0

Implement HasPermission() method in PermissionService.

This patch implements the HasPermission() method in the mojo PermissionService.
This methiod will be required for the Permissions API, see
https://w3c.github.io/permissions/

BUG=430238

Committed: https://crrev.com/277b23d74855b51ebe67ae0da7cd9e0b053044cf
Cr-Commit-Position: refs/heads/master@{#307302}

Committed: https://crrev.com/14570267ac4d5dc473d29f256e8d044e9bfcc8d2
Cr-Commit-Position: refs/heads/master@{#307504}

Review URL: https://codereview.chromium.org/750633003

Cr-Commit-Position: refs/heads/master@{#307948}
This commit is contained in:
timvolodine
2014-12-11 11:32:26 -08:00
committed by Commit bot
parent c429dd655d
commit 089c07c966
20 changed files with 149 additions and 22 deletions

@@ -599,6 +599,24 @@ void GetGuestViewDefaultContentSettingRules(
} }
#endif // defined(ENALBE_EXTENSIONS) #endif // defined(ENALBE_EXTENSIONS)
content::PermissionStatus
ContentSettingToPermissionStatus(ContentSetting setting) {
switch (setting) {
case CONTENT_SETTING_ALLOW:
case CONTENT_SETTING_SESSION_ONLY:
return content::PERMISSION_STATUS_GRANTED;
case CONTENT_SETTING_BLOCK:
return content::PERMISSION_STATUS_DENIED;
case CONTENT_SETTING_ASK:
return content::PERMISSION_STATUS_ASK;
case CONTENT_SETTING_DEFAULT:
case CONTENT_SETTING_NUM_SETTINGS:
break;
}
NOTREACHED();
return content::PERMISSION_STATUS_DENIED;
}
} // namespace } // namespace
namespace chrome { namespace chrome {
@@ -1917,6 +1935,49 @@ void ChromeContentBrowserClient::RequestPermission(
} }
} }
content::PermissionStatus ChromeContentBrowserClient::GetPermissionStatus(
content::PermissionType permission,
content::BrowserContext* browser_context,
const GURL& requesting_origin,
const GURL& embedding_origin) {
DCHECK(browser_context);
Profile* profile = Profile::FromBrowserContext(browser_context);
PermissionContextBase* context = nullptr;
switch (permission) {
case content::PERMISSION_MIDI_SYSEX:
context = MidiPermissionContextFactory::GetForProfile(profile);
break;
case content::PERMISSION_NOTIFICATIONS:
#if defined(ENABLE_NOTIFICATIONS)
context = DesktopNotificationServiceFactory::GetForProfile(profile);
#else
NOTIMPLEMENTED();
#endif
break;
case content::PERMISSION_GEOLOCATION:
context = GeolocationPermissionContextFactory::GetForProfile(profile);
break;
case content::PERMISSION_PROTECTED_MEDIA:
NOTIMPLEMENTED();
break;
case content::PERMISSION_PUSH_MESSAGING:
context = gcm::PushMessagingPermissionContextFactory::GetForProfile(
profile);
break;
case content::PERMISSION_NUM:
NOTREACHED() << "Invalid RequestPermission for " << permission;
break;
}
ContentSetting result = context
? context->GetPermissionStatus(requesting_origin.GetOrigin(),
embedding_origin.GetOrigin())
: CONTENT_SETTING_DEFAULT;
return ContentSettingToPermissionStatus(result);
}
void ChromeContentBrowserClient::CancelPermissionRequest( void ChromeContentBrowserClient::CancelPermissionRequest(
content::PermissionType permission, content::PermissionType permission,
content::WebContents* web_contents, content::WebContents* web_contents,

@@ -189,6 +189,11 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
const GURL& requesting_frame, const GURL& requesting_frame,
bool user_gesture, bool user_gesture,
const base::Callback<void(bool)>& result_callback) override; const base::Callback<void(bool)>& result_callback) override;
content::PermissionStatus GetPermissionStatus(
content::PermissionType permission,
content::BrowserContext* browser_context,
const GURL& requesting_origin,
const GURL& embedding_origin) override;
void CancelPermissionRequest(content::PermissionType permission, void CancelPermissionRequest(content::PermissionType permission,
content::WebContents* web_contents, content::WebContents* web_contents,
int bridge_id, int bridge_id,

@@ -0,0 +1,2 @@
mlamouri@chromium.org
timvolodine@chromium.org

@@ -7,6 +7,7 @@
#include "content/browser/permissions/permission_service_impl.h" #include "content/browser/permissions/permission_service_impl.h"
#include "content/public/browser/navigation_details.h" #include "content/public/browser/navigation_details.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
namespace content { namespace content {
@@ -14,7 +15,15 @@ namespace content {
PermissionServiceContext::PermissionServiceContext( PermissionServiceContext::PermissionServiceContext(
RenderFrameHost* render_frame_host) RenderFrameHost* render_frame_host)
: WebContentsObserver(WebContents::FromRenderFrameHost(render_frame_host)), : WebContentsObserver(WebContents::FromRenderFrameHost(render_frame_host)),
render_frame_host_(render_frame_host) { render_frame_host_(render_frame_host),
render_process_host_(nullptr) {
}
PermissionServiceContext::PermissionServiceContext(
RenderProcessHost* render_process_host)
: WebContentsObserver(nullptr),
render_frame_host_(nullptr),
render_process_host_(render_process_host) {
} }
PermissionServiceContext::~PermissionServiceContext() { PermissionServiceContext::~PermissionServiceContext() {
@@ -60,4 +69,17 @@ void PermissionServiceContext::CancelPendingRequests(
service->CancelPendingRequests(); service->CancelPendingRequests();
} }
BrowserContext* PermissionServiceContext::GetBrowserContext() const {
if (!web_contents()) {
DCHECK(render_process_host_);
return render_process_host_->GetBrowserContext();
}
return web_contents()->GetBrowserContext();
}
GURL PermissionServiceContext::GetEmbeddingOrigin() const {
return web_contents() ? web_contents()->GetLastCommittedURL().GetOrigin()
: GURL();
}
} // namespace content } // namespace content

@@ -15,6 +15,7 @@ namespace content {
class PermissionService; class PermissionService;
class PermissionServiceImpl; class PermissionServiceImpl;
class RenderFrameHost; class RenderFrameHost;
class RenderProcessHost;
// Provides information to a PermissionService. It is used by the // Provides information to a PermissionService. It is used by the
// PermissionService to handle request permission UI. // PermissionService to handle request permission UI.
@@ -23,6 +24,7 @@ class RenderFrameHost;
class PermissionServiceContext : public WebContentsObserver { class PermissionServiceContext : public WebContentsObserver {
public: public:
explicit PermissionServiceContext(RenderFrameHost* render_frame_host); explicit PermissionServiceContext(RenderFrameHost* render_frame_host);
explicit PermissionServiceContext(RenderProcessHost* render_process_host);
virtual ~PermissionServiceContext(); virtual ~PermissionServiceContext();
void CreateService(mojo::InterfaceRequest<PermissionService> request); void CreateService(mojo::InterfaceRequest<PermissionService> request);
@@ -31,6 +33,9 @@ class PermissionServiceContext : public WebContentsObserver {
// connection error in order to get unregistered and killed. // connection error in order to get unregistered and killed.
void ServiceHadConnectionError(PermissionServiceImpl* service); void ServiceHadConnectionError(PermissionServiceImpl* service);
BrowserContext* GetBrowserContext() const;
GURL GetEmbeddingOrigin() const;
private: private:
// WebContentsObserver // WebContentsObserver
void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; void RenderFrameDeleted(RenderFrameHost* render_frame_host) override;
@@ -41,6 +46,7 @@ class PermissionServiceContext : public WebContentsObserver {
void CancelPendingRequests(RenderFrameHost*) const; void CancelPendingRequests(RenderFrameHost*) const;
RenderFrameHost* render_frame_host_; RenderFrameHost* render_frame_host_;
RenderProcessHost* render_process_host_;
ScopedVector<PermissionServiceImpl> services_; ScopedVector<PermissionServiceImpl> services_;
DISALLOW_COPY_AND_ASSIGN(PermissionServiceContext); DISALLOW_COPY_AND_ASSIGN(PermissionServiceContext);

@@ -109,7 +109,16 @@ void PermissionServiceImpl::HasPermission(
PermissionName permission, PermissionName permission,
const mojo::String& origin, const mojo::String& origin,
const mojo::Callback<void(PermissionStatus)>& callback) { const mojo::Callback<void(PermissionStatus)>& callback) {
NOTIMPLEMENTED(); DCHECK(context_->GetBrowserContext());
// If the embedding_origin is empty we'll use |origin| instead.
GURL embedding_origin = context_->GetEmbeddingOrigin();
callback.Run(GetContentClient()->browser()->GetPermissionStatus(
PermissionNameToPermissionType(permission),
context_->GetBrowserContext(),
GURL(origin),
embedding_origin.is_empty() ? GURL(origin) : embedding_origin));
} }
} // namespace content } // namespace content

@@ -456,7 +456,7 @@ RenderProcessHostImpl::RenderProcessHostImpl(
within_process_died_observer_(false), within_process_died_observer_(false),
power_monitor_broadcaster_(this), power_monitor_broadcaster_(this),
worker_ref_count_(0), worker_ref_count_(0),
permission_service_context_(new PermissionServiceContext(nullptr)), permission_service_context_(new PermissionServiceContext(this)),
weak_factory_(this) { weak_factory_(this) {
widget_helper_ = new RenderWidgetHelper(); widget_helper_ = new RenderWidgetHelper();

@@ -4,11 +4,7 @@
module content; module content;
enum PermissionStatus { import "content/public/common/permission_status.mojom";
GRANTED,
DENIED,
ASK
};
enum PermissionName { enum PermissionName {
GEOLOCATION, GEOLOCATION,

@@ -25,7 +25,6 @@
['OS != "ios"', { ['OS != "ios"', {
'includes': [ 'includes': [
'../build/win_precompile.gypi', '../build/win_precompile.gypi',
'content_common_mojo_bindings.gypi',
'content_resources.gypi', 'content_resources.gypi',
], ],
}], }],
@@ -75,7 +74,6 @@
['OS != "ios"', { ['OS != "ios"', {
'dependencies': [ 'dependencies': [
'content_child', 'content_child',
'content_common_mojo_bindings',
'content_gpu', 'content_gpu',
'content_plugin', 'content_plugin',
'content_ppapi_plugin', 'content_ppapi_plugin',
@@ -175,7 +173,6 @@
}], }],
['OS != "ios"', { ['OS != "ios"', {
'dependencies': [ 'dependencies': [
'content_common_mojo_bindings',
'content_resources', 'content_resources',
], ],
}], }],
@@ -192,7 +189,6 @@
'conditions': [ 'conditions': [
['OS != "ios"', { ['OS != "ios"', {
'dependencies': [ 'dependencies': [
'content_common_mojo_bindings',
'content_resources', 'content_resources',
], ],
}], }],
@@ -312,11 +308,6 @@
'../v8/src/third_party/vtune/v8vtune.gyp:v8_vtune', '../v8/src/third_party/vtune/v8vtune.gyp:v8_vtune',
], ],
}], }],
['OS != "ios"', {
'dependencies': [
'content_common_mojo_bindings',
]
}]
], ],
'includes': [ 'includes': [
'content_app.gypi', 'content_app.gypi',

@@ -10,9 +10,12 @@
'../base/base.gyp:base', '../base/base.gyp:base',
'../base/base.gyp:base_i18n', '../base/base.gyp:base_i18n',
'../crypto/crypto.gyp:crypto', '../crypto/crypto.gyp:crypto',
'../mojo/edk/mojo_edk.gyp:mojo_system_impl',
'../mojo/mojo_base.gyp:mojo_environment_chromium',
'../ui/base/ui_base.gyp:ui_base', '../ui/base/ui_base.gyp:ui_base',
'../ui/gfx/gfx.gyp:gfx', '../ui/gfx/gfx.gyp:gfx',
'../ui/gfx/gfx.gyp:gfx_geometry', '../ui/gfx/gfx.gyp:gfx_geometry',
'content_common_mojo_bindings.gyp:content_common_mojo_bindings',
], ],
'sources': [ 'sources': [
'app/android/app_jni_registrar.cc', 'app/android/app_jni_registrar.cc',
@@ -63,11 +66,6 @@
'app/mojo/mojo_init.cc', 'app/mojo/mojo_init.cc',
'app/mojo/mojo_init.h', 'app/mojo/mojo_init.h',
], ],
}, { # OS!="ios"
'dependencies': [
'../mojo/edk/mojo_edk.gyp:mojo_system_impl',
'../mojo/mojo_base.gyp:mojo_environment_chromium',
],
}], }],
], ],
} }

@@ -29,6 +29,7 @@
'../ui/snapshot/snapshot.gyp:snapshot', '../ui/snapshot/snapshot.gyp:snapshot',
'browser/service_worker/service_worker_proto.gyp:proto', 'browser/service_worker/service_worker_proto.gyp:proto',
'browser/speech/proto/speech_proto.gyp:speech_proto', 'browser/speech/proto/speech_proto.gyp:speech_proto',
'content_common_mojo_bindings.gyp:content_common_mojo_bindings',
], ],
'export_dependent_settings': [ 'export_dependent_settings': [
'../ui/accessibility/accessibility.gyp:ax_gen', '../ui/accessibility/accessibility.gyp:ax_gen',
@@ -38,6 +39,7 @@
'../third_party/WebKit/public/blink_headers.gyp:blink_headers', '../third_party/WebKit/public/blink_headers.gyp:blink_headers',
# The public render_widget_host.h needs to re-export skia defines. # The public render_widget_host.h needs to re-export skia defines.
'../skia/skia.gyp:skia', '../skia/skia.gyp:skia',
'content_common_mojo_bindings.gyp:content_common_mojo_bindings',
], ],
'include_dirs': [ 'include_dirs': [
'..', '..',

@@ -13,6 +13,7 @@
'../ui/gfx/gfx.gyp:gfx', '../ui/gfx/gfx.gyp:gfx',
'../ui/gfx/gfx.gyp:gfx_geometry', '../ui/gfx/gfx.gyp:gfx_geometry',
'../url/url.gyp:url_lib', '../url/url.gyp:url_lib',
'content_common_mojo_bindings.gyp:content_common_mojo_bindings',
], ],
'include_dirs': [ 'include_dirs': [
'..', '..',

@@ -17,6 +17,7 @@
# NOTE: Sources duplicated in # NOTE: Sources duplicated in
# //content/public/common/BUILD.gn:mojo_bindings. # //content/public/common/BUILD.gn:mojo_bindings.
'public/common/mojo_geoposition.mojom', 'public/common/mojo_geoposition.mojom',
'public/common/permission_status.mojom',
], ],
}, },
'includes': [ '../mojo/public/tools/bindings/mojom_bindings_generator_explicit.gypi' ], 'includes': [ '../mojo/public/tools/bindings/mojom_bindings_generator_explicit.gypi' ],

@@ -12,6 +12,7 @@
'../ui/gfx/gfx.gyp:gfx', '../ui/gfx/gfx.gyp:gfx',
'../ui/gfx/gfx.gyp:gfx_geometry', '../ui/gfx/gfx.gyp:gfx_geometry',
'../third_party/WebKit/public/blink.gyp:blink', '../third_party/WebKit/public/blink.gyp:blink',
'content_common_mojo_bindings.gyp:content_common_mojo_bindings',
], ],
'sources': [ 'sources': [
'ppapi_plugin/broker_process_dispatcher.cc', 'ppapi_plugin/broker_process_dispatcher.cc',

@@ -36,6 +36,7 @@
'../ui/surface/surface.gyp:surface', '../ui/surface/surface.gyp:surface',
'../v8/tools/gyp/v8.gyp:v8', '../v8/tools/gyp/v8.gyp:v8',
'../webkit/common/gpu/webkit_gpu.gyp:webkit_gpu', '../webkit/common/gpu/webkit_gpu.gyp:webkit_gpu',
'content_common_mojo_bindings.gyp:content_common_mojo_bindings',
], ],
'include_dirs': [ 'include_dirs': [
'..', '..',

@@ -199,6 +199,8 @@
'target_name': 'test_support_content', 'target_name': 'test_support_content',
'type': 'static_library', 'type': 'static_library',
'dependencies': [ 'dependencies': [
'../mojo/edk/mojo_edk.gyp:mojo_system_impl',
'../mojo/mojo_base.gyp:mojo_environment_chromium',
'../net/net.gyp:net_test_support', '../net/net.gyp:net_test_support',
'../skia/skia.gyp:skia', '../skia/skia.gyp:skia',
'../storage/storage_common.gyp:storage_common', '../storage/storage_common.gyp:storage_common',
@@ -375,6 +377,7 @@
'browser/speech/proto/speech_proto.gyp:speech_proto', 'browser/speech/proto/speech_proto.gyp:speech_proto',
'content.gyp:content_browser', 'content.gyp:content_browser',
'content.gyp:content_common', 'content.gyp:content_common',
'content_common_mojo_bindings.gyp:content_common_mojo_bindings',
'test_support_content', 'test_support_content',
'../base/base.gyp:test_support_base', '../base/base.gyp:test_support_base',
'../crypto/crypto.gyp:crypto', '../crypto/crypto.gyp:crypto',
@@ -1155,6 +1158,7 @@
'content.gyp:content_renderer', 'content.gyp:content_renderer',
'content.gyp:content_resources', 'content.gyp:content_resources',
'content_browser_test_support', 'content_browser_test_support',
'content_common_mojo_bindings.gyp:content_common_mojo_bindings',
'content_shell_lib', 'content_shell_lib',
'content_shell_pak', 'content_shell_pak',
'test_support_content', 'test_support_content',

@@ -226,6 +226,14 @@ void ContentBrowserClient::RequestPermission(
result_callback.Run(true); result_callback.Run(true);
} }
PermissionStatus ContentBrowserClient::GetPermissionStatus(
PermissionType permission,
BrowserContext* browser_context,
const GURL& requesting_origin,
const GURL& embedding_origin) {
return PERMISSION_STATUS_DENIED;
}
bool ContentBrowserClient::CanCreateWindow( bool ContentBrowserClient::CanCreateWindow(
const GURL& opener_url, const GURL& opener_url,
const GURL& opener_top_level_frame_url, const GURL& opener_top_level_frame_url,

@@ -19,6 +19,7 @@
#include "content/public/browser/permission_type.h" #include "content/public/browser/permission_type.h"
#include "content/public/common/content_client.h" #include "content/public/common/content_client.h"
#include "content/public/common/media_stream_request.h" #include "content/public/common/media_stream_request.h"
#include "content/public/common/permission_status.mojom.h"
#include "content/public/common/resource_type.h" #include "content/public/common/resource_type.h"
#include "content/public/common/socket_permission_request.h" #include "content/public/common/socket_permission_request.h"
#include "content/public/common/window_container_type.h" #include "content/public/common/window_container_type.h"
@@ -438,6 +439,12 @@ class CONTENT_EXPORT ContentBrowserClient {
const GURL& frame_url, const GURL& frame_url,
const GURL& main_frame_url) {} const GURL& main_frame_url) {}
virtual PermissionStatus GetPermissionStatus(
PermissionType permission,
BrowserContext* browser_context,
const GURL& requesting_origin,
const GURL& embedding_origin);
// Returns true if the given page is allowed to open a window of the given // Returns true if the given page is allowed to open a window of the given
// type. If true is returned, |no_javascript_access| will indicate whether // type. If true is returned, |no_javascript_access| will indicate whether
// the window that is created should be scriptable/in the same process. // the window that is created should be scriptable/in the same process.

@@ -52,5 +52,6 @@ source_set("common_sources") {
mojom("mojo_bindings") { mojom("mojo_bindings") {
sources = [ sources = [
"mojo_geoposition.mojom", "mojo_geoposition.mojom",
"permission_status.mojom",
] ]
} }

@@ -0,0 +1,11 @@
// Copyright 2014 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.
module content;
enum PermissionStatus {
GRANTED,
DENIED,
ASK
};