diff --git a/java/src/org/openqa/selenium/bidi/browsingcontext/HistoryUpdated.java b/java/src/org/openqa/selenium/bidi/browsingcontext/HistoryUpdated.java new file mode 100644 index 0000000000000..aee7758f2fd62 --- /dev/null +++ b/java/src/org/openqa/selenium/bidi/browsingcontext/HistoryUpdated.java @@ -0,0 +1,92 @@ +// 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.browsingcontext; + +import static java.util.Collections.unmodifiableMap; + +import java.util.Map; +import java.util.TreeMap; +import org.openqa.selenium.json.JsonInput; + +public class HistoryUpdated { + + private final String browsingContextId; + + private final int timestamp; + + private final String url; + + private HistoryUpdated(String browsingContextId, int timestamp, String url) { + this.browsingContextId = browsingContextId; + this.timestamp = timestamp; + this.url = url; + } + + public static HistoryUpdated fromJson(JsonInput input) { + String browsingContextId = null; + int timestamp = 0; + String url = null; + + input.beginObject(); + while (input.hasNext()) { + switch (input.nextName()) { + case "context": + browsingContextId = input.read(String.class); + break; + + case "timestamp": + timestamp = input.read(int.class); + break; + + case "url": + url = input.read(String.class); + break; + + default: + input.skipValue(); + break; + } + } + + input.endObject(); + + return new HistoryUpdated(browsingContextId, timestamp, url); + } + + public String getBrowsingContextId() { + return browsingContextId; + } + + public int getTimestamp() { + return timestamp; + } + + public String getUrl() { + return url; + } + + private Map toJson() { + Map toReturn = new TreeMap<>(); + + toReturn.put("browsingContextId", this.getBrowsingContextId()); + toReturn.put("timestamp", this.getTimestamp()); + toReturn.put("url", this.getUrl()); + + return unmodifiableMap(toReturn); + } +} diff --git a/java/src/org/openqa/selenium/bidi/module/BrowsingContextInspector.java b/java/src/org/openqa/selenium/bidi/module/BrowsingContextInspector.java index ba07250e6ae0e..4b08dc9c11906 100644 --- a/java/src/org/openqa/selenium/bidi/module/BrowsingContextInspector.java +++ b/java/src/org/openqa/selenium/bidi/module/BrowsingContextInspector.java @@ -29,6 +29,7 @@ import org.openqa.selenium.bidi.Event; import org.openqa.selenium.bidi.HasBiDi; import org.openqa.selenium.bidi.browsingcontext.BrowsingContextInfo; +import org.openqa.selenium.bidi.browsingcontext.HistoryUpdated; import org.openqa.selenium.bidi.browsingcontext.NavigationInfo; import org.openqa.selenium.bidi.browsingcontext.UserPromptClosed; import org.openqa.selenium.bidi.browsingcontext.UserPromptOpened; @@ -88,6 +89,16 @@ public class BrowsingContextInspector implements AutoCloseable { } }); + private final Event historyUpdated = + new Event<>( + "browsingContext.historyUpdated", + params -> { + try (StringReader reader = new StringReader(JSON.toJson(params)); + JsonInput input = JSON.newInput(reader)) { + return input.read(HistoryUpdated.class); + } + }); + public BrowsingContextInspector(WebDriver driver) { this(new HashSet<>(), driver); } @@ -172,6 +183,14 @@ public void onUserPromptOpened(Consumer consumer) { } } + public void onHistoryUpdated(Consumer consumer) { + if (browsingContextIds.isEmpty()) { + this.bidi.addListener(historyUpdated, consumer); + } else { + this.bidi.addListener(browsingContextIds, historyUpdated, consumer); + } + } + private void addNavigationEventListener(String name, Consumer consumer) { Event navigationEvent = new Event<>(name, navigationInfoMapper); @@ -190,6 +209,7 @@ public void close() { this.bidi.clearListener(browsingContextDestroyed); this.bidi.clearListener(userPromptOpened); this.bidi.clearListener(userPromptClosed); + this.bidi.clearListener(historyUpdated); navigationEventSet.forEach(this.bidi::clearListener); }