Changeset 214194 in webkit


Ignore:
Timestamp:
Mar 20, 2017 4:07:50 PM (7 years ago)
Author:
dbates@webkit.org
Message:

Prevent new navigations from onbeforeunload handler
https://bugs.webkit.org/show_bug.cgi?id=169891
<rdar://problem/31155736>

Reviewed by Ryosuke Niwa.

Source/WebCore:

Ensure that all navigations initiated from an onbeforeunload handler are disallowed
regardless of how they were scheduled. Such navigations go against the expectation
of a user.

  • loader/FrameLoader.cpp:

(WebCore::FrameLoader::isNavigationAllowed): Added.
(WebCore::FrameLoader::loadURL): Modified code to call FrameLoader::isNavigationAllowed().
(WebCore::FrameLoader::loadWithDocumentLoader): Ditto.
(WebCore::FrameLoader::stopAllLoaders): Ditto.

  • loader/FrameLoader.h:

LayoutTests:

Update test to ensure that we disallow navigation initiated via a DOM click event from
an onbeforeunload handler.

  • fast/events/before-unload-forbidden-navigation.html:
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r214189 r214194  
     12017-03-20  Daniel Bates  <dabates@apple.com>
     2
     3        Prevent new navigations from onbeforeunload handler
     4        https://bugs.webkit.org/show_bug.cgi?id=169891
     5        <rdar://problem/31155736>
     6
     7        Reviewed by Ryosuke Niwa.
     8
     9        Update test to ensure that we disallow navigation initiated via a DOM click event from
     10        an onbeforeunload handler.
     11
     12        * fast/events/before-unload-forbidden-navigation.html:
     13
    1142017-03-20  Andy Estes  <aestes@apple.com>
    215
  • trunk/LayoutTests/fast/events/before-unload-forbidden-navigation.html

    r120792 r214194  
    1313
    1414var log = document.getElementById('log');
     15var didFireBeforeUnloadEvent = false;
    1516
    1617function test(iframe) {
     
    2627}
    2728
     29function navigateByClickingHyperlink(contentWindow, url) {
     30    var link = contentWindow.document.createElement('a');
     31    link.href = url;
     32    link.click();
     33}
     34
    2835function fired(contentWindow) {
     36    if (didFireBeforeUnloadEvent)
     37        return;
     38    didFireBeforeUnloadEvent = true;
     39
    2940    location.href = 'resources/before-unload-in-subframe-fail.html';
    3041    contentWindow.location.href = 'resources/before-unload-in-subframe-fail.html';
     42    navigateByClickingHyperlink(contentWindow, 'resources/before-unload-in-subframe-fail.html');
     43    navigateByClickingHyperlink(window, 'resources/before-unload-in-subframe-fail.html');
     44
    3145    log.innerHTML = 'PASS 1/2';
    3246    contentWindow.frameElement.halfPassed = true;
  • trunk/Source/WebCore/ChangeLog

    r214190 r214194  
     12017-03-20  Daniel Bates  <dabates@apple.com>
     2
     3        Prevent new navigations from onbeforeunload handler
     4        https://bugs.webkit.org/show_bug.cgi?id=169891
     5        <rdar://problem/31155736>
     6
     7        Reviewed by Ryosuke Niwa.
     8
     9        Ensure that all navigations initiated from an onbeforeunload handler are disallowed
     10        regardless of how they were scheduled. Such navigations go against the expectation
     11        of a user.
     12
     13        * loader/FrameLoader.cpp:
     14        (WebCore::FrameLoader::isNavigationAllowed): Added.
     15        (WebCore::FrameLoader::loadURL): Modified code to call FrameLoader::isNavigationAllowed().
     16        (WebCore::FrameLoader::loadWithDocumentLoader): Ditto.
     17        (WebCore::FrameLoader::stopAllLoaders): Ditto.
     18        * loader/FrameLoader.h:
     19
    1202017-03-20  Alex Christensen  <achristensen@webkit.org>
    221
  • trunk/Source/WebCore/loader/FrameLoader.cpp

    r214113 r214194  
    12111211}
    12121212
     1213bool FrameLoader::isNavigationAllowed() const
     1214{
     1215    return m_pageDismissalEventBeingDispatched == PageDismissalType::None && NavigationDisablerForBeforeUnload::isNavigationAllowed();
     1216}
     1217
    12131218void FrameLoader::loadURL(const FrameLoadRequest& frameLoadRequest, const String& referrer, FrameLoadType newLoadType, Event* event, FormState* formState)
    12141219{
     
    12491254    }
    12501255
    1251     if (m_pageDismissalEventBeingDispatched != PageDismissalType::None)
     1256    if (!isNavigationAllowed())
    12521257        return;
    12531258
     
    14541459    ASSERT(m_frame.view());
    14551460
    1456     if (m_pageDismissalEventBeingDispatched != PageDismissalType::None)
     1461    if (!isNavigationAllowed())
    14571462        return;
    14581463
     
    16491654{
    16501655    ASSERT(!m_frame.document() || m_frame.document()->pageCacheState() != Document::InPageCache);
    1651     if (m_pageDismissalEventBeingDispatched != PageDismissalType::None)
     1656    if (!isNavigationAllowed())
    16521657        return;
    16531658
  • trunk/Source/WebCore/loader/FrameLoader.h

    r214113 r214194  
    389389    void applyShouldOpenExternalURLsPolicyToNewDocumentLoader(DocumentLoader&, ShouldOpenExternalURLsPolicy propagatedPolicy);
    390390
     391    bool isNavigationAllowed() const;
     392
    391393    Frame& m_frame;
    392394    FrameLoaderClient& m_client;
Note: See TracChangeset for help on using the changeset viewer.