Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions java/src/org/openqa/selenium/bidi/emulation/Emulation.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,11 @@ public void setUserAgentOverride(SetUserAgentOverrideParameters parameters) {

bidi.send(new Command<>("emulation.setUserAgentOverride", parameters.toMap(), Map.class));
}

public void setScreenOrientationOverride(SetScreenOrientationOverrideParameters parameters) {
Require.nonNull("SetScreenOrientationOverride parameters", parameters);

bidi.send(
new Command<>("emulation.setScreenOrientationOverride", parameters.toMap(), Map.class));
}
}
52 changes: 52 additions & 0 deletions java/src/org/openqa/selenium/bidi/emulation/ScreenOrientation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.

package org.openqa.selenium.bidi.emulation;

import java.util.HashMap;
import java.util.Map;

public class ScreenOrientation {
private final ScreenOrientationNatural natural;
private final ScreenOrientationType type;

public ScreenOrientation(ScreenOrientationNatural natural, ScreenOrientationType type) {
if (natural == null) {
throw new IllegalArgumentException("Natural orientation cannot be null");
}
Comment thread
Delta456 marked this conversation as resolved.
Outdated
if (type == null) {
throw new IllegalArgumentException("Orientation type cannot be null");
}
Comment thread
Delta456 marked this conversation as resolved.
Outdated
this.natural = natural;
this.type = type;
}

public ScreenOrientationNatural getNatural() {
return natural;
}

public ScreenOrientationType getType() {
return type;
}

public Map<String, Object> toMap() {
Map<String, Object> map = new HashMap<>();
map.put("natural", natural.toString());
map.put("type", type.toString());
return map;
Comment thread
Delta456 marked this conversation as resolved.
Outdated
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.

package org.openqa.selenium.bidi.emulation;

public enum ScreenOrientationNatural {
PORTRAIT("portrait"),
LANDSCAPE("landscape");

private final String value;

ScreenOrientationNatural(String value) {
this.value = value;
}

@Override
public String toString() {
return value;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.

package org.openqa.selenium.bidi.emulation;

public enum ScreenOrientationType {
PORTRAIT_PRIMARY("portrait-primary"),
PORTRAIT_SECONDARY("portrait-secondary"),
LANDSCAPE_PRIMARY("landscape-primary"),
LANDSCAPE_SECONDARY("landscape-secondary");

private final String value;

ScreenOrientationType(String value) {
this.value = value;
}

@Override
public String toString() {
return value;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.

package org.openqa.selenium.bidi.emulation;

public class SetScreenOrientationOverrideParameters extends AbstractOverrideParameters {

public SetScreenOrientationOverrideParameters(ScreenOrientation screenOrientation) {
if (screenOrientation == null) {
map.put("screenOrientation", null);
} else {
map.put("screenOrientation", screenOrientation.toMap());
}
}

@Override
public SetScreenOrientationOverrideParameters contexts(java.util.List<String> contexts) {
super.contexts(contexts);
return this;
}

@Override
public SetScreenOrientationOverrideParameters userContexts(java.util.List<String> userContexts) {
super.userContexts(userContexts);
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.

package org.openqa.selenium.bidi.emulation;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.bidi.browsingcontext.CreateContextParameters;
import org.openqa.selenium.bidi.browsingcontext.ReadinessState;
import org.openqa.selenium.bidi.module.Browser;
import org.openqa.selenium.testing.JupiterTestBase;
import org.openqa.selenium.testing.NeedsFreshDriver;

public class SetScreenOrientationOverrideTest extends JupiterTestBase {

private Map<String, Object> getScreenOrientation(String context) {
driver.switchTo().window(context);
JavascriptExecutor executor = (JavascriptExecutor) driver;

String type = (String) executor.executeScript("return screen.orientation.type;");
Number angle = (Number) executor.executeScript("return screen.orientation.angle;");

return Map.of("type", type, "angle", angle.intValue());
}

@Test
@NeedsFreshDriver
void canSetScreenOrientationOverrideInContext() {
BrowsingContext context = new BrowsingContext(driver, driver.getWindowHandle());
String contextId = context.getId();

// Navigate to a page first to ensure screen.orientation is available
String url = appServer.whereIs("formPage.html");
context.navigate(url, ReadinessState.COMPLETE);

Map<String, Object> initialOrientation = getScreenOrientation(contextId);

Emulation emulation = new Emulation(driver);

// Set landscape-primary orientation
ScreenOrientation landscapeOrientation =
new ScreenOrientation(
ScreenOrientationNatural.LANDSCAPE, ScreenOrientationType.LANDSCAPE_PRIMARY);
emulation.setScreenOrientationOverride(
new SetScreenOrientationOverrideParameters(landscapeOrientation)
.contexts(List.of(contextId)));

// Reload the page to apply the orientation change
context.navigate(url, ReadinessState.COMPLETE);

Map<String, Object> currentOrientation = getScreenOrientation(contextId);
assertThat(currentOrientation.get("type")).isEqualTo("landscape-primary");
assertThat(currentOrientation.get("angle")).isEqualTo(0);

// Set portrait-secondary orientation
ScreenOrientation portraitOrientation =
new ScreenOrientation(
ScreenOrientationNatural.PORTRAIT, ScreenOrientationType.PORTRAIT_SECONDARY);
emulation.setScreenOrientationOverride(
new SetScreenOrientationOverrideParameters(portraitOrientation)
.contexts(List.of(contextId)));

currentOrientation = getScreenOrientation(contextId);
assertThat(currentOrientation.get("type")).isEqualTo("portrait-secondary");
assertThat(currentOrientation.get("angle")).isEqualTo(180);

// Clear the override
emulation.setScreenOrientationOverride(
new SetScreenOrientationOverrideParameters(null).contexts(List.of(contextId)));

currentOrientation = getScreenOrientation(contextId);
assertThat(currentOrientation.get("type")).isEqualTo(initialOrientation.get("type"));
assertThat(currentOrientation.get("angle")).isEqualTo(initialOrientation.get("angle"));
}

@Test
@NeedsFreshDriver
void canSetScreenOrientationOverrideInUserContext() {
Browser browser = new Browser(driver);
String userContext = browser.createUserContext();

try {
BrowsingContext context =
new BrowsingContext(
driver, new CreateContextParameters(WindowType.TAB).userContext(userContext));
String contextId = context.getId();

try {
driver.switchTo().window(contextId);

Emulation emulation = new Emulation(driver);

// Navigate to a page first to ensure screen.orientation is available
String url = appServer.whereIs("formPage.html");
context.navigate(url, ReadinessState.COMPLETE);

Map<String, Object> initialOrientation = getScreenOrientation(contextId);

// Set landscape-primary orientation
ScreenOrientation landscapeOrientation =
new ScreenOrientation(
ScreenOrientationNatural.LANDSCAPE, ScreenOrientationType.LANDSCAPE_PRIMARY);
emulation.setScreenOrientationOverride(
new SetScreenOrientationOverrideParameters(landscapeOrientation)
.userContexts(List.of(userContext)));

// Reload the page to apply the orientation override
context.navigate(url, ReadinessState.COMPLETE);

Map<String, Object> currentOrientation = getScreenOrientation(contextId);
assertThat(currentOrientation.get("type")).isEqualTo("landscape-primary");
assertThat(currentOrientation.get("angle")).isEqualTo(0);

// Set portrait-secondary orientation
ScreenOrientation portraitOrientation =
new ScreenOrientation(
ScreenOrientationNatural.PORTRAIT, ScreenOrientationType.PORTRAIT_SECONDARY);
emulation.setScreenOrientationOverride(
new SetScreenOrientationOverrideParameters(portraitOrientation)
.userContexts(List.of(userContext)));

currentOrientation = getScreenOrientation(contextId);
assertThat(currentOrientation.get("type")).isEqualTo("portrait-secondary");
assertThat(currentOrientation.get("angle")).isEqualTo(180);

// Clear the override
emulation.setScreenOrientationOverride(
new SetScreenOrientationOverrideParameters(null).userContexts(List.of(userContext)));

currentOrientation = getScreenOrientation(contextId);
assertThat(currentOrientation.get("type")).isEqualTo(initialOrientation.get("type"));
assertThat(currentOrientation.get("angle")).isEqualTo(initialOrientation.get("angle"));

} finally {
context.close();
}
} finally {
browser.removeUserContext(userContext);
}
}
}
Loading