Commit 73b2202e authored by Pavel Feldman's avatar Pavel Feldman Committed by Commit Bot

DevTools: respect permission overrides on the chrome level.

This is a follow up to the content-side change, we need chrome
to respect these overrides as well when the check originates
outside of the web platform.

Bug: 631464
Change-Id: I8300a17d6b2b65140aef8232a58a694e56a709e3
Reviewed-on: https://chromium-review.googlesource.com/c/1308935
Commit-Queue: Pavel Feldman <pfeldman@chromium.org>
Reviewed-by: default avatarMounir Lamouri <mlamouri@chromium.org>
Reviewed-by: default avatarDmitry Gozman <dgozman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#604815}
parent 6d232c64
...@@ -49,6 +49,9 @@ class ChromeDevToolsManagerDelegate : public content::DevToolsManagerDelegate { ...@@ -49,6 +49,9 @@ class ChromeDevToolsManagerDelegate : public content::DevToolsManagerDelegate {
// Resets |device_manager_|. // Resets |device_manager_|.
void ResetAndroidDeviceManagerForTesting(); void ResetAndroidDeviceManagerForTesting();
std::vector<content::BrowserContext*> GetBrowserContexts() override;
content::BrowserContext* GetDefaultBrowserContext() override;
private: private:
friend class DevToolsManagerDelegateTest; friend class DevToolsManagerDelegateTest;
...@@ -62,8 +65,6 @@ class ChromeDevToolsManagerDelegate : public content::DevToolsManagerDelegate { ...@@ -62,8 +65,6 @@ class ChromeDevToolsManagerDelegate : public content::DevToolsManagerDelegate {
std::string GetTargetType(content::WebContents* web_contents) override; std::string GetTargetType(content::WebContents* web_contents) override;
std::string GetTargetTitle(content::WebContents* web_contents) override; std::string GetTargetTitle(content::WebContents* web_contents) override;
std::vector<content::BrowserContext*> GetBrowserContexts() override;
content::BrowserContext* GetDefaultBrowserContext() override;
content::BrowserContext* CreateBrowserContext() override; content::BrowserContext* CreateBrowserContext() override;
void DisposeBrowserContext(content::BrowserContext*, void DisposeBrowserContext(content::BrowserContext*,
DisposeCallback callback) override; DisposeCallback callback) override;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
}, },
{ {
"domain": "Browser", "domain": "Browser",
"include": [ "getWindowForTarget", "getWindowBounds", "setWindowBounds", "close" ], "include": [ "getWindowForTarget", "getWindowBounds", "setWindowBounds", "close", "grantPermissions", "resetPermissions" ],
"include_events": [] "include_events": []
}, },
{ {
......
...@@ -5,8 +5,11 @@ ...@@ -5,8 +5,11 @@
#ifndef CHROME_BROWSER_DEVTOOLS_PROTOCOL_BROWSER_HANDLER_H_ #ifndef CHROME_BROWSER_DEVTOOLS_PROTOCOL_BROWSER_HANDLER_H_
#define CHROME_BROWSER_DEVTOOLS_PROTOCOL_BROWSER_HANDLER_H_ #define CHROME_BROWSER_DEVTOOLS_PROTOCOL_BROWSER_HANDLER_H_
#include "base/containers/flat_set.h"
#include "chrome/browser/devtools/protocol/browser.h" #include "chrome/browser/devtools/protocol/browser.h"
class Profile;
class BrowserHandler : public protocol::Browser::Backend { class BrowserHandler : public protocol::Browser::Backend {
public: public:
explicit BrowserHandler(protocol::UberDispatcher* dispatcher); explicit BrowserHandler(protocol::UberDispatcher* dispatcher);
...@@ -24,8 +27,22 @@ class BrowserHandler : public protocol::Browser::Backend { ...@@ -24,8 +27,22 @@ class BrowserHandler : public protocol::Browser::Backend {
protocol::Response SetWindowBounds( protocol::Response SetWindowBounds(
int window_id, int window_id,
std::unique_ptr<protocol::Browser::Bounds> out_bounds) override; std::unique_ptr<protocol::Browser::Bounds> out_bounds) override;
protocol::Response Disable() override;
protocol::Response GrantPermissions(
const std::string& origin,
std::unique_ptr<protocol::Array<protocol::Browser::PermissionType>>
permissions,
protocol::Maybe<std::string> browser_context_id) override;
protocol::Response ResetPermissions(
protocol::Maybe<std::string> browser_context_id) override;
private: private:
protocol::Response FindProfile(
const protocol::Maybe<std::string>& browser_context_id,
Profile** profile);
base::flat_set<std::string> contexts_with_overridden_permissions_;
DISALLOW_COPY_AND_ASSIGN(BrowserHandler); DISALLOW_COPY_AND_ASSIGN(BrowserHandler);
}; };
......
...@@ -396,10 +396,18 @@ int PermissionManager::RequestPermissions( ...@@ -396,10 +396,18 @@ int PermissionManager::RequestPermissions(
for (size_t i = 0; i < permissions.size(); ++i) { for (size_t i = 0; i < permissions.size(); ++i) {
const ContentSettingsType permission = permissions[i]; const ContentSettingsType permission = permissions[i];
PermissionContextBase* context = GetPermissionContext(permission);
DCHECK(context);
auto callback = auto callback =
std::make_unique<PermissionResponseCallback>(this, request_id, i); std::make_unique<PermissionResponseCallback>(this, request_id, i);
auto status = GetPermissionOverrideForDevTools(canonical_requesting_origin,
permission);
if (status != CONTENT_SETTING_DEFAULT) {
callback->OnPermissionsRequestResponseStatus(CONTENT_SETTING_ALLOW);
continue;
}
PermissionContextBase* context = GetPermissionContext(permission);
DCHECK(context);
context->RequestPermission( context->RequestPermission(
web_contents, request, canonical_requesting_origin, user_gesture, web_contents, request, canonical_requesting_origin, user_gesture,
base::Bind( base::Bind(
...@@ -676,6 +684,10 @@ PermissionResult PermissionManager::GetPermissionStatusHelper( ...@@ -676,6 +684,10 @@ PermissionResult PermissionManager::GetPermissionStatusHelper(
const GURL& embedding_origin) { const GURL& embedding_origin) {
GURL canonical_requesting_origin = GURL canonical_requesting_origin =
GetCanonicalOrigin(requesting_origin, embedding_origin); GetCanonicalOrigin(requesting_origin, embedding_origin);
auto status =
GetPermissionOverrideForDevTools(canonical_requesting_origin, permission);
if (status != CONTENT_SETTING_DEFAULT)
return PermissionResult(status, PermissionStatusSource::UNSPECIFIED);
PermissionContextBase* context = GetPermissionContext(permission); PermissionContextBase* context = GetPermissionContext(permission);
PermissionResult result = context->GetPermissionStatus( PermissionResult result = context->GetPermissionStatus(
render_frame_host, canonical_requesting_origin.GetOrigin(), render_frame_host, canonical_requesting_origin.GetOrigin(),
...@@ -685,3 +697,26 @@ PermissionResult PermissionManager::GetPermissionStatusHelper( ...@@ -685,3 +697,26 @@ PermissionResult PermissionManager::GetPermissionStatusHelper(
result.content_setting == CONTENT_SETTING_BLOCK); result.content_setting == CONTENT_SETTING_BLOCK);
return result; return result;
} }
void PermissionManager::SetPermissionOverridesForDevTools(
const GURL& origin,
const PermissionOverrides& overrides) {
ContentSettingsTypeOverrides result;
for (const auto& item : overrides)
result.insert(PermissionTypeToContentSetting(item));
devtools_permission_overrides_[origin] = std::move(result);
}
void PermissionManager::ResetPermissionOverridesForDevTools() {
devtools_permission_overrides_.clear();
}
ContentSetting PermissionManager::GetPermissionOverrideForDevTools(
const GURL& origin,
ContentSettingsType permission) {
auto it = devtools_permission_overrides_.find(origin);
if (it == devtools_permission_overrides_.end())
return CONTENT_SETTING_DEFAULT;
return it->second.count(permission) ? CONTENT_SETTING_ALLOW
: CONTENT_SETTING_BLOCK;
}
...@@ -15,15 +15,12 @@ ...@@ -15,15 +15,12 @@
#include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings.h"
#include "components/keyed_service/core/keyed_service.h" #include "components/keyed_service/core/keyed_service.h"
#include "content/public/browser/permission_controller_delegate.h" #include "content/public/browser/permission_controller_delegate.h"
#include "content/public/browser/permission_type.h"
class PermissionContextBase; class PermissionContextBase;
struct PermissionResult; struct PermissionResult;
class Profile; class Profile;
namespace content {
enum class PermissionType;
}; // namespace content
class PermissionManager : public KeyedService, class PermissionManager : public KeyedService,
public content::PermissionControllerDelegate, public content::PermissionControllerDelegate,
public content_settings::Observer { public content_settings::Observer {
...@@ -119,6 +116,14 @@ class PermissionManager : public KeyedService, ...@@ -119,6 +116,14 @@ class PermissionManager : public KeyedService,
// denied due to the kill switch. // denied due to the kill switch.
bool IsPermissionKillSwitchOn(ContentSettingsType); bool IsPermissionKillSwitchOn(ContentSettingsType);
using PermissionOverrides = std::set<content::PermissionType>;
// For the given |origin|, grant permissions that belong to |overrides|
// and reject all others.
void SetPermissionOverridesForDevTools(const GURL& origin,
const PermissionOverrides& overrides);
void ResetPermissionOverridesForDevTools();
private: private:
friend class PermissionManagerTest; friend class PermissionManagerTest;
friend class GeolocationPermissionContextTests; friend class GeolocationPermissionContextTests;
...@@ -158,6 +163,10 @@ class PermissionManager : public KeyedService, ...@@ -158,6 +163,10 @@ class PermissionManager : public KeyedService,
const GURL& requesting_origin, const GURL& requesting_origin,
const GURL& embedding_origin); const GURL& embedding_origin);
ContentSetting GetPermissionOverrideForDevTools(
const GURL& origin,
ContentSettingsType permission);
Profile* profile_; Profile* profile_;
PendingRequestsMap pending_requests_; PendingRequestsMap pending_requests_;
SubscriptionsMap subscriptions_; SubscriptionsMap subscriptions_;
...@@ -166,6 +175,8 @@ class PermissionManager : public KeyedService, ...@@ -166,6 +175,8 @@ class PermissionManager : public KeyedService,
std::unique_ptr<PermissionContextBase>, std::unique_ptr<PermissionContextBase>,
ContentSettingsTypeHash> ContentSettingsTypeHash>
permission_contexts_; permission_contexts_;
using ContentSettingsTypeOverrides = std::set<ContentSettingsType>;
std::map<GURL, ContentSettingsTypeOverrides> devtools_permission_overrides_;
DISALLOW_COPY_AND_ASSIGN(PermissionManager); DISALLOW_COPY_AND_ASSIGN(PermissionManager);
}; };
......
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