2011-06-30 Sreeram Ramachandran <sreeram@chromium.org>
Reviewed by Adam Barth.
Suppress modal JavaScript/HTML dialogs during unload events
https://bugs.webkit.org/show_bug.cgi?id=56397
Adds Chromium-specific test expectations that show alerts in unload
handlers being replaced by console messages.
* fast/loader/page-dismissal-modal-dialogs-expected.txt: Added.
* fast/loader/page-dismissal-modal-dialogs.html: Added.
* fast/loader/resources/page-dismissal-modal-dialogs-iframe.html: Added.
* platform/chromium-mac/fast/history/timed-refresh-in-cached-frame-expected.txt:
* platform/chromium-win/fast/history/timed-refresh-in-cached-frame-expected.txt:
* platform/chromium/fast/dom/Geolocation/notimer-after-unload-expected.txt: Added.
* platform/chromium/fast/events/onbeforeunload-focused-iframe-expected.txt: Added.
* platform/chromium/fast/events/onunload-clears-onbeforeunload-expected.txt: Added.
* platform/chromium/fast/events/onunload-expected.txt: Added.
* platform/chromium/fast/events/onunload-not-on-body-expected.txt: Added.
* platform/chromium/fast/events/onunload-window-property-expected.txt: Added.
* platform/chromium/fast/events/pageshow-pagehide-on-back-uncached-expected.txt: Added.
* platform/chromium/fast/history/timed-refresh-in-cached-frame-expected.txt: Added.
* platform/chromium/fast/loader/frames-with-unload-handlers-in-page-cache-expected.txt: Added.
* platform/chromium/fast/loader/page-dismissal-modal-dialogs-expected.txt: Added.
* platform/chromium/fast/loader/recursive-before-unload-crash-expected.txt: Added.
2011-06-30 Sreeram Ramachandran <sreeram@chromium.org>
Reviewed by Adam Barth.
Suppress modal JavaScript/HTML dialogs during unload events
https://bugs.webkit.org/show_bug.cgi?id=56397
Allows clients to specify whether to show alerts during unload handlers.
When checking for whether a page dismissal event is being dispatched,
it's important to check all frames on the page (otherwise it becomes a
loophole easily exploited).
Test: fast/loader/page-dismissal-modal-dialogs.html
* loader/FrameLoader.cpp:
(WebCore::FrameLoader::FrameLoader):
(WebCore::FrameLoader::stopLoading):
(WebCore::FrameLoader::loadURL):
(WebCore::FrameLoader::loadWithDocumentLoader):
(WebCore::FrameLoader::stopAllLoaders):
(WebCore::FrameLoader::fireBeforeUnloadEvent):
* loader/FrameLoader.h:
(WebCore::FrameLoader::pageDismissalEventBeingDispatched):
* loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::requestImage):
* page/Chrome.cpp:
(WebCore::canRunModalIfDuringPageDismissal):
(WebCore::Chrome::canRunModalNow):
(WebCore::Chrome::runJavaScriptAlert):
(WebCore::Chrome::runJavaScriptConfirm):
(WebCore::Chrome::runJavaScriptPrompt):
* page/Chrome.h:
* page/ChromeClient.h:
(WebCore::ChromeClient::shouldRunModalDialogDuringPageDismissal):
* page/DOMWindow.cpp:
(WebCore::DOMWindow::showModalDialog):
2011-06-30 Sreeram Ramachandran <sreeram@chromium.org>
Reviewed by Adam Barth.
Suppress modal JavaScript/HTML dialogs during unload events
https://bugs.webkit.org/show_bug.cgi?id=56397
Implementation of the new shouldRunModalDialogDuringPageDismissal() API
to block alerts during unload handlers. Logs such events to the console
and updates histograms.
* src/ChromeClientImpl.cpp:
(WebKit::ChromeClientImpl::shouldRunModalDialogDuringPageDismissal):
* src/ChromeClientImpl.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@90164 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/loader/FrameLoader.h b/Source/WebCore/loader/FrameLoader.h
index d73b5aa..fddaa08 100644
--- a/Source/WebCore/loader/FrameLoader.h
+++ b/Source/WebCore/loader/FrameLoader.h
@@ -272,7 +272,13 @@
void started();
- bool pageDismissalEventBeingDispatched() const { return m_pageDismissalEventBeingDispatched; }
+ enum PageDismissalType {
+ NoDismissal = 0,
+ BeforeUnloadDismissal = 1,
+ PageHideDismissal = 2,
+ UnloadDismissal = 3
+ };
+ PageDismissalType pageDismissalEventBeingDispatched() const { return m_pageDismissalEventBeingDispatched; }
NetworkingContext* networkingContext() const;
@@ -395,7 +401,7 @@
bool m_didCallImplicitClose;
bool m_wasUnloadEventEmitted;
- bool m_pageDismissalEventBeingDispatched;
+ PageDismissalType m_pageDismissalEventBeingDispatched;
bool m_isComplete;
bool m_isLoadingMainResource;