Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(193)

Unified Diff: third_party/WebKit/Source/web/tests/WebDocumentSubresourceFilterTest.cpp

Issue 2022783002: Skeleton of the Safe Browsing Subresource Filter. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Implement RenderFrameObserver::OnDestruct introduced by rebase. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/web/WebDataSourceImpl.cpp ('k') | third_party/WebKit/Source/web/web.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/web/tests/WebDocumentSubresourceFilterTest.cpp
diff --git a/third_party/WebKit/Source/web/tests/WebDocumentSubresourceFilterTest.cpp b/third_party/WebKit/Source/web/tests/WebDocumentSubresourceFilterTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a381dbe330212c6da85815c5341672a6f581e4c2
--- /dev/null
+++ b/third_party/WebKit/Source/web/tests/WebDocumentSubresourceFilterTest.cpp
@@ -0,0 +1,144 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "public/platform/WebDocumentSubresourceFilter.h"
+
+#include "core/dom/Element.h"
+#include "core/html/HTMLImageElement.h"
+#include "platform/testing/URLTestHelpers.h"
+#include "public/platform/Platform.h"
+#include "public/platform/WebURLLoaderMockFactory.h"
+#include "public/web/WebCache.h"
+#include "public/web/WebDocument.h"
+#include "public/web/WebElement.h"
+#include "public/web/WebLocalFrame.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "web/tests/FrameTestHelpers.h"
+
+namespace blink {
+
+namespace {
+
+class TestDocumentSubresourceFilter : public WebDocumentSubresourceFilter {
+public:
+ explicit TestDocumentSubresourceFilter(bool allowLoads)
+ : m_allowLoads(allowLoads)
+ {
+ }
+
+ bool allowLoad(const WebURL& resourceUrl, WebURLRequest::RequestContext) override
+ {
+ std::string resourcePath = WebString(KURL(resourceUrl).path()).utf8();
+ if (std::find(m_queriedSubresourcePaths.begin(), m_queriedSubresourcePaths.end(), resourcePath) == m_queriedSubresourcePaths.end())
+ m_queriedSubresourcePaths.push_back(resourcePath);
+ return m_allowLoads;
+ }
+
+ const std::vector<std::string>& queriedSubresourcePaths() const { return m_queriedSubresourcePaths; }
+
+private:
+ std::vector<std::string> m_queriedSubresourcePaths;
+ bool m_allowLoads;
+};
+
+class SubresourceFilteringWebFrameClient : public FrameTestHelpers::TestWebFrameClient {
+public:
+ void didStartProvisionalLoad(WebLocalFrame* localFrame, double) override
+ {
+ // Normally, the filter should be set when the load is committed. For
+ // the sake of this test, however, inject it earlier to verify that it
+ // is not consulted for the main resource load.
+ m_subresourceFilter = new TestDocumentSubresourceFilter(m_allowSubresourcesFromNextLoad);
+ localFrame->provisionalDataSource()->setSubresourceFilter(m_subresourceFilter);
+ }
+
+ void setAllowSubresourcesFromNextLoad(bool allow) { m_allowSubresourcesFromNextLoad = allow; }
+ const TestDocumentSubresourceFilter* subresourceFilter() const { return m_subresourceFilter; }
+
+private:
+ // Weak, owned by WebDataSource.
+ TestDocumentSubresourceFilter* m_subresourceFilter = nullptr;
+ bool m_allowSubresourcesFromNextLoad = false;
+};
+
+} // namespace
+
+class WebDocumentSubresourceFilterTest : public ::testing::Test {
+protected:
+ WebDocumentSubresourceFilterTest()
+ : m_baseURL("http://internal.test/")
+ {
+ registerMockedHttpURLLoad("white-1x1.png");
+ registerMockedHttpURLLoad("foo_with_image.html");
+ m_webViewHelper.initialize(false /* enableJavascript */, &m_client);
+ }
+
+ void loadDocument(bool allowSubresources)
+ {
+ m_client.setAllowSubresourcesFromNextLoad(allowSubresources);
+ FrameTestHelpers::loadFrame(mainFrame(), baseURL() + "foo_with_image.html");
+ }
+
+ void expectSubresourceWasLoaded(bool loaded)
+ {
+ WebElement webElement = mainFrame()->document().querySelector("img");
+ ASSERT_TRUE(isHTMLImageElement(webElement));
+ HTMLImageElement* imageElement = toHTMLImageElement(webElement);
+ EXPECT_EQ(loaded, !!imageElement->cachedImage());
+ }
+
+ const std::string& baseURL() const { return m_baseURL; }
+ WebFrame* mainFrame() { return m_webViewHelper.webViewImpl()->mainFrame(); }
+ const std::vector<std::string>& queriedSubresourcePaths() const { return m_client.subresourceFilter()->queriedSubresourcePaths(); }
+
+private:
+ void registerMockedHttpURLLoad(const std::string& fileName)
+ {
+ URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8(fileName.c_str()));
+ }
+
+ // ::testing::Test:
+ void TearDown() override
+ {
+ Platform::current()->getURLLoaderMockFactory()->unregisterAllURLs();
+ WebCache::clear();
+ }
+
+ SubresourceFilteringWebFrameClient m_client;
+ FrameTestHelpers::WebViewHelper m_webViewHelper;
+ std::string m_baseURL;
+};
+
+TEST_F(WebDocumentSubresourceFilterTest, AllowedSubresource)
+{
+ loadDocument(true /* allowSubresources */);
+ expectSubresourceWasLoaded(true);
+ // The filter should not be consulted for the main document resource.
+ EXPECT_THAT(queriedSubresourcePaths(), testing::ElementsAre("/white-1x1.png"));
+}
+
+TEST_F(WebDocumentSubresourceFilterTest, DisallowedSubresource)
+{
+ loadDocument(false /* allowSubresources */);
+ expectSubresourceWasLoaded(false);
+}
+
+TEST_F(WebDocumentSubresourceFilterTest, FilteringDecisionIsMadeLoadByLoad)
+{
+ for (const bool allowSubresources : { false, true }) {
+ SCOPED_TRACE(testing::Message() << "First load allows subresources = " << allowSubresources);
+
+ loadDocument(allowSubresources);
+ expectSubresourceWasLoaded(allowSubresources);
+
+ loadDocument(!allowSubresources);
+ expectSubresourceWasLoaded(!allowSubresources);
+ EXPECT_THAT(queriedSubresourcePaths(), testing::ElementsAre("/white-1x1.png"));
+
+ WebCache::clear();
+ }
+}
+
+} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/web/WebDataSourceImpl.cpp ('k') | third_party/WebKit/Source/web/web.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698