Skip to content

Commit

Permalink
permission control from manifest and webview attribute
Browse files Browse the repository at this point in the history
  • Loading branch information
rogerwang committed Dec 18, 2014
1 parent 570b1ed commit 0d88746
Show file tree
Hide file tree
Showing 11 changed files with 305 additions and 20 deletions.
4 changes: 4 additions & 0 deletions nw.gypi
Expand Up @@ -289,12 +289,16 @@
'src/browser/shell_extension_system.h',
'src/browser/shell_extension_system_factory.cc',
'src/browser/shell_extension_system_factory.h',
'src/browser/shell_extensions_api_client.cc',
'src/browser/shell_extensions_api_client.h',
'src/browser/shell_extensions_browser_client.cc',
'src/browser/shell_extensions_browser_client.h',
'src/browser/shell_extension_host_delegate.cc',
'src/browser/shell_extension_host_delegate.h',
'src/browser/shell_extension_web_contents_observer.cc',
'src/browser/shell_extension_web_contents_observer.h',
'src/browser/shell_web_view_guest_delegate.cc',
'src/browser/shell_web_view_guest_delegate.h',
'src/browser/shell_display_info_provider.cc',
'src/browser/shell_display_info_provider.h',
'src/browser/shell_runtime_api_delegate.cc',
Expand Down
104 changes: 104 additions & 0 deletions src/browser/shell_extensions_api_client.cc
@@ -0,0 +1,104 @@
// 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.

#include "content/nw/src/browser/shell_extensions_api_client.h"

#include "base/files/file_path.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/nw/src/browser/shell_web_view_guest_delegate.h"
#include "extensions/browser/api/device_permissions_prompt.h"
#include "extensions/browser/api/virtual_keyboard_private/virtual_keyboard_delegate.h"
#include "extensions/browser/api/web_request/web_request_event_router_delegate.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h"
#include "extensions/browser/guest_view/web_view/web_view_permission_helper_delegate.h"
#include "extensions/browser/guest_view/web_view/web_view_guest.h"

namespace extensions {

ShellExtensionsAPIClient::ShellExtensionsAPIClient() {}

ShellExtensionsAPIClient::~ShellExtensionsAPIClient() {}

void ShellExtensionsAPIClient::AddAdditionalValueStoreCaches(
content::BrowserContext* context,
const scoped_refptr<SettingsStorageFactory>& factory,
const scoped_refptr<ObserverListThreadSafe<SettingsObserver> >& observers,
std::map<settings_namespace::Namespace, ValueStoreCache*>* caches) {
}

AppViewGuestDelegate* ShellExtensionsAPIClient::CreateAppViewGuestDelegate()
const {
return NULL;
}

double ShellWebViewGuestDelegate::GetZoom() {
return 1.0;
}

void ShellWebViewGuestDelegate::OnSetZoom(double zoom_factor) {
}

void ShellWebViewGuestDelegate::OnShowContextMenu(
int request_id,
const MenuItemVector* items) {
}

bool ShellWebViewGuestDelegate::HandleContextMenu(
const content::ContextMenuParams& params) {
return false;
}

ExtensionOptionsGuestDelegate*
ShellExtensionsAPIClient::CreateExtensionOptionsGuestDelegate(
ExtensionOptionsGuest* guest) const {
return NULL;
}

scoped_ptr<MimeHandlerViewGuestDelegate>
ShellExtensionsAPIClient::CreateMimeHandlerViewGuestDelegate(
MimeHandlerViewGuest* guest) const {
return scoped_ptr<MimeHandlerViewGuestDelegate>();
}

WebViewGuestDelegate* ShellExtensionsAPIClient::CreateWebViewGuestDelegate(
WebViewGuest* web_view_guest) const {
return new ShellWebViewGuestDelegate(web_view_guest);
}

WebViewPermissionHelperDelegate* ShellExtensionsAPIClient::
CreateWebViewPermissionHelperDelegate(
WebViewPermissionHelper* web_view_permission_helper) const {
return new WebViewPermissionHelperDelegate(web_view_permission_helper);
}

WebRequestEventRouterDelegate*
ShellExtensionsAPIClient::CreateWebRequestEventRouterDelegate() const {
return new WebRequestEventRouterDelegate();
}

scoped_refptr<ContentRulesRegistry>
ShellExtensionsAPIClient::CreateContentRulesRegistry(
content::BrowserContext* browser_context,
RulesCacheDelegate* cache_delegate) const {
return scoped_refptr<ContentRulesRegistry>();
}

scoped_ptr<DevicePermissionsPrompt>
ShellExtensionsAPIClient::CreateDevicePermissionsPrompt(
content::WebContents* web_contents) const {
return nullptr;
}

scoped_ptr<VirtualKeyboardDelegate>
ShellExtensionsAPIClient::CreateVirtualKeyboardDelegate() const {
return nullptr;
}

ManagementAPIDelegate* ShellExtensionsAPIClient::CreateManagementAPIDelegate()
const {
return nullptr;
}

} // namespace extensions
52 changes: 52 additions & 0 deletions src/browser/shell_extensions_api_client.h
@@ -0,0 +1,52 @@
// 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.

#ifndef NW_BROWSER_EXTENSIONS_API_CHROME_EXTENSIONS_API_CLIENT_H_
#define NW_BROWSER_EXTENSIONS_API_CHROME_EXTENSIONS_API_CLIENT_H_

#include "base/compiler_specific.h"
#include "extensions/browser/api/extensions_api_client.h"

namespace extensions {

// Extra support for extensions APIs in Chrome.
class ShellExtensionsAPIClient : public ExtensionsAPIClient {
public:
ShellExtensionsAPIClient();
~ShellExtensionsAPIClient() override;

// ExtensionsApiClient implementation.
void AddAdditionalValueStoreCaches(
content::BrowserContext* context,
const scoped_refptr<SettingsStorageFactory>& factory,
const scoped_refptr<ObserverListThreadSafe<SettingsObserver>>& observers,
std::map<settings_namespace::Namespace, ValueStoreCache*>* caches)
override;
AppViewGuestDelegate* CreateAppViewGuestDelegate() const override;
ExtensionOptionsGuestDelegate* CreateExtensionOptionsGuestDelegate(
ExtensionOptionsGuest* guest) const override;
scoped_ptr<MimeHandlerViewGuestDelegate> CreateMimeHandlerViewGuestDelegate(
MimeHandlerViewGuest* guest) const override;
WebViewGuestDelegate* CreateWebViewGuestDelegate(
WebViewGuest* web_view_guest) const override;
WebViewPermissionHelperDelegate* CreateWebViewPermissionHelperDelegate(
WebViewPermissionHelper* web_view_permission_helper) const override;
WebRequestEventRouterDelegate* CreateWebRequestEventRouterDelegate()
const override;
scoped_refptr<ContentRulesRegistry> CreateContentRulesRegistry(
content::BrowserContext* browser_context,
RulesCacheDelegate* cache_delegate) const override;
scoped_ptr<DevicePermissionsPrompt> CreateDevicePermissionsPrompt(
content::WebContents* web_contents) const override;
scoped_ptr<VirtualKeyboardDelegate> CreateVirtualKeyboardDelegate()
const override;
ManagementAPIDelegate* CreateManagementAPIDelegate() const override;

private:
DISALLOW_COPY_AND_ASSIGN(ShellExtensionsAPIClient);
};

} // namespace extensions

#endif // CHROME_BROWSER_EXTENSIONS_API_CHROME_EXTENSIONS_API_CLIENT_H_
3 changes: 2 additions & 1 deletion src/browser/shell_extensions_browser_client.cc
Expand Up @@ -25,6 +25,7 @@
#include "extensions/shell/browser/shell_runtime_api_delegate.h"

#include "content/nw/src/browser/shell_component_extension_resource_manager.h"
#include "content/nw/src/browser/shell_extensions_api_client.h"

using content::BrowserContext;
using content::BrowserThread;
Expand All @@ -42,7 +43,7 @@ void RegisterPrefs(user_prefs::PrefRegistrySyncable* registry) {
ShellExtensionsBrowserClient::ShellExtensionsBrowserClient(
BrowserContext* context)
: browser_context_(context),
api_client_(new ExtensionsAPIClient),
api_client_(new ShellExtensionsAPIClient),
extension_cache_(new NullExtensionCache()) {
// Set up the preferences service.
base::PrefServiceFactory factory;
Expand Down
56 changes: 56 additions & 0 deletions src/browser/shell_web_view_guest_delegate.cc
@@ -0,0 +1,56 @@
// 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.


#include "content/nw/src/browser/shell_web_view_guest_delegate.h"

#include "content/public/browser/child_process_security_policy.h"
#include "content/public/browser/render_process_host.h"
#include "extensions/browser/api/web_request/web_request_api.h"
#include "extensions/browser/guest_view/web_view/web_view_constants.h"

namespace extensions {

ShellWebViewGuestDelegate::ShellWebViewGuestDelegate(
WebViewGuest* web_view_guest)
: web_view_guest_(web_view_guest),
nw_disabled_(false),
weak_ptr_factory_(this) {
}

ShellWebViewGuestDelegate::~ShellWebViewGuestDelegate() {
}

void ShellWebViewGuestDelegate::OnAttachWebViewHelpers(
content::WebContents* contents) {
}

void ShellWebViewGuestDelegate::OnDidAttachToEmbedder() {
web_view_guest_->attach_params()->GetBoolean("nwdisable", &nw_disabled_);
if (nw_disabled_)
return;
content::RenderProcessHost* host =
web_view_guest_->web_contents()->GetRenderProcessHost();
content::ChildProcessSecurityPolicy::GetInstance()->GrantScheme(
host->GetID(), url::kFileScheme);
}

void ShellWebViewGuestDelegate::OnDidCommitProvisionalLoadForFrame(
bool is_main_frame) {
}

void ShellWebViewGuestDelegate::OnDidInitialize() {
}

void ShellWebViewGuestDelegate::OnDocumentLoadedInFrame(
content::RenderFrameHost* render_frame_host) {
}

void ShellWebViewGuestDelegate::OnEmbedderWillBeDestroyed() {
}

void ShellWebViewGuestDelegate::OnGuestDestroyed() {
}

} // namespace extensions
53 changes: 53 additions & 0 deletions src/browser/shell_web_view_guest_delegate.h
@@ -0,0 +1,53 @@
// 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.

#ifndef NW_BROWSER_GUEST_VIEW_WEB_VIEW_CHROME_WEB_VIEW_GUEST_DELEGATE_H_
#define NW_BROWSER_GUEST_VIEW_WEB_VIEW_CHROME_WEB_VIEW_GUEST_DELEGATE_H_

#include "extensions/browser/guest_view/web_view/web_view_guest.h"
#include "extensions/browser/guest_view/web_view/web_view_guest_delegate.h"


namespace extensions {

class ShellWebViewGuestDelegate : public WebViewGuestDelegate {
public :
explicit ShellWebViewGuestDelegate(WebViewGuest* web_view_guest);
~ShellWebViewGuestDelegate() override;

// WebViewGuestDelegate implementation.
double GetZoom() override;
bool HandleContextMenu(const content::ContextMenuParams& params) override;
void OnAttachWebViewHelpers(content::WebContents* contents) override;
void OnDidAttachToEmbedder() override;
void OnDidCommitProvisionalLoadForFrame(bool is_main_frame) override;
void OnDidInitialize() override;
void OnDocumentLoadedInFrame(
content::RenderFrameHost* render_frame_host) override;
void OnEmbedderWillBeDestroyed() override;
void OnGuestDestroyed() override;
void OnSetZoom(double zoom_factor) override;
void OnShowContextMenu(int request_id, const MenuItemVector* items) override;

WebViewGuest* web_view_guest() const { return web_view_guest_; }

private:
content::WebContents* guest_web_contents() const {
return web_view_guest()->web_contents();
}

WebViewGuest* const web_view_guest_;

bool nw_disabled_;
// This is used to ensure pending tasks will not fire after this object is
// destroyed.
base::WeakPtrFactory<ShellWebViewGuestDelegate> weak_ptr_factory_;

DISALLOW_COPY_AND_ASSIGN(ShellWebViewGuestDelegate);
};

} // namespace extensions

#endif // CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_CHROME_WEB_VIEW_GUEST_DELEGATE_H_

6 changes: 6 additions & 0 deletions src/nw_package.cc
Expand Up @@ -245,6 +245,12 @@ bool Package::GetUseNode() {
return use_node;
}

bool Package::GetUseExtension() {
bool use_ext = true;
root()->GetBoolean(switches::kChromeExtension, &use_ext);
return use_ext;
}

base::DictionaryValue* Package::window() {
base::DictionaryValue* window;
root()->GetDictionaryWithoutPathExpansion(switches::kmWindow, &window);
Expand Down
2 changes: 2 additions & 0 deletions src/nw_package.h
Expand Up @@ -66,6 +66,8 @@ class Package {
// Return if we enable node.js.
bool GetUseNode();

bool GetUseExtension();

// Root path of package.
FilePath path() const { return path_; }

Expand Down
37 changes: 22 additions & 15 deletions src/renderer/shell_content_renderer_client.cc
Expand Up @@ -71,6 +71,7 @@
#include "nw/id/commit.h"

#include "extensions/common/extensions_client.h"
#include "extensions/common/switches.h"
#include "extensions/renderer/default_dispatcher_delegate.h"
#include "extensions/renderer/dispatcher.h"
#include "extensions/renderer/extension_helper.h"
Expand Down Expand Up @@ -165,18 +166,20 @@ void ShellContentRendererClient::RenderThreadStarted() {
command_line->GetSwitchValuePath(switches::kWorkingDirectory));
}

extensions_client_.reset(CreateExtensionsClient());
extensions::ExtensionsClient::Set(extensions_client_.get());
if (command_line->HasSwitch(extensions::switches::kExtensionProcess)) {
extensions_client_.reset(CreateExtensionsClient());
extensions::ExtensionsClient::Set(extensions_client_.get());

extensions_renderer_client_.reset(new extensions::ShellExtensionsRendererClient);
extensions::ExtensionsRendererClient::Set(extensions_renderer_client_.get());
extensions_renderer_client_.reset(new extensions::ShellExtensionsRendererClient);
extensions::ExtensionsRendererClient::Set(extensions_renderer_client_.get());

extension_dispatcher_delegate_.reset(new extensions::DefaultDispatcherDelegate());
extension_dispatcher_delegate_.reset(new extensions::DefaultDispatcherDelegate());

// Must be initialized after ExtensionsRendererClient.
extension_dispatcher_.reset(
new extensions::Dispatcher(extension_dispatcher_delegate_.get()));
thread->AddObserver(extension_dispatcher_.get());
// Must be initialized after ExtensionsRendererClient.
extension_dispatcher_.reset(
new extensions::Dispatcher(extension_dispatcher_delegate_.get()));
thread->AddObserver(extension_dispatcher_.get());
}

#if 0
if (command_line->HasSwitch(switches::kDomStorageQuota)) {
Expand Down Expand Up @@ -207,8 +210,10 @@ void ShellContentRendererClient::RenderViewCreated(RenderView* render_view) {
new printing::PrintWebViewHelper(render_view);
#endif

new extensions::ExtensionHelper(render_view, extension_dispatcher_.get());
extension_dispatcher_->OnRenderViewCreated(render_view);
if (extension_dispatcher_.get()) {
new extensions::ExtensionHelper(render_view, extension_dispatcher_.get());
extension_dispatcher_->OnRenderViewCreated(render_view);
}

PasswordGenerationAgent* password_generation_agent =
new PasswordGenerationAgent(render_view);
Expand Down Expand Up @@ -239,8 +244,8 @@ void ShellContentRendererClient::DidCreateScriptContext(
InstallNodeSymbols(frame, context, url);
creating_first_context_ = false;

extension_dispatcher_->DidCreateScriptContext(
frame, context, extension_group, world_id);
if (extension_dispatcher_.get())
extension_dispatcher_->DidCreateScriptContext(frame, context, extension_group, world_id);
}

bool ShellContentRendererClient::goodForNode(blink::WebFrame* frame)
Expand Down Expand Up @@ -535,8 +540,10 @@ ExtensionsClient* ShellContentRendererClient::CreateExtensionsClient() {

void ShellContentRendererClient::RenderFrameCreated(
content::RenderFrame* render_frame) {
// ShellFrameHelper destroys itself when the RenderFrame is destroyed.
new ShellFrameHelper(render_frame, extension_dispatcher_.get());
// ShellFrameHelper destroys itself when the RenderFrame is
// destroyed.
if (extension_dispatcher_.get())
new ShellFrameHelper(render_frame, extension_dispatcher_.get());

// TODO(jamescook): Do we need to add a new PepperHelper(render_frame) here?
// It doesn't seem necessary for either Pepper or NaCl.
Expand Down

0 comments on commit 0d88746

Please sign in to comment.