Commit 06dea026 authored by Clark DuVall's avatar Clark DuVall Committed by Commit Bot

Move ContentSettingsManagerImpl to //components/content_settings

Now that TabSpecificContentSettings is componentized, it makes sense to
share the logic in ContentSettingsManagerImpl.

Bug: 1070825
Change-Id: I76cd324119640fd374b1ad2b474a665aa7fade7b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2157650Reviewed-by: default avatarChristian Dullweber <dullweber@chromium.org>
Reviewed-by: default avatarRobert Sesek <rsesek@chromium.org>
Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Commit-Queue: Clark DuVall <cduvall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#761018}
parent 9e9a31d6
......@@ -339,8 +339,8 @@ jumbo_static_library("browser") {
"content_index/content_index_provider_impl.h",
"content_settings/chrome_content_settings_utils.cc",
"content_settings/chrome_content_settings_utils.h",
"content_settings/content_settings_manager_impl.cc",
"content_settings/content_settings_manager_impl.h",
"content_settings/content_settings_manager_delegate.cc",
"content_settings/content_settings_manager_delegate.h",
"content_settings/cookie_settings_factory.cc",
"content_settings/cookie_settings_factory.h",
"content_settings/host_content_settings_map_factory.cc",
......
......@@ -14,7 +14,7 @@
#include "chrome/browser/cache_stats_recorder.h"
#include "chrome/browser/chrome_browser_interface_binders.h"
#include "chrome/browser/chrome_content_browser_client_parts.h"
#include "chrome/browser/content_settings/content_settings_manager_impl.h"
#include "chrome/browser/content_settings/content_settings_manager_delegate.h"
#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
#include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
......@@ -284,8 +284,9 @@ void ChromeContentBrowserClient::BindHostReceiverForRenderer(
mojo::GenericPendingReceiver receiver) {
if (auto host_receiver =
receiver.As<content_settings::mojom::ContentSettingsManager>()) {
chrome::ContentSettingsManagerImpl::Create(render_process_host,
std::move(host_receiver));
content_settings::ContentSettingsManagerImpl::Create(
render_process_host, std::move(host_receiver),
std::make_unique<chrome::ContentSettingsManagerDelegate>());
return;
}
......
// 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 "chrome/browser/content_settings/content_settings_manager_delegate.h"
#include "chrome/browser/content_settings/cookie_settings_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "components/content_settings/browser/tab_specific_content_settings.h"
#include "components/content_settings/core/browser/cookie_settings.h"
#include "extensions/buildflags/buildflags.h"
#if BUILDFLAG(ENABLE_EXTENSIONS)
#include "extensions/browser/guest_view/web_view/web_view_permission_helper.h"
#include "extensions/browser/guest_view/web_view/web_view_renderer_state.h"
#endif
namespace chrome {
namespace {
#if BUILDFLAG(ENABLE_EXTENSIONS)
void OnFileSystemAccessedInGuestViewContinuation(
int render_process_id,
int render_frame_id,
const GURL& url,
base::OnceCallback<void(bool)> callback,
bool allowed) {
content_settings::TabSpecificContentSettings::FileSystemAccessed(
render_process_id, render_frame_id, url, !allowed);
std::move(callback).Run(allowed);
}
void OnFileSystemAccessedInGuestView(int render_process_id,
int render_frame_id,
const GURL& url,
bool allowed,
base::OnceCallback<void(bool)> callback) {
extensions::WebViewPermissionHelper* web_view_permission_helper =
extensions::WebViewPermissionHelper::FromFrameID(render_process_id,
render_frame_id);
auto continuation = base::BindOnce(
&OnFileSystemAccessedInGuestViewContinuation, render_process_id,
render_frame_id, url, std::move(callback));
if (!web_view_permission_helper) {
std::move(continuation).Run(allowed);
return;
}
web_view_permission_helper->RequestFileSystemPermission(
url, allowed, std::move(continuation));
}
#endif
} // namespace
ContentSettingsManagerDelegate::ContentSettingsManagerDelegate() = default;
ContentSettingsManagerDelegate::~ContentSettingsManagerDelegate() = default;
scoped_refptr<content_settings::CookieSettings>
ContentSettingsManagerDelegate::GetCookieSettings(
content::BrowserContext* browser_context) {
return CookieSettingsFactory::GetForProfile(
Profile::FromBrowserContext(browser_context));
}
bool ContentSettingsManagerDelegate::AllowStorageAccess(
int render_process_id,
int render_frame_id,
content_settings::mojom::ContentSettingsManager::StorageType storage_type,
const GURL& url,
bool allowed,
base::OnceCallback<void(bool)>* callback) {
#if BUILDFLAG(ENABLE_EXTENSIONS)
if (storage_type == content_settings::mojom::ContentSettingsManager::
StorageType::FILE_SYSTEM &&
extensions::WebViewRendererState::GetInstance()->IsGuest(
render_process_id)) {
OnFileSystemAccessedInGuestView(render_process_id, render_frame_id, url,
allowed, std::move(*callback));
return true;
}
#endif
return false;
}
std::unique_ptr<content_settings::ContentSettingsManagerImpl::Delegate>
ContentSettingsManagerDelegate::Clone() {
return std::make_unique<ContentSettingsManagerDelegate>();
}
} // namespace chrome
// 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 CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_MANAGER_DELEGATE_H_
#define CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_MANAGER_DELEGATE_H_
#include "components/content_settings/browser/content_settings_manager_impl.h"
namespace chrome {
class ContentSettingsManagerDelegate
: public content_settings::ContentSettingsManagerImpl::Delegate {
public:
ContentSettingsManagerDelegate();
~ContentSettingsManagerDelegate() override;
private:
// content_settings::ContentSettingsManagerImpl::Delegate:
scoped_refptr<content_settings::CookieSettings> GetCookieSettings(
content::BrowserContext* browser_context) override;
bool AllowStorageAccess(
int render_process_id,
int render_frame_id,
content_settings::mojom::ContentSettingsManager::StorageType storage_type,
const GURL& url,
bool allowed,
base::OnceCallback<void(bool)>* callback) override;
std::unique_ptr<Delegate> Clone() override;
};
} // namespace chrome
#endif // CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_MANAGER_DELEGATE_H_
......@@ -4,6 +4,8 @@
source_set("browser") {
sources = [
"content_settings_manager_impl.cc",
"content_settings_manager_impl.h",
"tab_specific_content_settings.cc",
"tab_specific_content_settings.h",
]
......@@ -13,6 +15,7 @@ source_set("browser") {
"//components/content_settings/common:mojom",
"//components/content_settings/core/browser",
"//components/content_settings/core/common",
"//components/page_load_metrics/browser",
"//components/prefs",
"//components/security_state/core",
"//content/public/browser",
......
include_rules = [
"+components/browsing_data/content",
"+components/page_load_metrics/browser",
"+components/security_state/core",
"+components/sync_preferences",
"+content/public/browser",
"+content/public/common",
"+content/public/test",
"+mojo/public",
"+net/cookies",
"+third_party/blink/public",
]
......@@ -2,28 +2,20 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/content_settings/content_settings_manager_impl.h"
#include "components/content_settings/browser/content_settings_manager_impl.h"
#include "base/memory/ptr_util.h"
#include "chrome/browser/content_settings/cookie_settings_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "components/content_settings/browser/tab_specific_content_settings.h"
#include "components/content_settings/core/browser/cookie_settings.h"
#include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
#include "components/page_load_metrics/browser/page_load_metrics_observer.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "extensions/buildflags/buildflags.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#if BUILDFLAG(ENABLE_EXTENSIONS)
#include "extensions/browser/guest_view/web_view/web_view_permission_helper.h"
#include "extensions/browser/guest_view/web_view/web_view_renderer_state.h"
#endif
using content_settings::TabSpecificContentSettings;
namespace chrome {
namespace content_settings {
namespace {
void OnStorageAccessed(int process_id,
......@@ -67,38 +59,6 @@ void OnDomStorageAccessed(int process_id,
tab_settings->OnDomStorageAccessed(origin_url, local, blocked_by_policy);
}
#if BUILDFLAG(ENABLE_EXTENSIONS)
void OnFileSystemAccessedInGuestViewContinuation(
int render_process_id,
int render_frame_id,
const GURL& url,
base::OnceCallback<void(bool)> callback,
bool allowed) {
TabSpecificContentSettings::FileSystemAccessed(
render_process_id, render_frame_id, url, !allowed);
std::move(callback).Run(allowed);
}
void OnFileSystemAccessedInGuestView(int render_process_id,
int render_frame_id,
const GURL& url,
bool allowed,
base::OnceCallback<void(bool)> callback) {
extensions::WebViewPermissionHelper* web_view_permission_helper =
extensions::WebViewPermissionHelper::FromFrameID(render_process_id,
render_frame_id);
auto continuation = base::BindOnce(
&OnFileSystemAccessedInGuestViewContinuation, render_process_id,
render_frame_id, url, std::move(callback));
if (!web_view_permission_helper) {
std::move(continuation).Run(allowed);
return;
}
web_view_permission_helper->RequestFileSystemPermission(
url, allowed, std::move(continuation));
}
#endif
} // namespace
ContentSettingsManagerImpl::~ContentSettingsManagerImpl() = default;
......@@ -107,9 +67,10 @@ ContentSettingsManagerImpl::~ContentSettingsManagerImpl() = default;
void ContentSettingsManagerImpl::Create(
content::RenderProcessHost* render_process_host,
mojo::PendingReceiver<content_settings::mojom::ContentSettingsManager>
receiver) {
mojo::MakeSelfOwnedReceiver(
base::WrapUnique(new ContentSettingsManagerImpl(render_process_host)),
receiver,
std::unique_ptr<Delegate> delegate) {
mojo::MakeSelfOwnedReceiver(base::WrapUnique(new ContentSettingsManagerImpl(
render_process_host, std::move(delegate))),
std::move(receiver));
}
......@@ -132,6 +93,11 @@ void ContentSettingsManagerImpl::AllowStorageAccess(
bool allowed = cookie_settings_->IsCookieAccessAllowed(url, site_for_cookies,
top_frame_origin);
if (delegate_->AllowStorageAccess(render_process_id_, render_frame_id,
storage_type, url, allowed, &callback)) {
DCHECK(!callback);
return;
}
switch (storage_type) {
case StorageType::DATABASE:
......@@ -154,14 +120,6 @@ void ContentSettingsManagerImpl::AllowStorageAccess(
break;
case StorageType::FILE_SYSTEM:
#if BUILDFLAG(ENABLE_EXTENSIONS)
if (extensions::WebViewRendererState::GetInstance()->IsGuest(
render_process_id_)) {
OnFileSystemAccessedInGuestView(render_process_id_, render_frame_id,
url, allowed, std::move(callback));
return;
}
#endif
TabSpecificContentSettings::FileSystemAccessed(
render_process_id_, render_frame_id, url, !allowed);
OnStorageAccessed(render_process_id_, render_frame_id, url,
......@@ -206,15 +164,17 @@ void ContentSettingsManagerImpl::OnContentBlocked(int32_t render_frame_id,
}
ContentSettingsManagerImpl::ContentSettingsManagerImpl(
content::RenderProcessHost* render_process_host)
: render_process_id_(render_process_host->GetID()),
cookie_settings_(
CookieSettingsFactory::GetForProfile(Profile::FromBrowserContext(
render_process_host->GetBrowserContext()))) {}
content::RenderProcessHost* render_process_host,
std::unique_ptr<Delegate> delegate)
: delegate_(std::move(delegate)),
render_process_id_(render_process_host->GetID()),
cookie_settings_(delegate_->GetCookieSettings(
render_process_host->GetBrowserContext())) {}
ContentSettingsManagerImpl::ContentSettingsManagerImpl(
const ContentSettingsManagerImpl& other)
: render_process_id_(other.render_process_id_),
: delegate_(other.delegate_->Clone()),
render_process_id_(other.render_process_id_),
cookie_settings_(other.cookie_settings_) {}
} // namespace chrome
} // namespace content_settings
......@@ -2,13 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_MANAGER_IMPL_H_
#define CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_MANAGER_IMPL_H_
#ifndef COMPONENTS_CONTENT_SETTINGS_BROWSER_CONTENT_SETTINGS_MANAGER_IMPL_H_
#define COMPONENTS_CONTENT_SETTINGS_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 BrowserContext;
class RenderProcessHost;
} // namespace content
......@@ -16,17 +17,40 @@ namespace content_settings {
class CookieSettings;
} // namespace content_settings
namespace chrome {
namespace content_settings {
class ContentSettingsManagerImpl
: public content_settings::mojom::ContentSettingsManager {
public:
class Delegate {
public:
virtual ~Delegate() = default;
// Gets cookie settings for this browser context.
virtual scoped_refptr<CookieSettings> GetCookieSettings(
content::BrowserContext* browser_context) = 0;
// Allows delegate to override AllowStorageAccess(). If the delegate returns
// true here, the default logic will be bypassed.
virtual bool AllowStorageAccess(
int render_process_id,
int render_frame_id,
StorageType storage_type,
const GURL& url,
bool allowed,
base::OnceCallback<void(bool)>* callback) = 0;
// Returns a new instance of this delegate.
virtual std::unique_ptr<Delegate> Clone() = 0;
};
~ContentSettingsManagerImpl() override;
static void Create(
content::RenderProcessHost* render_process_host,
mojo::PendingReceiver<content_settings::mojom::ContentSettingsManager>
receiver);
receiver,
std::unique_ptr<Delegate> delegate);
// mojom::ContentSettingsManager methods:
void Clone(
......@@ -42,9 +66,11 @@ class ContentSettingsManagerImpl
ContentSettingsType type) override;
private:
explicit ContentSettingsManagerImpl(
content::RenderProcessHost* render_process_host);
explicit ContentSettingsManagerImpl(const ContentSettingsManagerImpl& other);
ContentSettingsManagerImpl(content::RenderProcessHost* render_process_host,
std::unique_ptr<Delegate> delegate);
ContentSettingsManagerImpl(const ContentSettingsManagerImpl& other);
std::unique_ptr<Delegate> delegate_;
// Use these IDs to hold a weak reference back to the RenderFrameHost.
const int render_process_id_;
......@@ -53,6 +79,6 @@ class ContentSettingsManagerImpl
scoped_refptr<content_settings::CookieSettings> cookie_settings_;
};
} // namespace chrome
} // namespace content_settings
#endif // CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_MANAGER_IMPL_H_
#endif // COMPONENTS_CONTENT_SETTINGS_BROWSER_CONTENT_SETTINGS_MANAGER_IMPL_H_
......@@ -128,8 +128,8 @@ source_set("weblayer_lib_base") {
"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/content_settings_manager_delegate.cc",
"browser/content_settings_manager_delegate.h",
"browser/controls_visibility_reason.h",
"browser/cookie_manager_impl.cc",
"browser/cookie_manager_impl.h",
......
......@@ -6,7 +6,7 @@
#include "weblayer/browser/content_browser_client_impl.h"
#include "weblayer/browser/content_settings_manager_impl.h"
#include "weblayer/browser/content_settings_manager_delegate.h"
namespace weblayer {
......@@ -15,8 +15,9 @@ void ContentBrowserClientImpl::BindHostReceiverForRenderer(
mojo::GenericPendingReceiver receiver) {
if (auto host_receiver =
receiver.As<content_settings::mojom::ContentSettingsManager>()) {
ContentSettingsManagerImpl::Create(render_process_host,
std::move(host_receiver));
content_settings::ContentSettingsManagerImpl::Create(
render_process_host, std::move(host_receiver),
std::make_unique<ContentSettingsManagerDelegate>());
return;
}
}
......
// 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_delegate.h"
#include "components/content_settings/core/browser/cookie_settings.h"
#include "weblayer/browser/cookie_settings_factory.h"
namespace weblayer {
ContentSettingsManagerDelegate::ContentSettingsManagerDelegate() = default;
ContentSettingsManagerDelegate::~ContentSettingsManagerDelegate() = default;
scoped_refptr<content_settings::CookieSettings>
ContentSettingsManagerDelegate::GetCookieSettings(
content::BrowserContext* browser_context) {
return CookieSettingsFactory::GetForBrowserContext(browser_context);
}
bool ContentSettingsManagerDelegate::AllowStorageAccess(
int render_process_id,
int render_frame_id,
content_settings::mojom::ContentSettingsManager::StorageType storage_type,
const GURL& url,
bool allowed,
base::OnceCallback<void(bool)>* callback) {
return false;
}
std::unique_ptr<content_settings::ContentSettingsManagerImpl::Delegate>
ContentSettingsManagerDelegate::Clone() {
return std::make_unique<ContentSettingsManagerDelegate>();
}
} // 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_DELEGATE_H_
#define WEBLAYER_BROWSER_CONTENT_SETTINGS_MANAGER_DELEGATE_H_
#include "components/content_settings/browser/content_settings_manager_impl.h"
namespace weblayer {
class ContentSettingsManagerDelegate
: public content_settings::ContentSettingsManagerImpl::Delegate {
public:
ContentSettingsManagerDelegate();
~ContentSettingsManagerDelegate() override;
private:
// content_settings::ContentSettingsManagerImpl::Delegate:
scoped_refptr<content_settings::CookieSettings> GetCookieSettings(
content::BrowserContext* browser_context) override;
bool AllowStorageAccess(
int render_process_id,
int render_frame_id,
content_settings::mojom::ContentSettingsManager::StorageType storage_type,
const GURL& url,
bool allowed,
base::OnceCallback<void(bool)>* callback) override;
std::unique_ptr<Delegate> Clone() override;
};
} // namespace weblayer
#endif // WEBLAYER_BROWSER_CONTENT_SETTINGS_MANAGER_DELEGATE_H_
// 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_
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