| Index: third_party/WebKit/Source/web/AssociatedURLLoaderTest.cpp
|
| diff --git a/third_party/WebKit/Source/web/AssociatedURLLoaderTest.cpp b/third_party/WebKit/Source/web/AssociatedURLLoaderTest.cpp
|
| deleted file mode 100644
|
| index 7775028e19362c25b7e91fd05704e908c21bacba..0000000000000000000000000000000000000000
|
| --- a/third_party/WebKit/Source/web/AssociatedURLLoaderTest.cpp
|
| +++ /dev/null
|
| @@ -1,722 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2011 Google Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions are
|
| - * met:
|
| - *
|
| - * * Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * * Redistributions in binary form must reproduce the above
|
| - * copyright notice, this list of conditions and the following disclaimer
|
| - * in the documentation and/or other materials provided with the
|
| - * distribution.
|
| - * * Neither the name of Google Inc. nor the names of its
|
| - * contributors may be used to endorse or promote products derived from
|
| - * this software without specific prior written permission.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "platform/testing/URLTestHelpers.h"
|
| -#include "platform/testing/UnitTestHelpers.h"
|
| -#include "public/platform/Platform.h"
|
| -#include "public/platform/WebString.h"
|
| -#include "public/platform/WebThread.h"
|
| -#include "public/platform/WebURL.h"
|
| -#include "public/platform/WebURLLoader.h"
|
| -#include "public/platform/WebURLLoaderClient.h"
|
| -#include "public/platform/WebURLLoaderMockFactory.h"
|
| -#include "public/platform/WebURLRequest.h"
|
| -#include "public/platform/WebURLResponse.h"
|
| -#include "public/web/WebCache.h"
|
| -#include "public/web/WebFrame.h"
|
| -#include "public/web/WebURLLoaderOptions.h"
|
| -#include "public/web/WebView.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "web/tests/FrameTestHelpers.h"
|
| -#include "wtf/PtrUtil.h"
|
| -#include "wtf/text/CString.h"
|
| -#include "wtf/text/WTFString.h"
|
| -#include <memory>
|
| -
|
| -using blink::URLTestHelpers::toKURL;
|
| -using blink::testing::runPendingTasks;
|
| -
|
| -namespace blink {
|
| -
|
| -class AssociatedURLLoaderTest : public ::testing::Test,
|
| - public WebURLLoaderClient {
|
| - public:
|
| - AssociatedURLLoaderTest()
|
| - : m_willFollowRedirect(false),
|
| - m_didSendData(false),
|
| - m_didReceiveResponse(false),
|
| - m_didReceiveData(false),
|
| - m_didReceiveCachedMetadata(false),
|
| - m_didFinishLoading(false),
|
| - m_didFail(false) {
|
| - // Reuse one of the test files from WebFrameTest.
|
| - m_baseFilePath = testing::blinkRootDir();
|
| - m_baseFilePath.append("/Source/web/tests/data/");
|
| - m_frameFilePath = m_baseFilePath;
|
| - m_frameFilePath.append("iframes_test.html");
|
| - }
|
| -
|
| - KURL RegisterMockedUrl(const std::string& urlRoot,
|
| - const WTF::String& filename) {
|
| - WebURLResponse response;
|
| - response.setMIMEType("text/html");
|
| - WTF::String localPath = m_baseFilePath;
|
| - localPath.append(filename);
|
| - KURL url = toKURL(urlRoot + filename.utf8().data());
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(url, response,
|
| - localPath);
|
| - return url;
|
| - }
|
| -
|
| - void SetUp() override {
|
| - m_helper.initialize();
|
| -
|
| - std::string urlRoot = "http://www.test.com/";
|
| - KURL url = RegisterMockedUrl(urlRoot, "iframes_test.html");
|
| - const char* iframeSupportFiles[] = {
|
| - "invisible_iframe.html", "visible_iframe.html",
|
| - "zero_sized_iframe.html",
|
| - };
|
| - for (size_t i = 0; i < WTF_ARRAY_LENGTH(iframeSupportFiles); ++i) {
|
| - RegisterMockedUrl(urlRoot, iframeSupportFiles[i]);
|
| - }
|
| -
|
| - FrameTestHelpers::loadFrame(mainFrame(), url.getString().utf8().data());
|
| -
|
| - Platform::current()->getURLLoaderMockFactory()->unregisterURL(url);
|
| - }
|
| -
|
| - void TearDown() override {
|
| - Platform::current()->getURLLoaderMockFactory()->unregisterAllURLs();
|
| - WebCache::clear();
|
| - }
|
| -
|
| - void serveRequests() {
|
| - Platform::current()->getURLLoaderMockFactory()->serveAsynchronousRequests();
|
| - }
|
| -
|
| - std::unique_ptr<WebURLLoader> createAssociatedURLLoader(
|
| - const WebURLLoaderOptions options = WebURLLoaderOptions()) {
|
| - return wrapUnique(mainFrame()->createAssociatedURLLoader(options));
|
| - }
|
| -
|
| - // WebURLLoaderClient implementation.
|
| - bool willFollowRedirect(WebURLLoader* loader,
|
| - WebURLRequest& newRequest,
|
| - const WebURLResponse& redirectResponse) override {
|
| - m_willFollowRedirect = true;
|
| - EXPECT_EQ(m_expectedLoader.get(), loader);
|
| - EXPECT_EQ(m_expectedNewRequest.url(), newRequest.url());
|
| - // Check that CORS simple headers are transferred to the new request.
|
| - EXPECT_EQ(m_expectedNewRequest.httpHeaderField("accept"),
|
| - newRequest.httpHeaderField("accept"));
|
| - EXPECT_EQ(m_expectedRedirectResponse.url(), redirectResponse.url());
|
| - EXPECT_EQ(m_expectedRedirectResponse.httpStatusCode(),
|
| - redirectResponse.httpStatusCode());
|
| - EXPECT_EQ(m_expectedRedirectResponse.mimeType(),
|
| - redirectResponse.mimeType());
|
| - return true;
|
| - }
|
| -
|
| - void didSendData(WebURLLoader* loader,
|
| - unsigned long long bytesSent,
|
| - unsigned long long totalBytesToBeSent) override {
|
| - m_didSendData = true;
|
| - EXPECT_EQ(m_expectedLoader.get(), loader);
|
| - }
|
| -
|
| - void didReceiveResponse(WebURLLoader* loader,
|
| - const WebURLResponse& response) override {
|
| - m_didReceiveResponse = true;
|
| - m_actualResponse = WebURLResponse(response);
|
| - EXPECT_EQ(m_expectedLoader.get(), loader);
|
| - EXPECT_EQ(m_expectedResponse.url(), response.url());
|
| - EXPECT_EQ(m_expectedResponse.httpStatusCode(), response.httpStatusCode());
|
| - }
|
| -
|
| - void didDownloadData(WebURLLoader* loader,
|
| - int dataLength,
|
| - int encodedDataLength) override {
|
| - m_didDownloadData = true;
|
| - EXPECT_EQ(m_expectedLoader.get(), loader);
|
| - }
|
| -
|
| - void didReceiveData(WebURLLoader* loader,
|
| - const char* data,
|
| - int dataLength,
|
| - int encodedDataLength,
|
| - int encodedBodyLength) override {
|
| - m_didReceiveData = true;
|
| - EXPECT_EQ(m_expectedLoader.get(), loader);
|
| - EXPECT_TRUE(data);
|
| - EXPECT_GT(dataLength, 0);
|
| - }
|
| -
|
| - void didReceiveCachedMetadata(WebURLLoader* loader,
|
| - const char* data,
|
| - int dataLength) override {
|
| - m_didReceiveCachedMetadata = true;
|
| - EXPECT_EQ(m_expectedLoader.get(), loader);
|
| - }
|
| -
|
| - void didFinishLoading(WebURLLoader* loader,
|
| - double finishTime,
|
| - int64_t encodedDataLength) override {
|
| - m_didFinishLoading = true;
|
| - EXPECT_EQ(m_expectedLoader.get(), loader);
|
| - }
|
| -
|
| - void didFail(WebURLLoader* loader, const WebURLError& error) override {
|
| - m_didFail = true;
|
| - EXPECT_EQ(m_expectedLoader.get(), loader);
|
| - }
|
| -
|
| - void CheckMethodFails(const char* unsafeMethod) {
|
| - WebURLRequest request;
|
| - request.setURL(toKURL("http://www.test.com/success.html"));
|
| - request.setHTTPMethod(WebString::fromUTF8(unsafeMethod));
|
| - WebURLLoaderOptions options;
|
| - options.untrustedHTTP = true;
|
| - CheckFails(request, options);
|
| - }
|
| -
|
| - void CheckHeaderFails(const char* headerField) {
|
| - CheckHeaderFails(headerField, "foo");
|
| - }
|
| -
|
| - void CheckHeaderFails(const char* headerField, const char* headerValue) {
|
| - WebURLRequest request;
|
| - request.setURL(toKURL("http://www.test.com/success.html"));
|
| - if (equalIgnoringASCIICase(WebString::fromUTF8(headerField), "referer"))
|
| - request.setHTTPReferrer(WebString::fromUTF8(headerValue),
|
| - WebReferrerPolicyDefault);
|
| - else
|
| - request.setHTTPHeaderField(WebString::fromUTF8(headerField),
|
| - WebString::fromUTF8(headerValue));
|
| - WebURLLoaderOptions options;
|
| - options.untrustedHTTP = true;
|
| - CheckFails(request, options);
|
| - }
|
| -
|
| - void CheckFails(const WebURLRequest& request,
|
| - WebURLLoaderOptions options = WebURLLoaderOptions()) {
|
| - m_expectedLoader = createAssociatedURLLoader(options);
|
| - EXPECT_TRUE(m_expectedLoader);
|
| - m_didFail = false;
|
| - m_expectedLoader->loadAsynchronously(request, this);
|
| - // Failure should not be reported synchronously.
|
| - EXPECT_FALSE(m_didFail);
|
| - // Allow the loader to return the error.
|
| - runPendingTasks();
|
| - EXPECT_TRUE(m_didFail);
|
| - EXPECT_FALSE(m_didReceiveResponse);
|
| - }
|
| -
|
| - bool CheckAccessControlHeaders(const char* headerName, bool exposed) {
|
| - std::string id("http://www.other.com/CheckAccessControlExposeHeaders_");
|
| - id.append(headerName);
|
| - if (exposed)
|
| - id.append("-Exposed");
|
| - id.append(".html");
|
| -
|
| - KURL url = toKURL(id);
|
| - WebURLRequest request;
|
| - request.setURL(url);
|
| -
|
| - WebString headerNameString(WebString::fromUTF8(headerName));
|
| - m_expectedResponse = WebURLResponse();
|
| - m_expectedResponse.setMIMEType("text/html");
|
| - m_expectedResponse.setHTTPStatusCode(200);
|
| - m_expectedResponse.addHTTPHeaderField("Access-Control-Allow-Origin", "*");
|
| - if (exposed)
|
| - m_expectedResponse.addHTTPHeaderField("access-control-expose-headers",
|
| - headerNameString);
|
| - m_expectedResponse.addHTTPHeaderField(headerNameString, "foo");
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - url, m_expectedResponse, m_frameFilePath);
|
| -
|
| - WebURLLoaderOptions options;
|
| - options.crossOriginRequestPolicy =
|
| - WebURLLoaderOptions::CrossOriginRequestPolicyUseAccessControl;
|
| - m_expectedLoader = createAssociatedURLLoader(options);
|
| - EXPECT_TRUE(m_expectedLoader);
|
| - m_expectedLoader->loadAsynchronously(request, this);
|
| - serveRequests();
|
| - EXPECT_TRUE(m_didReceiveResponse);
|
| - EXPECT_TRUE(m_didReceiveData);
|
| - EXPECT_TRUE(m_didFinishLoading);
|
| -
|
| - return !m_actualResponse.httpHeaderField(headerNameString).isEmpty();
|
| - }
|
| -
|
| - WebFrame* mainFrame() const { return m_helper.webView()->mainFrame(); }
|
| -
|
| - protected:
|
| - String m_baseFilePath;
|
| - String m_frameFilePath;
|
| - FrameTestHelpers::WebViewHelper m_helper;
|
| -
|
| - std::unique_ptr<WebURLLoader> m_expectedLoader;
|
| - WebURLResponse m_actualResponse;
|
| - WebURLResponse m_expectedResponse;
|
| - WebURLRequest m_expectedNewRequest;
|
| - WebURLResponse m_expectedRedirectResponse;
|
| - bool m_willFollowRedirect;
|
| - bool m_didSendData;
|
| - bool m_didReceiveResponse;
|
| - bool m_didDownloadData;
|
| - bool m_didReceiveData;
|
| - bool m_didReceiveCachedMetadata;
|
| - bool m_didFinishLoading;
|
| - bool m_didFail;
|
| -};
|
| -
|
| -// Test a successful same-origin URL load.
|
| -TEST_F(AssociatedURLLoaderTest, SameOriginSuccess) {
|
| - KURL url = toKURL("http://www.test.com/SameOriginSuccess.html");
|
| - WebURLRequest request;
|
| - request.setURL(url);
|
| -
|
| - m_expectedResponse = WebURLResponse();
|
| - m_expectedResponse.setMIMEType("text/html");
|
| - m_expectedResponse.setHTTPStatusCode(200);
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - url, m_expectedResponse, m_frameFilePath);
|
| -
|
| - m_expectedLoader = createAssociatedURLLoader();
|
| - EXPECT_TRUE(m_expectedLoader);
|
| - m_expectedLoader->loadAsynchronously(request, this);
|
| - serveRequests();
|
| - EXPECT_TRUE(m_didReceiveResponse);
|
| - EXPECT_TRUE(m_didReceiveData);
|
| - EXPECT_TRUE(m_didFinishLoading);
|
| -}
|
| -
|
| -// Test that the same-origin restriction is the default.
|
| -TEST_F(AssociatedURLLoaderTest, SameOriginRestriction) {
|
| - // This is cross-origin since the frame was loaded from www.test.com.
|
| - KURL url = toKURL("http://www.other.com/SameOriginRestriction.html");
|
| - WebURLRequest request;
|
| - request.setURL(url);
|
| - CheckFails(request);
|
| -}
|
| -
|
| -// Test a successful cross-origin load.
|
| -TEST_F(AssociatedURLLoaderTest, CrossOriginSuccess) {
|
| - // This is cross-origin since the frame was loaded from www.test.com.
|
| - KURL url = toKURL("http://www.other.com/CrossOriginSuccess");
|
| - WebURLRequest request;
|
| - request.setURL(url);
|
| - // No-CORS requests (CrossOriginRequestPolicyAllow) aren't allowed for the
|
| - // default context. So we set the context as Script here.
|
| - request.setRequestContext(WebURLRequest::RequestContextScript);
|
| -
|
| - m_expectedResponse = WebURLResponse();
|
| - m_expectedResponse.setMIMEType("text/html");
|
| - m_expectedResponse.setHTTPStatusCode(200);
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - url, m_expectedResponse, m_frameFilePath);
|
| -
|
| - WebURLLoaderOptions options;
|
| - options.crossOriginRequestPolicy =
|
| - WebURLLoaderOptions::CrossOriginRequestPolicyAllow;
|
| - m_expectedLoader = createAssociatedURLLoader(options);
|
| - EXPECT_TRUE(m_expectedLoader);
|
| - m_expectedLoader->loadAsynchronously(request, this);
|
| - serveRequests();
|
| - EXPECT_TRUE(m_didReceiveResponse);
|
| - EXPECT_TRUE(m_didReceiveData);
|
| - EXPECT_TRUE(m_didFinishLoading);
|
| -}
|
| -
|
| -// Test a successful cross-origin load using CORS.
|
| -TEST_F(AssociatedURLLoaderTest, CrossOriginWithAccessControlSuccess) {
|
| - // This is cross-origin since the frame was loaded from www.test.com.
|
| - KURL url =
|
| - toKURL("http://www.other.com/CrossOriginWithAccessControlSuccess.html");
|
| - WebURLRequest request;
|
| - request.setURL(url);
|
| -
|
| - m_expectedResponse = WebURLResponse();
|
| - m_expectedResponse.setMIMEType("text/html");
|
| - m_expectedResponse.setHTTPStatusCode(200);
|
| - m_expectedResponse.addHTTPHeaderField("access-control-allow-origin", "*");
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - url, m_expectedResponse, m_frameFilePath);
|
| -
|
| - WebURLLoaderOptions options;
|
| - options.crossOriginRequestPolicy =
|
| - WebURLLoaderOptions::CrossOriginRequestPolicyUseAccessControl;
|
| - m_expectedLoader = createAssociatedURLLoader(options);
|
| - EXPECT_TRUE(m_expectedLoader);
|
| - m_expectedLoader->loadAsynchronously(request, this);
|
| - serveRequests();
|
| - EXPECT_TRUE(m_didReceiveResponse);
|
| - EXPECT_TRUE(m_didReceiveData);
|
| - EXPECT_TRUE(m_didFinishLoading);
|
| -}
|
| -
|
| -// Test an unsuccessful cross-origin load using CORS.
|
| -TEST_F(AssociatedURLLoaderTest, CrossOriginWithAccessControlFailure) {
|
| - // This is cross-origin since the frame was loaded from www.test.com.
|
| - KURL url =
|
| - toKURL("http://www.other.com/CrossOriginWithAccessControlFailure.html");
|
| - WebURLRequest request;
|
| - request.setURL(url);
|
| -
|
| - m_expectedResponse = WebURLResponse();
|
| - m_expectedResponse.setMIMEType("text/html");
|
| - m_expectedResponse.setHTTPStatusCode(200);
|
| - m_expectedResponse.addHTTPHeaderField("access-control-allow-origin", "*");
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - url, m_expectedResponse, m_frameFilePath);
|
| -
|
| - WebURLLoaderOptions options;
|
| - // Send credentials. This will cause the CORS checks to fail, because
|
| - // credentials can't be sent to a server which returns the header
|
| - // "access-control-allow-origin" with "*" as its value.
|
| - options.allowCredentials = true;
|
| - options.crossOriginRequestPolicy =
|
| - WebURLLoaderOptions::CrossOriginRequestPolicyUseAccessControl;
|
| - m_expectedLoader = createAssociatedURLLoader(options);
|
| - EXPECT_TRUE(m_expectedLoader);
|
| - m_expectedLoader->loadAsynchronously(request, this);
|
| -
|
| - // Failure should not be reported synchronously.
|
| - EXPECT_FALSE(m_didFail);
|
| - // The loader needs to receive the response, before doing the CORS check.
|
| - serveRequests();
|
| - EXPECT_TRUE(m_didFail);
|
| - EXPECT_FALSE(m_didReceiveResponse);
|
| -}
|
| -
|
| -// Test an unsuccessful cross-origin load using CORS.
|
| -TEST_F(AssociatedURLLoaderTest,
|
| - CrossOriginWithAccessControlFailureBadStatusCode) {
|
| - // This is cross-origin since the frame was loaded from www.test.com.
|
| - KURL url =
|
| - toKURL("http://www.other.com/CrossOriginWithAccessControlFailure.html");
|
| - WebURLRequest request;
|
| - request.setURL(url);
|
| -
|
| - m_expectedResponse = WebURLResponse();
|
| - m_expectedResponse.setMIMEType("text/html");
|
| - m_expectedResponse.setHTTPStatusCode(0);
|
| - m_expectedResponse.addHTTPHeaderField("access-control-allow-origin", "*");
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - url, m_expectedResponse, m_frameFilePath);
|
| -
|
| - WebURLLoaderOptions options;
|
| - options.crossOriginRequestPolicy =
|
| - WebURLLoaderOptions::CrossOriginRequestPolicyUseAccessControl;
|
| - m_expectedLoader = createAssociatedURLLoader(options);
|
| - EXPECT_TRUE(m_expectedLoader);
|
| - m_expectedLoader->loadAsynchronously(request, this);
|
| -
|
| - // Failure should not be reported synchronously.
|
| - EXPECT_FALSE(m_didFail);
|
| - // The loader needs to receive the response, before doing the CORS check.
|
| - serveRequests();
|
| - EXPECT_TRUE(m_didFail);
|
| - EXPECT_FALSE(m_didReceiveResponse);
|
| -}
|
| -
|
| -// Test a same-origin URL redirect and load.
|
| -TEST_F(AssociatedURLLoaderTest, RedirectSuccess) {
|
| - KURL url = toKURL("http://www.test.com/RedirectSuccess.html");
|
| - char redirect[] = "http://www.test.com/RedirectSuccess2.html"; // Same-origin
|
| - KURL redirectURL = toKURL(redirect);
|
| -
|
| - WebURLRequest request;
|
| - request.setURL(url);
|
| -
|
| - m_expectedRedirectResponse = WebURLResponse();
|
| - m_expectedRedirectResponse.setMIMEType("text/html");
|
| - m_expectedRedirectResponse.setHTTPStatusCode(301);
|
| - m_expectedRedirectResponse.setHTTPHeaderField("Location", redirect);
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - url, m_expectedRedirectResponse, m_frameFilePath);
|
| -
|
| - m_expectedNewRequest = WebURLRequest();
|
| - m_expectedNewRequest.setURL(redirectURL);
|
| -
|
| - m_expectedResponse = WebURLResponse();
|
| - m_expectedResponse.setMIMEType("text/html");
|
| - m_expectedResponse.setHTTPStatusCode(200);
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - redirectURL, m_expectedResponse, m_frameFilePath);
|
| -
|
| - m_expectedLoader = createAssociatedURLLoader();
|
| - EXPECT_TRUE(m_expectedLoader);
|
| - m_expectedLoader->loadAsynchronously(request, this);
|
| - serveRequests();
|
| - EXPECT_TRUE(m_willFollowRedirect);
|
| - EXPECT_TRUE(m_didReceiveResponse);
|
| - EXPECT_TRUE(m_didReceiveData);
|
| - EXPECT_TRUE(m_didFinishLoading);
|
| -}
|
| -
|
| -// Test a cross-origin URL redirect without Access Control set.
|
| -TEST_F(AssociatedURLLoaderTest, RedirectCrossOriginFailure) {
|
| - KURL url = toKURL("http://www.test.com/RedirectCrossOriginFailure.html");
|
| - char redirect[] =
|
| - "http://www.other.com/RedirectCrossOriginFailure.html"; // Cross-origin
|
| - KURL redirectURL = toKURL(redirect);
|
| -
|
| - WebURLRequest request;
|
| - request.setURL(url);
|
| -
|
| - m_expectedRedirectResponse = WebURLResponse();
|
| - m_expectedRedirectResponse.setMIMEType("text/html");
|
| - m_expectedRedirectResponse.setHTTPStatusCode(301);
|
| - m_expectedRedirectResponse.setHTTPHeaderField("Location", redirect);
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - url, m_expectedRedirectResponse, m_frameFilePath);
|
| -
|
| - m_expectedNewRequest = WebURLRequest();
|
| - m_expectedNewRequest.setURL(redirectURL);
|
| -
|
| - m_expectedResponse = WebURLResponse();
|
| - m_expectedResponse.setMIMEType("text/html");
|
| - m_expectedResponse.setHTTPStatusCode(200);
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - redirectURL, m_expectedResponse, m_frameFilePath);
|
| -
|
| - m_expectedLoader = createAssociatedURLLoader();
|
| - EXPECT_TRUE(m_expectedLoader);
|
| - m_expectedLoader->loadAsynchronously(request, this);
|
| -
|
| - serveRequests();
|
| - EXPECT_FALSE(m_willFollowRedirect);
|
| - EXPECT_FALSE(m_didReceiveResponse);
|
| - EXPECT_FALSE(m_didReceiveData);
|
| - EXPECT_FALSE(m_didFinishLoading);
|
| -}
|
| -
|
| -// Test that a cross origin redirect response without CORS headers fails.
|
| -TEST_F(AssociatedURLLoaderTest, RedirectCrossOriginWithAccessControlFailure) {
|
| - KURL url = toKURL(
|
| - "http://www.test.com/RedirectCrossOriginWithAccessControlFailure.html");
|
| - char redirect[] =
|
| - "http://www.other.com/"
|
| - "RedirectCrossOriginWithAccessControlFailure.html"; // Cross-origin
|
| - KURL redirectURL = toKURL(redirect);
|
| -
|
| - WebURLRequest request;
|
| - request.setURL(url);
|
| -
|
| - m_expectedRedirectResponse = WebURLResponse();
|
| - m_expectedRedirectResponse.setMIMEType("text/html");
|
| - m_expectedRedirectResponse.setHTTPStatusCode(301);
|
| - m_expectedRedirectResponse.setHTTPHeaderField("Location", redirect);
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - url, m_expectedRedirectResponse, m_frameFilePath);
|
| -
|
| - m_expectedNewRequest = WebURLRequest();
|
| - m_expectedNewRequest.setURL(redirectURL);
|
| -
|
| - m_expectedResponse = WebURLResponse();
|
| - m_expectedResponse.setMIMEType("text/html");
|
| - m_expectedResponse.setHTTPStatusCode(200);
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - redirectURL, m_expectedResponse, m_frameFilePath);
|
| -
|
| - WebURLLoaderOptions options;
|
| - options.crossOriginRequestPolicy =
|
| - WebURLLoaderOptions::CrossOriginRequestPolicyUseAccessControl;
|
| - m_expectedLoader = createAssociatedURLLoader(options);
|
| - EXPECT_TRUE(m_expectedLoader);
|
| - m_expectedLoader->loadAsynchronously(request, this);
|
| -
|
| - serveRequests();
|
| - // We should get a notification about access control check failure.
|
| - EXPECT_FALSE(m_willFollowRedirect);
|
| - EXPECT_FALSE(m_didReceiveResponse);
|
| - EXPECT_FALSE(m_didReceiveData);
|
| - EXPECT_TRUE(m_didFail);
|
| -}
|
| -
|
| -// Test that a cross origin redirect response with CORS headers that allow the
|
| -// requesting origin succeeds.
|
| -TEST_F(AssociatedURLLoaderTest, RedirectCrossOriginWithAccessControlSuccess) {
|
| - KURL url = toKURL(
|
| - "http://www.test.com/RedirectCrossOriginWithAccessControlSuccess.html");
|
| - char redirect[] =
|
| - "http://www.other.com/"
|
| - "RedirectCrossOriginWithAccessControlSuccess.html"; // Cross-origin
|
| - KURL redirectURL = toKURL(redirect);
|
| -
|
| - WebURLRequest request;
|
| - request.setURL(url);
|
| - // Add a CORS simple header.
|
| - request.setHTTPHeaderField("accept", "application/json");
|
| -
|
| - // Create a redirect response that allows the redirect to pass the access
|
| - // control checks.
|
| - m_expectedRedirectResponse = WebURLResponse();
|
| - m_expectedRedirectResponse.setMIMEType("text/html");
|
| - m_expectedRedirectResponse.setHTTPStatusCode(301);
|
| - m_expectedRedirectResponse.setHTTPHeaderField("Location", redirect);
|
| - m_expectedRedirectResponse.addHTTPHeaderField("access-control-allow-origin",
|
| - "*");
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - url, m_expectedRedirectResponse, m_frameFilePath);
|
| -
|
| - m_expectedNewRequest = WebURLRequest();
|
| - m_expectedNewRequest.setURL(redirectURL);
|
| - m_expectedNewRequest.setHTTPHeaderField("accept", "application/json");
|
| -
|
| - m_expectedResponse = WebURLResponse();
|
| - m_expectedResponse.setMIMEType("text/html");
|
| - m_expectedResponse.setHTTPStatusCode(200);
|
| - m_expectedResponse.addHTTPHeaderField("access-control-allow-origin", "*");
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - redirectURL, m_expectedResponse, m_frameFilePath);
|
| -
|
| - WebURLLoaderOptions options;
|
| - options.crossOriginRequestPolicy =
|
| - WebURLLoaderOptions::CrossOriginRequestPolicyUseAccessControl;
|
| - m_expectedLoader = createAssociatedURLLoader(options);
|
| - EXPECT_TRUE(m_expectedLoader);
|
| - m_expectedLoader->loadAsynchronously(request, this);
|
| - serveRequests();
|
| - // We should not receive a notification for the redirect.
|
| - EXPECT_FALSE(m_willFollowRedirect);
|
| - EXPECT_TRUE(m_didReceiveResponse);
|
| - EXPECT_TRUE(m_didReceiveData);
|
| - EXPECT_TRUE(m_didFinishLoading);
|
| -}
|
| -
|
| -// Test that untrusted loads can't use a forbidden method.
|
| -TEST_F(AssociatedURLLoaderTest, UntrustedCheckMethods) {
|
| - // Check non-token method fails.
|
| - CheckMethodFails("GET()");
|
| - CheckMethodFails("POST\x0d\x0ax-csrf-token:\x20test1234");
|
| -
|
| - // Forbidden methods should fail regardless of casing.
|
| - CheckMethodFails("CoNneCt");
|
| - CheckMethodFails("TrAcK");
|
| - CheckMethodFails("TrAcE");
|
| -}
|
| -
|
| -// This test is flaky on Windows and Android. See <http://crbug.com/471645>.
|
| -#if OS(WIN) || OS(ANDROID)
|
| -#define MAYBE_UntrustedCheckHeaders DISABLED_UntrustedCheckHeaders
|
| -#else
|
| -#define MAYBE_UntrustedCheckHeaders UntrustedCheckHeaders
|
| -#endif
|
| -
|
| -// Test that untrusted loads can't use a forbidden header field.
|
| -TEST_F(AssociatedURLLoaderTest, MAYBE_UntrustedCheckHeaders) {
|
| - // Check non-token header fails.
|
| - CheckHeaderFails("foo()");
|
| -
|
| - // Check forbidden headers fail.
|
| - CheckHeaderFails("accept-charset");
|
| - CheckHeaderFails("accept-encoding");
|
| - CheckHeaderFails("connection");
|
| - CheckHeaderFails("content-length");
|
| - CheckHeaderFails("cookie");
|
| - CheckHeaderFails("cookie2");
|
| - CheckHeaderFails("date");
|
| - CheckHeaderFails("dnt");
|
| - CheckHeaderFails("expect");
|
| - CheckHeaderFails("host");
|
| - CheckHeaderFails("keep-alive");
|
| - CheckHeaderFails("origin");
|
| - CheckHeaderFails("referer", "http://example.com/");
|
| - CheckHeaderFails("te");
|
| - CheckHeaderFails("trailer");
|
| - CheckHeaderFails("transfer-encoding");
|
| - CheckHeaderFails("upgrade");
|
| - CheckHeaderFails("user-agent");
|
| - CheckHeaderFails("via");
|
| -
|
| - CheckHeaderFails("proxy-");
|
| - CheckHeaderFails("proxy-foo");
|
| - CheckHeaderFails("sec-");
|
| - CheckHeaderFails("sec-foo");
|
| -
|
| - // Check that validation is case-insensitive.
|
| - CheckHeaderFails("AcCePt-ChArSeT");
|
| - CheckHeaderFails("ProXy-FoO");
|
| -
|
| - // Check invalid header values.
|
| - CheckHeaderFails("foo", "bar\x0d\x0ax-csrf-token:\x20test1234");
|
| -}
|
| -
|
| -// Test that the loader filters response headers according to the CORS standard.
|
| -TEST_F(AssociatedURLLoaderTest, CrossOriginHeaderWhitelisting) {
|
| - // Test that whitelisted headers are returned without exposing them.
|
| - EXPECT_TRUE(CheckAccessControlHeaders("cache-control", false));
|
| - EXPECT_TRUE(CheckAccessControlHeaders("content-language", false));
|
| - EXPECT_TRUE(CheckAccessControlHeaders("content-type", false));
|
| - EXPECT_TRUE(CheckAccessControlHeaders("expires", false));
|
| - EXPECT_TRUE(CheckAccessControlHeaders("last-modified", false));
|
| - EXPECT_TRUE(CheckAccessControlHeaders("pragma", false));
|
| -
|
| - // Test that non-whitelisted headers aren't returned.
|
| - EXPECT_FALSE(CheckAccessControlHeaders("non-whitelisted", false));
|
| -
|
| - // Test that Set-Cookie headers aren't returned.
|
| - EXPECT_FALSE(CheckAccessControlHeaders("Set-Cookie", false));
|
| - EXPECT_FALSE(CheckAccessControlHeaders("Set-Cookie2", false));
|
| -
|
| - // Test that exposed headers that aren't whitelisted are returned.
|
| - EXPECT_TRUE(CheckAccessControlHeaders("non-whitelisted", true));
|
| -
|
| - // Test that Set-Cookie headers aren't returned, even if exposed.
|
| - EXPECT_FALSE(CheckAccessControlHeaders("Set-Cookie", true));
|
| -}
|
| -
|
| -// Test that the loader can allow non-whitelisted response headers for trusted
|
| -// CORS loads.
|
| -TEST_F(AssociatedURLLoaderTest, CrossOriginHeaderAllowResponseHeaders) {
|
| - WebURLRequest request;
|
| - KURL url =
|
| - toKURL("http://www.other.com/CrossOriginHeaderAllowResponseHeaders.html");
|
| - request.setURL(url);
|
| -
|
| - WebString headerNameString(WebString::fromUTF8("non-whitelisted"));
|
| - m_expectedResponse = WebURLResponse();
|
| - m_expectedResponse.setMIMEType("text/html");
|
| - m_expectedResponse.setHTTPStatusCode(200);
|
| - m_expectedResponse.addHTTPHeaderField("Access-Control-Allow-Origin", "*");
|
| - m_expectedResponse.addHTTPHeaderField(headerNameString, "foo");
|
| - Platform::current()->getURLLoaderMockFactory()->registerURL(
|
| - url, m_expectedResponse, m_frameFilePath);
|
| -
|
| - WebURLLoaderOptions options;
|
| - options.exposeAllResponseHeaders =
|
| - true; // This turns off response whitelisting.
|
| - options.crossOriginRequestPolicy =
|
| - WebURLLoaderOptions::CrossOriginRequestPolicyUseAccessControl;
|
| - m_expectedLoader = createAssociatedURLLoader(options);
|
| - EXPECT_TRUE(m_expectedLoader);
|
| - m_expectedLoader->loadAsynchronously(request, this);
|
| - serveRequests();
|
| - EXPECT_TRUE(m_didReceiveResponse);
|
| - EXPECT_TRUE(m_didReceiveData);
|
| - EXPECT_TRUE(m_didFinishLoading);
|
| -
|
| - EXPECT_FALSE(m_actualResponse.httpHeaderField(headerNameString).isEmpty());
|
| -}
|
| -
|
| -} // namespace blink
|
|
|