Changeset 214771 in webkit


Ignore:
Timestamp:
Apr 3, 2017 5:01:58 AM (7 years ago)
Author:
Carlos Garcia Campos
Message:

Merge r214194 - 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:
releases/WebKitGTK/webkit-2.16
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • releases/WebKitGTK/webkit-2.16/LayoutTests/ChangeLog

    r214768 r214771  
     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-19  Chris Dumez  <cdumez@apple.com>
    215
  • releases/WebKitGTK/webkit-2.16/LayoutTests/fast/events/before-unload-forbidden-navigation.html

    r120792 r214771  
    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;
  • releases/WebKitGTK/webkit-2.16/Source/WebCore/ChangeLog

    r214770 r214771  
     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  Simon Fraser  <simon.fraser@apple.com>
    221
  • releases/WebKitGTK/webkit-2.16/Source/WebCore/loader/FrameLoader.cpp

    r214747 r214771  
    11861186}
    11871187
     1188bool FrameLoader::isNavigationAllowed() const
     1189{
     1190    return m_pageDismissalEventBeingDispatched == PageDismissalType::None && NavigationDisablerForBeforeUnload::isNavigationAllowed();
     1191}
     1192
    11881193void FrameLoader::loadURL(const FrameLoadRequest& frameLoadRequest, const String& referrer, FrameLoadType newLoadType, Event* event, FormState* formState)
    11891194{
     
    12241229    }
    12251230
    1226     if (m_pageDismissalEventBeingDispatched != PageDismissalType::None)
     1231    if (!isNavigationAllowed())
    12271232        return;
    12281233
     
    14261431    ASSERT(m_frame.view());
    14271432
    1428     if (m_pageDismissalEventBeingDispatched != PageDismissalType::None)
     1433    if (!isNavigationAllowed())
    14291434        return;
    14301435
     
    16131618{
    16141619    ASSERT(!m_frame.document() || m_frame.document()->pageCacheState() != Document::InPageCache);
    1615     if (m_pageDismissalEventBeingDispatched != PageDismissalType::None)
     1620    if (!isNavigationAllowed())
    16161621        return;
    16171622
  • releases/WebKitGTK/webkit-2.16/Source/WebCore/loader/FrameLoader.h

    r214747 r214771  
    387387    void applyShouldOpenExternalURLsPolicyToNewDocumentLoader(DocumentLoader&, ShouldOpenExternalURLsPolicy propagatedPolicy);
    388388
     389    bool isNavigationAllowed() const;
     390
    389391    Frame& m_frame;
    390392    FrameLoaderClient& m_client;
Note: See TracChangeset for help on using the changeset viewer.