Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Unified Diff: third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp

Issue 2812743002: Revert of Keep track in the browser of which frames have onunload and onbeforeunload handlers. (Closed)
Patch Set: manual merge Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/test/test_render_frame_host.h ('k') | ui/views/controls/webview/web_dialog_view.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
index 96c93e7436517ad80927efab39f8a434ce061e4d..57a327f569e7dc985bd56e8d08cce104bec7bc4e 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -255,6 +255,14 @@ static void RemoveAllBeforeUnloadEventListeners(LocalDOMWindow* dom_window) {
}
}
+static bool AllowsBeforeUnloadListeners(LocalDOMWindow* window) {
+ DCHECK(window);
+ LocalFrame* frame = window->GetFrame();
+ if (!frame)
+ return false;
+ return frame->IsMainFrame();
+}
+
unsigned LocalDOMWindow::PendingUnloadEventListeners() const {
return WindowsWithUnloadEventListeners().Count(
const_cast<LocalDOMWindow*>(this));
@@ -1440,10 +1448,17 @@ void LocalDOMWindow::AddedEventListener(
AddUnloadEventListener(this);
} else if (event_type == EventTypeNames::beforeunload) {
UseCounter::Count(document(), UseCounter::kDocumentBeforeUnloadRegistered);
- AddBeforeUnloadEventListener(this);
- if (GetFrame() && !GetFrame()->IsMainFrame())
+ if (AllowsBeforeUnloadListeners(this)) {
+ // This is confusingly named. It doesn't actually add the listener. It
+ // just increments a count so that we know we have listeners registered
+ // for the purposes of determining if we can fast terminate the renderer
+ // process.
+ AddBeforeUnloadEventListener(this);
+ } else {
+ // Subframes return false from allowsBeforeUnloadListeners.
UseCounter::Count(document(),
UseCounter::kSubFrameBeforeUnloadRegistered);
+ }
}
}
@@ -1461,7 +1476,8 @@ void LocalDOMWindow::RemovedEventListener(
if (event_type == EventTypeNames::unload) {
RemoveUnloadEventListener(this);
- } else if (event_type == EventTypeNames::beforeunload) {
+ } else if (event_type == EventTypeNames::beforeunload &&
+ AllowsBeforeUnloadListeners(this)) {
RemoveBeforeUnloadEventListener(this);
}
}
« no previous file with comments | « content/test/test_render_frame_host.h ('k') | ui/views/controls/webview/web_dialog_view.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698