Skip to content

Commit

Permalink
MPArch: Make PageSpecificContentSettings work with prerendering
Browse files Browse the repository at this point in the history
This CL stops PSCS for prerendering pages from notifying delegates/
observers of content settings changes. The updates are queued up and
only dispatched when the page is activated. If the prerendering page is
discarded, the updates are never sent.

Bug: 1187618
Change-Id: I7e07b6928b19b4150031b41f1a9cb813f5358f9e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2860587
Commit-Queue: Adithya Srinivasan <adithyas@chromium.org>
Reviewed-by: Balazs Engedy <engedy@chromium.org>
Reviewed-by: Alex Moshchuk <alexmos@chromium.org>
Reviewed-by: Lucas Gadani <lfg@chromium.org>
Reviewed-by: Hiroki Nakagawa <nhiroki@chromium.org>
Cr-Commit-Position: refs/heads/master@{#892256}
  • Loading branch information
a4sriniv authored and Chromium LUCI CQ committed Jun 14, 2021
1 parent 816a111 commit 8bda0b2
Show file tree
Hide file tree
Showing 8 changed files with 480 additions and 89 deletions.
96 changes: 96 additions & 0 deletions chrome/browser/content_settings/content_settings_browsertest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/ppapi_test_utils.h"
#include "content/public/test/prerender_test_util.h"
#include "content/public/test/test_utils.h"
#include "net/cookies/canonical_cookie_test_helpers.h"
#include "net/dns/mock_host_resolver.h"
Expand Down Expand Up @@ -1319,3 +1320,98 @@ IN_PROC_BROWSER_TEST_F(ContentSettingsWorkerModulesBrowserTest, CookieStore) {
EXPECT_THAT(blocked_cookies, net::MatchesCookieLine("second=value"));
}
}

class ContentSettingsWithPrerenderingBrowserTest : public ContentSettingsTest {
public:
ContentSettingsWithPrerenderingBrowserTest()
: prerender_test_helper_(base::BindRepeating(
&ContentSettingsWithPrerenderingBrowserTest::GetWebContents,
base::Unretained(this))) {}

void SetUpOnMainThread() override {
prerender_test_helper().SetUpOnMainThread(embedded_test_server());
ContentSettingsTest::SetUpOnMainThread();
ASSERT_TRUE(embedded_test_server()->Start());
}

content::test::PrerenderTestHelper& prerender_test_helper() {
return prerender_test_helper_;
}

content::WebContents* GetWebContents() {
return browser()->tab_strip_model()->GetActiveWebContents();
}

private:
content::test::PrerenderTestHelper prerender_test_helper_;
};

IN_PROC_BROWSER_TEST_F(ContentSettingsWithPrerenderingBrowserTest,
PrerenderingPageSetsCookie) {
const GURL main_url = embedded_test_server()->GetURL("/empty.html");
const GURL prerender_url =
embedded_test_server()->GetURL("/set_cookie_header.html");

ui_test_utils::NavigateToURL(browser(), main_url);
ASSERT_EQ(GetWebContents()->GetLastCommittedURL(), main_url);

prerender_test_helper().AddPrerender(prerender_url);
int host_id = prerender_test_helper().GetHostForUrl(prerender_url);
content::RenderFrameHost* prerender_frame =
prerender_test_helper().GetPrerenderedMainFrameHost(host_id);
EXPECT_NE(prerender_frame, nullptr);

auto* prerender_pscs =
PageSpecificContentSettings::GetForFrame(prerender_frame);
EXPECT_TRUE(prerender_pscs->IsContentAllowed(ContentSettingsType::COOKIES));
EXPECT_EQ(prerender_pscs->allowed_local_shared_objects().GetObjectCount(),
1u);
auto* main_pscs = PageSpecificContentSettings::GetForFrame(
GetWebContents()->GetMainFrame());
EXPECT_FALSE(main_pscs->IsContentAllowed(ContentSettingsType::COOKIES));
EXPECT_EQ(main_pscs->allowed_local_shared_objects().GetObjectCount(), 0u);

prerender_test_helper().NavigatePrimaryPage(prerender_url);

main_pscs = PageSpecificContentSettings::GetForFrame(
GetWebContents()->GetMainFrame());
EXPECT_TRUE(main_pscs->IsContentAllowed(ContentSettingsType::COOKIES));
EXPECT_EQ(main_pscs->allowed_local_shared_objects().GetObjectCount(), 1u);
}

IN_PROC_BROWSER_TEST_F(ContentSettingsWithPrerenderingBrowserTest,
PrerenderingPageIframeSetsCookie) {
const GURL main_url = embedded_test_server()->GetURL("/empty.html");
const GURL prerender_url = embedded_test_server()->GetURL("/title1.html");
const GURL iframe_url =
embedded_test_server()->GetURL("/set_cookie_header.html");

ui_test_utils::NavigateToURL(browser(), main_url);
ASSERT_EQ(GetWebContents()->GetLastCommittedURL(), main_url);

prerender_test_helper().AddPrerender(prerender_url);
int host_id = prerender_test_helper().GetHostForUrl(prerender_url);
content::RenderFrameHost* prerender_frame =
prerender_test_helper().GetPrerenderedMainFrameHost(host_id);
EXPECT_NE(prerender_frame, nullptr);

content::TestNavigationManager navigation_manager(GetWebContents(),
iframe_url);
EXPECT_TRUE(content::ExecJs(
prerender_frame,
content::JsReplace("const iframe = document.createElement('iframe');"
"iframe.src = $1;"
"document.body.appendChild(iframe);",
iframe_url)));
navigation_manager.WaitForNavigationFinished();

auto* prerender_pscs =
PageSpecificContentSettings::GetForFrame(prerender_frame);
EXPECT_TRUE(prerender_pscs->IsContentAllowed(ContentSettingsType::COOKIES));
EXPECT_EQ(prerender_pscs->allowed_local_shared_objects().GetObjectCount(),
1u);
auto* main_pscs = PageSpecificContentSettings::GetForFrame(
GetWebContents()->GetMainFrame());
EXPECT_FALSE(main_pscs->IsContentAllowed(ContentSettingsType::COOKIES));
EXPECT_EQ(main_pscs->allowed_local_shared_objects().GetObjectCount(), 0u);
}

0 comments on commit 8bda0b2

Please sign in to comment.