Commit c12d5629 authored by Clark DuVall's avatar Clark DuVall Committed by Commit Bot

[WebLayer] Implement ContentSettingsManager in WebLayer

This is used by ContentSettingsAgentImpl to query for storage
permissions in the browser process.

Bug: 1065537
Change-Id: Idd8176bf801c6636559304c6d23ce6c6b1237405
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2145257
Commit-Queue: Clark DuVall <cduvall@chromium.org>
Reviewed-by: default avatarRobert Sesek <rsesek@chromium.org>
Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Reviewed-by: default avatarMugdha Lakhani <nator@chromium.org>
Cr-Commit-Position: refs/heads/master@{#759436}
parent 103395c0
......@@ -114,6 +114,9 @@ source_set("weblayer_lib_base") {
"browser/client_hints_factory.h",
"browser/content_browser_client_impl.cc",
"browser/content_browser_client_impl.h",
"browser/content_browser_client_impl_receiver_bindings.cc",
"browser/content_settings_manager_impl.cc",
"browser/content_settings_manager_impl.h",
"browser/controls_visibility_reason.h",
"browser/cookie_manager_impl.cc",
"browser/cookie_manager_impl.h",
......@@ -238,6 +241,7 @@ source_set("weblayer_lib_base") {
"//components/captive_portal/core:buildflags",
"//components/cdm/renderer",
"//components/client_hints/browser",
"//components/content_settings/common:mojom",
"//components/content_settings/core/browser",
"//components/content_settings/renderer",
"//components/crash/content/browser",
......
......@@ -9,6 +9,7 @@ include_rules = [
"+components/captive_portal",
"+components/cdm/browser",
"+components/client_hints/browser",
"+components/content_settings/common",
"+components/content_settings/core/common",
"+components/crash/content/browser",
"+components/crash/core/common",
......
......@@ -2,3 +2,5 @@ per-file weblayer_content_browser_overlay_manifest.*=set noparent
per-file weblayer_content_browser_overlay_manifest.*=file://ipc/SECURITY_OWNERS
per-file weblayer_browser_interface_binders.*=set noparent
per-file weblayer_browser_interface_binders.*=file://ipc/SECURITY_OWNERS
per-file content_browser_client_impl_receiver_bindings.*=set noparent
per-file content_browser_client_impl_receiver_bindings.*=file://ipc/SECURITY_OWNERS
......@@ -238,6 +238,9 @@ void BrowserContextImpl::RegisterPrefs(
permissions::GeolocationPermissionContextAndroid::RegisterProfilePrefs(
pref_registry);
#endif
BrowserContextDependencyManager::GetInstance()
->RegisterProfilePrefsForServices(pref_registry);
}
class BrowserContextImpl::WebLayerVariationsClient
......
......@@ -22,6 +22,7 @@
#include "services/service_manager/embedder/result_codes.h"
#include "ui/base/resource/resource_bundle.h"
#include "weblayer/browser/browser_process.h"
#include "weblayer/browser/cookie_settings_factory.h"
#include "weblayer/browser/feature_list_creator.h"
#include "weblayer/browser/host_content_settings_map_factory.h"
#include "weblayer/browser/permissions/weblayer_permissions_client.h"
......@@ -68,6 +69,7 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt() {
#endif
HostContentSettingsMapFactory::GetInstance();
StatefulSSLHostStateDelegateFactory::GetInstance();
CookieSettingsFactory::GetInstance();
}
void StopMessageLoop(base::OnceClosure quit_closure) {
......
......@@ -89,6 +89,9 @@ class ContentBrowserClientImpl : public content::ContentBrowserClient {
content::RenderFrameHost* render_frame_host,
service_manager::BinderMapWithContext<content::RenderFrameHost*>* map)
override;
void BindHostReceiverForRenderer(
content::RenderProcessHost* render_process_host,
mojo::GenericPendingReceiver receiver) override;
void RenderProcessWillLaunch(content::RenderProcessHost* host) override;
scoped_refptr<content::QuotaPermissionContext> CreateQuotaPermissionContext()
override;
......
// Copyright 2020 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.
// This file exposes services from the browser to child processes.
#include "weblayer/browser/content_browser_client_impl.h"
#include "weblayer/browser/content_settings_manager_impl.h"
namespace weblayer {
void ContentBrowserClientImpl::BindHostReceiverForRenderer(
content::RenderProcessHost* render_process_host,
mojo::GenericPendingReceiver receiver) {
if (auto host_receiver =
receiver.As<content_settings::mojom::ContentSettingsManager>()) {
ContentSettingsManagerImpl::Create(render_process_host,
std::move(host_receiver));
return;
}
}
} // namespace weblayer
// Copyright 2020 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 "components/content_settings/core/browser/cookie_settings.h"
#include "content/public/test/browser_test_utils.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "weblayer/browser/cookie_settings_factory.h"
#include "weblayer/browser/tab_impl.h"
#include "weblayer/shell/browser/shell.h"
#include "weblayer/test/weblayer_browser_test.h"
#include "weblayer/test/weblayer_browser_test_utils.h"
namespace weblayer {
namespace {
constexpr char kHasLocalStorageScript[] = R"(
new Promise(function (resolve, reject) {
try {
localStorage.setItem('foo', 'bar');
resolve(true);
} catch(e) {
resolve(false);
}
})
)";
} // namespace
using ContentSettingsBrowserTest = WebLayerBrowserTest;
IN_PROC_BROWSER_TEST_F(ContentSettingsBrowserTest, LocalStorageAvailable) {
ASSERT_TRUE(embedded_test_server()->Start());
NavigateAndWaitForCompletion(embedded_test_server()->GetURL("/echo"),
shell());
content::WebContents* web_contents =
static_cast<TabImpl*>(shell()->tab())->web_contents();
EXPECT_TRUE(
content::EvalJs(web_contents, kHasLocalStorageScript).ExtractBool());
}
IN_PROC_BROWSER_TEST_F(ContentSettingsBrowserTest, LocalStorageDenied) {
ASSERT_TRUE(embedded_test_server()->Start());
NavigateAndWaitForCompletion(embedded_test_server()->GetURL("/echo"),
shell());
content::WebContents* web_contents =
static_cast<TabImpl*>(shell()->tab())->web_contents();
// Blocking cookies for this URL should also block local storage.
CookieSettingsFactory::GetForBrowserContext(web_contents->GetBrowserContext())
->SetCookieSetting(embedded_test_server()->base_url(),
CONTENT_SETTING_BLOCK);
EXPECT_FALSE(
content::EvalJs(web_contents, kHasLocalStorageScript).ExtractBool());
}
} // namespace weblayer
// Copyright 2020 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 "weblayer/browser/content_settings_manager_impl.h"
#include "components/content_settings/core/browser/cookie_settings.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "weblayer/browser/cookie_settings_factory.h"
namespace weblayer {
ContentSettingsManagerImpl::~ContentSettingsManagerImpl() = default;
// static
void ContentSettingsManagerImpl::Create(
content::RenderProcessHost* render_process_host,
mojo::PendingReceiver<content_settings::mojom::ContentSettingsManager>
receiver) {
mojo::MakeSelfOwnedReceiver(
base::WrapUnique(new ContentSettingsManagerImpl(render_process_host)),
std::move(receiver));
}
void ContentSettingsManagerImpl::Clone(
mojo::PendingReceiver<content_settings::mojom::ContentSettingsManager>
receiver) {
mojo::MakeSelfOwnedReceiver(
base::WrapUnique(new ContentSettingsManagerImpl(*this)),
std::move(receiver));
}
void ContentSettingsManagerImpl::AllowStorageAccess(
int32_t render_frame_id,
StorageType storage_type,
const url::Origin& origin,
const GURL& site_for_cookies,
const url::Origin& top_frame_origin,
base::OnceCallback<void(bool)> callback) {
std::move(callback).Run(cookie_settings_->IsCookieAccessAllowed(
origin.GetURL(), site_for_cookies, top_frame_origin));
}
void ContentSettingsManagerImpl::OnContentBlocked(int32_t render_frame_id,
ContentSettingsType type) {}
ContentSettingsManagerImpl::ContentSettingsManagerImpl(
content::RenderProcessHost* render_process_host)
: render_process_id_(render_process_host->GetID()),
cookie_settings_(CookieSettingsFactory::GetForBrowserContext(
render_process_host->GetBrowserContext())) {}
ContentSettingsManagerImpl::ContentSettingsManagerImpl(
const ContentSettingsManagerImpl& other)
: render_process_id_(other.render_process_id_),
cookie_settings_(other.cookie_settings_) {}
} // namespace weblayer
// Copyright 2020 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.
#ifndef WEBLAYER_BROWSER_CONTENT_SETTINGS_MANAGER_IMPL_H_
#define WEBLAYER_BROWSER_CONTENT_SETTINGS_MANAGER_IMPL_H_
#include "base/memory/ref_counted.h"
#include "components/content_settings/common/content_settings_manager.mojom.h"
namespace content {
class RenderProcessHost;
}
namespace content_settings {
class CookieSettings;
}
namespace weblayer {
// Called by the renderer to query storage access and notify when content is
// blocked.
class ContentSettingsManagerImpl
: public content_settings::mojom::ContentSettingsManager {
public:
~ContentSettingsManagerImpl() override;
static void Create(
content::RenderProcessHost* render_process_host,
mojo::PendingReceiver<content_settings::mojom::ContentSettingsManager>
receiver);
// mojom::ContentSettingsManager methods:
void Clone(
mojo::PendingReceiver<content_settings::mojom::ContentSettingsManager>
receiver) override;
void AllowStorageAccess(int32_t render_frame_id,
StorageType storage_type,
const url::Origin& origin,
const GURL& site_for_cookies,
const url::Origin& top_frame_origin,
base::OnceCallback<void(bool)> callback) override;
void OnContentBlocked(int32_t render_frame_id,
ContentSettingsType type) override;
private:
explicit ContentSettingsManagerImpl(
content::RenderProcessHost* render_process_host);
ContentSettingsManagerImpl(const ContentSettingsManagerImpl& other);
const int render_process_id_;
scoped_refptr<content_settings::CookieSettings> cookie_settings_;
};
} // namespace weblayer
#endif // WEBLAYER_BROWSER_CONTENT_SETTINGS_MANAGER_IMPL_H_
......@@ -90,6 +90,7 @@ test("weblayer_browsertests") {
"//components/autofill/core/browser",
"//components/autofill/core/browser:test_support",
"//components/autofill/core/common",
"//components/content_settings/core/browser",
"//components/network_time",
"//components/security_interstitials/content:security_interstitial_page",
"//components/sessions:test_support",
......@@ -106,6 +107,7 @@ test("weblayer_browsertests") {
sources = [
"../browser/autofill_browsertest.cc",
"../browser/client_hints_browsertest.cc",
"../browser/content_settings_browsertest.cc",
"../browser/cookie_manager_browsertest.cc",
"../browser/download_browsertest.cc",
"../browser/errorpage_browsertest.cc",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment