Skip to content

Commit 5d6399f

Browse files
WebView and WebPage URLs not updated after URL is modified by InjectedBundlePageResourceLoadClient::willSendRequestForFrame
https://bugs.webkit.org/show_bug.cgi?id=146306 Reviewed by Darin Adler. Source/WebCore: Notify about the provisional URL change when new request set for main resource load in DocumentLoader has a different URL than the previous one. * loader/DocumentLoader.cpp: (WebCore::DocumentLoader::setRequest): Tools: Add unit test to check that the committed URL is updated when changed in willSendRequest callback. * TestWebKitAPI/CMakeLists.txt: * TestWebKitAPI/PlatformEfl.cmake: * TestWebKitAPI/PlatformGTK.cmake: * TestWebKitAPI/Tests/WebKit2/ProvisionalURLAfterWillSendRequestCallback.cpp: Added. (TestWebKitAPI::didCommitLoadForFrame): (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebKit2/ProvisionalURLAfterWillSendRequestCallback_Bundle.cpp: Added. (TestWebKitAPI::ProvisionalURLAfterWillSendRequestCallbackTest::ProvisionalURLAfterWillSendRequestCallbackTest): (TestWebKitAPI::ProvisionalURLAfterWillSendRequestCallbackTest::willSendRequestForFrame): (TestWebKitAPI::ProvisionalURLAfterWillSendRequestCallbackTest::didCommitLoadForFrame): git-svn-id: http://svn.webkit.org/repository/webkit/trunk@207325 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent 3defb27 commit 5d6399f

8 files changed

+215
-0
lines changed

Source/WebCore/ChangeLog

+13
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
2016-10-13 Carlos Garcia Campos <[email protected]>
2+
3+
WebView and WebPage URLs not updated after URL is modified by InjectedBundlePageResourceLoadClient::willSendRequestForFrame
4+
https://bugs.webkit.org/show_bug.cgi?id=146306
5+
6+
Reviewed by Darin Adler.
7+
8+
Notify about the provisional URL change when new request set for main resource load in DocumentLoader has a
9+
different URL than the previous one.
10+
11+
* loader/DocumentLoader.cpp:
12+
(WebCore::DocumentLoader::setRequest):
13+
114
2016-10-13 Youenn Fablet <[email protected]>
215

316
Update serializer and iterator binding generated code

Source/WebCore/loader/DocumentLoader.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -234,15 +234,20 @@ void DocumentLoader::setRequest(const ResourceRequest& req)
234234

235235
handlingUnreachableURL = m_substituteData.isValid() && !m_substituteData.failingURL().isEmpty();
236236

237+
bool shouldNotifyAboutProvisionalURLChange = false;
237238
if (handlingUnreachableURL)
238239
m_committed = false;
240+
else if (isLoadingMainResource() && req.url() != m_request.url())
241+
shouldNotifyAboutProvisionalURLChange = true;
239242

240243
// We should never be getting a redirect callback after the data
241244
// source is committed, except in the unreachable URL case. It
242245
// would be a WebFoundation bug if it sent a redirect callback after commit.
243246
ASSERT(!m_committed);
244247

245248
m_request = req;
249+
if (shouldNotifyAboutProvisionalURLChange)
250+
frameLoader()->client().dispatchDidChangeProvisionalURL();
246251
}
247252

248253
void DocumentLoader::setMainDocumentError(const ResourceError& error)

Tools/ChangeLog

+20
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
2016-10-13 Carlos Garcia Campos <[email protected]>
2+
3+
WebView and WebPage URLs not updated after URL is modified by InjectedBundlePageResourceLoadClient::willSendRequestForFrame
4+
https://bugs.webkit.org/show_bug.cgi?id=146306
5+
6+
Reviewed by Darin Adler.
7+
8+
Add unit test to check that the committed URL is updated when changed in willSendRequest callback.
9+
10+
* TestWebKitAPI/CMakeLists.txt:
11+
* TestWebKitAPI/PlatformEfl.cmake:
12+
* TestWebKitAPI/PlatformGTK.cmake:
13+
* TestWebKitAPI/Tests/WebKit2/ProvisionalURLAfterWillSendRequestCallback.cpp: Added.
14+
(TestWebKitAPI::didCommitLoadForFrame):
15+
(TestWebKitAPI::TEST):
16+
* TestWebKitAPI/Tests/WebKit2/ProvisionalURLAfterWillSendRequestCallback_Bundle.cpp: Added.
17+
(TestWebKitAPI::ProvisionalURLAfterWillSendRequestCallbackTest::ProvisionalURLAfterWillSendRequestCallbackTest):
18+
(TestWebKitAPI::ProvisionalURLAfterWillSendRequestCallbackTest::willSendRequestForFrame):
19+
(TestWebKitAPI::ProvisionalURLAfterWillSendRequestCallbackTest::didCommitLoadForFrame):
20+
121
2016-10-13 Alex Christensen <[email protected]>
222

323
Hosts of URLs with non-special schemes should be case-sensitive, and non-ASCII characters in such hosts should be punycode-encoded

Tools/TestWebKitAPI/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ if (ENABLE_WEBKIT2)
149149
${TESTWEBKITAPI_DIR}/Tests/WebKit2/NewFirstVisuallyNonEmptyLayoutFrames_Bundle.cpp
150150
${TESTWEBKITAPI_DIR}/Tests/WebKit2/NewFirstVisuallyNonEmptyLayout_Bundle.cpp
151151
${TESTWEBKITAPI_DIR}/Tests/WebKit2/ParentFrame_Bundle.cpp
152+
${TESTWEBKITAPI_DIR}/Tests/WebKit2/ProvisionalURLAfterWillSendRequestCallback_Bundle.cpp
152153
${TESTWEBKITAPI_DIR}/Tests/WebKit2/ResponsivenessTimerDoesntFireEarly_Bundle.cpp
153154
${TESTWEBKITAPI_DIR}/Tests/WebKit2/ShouldGoToBackForwardListItem_Bundle.cpp
154155
${TESTWEBKITAPI_DIR}/Tests/WebKit2/TextFieldDidBeginAndEndEditing_Bundle.cpp

Tools/TestWebKitAPI/PlatformEfl.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ set(test_webkit2_api_BINARIES
9797
PendingAPIRequestURL
9898
PreventEmptyUserAgent
9999
PrivateBrowsingPushStateNoHistoryCallback
100+
ProvisionalURLAfterWillSendRequestCallback
100101
ResponsivenessTimerDoesntFireEarly
101102
ShouldGoToBackForwardListItem
102103
TerminateTwice

Tools/TestWebKitAPI/PlatformGTK.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ add_executable(TestWebKit2
101101
${TESTWEBKITAPI_DIR}/Tests/WebKit2/PendingAPIRequestURL.cpp
102102
${TESTWEBKITAPI_DIR}/Tests/WebKit2/PreventEmptyUserAgent.cpp
103103
${TESTWEBKITAPI_DIR}/Tests/WebKit2/PrivateBrowsingPushStateNoHistoryCallback.cpp
104+
${TESTWEBKITAPI_DIR}/Tests/WebKit2/ProvisionalURLAfterWillSendRequestCallback.cpp
104105
${TESTWEBKITAPI_DIR}/Tests/WebKit2/ReloadPageAfterCrash.cpp
105106
${TESTWEBKITAPI_DIR}/Tests/WebKit2/ResizeWindowAfterCrash.cpp
106107
${TESTWEBKITAPI_DIR}/Tests/WebKit2/RestoreSessionStateContainingFormData.cpp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* Copyright (C) 2016 Igalia S.L.
3+
*
4+
* Redistribution and use in source and binary forms, with or without
5+
* modification, are permitted provided that the following conditions
6+
* are met:
7+
* 1. Redistributions of source code must retain the above copyright
8+
* notice, this list of conditions and the following disclaimer.
9+
* 2. Redistributions in binary form must reproduce the above copyright
10+
* notice, this list of conditions and the following disclaimer in the
11+
* documentation and/or other materials provided with the distribution.
12+
*
13+
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15+
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17+
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23+
* THE POSSIBILITY OF SUCH DAMAGE.
24+
*/
25+
26+
#include "config.h"
27+
28+
#if WK_HAVE_C_SPI
29+
30+
#include "PlatformUtilities.h"
31+
#include "PlatformWebView.h"
32+
#include "Test.h"
33+
#include <WebKit/WKContext.h>
34+
#include <WebKit/WKFrame.h>
35+
#include <WebKit/WKRetainPtr.h>
36+
37+
namespace TestWebKitAPI {
38+
39+
static bool committedLoad;
40+
41+
static void didCommitLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void*)
42+
{
43+
if (!WKFrameIsMainFrame(frame))
44+
return;
45+
46+
// The provisional URL should be null.
47+
EXPECT_NULL(WKFrameCopyProvisionalURL(frame));
48+
49+
// The committed URL is the last known provisional URL.
50+
WKRetainPtr<WKURLRef> committedURL = adoptWK(WKFrameCopyURL(frame));
51+
ASSERT_NOT_NULL(committedURL.get());
52+
WKRetainPtr<WKURLRef> activeURL = adoptWK(WKPageCopyActiveURL(page));
53+
ASSERT_NOT_NULL(activeURL.get());
54+
EXPECT_TRUE(WKURLIsEqual(committedURL.get(), activeURL.get()));
55+
assert(WKGetTypeID(userData) == WKURLGetTypeID());
56+
EXPECT_TRUE(WKURLIsEqual(committedURL.get(), static_cast<WKURLRef>(userData)));
57+
58+
WKRetainPtr<WKURLRef> url(AdoptWK, Util::createURLForResource("simple2", "html"));
59+
EXPECT_TRUE(WKURLIsEqual(committedURL.get(), url.get()));
60+
61+
committedLoad = true;
62+
}
63+
64+
TEST(WebKit2, ProvisionalURLAfterWillSendRequestCallback)
65+
{
66+
WKRetainPtr<WKContextRef> context(AdoptWK, Util::createContextForInjectedBundleTest("ProvisionalURLAfterWillSendRequestCallbackTest"));
67+
68+
WKContextInjectedBundleClientV0 injectedBundleClient;
69+
memset(&injectedBundleClient, 0, sizeof(injectedBundleClient));
70+
injectedBundleClient.base.version = 0;
71+
WKContextSetInjectedBundleClient(context.get(), &injectedBundleClient.base);
72+
73+
PlatformWebView webView(context.get());
74+
75+
WKPageLoaderClientV0 loaderClient;
76+
memset(&loaderClient, 0, sizeof(loaderClient));
77+
78+
loaderClient.base.version = 0;
79+
loaderClient.didCommitLoadForFrame = didCommitLoadForFrame;
80+
WKPageSetPageLoaderClient(webView.page(), &loaderClient.base);
81+
82+
WKRetainPtr<WKURLRef> url(AdoptWK, Util::createURLForResource("simple", "html"));
83+
WKPageLoadURL(webView.page(), url.get());
84+
Util::run(&committedLoad);
85+
}
86+
87+
} // namespace TestWebKitAPI
88+
89+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
* Copyright (C) 2016 Igalia S.L.
3+
*
4+
* Redistribution and use in source and binary forms, with or without
5+
* modification, are permitted provided that the following conditions
6+
* are met:
7+
* 1. Redistributions of source code must retain the above copyright
8+
* notice, this list of conditions and the following disclaimer.
9+
* 2. Redistributions in binary form must reproduce the above copyright
10+
* notice, this list of conditions and the following disclaimer in the
11+
* documentation and/or other materials provided with the distribution.
12+
*
13+
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15+
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17+
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23+
* THE POSSIBILITY OF SUCH DAMAGE.
24+
*/
25+
26+
#include "config.h"
27+
28+
#if WK_HAVE_C_SPI
29+
30+
#include "InjectedBundleTest.h"
31+
#include "PlatformUtilities.h"
32+
#include "Test.h"
33+
#include <WebKit/WKBundleFrame.h>
34+
#include <WebKit/WKBundlePage.h>
35+
#include <WebKit/WKRetainPtr.h>
36+
37+
namespace TestWebKitAPI {
38+
39+
class ProvisionalURLAfterWillSendRequestCallbackTest : public InjectedBundleTest {
40+
public:
41+
ProvisionalURLAfterWillSendRequestCallbackTest(const std::string& identifier)
42+
: InjectedBundleTest(identifier)
43+
{
44+
}
45+
46+
static WKURLRequestRef willSendRequestForFrame(WKBundlePageRef, WKBundleFrameRef frame, uint64_t resourceIdentifier, WKURLRequestRef request, WKURLResponseRef redirectResponse, const void*)
47+
{
48+
if (!WKBundleFrameIsMainFrame(frame)) {
49+
WKRetainPtr<WKURLRequestRef> newRequest = request;
50+
return newRequest.leakRef();
51+
}
52+
53+
// Change the main frame URL.
54+
WKRetainPtr<WKURLRef> url(AdoptWK, Util::createURLForResource("simple2", "html"));
55+
return WKURLRequestCreateWithWKURL(url.get());
56+
}
57+
58+
static void didCommitLoadForFrame(WKBundlePageRef, WKBundleFrameRef frame, WKTypeRef* userData, const void*)
59+
{
60+
if (!WKBundleFrameIsMainFrame(frame))
61+
return;
62+
*userData = WKBundleFrameCopyURL(frame);
63+
}
64+
65+
void didCreatePage(WKBundleRef bundle, WKBundlePageRef page) override
66+
{
67+
WKBundlePageResourceLoadClientV0 resourceLoadClient;
68+
memset(&resourceLoadClient, 0, sizeof(resourceLoadClient));
69+
resourceLoadClient.base.version = 0;
70+
resourceLoadClient.willSendRequestForFrame = willSendRequestForFrame;
71+
WKBundlePageSetResourceLoadClient(page, &resourceLoadClient.base);
72+
73+
WKBundlePageLoaderClientV0 pageLoaderClient;
74+
memset(&pageLoaderClient, 0, sizeof(pageLoaderClient));
75+
pageLoaderClient.base.version = 0;
76+
pageLoaderClient.didCommitLoadForFrame = didCommitLoadForFrame;
77+
WKBundlePageSetPageLoaderClient(page, &pageLoaderClient.base);
78+
}
79+
};
80+
81+
static InjectedBundleTest::Register<ProvisionalURLAfterWillSendRequestCallbackTest> registrar("ProvisionalURLAfterWillSendRequestCallbackTest");
82+
83+
} // namespace TestWebKitAPI
84+
85+
#endif

0 commit comments

Comments
 (0)