⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 243973 in webkit


Ignore:
Timestamp:
Apr 8, 2019, 3:14:04 AM (7 years ago)
Author:
Carlos Garcia Campos
Message:

Merge r243434 - [GTK][WPE] Do not allow changes in active URI before provisional load starts for non-API requests
https://bugs.webkit.org/show_bug.cgi?id=194208

Reviewed by Michael Catanzaro.

  • UIProcess/API/glib/WebKitWebView.cpp:

(webkitWebViewWillStartLoad): Block updates of active URL.
(webkitWebViewLoadChanged): Unblock updates of active URL on WEBKIT_LOAD_STARTED.

Location:
releases/WebKitGTK/webkit-2.24
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • releases/WebKitGTK/webkit-2.24/Source/WebKit/ChangeLog

    r243972 r243973  
     12019-03-25  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK][WPE] Do not allow changes in active URI before provisional load starts for non-API requests
     4        https://bugs.webkit.org/show_bug.cgi?id=194208
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        * UIProcess/API/glib/WebKitWebView.cpp:
     9        (webkitWebViewWillStartLoad): Block updates of active URL.
     10        (webkitWebViewLoadChanged): Unblock updates of active URL on WEBKIT_LOAD_STARTED.
     11
    1122019-03-12  Carlos Garcia Campos  <cgarcia@igalia.com>
    213
  • releases/WebKitGTK/webkit-2.24/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp

    r243972 r243973  
    247247    CString customTextEncoding;
    248248    CString activeURI;
     249    bool isActiveURIChangeBlocked;
    249250    bool isLoading;
    250251    bool isEphemeral;
     
    356357    void willChangeActiveURL() override
    357358    {
     359        if (m_webView->priv->isActiveURIChangeBlocked)
     360            return;
    358361        g_object_freeze_notify(G_OBJECT(m_webView));
    359362    }
    360363    void didChangeActiveURL() override
    361364    {
     365        if (m_webView->priv->isActiveURIChangeBlocked)
     366            return;
    362367        m_webView->priv->activeURI = getPage(m_webView).pageLoadState().activeURL().utf8();
    363368        g_object_notify(G_OBJECT(m_webView), "uri");
     
    20782083void webkitWebViewWillStartLoad(WebKitWebView* webView)
    20792084{
     2085    // Ignore the active URI changes happening before WEBKIT_LOAD_STARTED. If they are not user-initiated,
     2086    // they could be a malicious attempt to trick users by loading an invalid URI on a trusted host, with the load
     2087    // intended to stall, or perhaps be repeated. If we trust the URI here and display it to the user, then the user's
     2088    // only indication that something is wrong would be a page loading indicator. If the load request is not
     2089    // user-initiated, we must not trust it until WEBKIT_LOAD_COMMITTED. If the load is triggered by API
     2090    // request, then the active URI is already the pending API request URL, so the blocking is harmless and the
     2091    // client application will still see the URI update immediately. Otherwise, the URI update will be delayed a bit.
     2092    webView->priv->isActiveURIChangeBlocked = true;
     2093
    20802094    // This is called before NavigationClient::didStartProvisionalNavigation(), the page load state hasn't been committed yet.
    20812095    auto& pageLoadState = getPage(webView).pageLoadState();
     
    21002114        priv->loadingResourcesMap.clear();
    21012115        priv->mainResource = nullptr;
     2116        webView->priv->isActiveURIChangeBlocked = false;
    21022117        break;
     2118    case WEBKIT_LOAD_COMMITTED: {
     2119        auto activeURL = getPage(webView).pageLoadState().activeURL().utf8();
     2120        // Active URL is trusted now. If it's different to our active URI, due to the
     2121        // update block before WEBKIT_LOAD_STARTED, we update it here to be in sync
     2122        // again with the page load state.
     2123        if (activeURL != priv->activeURI) {
     2124            priv->activeURI = activeURL;
     2125            g_object_notify(G_OBJECT(webView), "uri");
     2126        }
    21032127#if PLATFORM(GTK)
    2104     case WEBKIT_LOAD_COMMITTED: {
    21052128        WebKitFaviconDatabase* database = webkit_web_context_get_favicon_database(priv->context.get());
    21062129        GUniquePtr<char> faviconURI(webkit_favicon_database_get_favicon_uri(database, priv->activeURI.data()));
    21072130        webkitWebViewUpdateFaviconURI(webView, faviconURI.get());
     2131#endif
    21082132        break;
    21092133    }
    2110 #endif
    21112134    case WEBKIT_LOAD_FINISHED:
    21122135        webkitWebViewCancelAuthenticationRequest(webView);
  • releases/WebKitGTK/webkit-2.24/Tools/ChangeLog

    r243972 r243973  
     12019-03-27  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        Unreviewed. Add GLib API test cases after r243434.
     4
     5        * TestWebKitAPI/Tests/WebKitGLib/TestLoaderClient.cpp:
     6        (testWebViewActiveURI):
     7        (serverCallback):
     8        * TestWebKitAPI/Tests/WebKitGLib/WebExtensionTest.cpp:
     9        (sendRequestCallback):
     10
    1112019-03-12  Michael Catanzaro  <mcatanzaro@igalia.com>
    212
  • releases/WebKitGTK/webkit-2.24/Tools/TestWebKitAPI/Tests/WebKitGLib/TestLoaderClient.cpp

    r243972 r243973  
    369369    test->checkURIAtState(ViewURITrackingTest::State::Commited, "/request-changed-on-redirect");
    370370    test->checkURIAtState(ViewURITrackingTest::State::Finished, "/request-changed-on-redirect");
     371
     372    // Non-API request loads.
     373    test->loadURI(kServer->getURIForPath("/redirect-js/normal").data());
     374    test->waitUntilLoadFinished();
     375    test->checkURIAtState(ViewURITrackingTest::State::Provisional, "/redirect-js/normal");
     376    test->checkURIAtState(ViewURITrackingTest::State::ProvisionalAfterRedirect, nullptr);
     377    test->checkURIAtState(ViewURITrackingTest::State::Commited, "/redirect-js/normal");
     378    test->checkURIAtState(ViewURITrackingTest::State::Finished, "/redirect-js/normal");
     379    test->waitUntilLoadFinished();
     380    test->checkURIAtState(ViewURITrackingTest::State::Provisional, "/redirect-js/normal");
     381    test->checkURIAtState(ViewURITrackingTest::State::ProvisionalAfterRedirect, nullptr);
     382    test->checkURIAtState(ViewURITrackingTest::State::Commited, "/normal");
     383    test->checkURIAtState(ViewURITrackingTest::State::Finished, "/normal");
     384
     385    test->loadURI(kServer->getURIForPath("/redirect-js/redirect").data());
     386    test->waitUntilLoadFinished();
     387    test->checkURIAtState(ViewURITrackingTest::State::Provisional, "/redirect-js/redirect");
     388    test->checkURIAtState(ViewURITrackingTest::State::ProvisionalAfterRedirect, nullptr);
     389    test->checkURIAtState(ViewURITrackingTest::State::Commited, "/redirect-js/redirect");
     390    test->checkURIAtState(ViewURITrackingTest::State::Finished, "/redirect-js/redirect");
     391    test->waitUntilLoadFinished();
     392    test->checkURIAtState(ViewURITrackingTest::State::Provisional, "/redirect-js/redirect");
     393    test->checkURIAtState(ViewURITrackingTest::State::ProvisionalAfterRedirect, "/normal");
     394    test->checkURIAtState(ViewURITrackingTest::State::Commited, "/normal");
     395    test->checkURIAtState(ViewURITrackingTest::State::Finished, "/normal");
     396
     397    test->loadURI(kServer->getURIForPath("/redirect-js/normal-change-request").data());
     398    test->waitUntilLoadFinished();
     399    test->checkURIAtState(ViewURITrackingTest::State::Provisional, "/redirect-js/normal-change-request");
     400    test->checkURIAtState(ViewURITrackingTest::State::ProvisionalAfterRedirect, nullptr);
     401    test->checkURIAtState(ViewURITrackingTest::State::Commited, "/redirect-js/normal-change-request");
     402    test->checkURIAtState(ViewURITrackingTest::State::Finished, "/redirect-js/normal-change-request");
     403    test->waitUntilLoadFinished();
     404    test->checkURIAtState(ViewURITrackingTest::State::Provisional, "/redirect-js/normal-change-request");
     405    test->checkURIAtState(ViewURITrackingTest::State::ProvisionalAfterRedirect, nullptr);
     406    test->checkURIAtState(ViewURITrackingTest::State::Commited, "/request-changed");
     407    test->checkURIAtState(ViewURITrackingTest::State::Finished, "/request-changed");
     408
     409    test->loadURI(kServer->getURIForPath("/redirect-js/redirect-to-change-request").data());
     410    test->waitUntilLoadFinished();
     411    test->checkURIAtState(ViewURITrackingTest::State::Provisional, "/redirect-js/redirect-to-change-request");
     412    test->checkURIAtState(ViewURITrackingTest::State::ProvisionalAfterRedirect, nullptr);
     413    test->checkURIAtState(ViewURITrackingTest::State::Commited, "/redirect-js/redirect-to-change-request");
     414    test->checkURIAtState(ViewURITrackingTest::State::Finished, "/redirect-js/redirect-to-change-request");
     415    test->waitUntilLoadFinished();
     416    test->checkURIAtState(ViewURITrackingTest::State::Provisional, "/redirect-js/redirect-to-change-request");
     417    test->checkURIAtState(ViewURITrackingTest::State::ProvisionalAfterRedirect, "/normal-change-request");
     418    test->checkURIAtState(ViewURITrackingTest::State::Commited, "/request-changed-on-redirect");
     419    test->checkURIAtState(ViewURITrackingTest::State::Finished, "/request-changed-on-redirect");
    371420}
    372421
     
    619668        "Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!</body></html>";
    620669
    621     static const char* unfinishedSubresourceLoadResponseString = "<html><body>"
    622         "<img src=\"/stall\"/>"
    623         "<script>"
    624         "  function run() {"
    625         "      location = '/normal';"
    626         "  }"
    627         "  setInterval(run(), 50);"
    628         "</script>"
    629         "</body></html>";
    630 
    631670    if (message->method != SOUP_METHOD_GET) {
    632671        soup_message_set_status(message, SOUP_STATUS_NOT_IMPLEMENTED);
     
    646685        soup_message_set_status(message, SOUP_STATUS_MOVED_PERMANENTLY);
    647686        soup_message_headers_append(message->response_headers, "Location", "/normal-change-request");
     687    } else if (g_str_has_prefix(path, "/redirect-js/")) {
     688        static const char* redirectJSFormat = "<html><body><script>location = '%s';</script></body></html>";
     689        char* redirectJS = g_strdup_printf(redirectJSFormat, g_strrstr(path, "/"));
     690        soup_message_body_append(message->response_body, SOUP_MEMORY_TAKE, redirectJS, strlen(redirectJS));
    648691    } else if (g_str_equal(path, "/cancelled")) {
    649692        soup_message_headers_set_encoding(message->response_headers, SOUP_ENCODING_CHUNKED);
     
    665708        soup_message_headers_append(message->response_headers, "Location", "data:text/plain;charset=utf-8,data-uri");
    666709    } else if (g_str_equal(path, "/unfinished-subresource-load")) {
     710        static const char* unfinishedSubresourceLoadResponseString = "<html><body>"
     711            "<img src=\"/stall\"/>"
     712            "<script>"
     713            "  function run() {"
     714            "      location = '/normal';"
     715            "  }"
     716            "  setInterval(run(), 50);"
     717            "</script>"
     718            "</body></html>";
    667719        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, unfinishedSubresourceLoadResponseString, strlen(unfinishedSubresourceLoadResponseString));
    668720    } else if (g_str_equal(path, "/stall")) {
  • releases/WebKitGTK/webkit-2.24/Tools/TestWebKitAPI/Tests/WebKitGLib/WebExtensionTest.cpp

    r239772 r243973  
    206206        g_assert_nonnull(headers);
    207207        soup_message_headers_append(headers, "DNT", "1");
    208     } else if (g_str_has_suffix(requestURI, "/normal-change-request")) {
     208    } else if (g_str_has_suffix(requestURI, "/normal-change-request") && !g_strrstr(requestURI, "/redirect-js/")) {
    209209        GUniquePtr<char> prefix(g_strndup(requestURI, strlen(requestURI) - strlen("/normal-change-request")));
    210210        GUniquePtr<char> newURI(g_strdup_printf("%s/request-changed%s", prefix.get(), redirectResponse ? "-on-redirect" : ""));
Note: See TracChangeset for help on using the changeset viewer.