Skip to content

Commit

Permalink
Add missing EventTarget inherit for ModalCloseWatcher
Browse files Browse the repository at this point in the history
Also, the new test case uncovered a race condition where the
ModalCloseWatcher may try to disconnect and reconnect its mojo
pipe before the host in the browser process has a chance to run
its disconnect handler. Fix that, too.

Bug: 1182772
Change-Id: Icfaa143669803a0293c3497765a48c15448cc4d5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2723246
Reviewed-by: Domenic Denicola <domenic@chromium.org>
Reviewed-by: Aaron Colwell <acolwell@chromium.org>
Commit-Queue: Nate Chapin <japhet@chromium.org>
Cr-Commit-Position: refs/heads/master@{#859066}
  • Loading branch information
natechapin authored and Chromium LUCI CQ committed Mar 2, 2021
1 parent 7760ad5 commit 5b27b90
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 10 deletions.
9 changes: 3 additions & 6 deletions content/browser/renderer_host/modal_close_listener_host.cc
Expand Up @@ -16,11 +16,12 @@ ModalCloseListenerHost::~ModalCloseListenerHost() = default;

void ModalCloseListenerHost::SetListener(
mojo::PendingRemote<blink::mojom::ModalCloseListener> listener) {
if (modal_close_listener_.is_bound())
modal_close_listener_.reset();
modal_close_listener_.Bind(std::move(listener));
// The renderer resets the message pipe when no ModalCloseWatchers are
// waiting for a Signal().
modal_close_listener_.set_disconnect_handler(base::BindOnce(
&ModalCloseListenerHost::Disconnect, base::Unretained(this)));
modal_close_listener_.reset_on_disconnect();
}

bool ModalCloseListenerHost::SignalIfActive() {
Expand All @@ -30,10 +31,6 @@ bool ModalCloseListenerHost::SignalIfActive() {
return true;
}

void ModalCloseListenerHost::Disconnect() {
modal_close_listener_.reset();
}

RENDER_DOCUMENT_HOST_USER_DATA_KEY_IMPL(ModalCloseListenerHost)

} // namespace content
2 changes: 0 additions & 2 deletions content/browser/renderer_host/modal_close_listener_host.h
Expand Up @@ -27,8 +27,6 @@ class CONTENT_EXPORT ModalCloseListenerHost
explicit ModalCloseListenerHost(RenderFrameHost* render_frame_host);
friend class RenderDocumentHostUserData<ModalCloseListenerHost>;

void Disconnect();

mojo::Remote<blink::mojom::ModalCloseListener> modal_close_listener_;
RENDER_DOCUMENT_HOST_USER_DATA_KEY_DECL();
DISALLOW_COPY_AND_ASSIGN(ModalCloseListenerHost);
Expand Down
Expand Up @@ -5,7 +5,7 @@
[
Exposed=Window,
RuntimeEnabled=ModalCloseWatcher
] interface ModalCloseWatcher {
] interface ModalCloseWatcher : EventTarget {
[CallWith=ScriptState, RaisesException] constructor();

void signalClosed();
Expand Down
Expand Up @@ -5348,7 +5348,7 @@ interface MimeTypeArray
method constructor
method item
method namedItem
interface ModalCloseWatcher
interface ModalCloseWatcher : EventTarget
attribute @@toStringTag
getter onbeforeclose
getter onclose
Expand Down
Expand Up @@ -198,4 +198,17 @@
watcher.onclose = () => { watcher.signalClosed(); }
watcher.signalClosed();
}, "signalClose inside onclose should not trigger an infinite loop");

test(() => {
let watcher = new ModalCloseWatcher();
let onbeforeclose_called = false;
let onclose_called = false;
watcher.addEventListener("beforeclose", () => onbeforeclose_called = true);
watcher.addEventListener("close", () => onclose_called = true);

watcher.signalClosed();

assert_true(onbeforeclose_called);
assert_true(onclose_called);
}, "signalClose with events added via addEventListener");
</script>

0 comments on commit 5b27b90

Please sign in to comment.