Index: apps/app_web_contents_helper.cc |
diff --git a/apps/app_web_contents_helper.cc b/apps/app_web_contents_helper.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..115a372347fc16a8b11706f651043b8b4e8db137 |
--- /dev/null |
+++ b/apps/app_web_contents_helper.cc |
@@ -0,0 +1,114 @@ |
+// 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 "apps/app_web_contents_helper.h" |
+ |
+#include "apps/app_delegate.h" |
+#include "base/strings/stringprintf.h" |
+#include "chrome/browser/extensions/suggest_permission_util.h" |
+#include "content/public/browser/native_web_keyboard_event.h" |
+#include "content/public/browser/page_navigator.h" |
+#include "content/public/browser/render_view_host.h" |
+#include "content/public/browser/web_contents.h" |
+#include "extensions/browser/extension_registry.h" |
+#include "extensions/common/extension_messages.h" |
+#include "extensions/common/permissions/api_permission.h" |
+ |
+namespace apps { |
+ |
+AppWebContentsHelper::AppWebContentsHelper( |
+ content::BrowserContext* browser_context, |
+ const std::string& extension_id, |
+ content::WebContents* web_contents, |
+ AppDelegate* app_delegate) |
+ : browser_context_(browser_context), |
+ extension_id_(extension_id), |
+ web_contents_(web_contents), |
+ app_delegate_(app_delegate) { |
+} |
+ |
+// static |
+bool AppWebContentsHelper::ShouldSuppressGestureEvent( |
+ const blink::WebGestureEvent& event) { |
+ // Disable pinch zooming in app windows. |
+ return event.type == blink::WebGestureEvent::GesturePinchBegin || |
+ event.type == blink::WebGestureEvent::GesturePinchUpdate || |
+ event.type == blink::WebGestureEvent::GesturePinchEnd; |
+} |
+ |
+content::WebContents* AppWebContentsHelper::OpenURLFromTab( |
+ const content::OpenURLParams& params) const { |
+ // Don't allow the current tab to be navigated. It would be nice to map all |
+ // anchor tags (even those without target="_blank") to new tabs, but right |
+ // now we can't distinguish between those and <meta> refreshes or window.href |
+ // navigations, which we don't want to allow. |
+ // TOOD(mihaip): Can we check for user gestures instead? |
+ WindowOpenDisposition disposition = params.disposition; |
+ if (disposition == CURRENT_TAB) { |
+ AddMessageToDevToolsConsole( |
+ content::CONSOLE_MESSAGE_LEVEL_ERROR, |
+ base::StringPrintf( |
+ "Can't open same-window link to \"%s\"; try target=\"_blank\".", |
+ params.url.spec().c_str())); |
+ return NULL; |
+ } |
+ |
+ // These dispositions aren't really navigations. |
+ if (disposition == SUPPRESS_OPEN || disposition == SAVE_TO_DISK || |
+ disposition == IGNORE_ACTION) { |
+ return NULL; |
+ } |
+ |
+ content::WebContents* contents = |
+ app_delegate_->OpenURLFromTab(browser_context_, web_contents_, params); |
+ if (!contents) { |
+ AddMessageToDevToolsConsole( |
+ content::CONSOLE_MESSAGE_LEVEL_ERROR, |
+ base::StringPrintf( |
+ "Can't navigate to \"%s\"; apps do not support navigation.", |
+ params.url.spec().c_str())); |
+ } |
+ |
+ return contents; |
+} |
+ |
+void AppWebContentsHelper::RequestToLockMouse() const { |
+ const extensions::Extension* extension = GetExtension(); |
+ if (!extension) |
+ return; |
+ |
+ bool has_permission = IsExtensionWithPermissionOrSuggestInConsole( |
+ extensions::APIPermission::kPointerLock, |
+ extension, |
+ web_contents_->GetRenderViewHost()); |
+ |
+ web_contents_->GotResponseToLockMouseRequest(has_permission); |
+} |
+ |
+void AppWebContentsHelper::RequestMediaAccessPermission( |
+ const content::MediaStreamRequest& request, |
+ const content::MediaResponseCallback& callback) const { |
+ const extensions::Extension* extension = GetExtension(); |
+ if (!extension) |
+ return; |
+ |
+ app_delegate_->RequestMediaAccessPermission( |
+ web_contents_, request, callback, extension); |
+} |
+ |
+const extensions::Extension* AppWebContentsHelper::GetExtension() const { |
+ return extensions::ExtensionRegistry::Get(browser_context_) |
+ ->enabled_extensions() |
+ .GetByID(extension_id_); |
+} |
+ |
+void AppWebContentsHelper::AddMessageToDevToolsConsole( |
+ content::ConsoleMessageLevel level, |
+ const std::string& message) const { |
+ content::RenderViewHost* rvh = web_contents_->GetRenderViewHost(); |
+ rvh->Send(new ExtensionMsg_AddMessageToConsole( |
+ rvh->GetRoutingID(), level, message)); |
+} |
+ |
+} // namespace apps |