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;