Skip to content

Commit

Permalink
[bidi][java] Add disown command
Browse files Browse the repository at this point in the history
  • Loading branch information
pujagani committed Oct 30, 2023
1 parent e43190f commit 6af1af6
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 0 deletions.
27 changes: 27 additions & 0 deletions java/src/org/openqa/selenium/bidi/Script.java
Expand Up @@ -162,6 +162,33 @@ public EvaluateResult evaluateFunctionInBrowsingContext(
return this.bidi.send(new Command<>("script.evaluate", params, evaluateResultMapper));
}

public void disownRealmScript(String realmId, List<String> handles) {
this.bidi.send(
new Command<>(
"script.disown", Map.of("handles", handles, "target", Map.of("realm", realmId))));
}

public void disownBrowsingContextScript(String browsingContextId, List<String> handles) {
this.bidi.send(
new Command<>(
"script.disown",
Map.of("handles", handles, "target", Map.of("context", browsingContextId))));
}

public void disownBrowsingContextScript(
String browsingContextId, String sandbox, List<String> handles) {
this.bidi.send(
new Command<>(
"script.disown",
Map.of(
"handles",
handles,
"target",
Map.of(
"context", browsingContextId,
"sandbox", sandbox))));
}

private Map<String, Object> getCallFunctionParams(
String targetType,
String id,
Expand Down
115 changes: 115 additions & 0 deletions java/test/org/openqa/selenium/bidi/script/ScriptCommandsTest.java
Expand Up @@ -17,6 +17,7 @@

package org.openqa.selenium.bidi.script;

import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.openqa.selenium.testing.drivers.Browser.CHROME;
import static org.openqa.selenium.testing.drivers.Browser.EDGE;
Expand All @@ -28,8 +29,10 @@
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.bidi.Script;
import org.openqa.selenium.testing.JupiterTestBase;
import org.openqa.selenium.testing.NotYetImplemented;
Expand Down Expand Up @@ -424,6 +427,118 @@ void canEvaluateInASandBox() {
assertThat((Long) resultInSandboxSuccess.getResult().getValue().get()).isEqualTo(2L);
}

@Test
void canDisownHandles() {
String id = driver.getWindowHandle();
Script script = new Script(id, driver);

EvaluateResult evaluateResult =
script.evaluateFunctionInBrowsingContext(
id, "({a:1})", false, Optional.of(ResultOwnership.ROOT));

assertThat(evaluateResult.getResultType()).isEqualTo(EvaluateResult.EvaluateResultType.SUCCESS);
assertThat(evaluateResult.getRealmId()).isNotNull();

EvaluateResultSuccess successEvaluateResult = (EvaluateResultSuccess) evaluateResult;
assertThat(successEvaluateResult.getResult().getHandle().isPresent()).isTrue();

List<LocalValue> arguments = new ArrayList<>();

Map<Object, RemoteValue> valueMap =
(Map<Object, RemoteValue>) successEvaluateResult.getResult().getValue().get();

RemoteValue value = valueMap.get("a");

AtomicReference<LocalValue> localValue = new AtomicReference<>();
value.getValue().ifPresent(v -> localValue.set(LocalValue.numberValue((long) v)));

Map<Object, LocalValue> localValueMap = new HashMap<>();
localValueMap.put("a", localValue.get());

LocalValue value1 = LocalValue.objectValue(localValueMap);
LocalValue value2 =
LocalValue.remoteReference(
RemoteReference.Type.HANDLE, successEvaluateResult.getResult().getHandle().get());
arguments.add(value1);
arguments.add(value2);

script.callFunctionInBrowsingContext(
id, "arg => arg.a", false, Optional.of(arguments), Optional.empty(), Optional.empty());

assertThat(successEvaluateResult.getResult().getValue().isPresent()).isTrue();

List<String> handles = new ArrayList<>();
handles.add(successEvaluateResult.getResult().getHandle().get());
script.disownBrowsingContextScript(id, handles);

assertThatExceptionOfType(WebDriverException.class)
.isThrownBy(
() ->
script.callFunctionInBrowsingContext(
id,
"arg => arg.a",
false,
Optional.of(arguments),
Optional.empty(),
Optional.empty()));
}

@Test
void canDisownHandlesInRealm() {
String id = driver.getWindowHandle();
Script script = new Script(id, driver);

EvaluateResult evaluateResult =
script.evaluateFunctionInBrowsingContext(
id, "({a:1})", false, Optional.of(ResultOwnership.ROOT));

assertThat(evaluateResult.getResultType()).isEqualTo(EvaluateResult.EvaluateResultType.SUCCESS);
assertThat(evaluateResult.getRealmId()).isNotNull();

EvaluateResultSuccess successEvaluateResult = (EvaluateResultSuccess) evaluateResult;
assertThat(successEvaluateResult.getResult().getHandle().isPresent()).isTrue();

List<LocalValue> arguments = new ArrayList<>();

Map<Object, RemoteValue> valueMap =
(Map<Object, RemoteValue>) successEvaluateResult.getResult().getValue().get();

RemoteValue value = valueMap.get("a");

AtomicReference<LocalValue> localValue = new AtomicReference<>();
value.getValue().ifPresent(v -> localValue.set(LocalValue.numberValue((long) v)));

Map<Object, LocalValue> localValueMap = new HashMap<>();
localValueMap.put("a", localValue.get());

LocalValue value1 = LocalValue.objectValue(localValueMap);
LocalValue value2 =
LocalValue.remoteReference(
RemoteReference.Type.HANDLE, successEvaluateResult.getResult().getHandle().get());
arguments.add(value1);
arguments.add(value2);

script.callFunctionInBrowsingContext(
id, "arg => arg.a", false, Optional.of(arguments), Optional.empty(), Optional.empty());

assertThat(successEvaluateResult.getResult().getValue().isPresent()).isTrue();

List<String> handles = new ArrayList<>();
handles.add(successEvaluateResult.getResult().getHandle().get());
script.disownRealmScript(evaluateResult.getRealmId(), handles);

assertThatExceptionOfType(WebDriverException.class)
.isThrownBy(
() ->
script.callFunctionInBrowsingContext(
id,
"arg => arg.a",
false,
Optional.of(arguments),
Optional.empty(),
Optional.empty()));
}

@AfterEach
public void quitDriver() {
if (driver != null) {
Expand Down

0 comments on commit 6af1af6

Please sign in to comment.