1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_permission_helper.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_process_host.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_view_host.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/user_metrics.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/extensions_api_client.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_constants.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_guest.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/guest_view/web_view/web_view_permission_helper_delegate.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_permission_types.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing content::BrowserPluginGuestDelegate; 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing content::RenderViewHost; 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace extensions { 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstatic std::string PermissionTypeToString(WebViewPermissionType type) { 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (type) { 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return webview::kPermissionTypeDownload; 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM: 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return webview::kPermissionTypeFileSystem; 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return webview::kPermissionTypeGeolocation; 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return webview::kPermissionTypeDialog; 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return webview::kPermissionTypeLoadPlugin; 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_MEDIA: 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return webview::kPermissionTypeMedia; 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW: 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return webview::kPermissionTypeNewWindow; 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return webview::kPermissionTypePointerLock; 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED(); 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return std::string(); 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RecordUserInitiatedUMA( 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const WebViewPermissionHelper::PermissionResponseInfo& info, 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allow) { 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (allow) { 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Note that |allow| == true means the embedder explicitly allowed the 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // request. For some requests they might still fail. An example of such 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // scenario would be: an embedder allows geolocation request but doesn't 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // have geolocation access on its own. 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (info.permission_type) { 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.PermissionAllow.Download")); 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM: 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.PermissionAllow.FileSystem")); 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.PermissionAllow.Geolocation")); 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.PermissionAllow.JSDialog")); 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.Guest.PermissionAllow.PluginLoad")); 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_MEDIA: 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.PermissionAllow.Media")); 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW: 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("BrowserPlugin.PermissionAllow.NewWindow")); 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.PermissionAllow.PointerLock")); 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (info.permission_type) { 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.PermissionDeny.Download")); 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM: 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.PermissionDeny.FileSystem")); 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.PermissionDeny.Geolocation")); 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.PermissionDeny.JSDialog")); 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.Guest.PermissionDeny.PluginLoad")); 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_MEDIA: 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.PermissionDeny.Media")); 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW: 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("BrowserPlugin.PermissionDeny.NewWindow")); 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RecordAction( 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserMetricsAction("WebView.PermissionDeny.PointerLock")); 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 132116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::WebViewPermissionHelper(WebViewGuest* web_view_guest) 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : content::WebContentsObserver(web_view_guest->web_contents()), 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next_permission_request_id_(guestview::kInstanceIDNone), 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_view_guest_(web_view_guest), 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_factory_(this) { 1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) web_view_permission_helper_delegate_.reset( 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionsAPIClient::Get()->CreateWebViewPermissionHelperDelegate( 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this)); 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 142116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::~WebViewPermissionHelper() { 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static 146116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper* WebViewPermissionHelper::FromFrameID( 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int render_process_id, 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int render_frame_id) { 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebViewGuest* web_view_guest = WebViewGuest::FromFrameID( 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_process_id, render_frame_id); 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!web_view_guest) { 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return NULL; 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return web_view_guest->web_view_permission_helper_.get(); 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static 158116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper* WebViewPermissionHelper::FromWebContents( 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::WebContents* web_contents) { 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebViewGuest* web_view_guest = WebViewGuest::FromWebContents(web_contents); 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!web_view_guest) 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return NULL; 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return web_view_guest->web_view_permission_helper_.get(); 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_PLUGINS) 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebViewPermissionHelper::OnMessageReceived( 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const IPC::Message& message, 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* render_frame_host) { 1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return web_view_permission_helper_delegate_->OnMessageReceived( 1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) message, render_frame_host); 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebViewPermissionHelper::OnMessageReceived(const IPC::Message& message) { 1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return web_view_permission_helper_delegate_->OnMessageReceived(message); 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // defined(ENABLE_PLUGINS) 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::RequestMediaAccessPermission( 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::WebContents* source, 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const content::MediaStreamRequest& request, 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const content::MediaResponseCallback& callback) { 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::DictionaryValue request_info; 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request_info.SetString(guestview::kUrl, request.security_origin.spec()); 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RequestPermission( 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WEB_VIEW_PERMISSION_TYPE_MEDIA, 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request_info, 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&WebViewPermissionHelper::OnMediaPermissionResponse, 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_factory_.GetWeakPtr(), 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request, 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback), 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false /* allowed_by_default */); 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool WebViewPermissionHelper::CheckMediaAccessPermission( 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::WebContents* source, 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& security_origin, 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::MediaStreamType type) { 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!web_view_guest()->attached() || 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !web_view_guest()->embedder_web_contents()->GetDelegate()) { 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return web_view_guest() 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->embedder_web_contents() 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->GetDelegate() 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->CheckMediaAccessPermission( 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_view_guest()->embedder_web_contents(), security_origin, type); 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebViewPermissionHelper::OnMediaPermissionResponse( 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const content::MediaStreamRequest& request, 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const content::MediaResponseCallback& callback, 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool allow, 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& user_input) { 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!allow) { 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback.Run(content::MediaStreamDevices(), 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::MEDIA_DEVICE_PERMISSION_DENIED, 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<content::MediaStreamUI>()); 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!web_view_guest()->attached() || 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !web_view_guest()->embedder_web_contents()->GetDelegate()) { 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback.Run(content::MediaStreamDevices(), 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::MEDIA_DEVICE_INVALID_STATE, 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<content::MediaStreamUI>()); 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_view_guest() 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->embedder_web_contents() 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->GetDelegate() 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->RequestMediaAccessPermission( 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_view_guest()->embedder_web_contents(), request, callback); 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::CanDownload( 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderViewHost* render_view_host, 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& url, 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& request_method, 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Callback<void(bool)>& callback) { 2416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) web_view_permission_helper_delegate_->CanDownload( 2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) render_view_host, url, request_method, callback); 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::RequestPointerLockPermission( 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool user_gesture, 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool last_unlocked_by_target, 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Callback<void(bool)>& callback) { 2496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) web_view_permission_helper_delegate_->RequestPointerLockPermission( 2506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_gesture, last_unlocked_by_target, callback); 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::RequestGeolocationPermission( 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int bridge_id, 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& requesting_frame, 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool user_gesture, 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Callback<void(bool)>& callback) { 2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) web_view_permission_helper_delegate_->RequestGeolocationPermission( 2596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bridge_id, requesting_frame, user_gesture, callback); 260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::CancelGeolocationPermissionRequest( 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int bridge_id) { 2646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) web_view_permission_helper_delegate_->CancelGeolocationPermissionRequest( 2656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bridge_id); 266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 268116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::RequestFileSystemPermission( 269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& url, 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allowed_by_default, 271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Callback<void(bool)>& callback) { 2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) web_view_permission_helper_delegate_->RequestFileSystemPermission( 2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) url, allowed_by_default, callback); 274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 276116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::FileSystemAccessedAsync(int render_process_id, 277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int render_frame_id, 278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int request_id, 279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& url, 280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool blocked_by_policy) { 2816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) web_view_permission_helper_delegate_->FileSystemAccessedAsync( 2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) render_process_id, render_frame_id, request_id, url, blocked_by_policy); 283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 285116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::FileSystemAccessedSync(int render_process_id, 286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int render_frame_id, 287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& url, 288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool blocked_by_policy, 289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC::Message* reply_msg) { 2906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) web_view_permission_helper_delegate_->FileSystemAccessedSync( 2916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) render_process_id, render_frame_id, url, blocked_by_policy, reply_msg); 292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 294116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint WebViewPermissionHelper::RequestPermission( 295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebViewPermissionType permission_type, 296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::DictionaryValue& request_info, 297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const PermissionResponseCallback& callback, 298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allowed_by_default) { 299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If there are too many pending permission requests then reject this request. 300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (pending_permission_requests_.size() >= 301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch webview::kMaxOutstandingPermissionRequests) { 302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Let the stack unwind before we deny the permission request so that 303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // objects held by the permission request are not destroyed immediately 304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // after creation. This is to allow those same objects to be accessed again 305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // in the same scope without fear of use after freeing. 306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::MessageLoop::current()->PostTask( 307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FROM_HERE, 308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&PermissionResponseCallback::Run, 309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Owned(new PermissionResponseCallback(callback)), 310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch allowed_by_default, 311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string())); 312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return webview::kInvalidPermissionRequestID; 313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int request_id = next_permission_request_id_++; 316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_permission_requests_[request_id] = 317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PermissionResponseInfo(callback, permission_type, allowed_by_default); 318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<base::DictionaryValue> args(request_info.DeepCopy()); 319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch args->SetInteger(webview::kRequestId, request_id); 320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (permission_type) { 321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW: { 322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_view_guest_->DispatchEventToEmbedder( 323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new GuestViewBase::Event(webview::kEventNewWindow, args.Pass())); 324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: { 327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_view_guest_->DispatchEventToEmbedder( 328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new GuestViewBase::Event(webview::kEventDialog, args.Pass())); 329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: { 332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch args->SetString(webview::kPermission, 333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PermissionTypeToString(permission_type)); 334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_view_guest_->DispatchEventToEmbedder(new GuestViewBase::Event( 335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch webview::kEventPermissionRequest, 336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch args.Pass())); 337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return request_id; 341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 343116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::SetPermissionResult 344116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::SetPermission( 345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int request_id, 346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PermissionResponseAction action, 347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& user_input) { 348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RequestMap::iterator request_itr = 349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_permission_requests_.find(request_id); 350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (request_itr == pending_permission_requests_.end()) 352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return SET_PERMISSION_INVALID; 353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const PermissionResponseInfo& info = request_itr->second; 355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allow = (action == ALLOW) || 356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ((action == DEFAULT) && info.allowed_by_default); 357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch info.callback.Run(allow, user_input); 359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Only record user initiated (i.e. non-default) actions. 361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (action != DEFAULT) 362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RecordUserInitiatedUMA(info, allow); 363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_permission_requests_.erase(request_itr); 365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return allow ? SET_PERMISSION_ALLOWED : SET_PERMISSION_DENIED; 367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void WebViewPermissionHelper::CancelPendingPermissionRequest(int request_id) { 3706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) RequestMap::iterator request_itr = 3716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) pending_permission_requests_.find(request_id); 3726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (request_itr == pending_permission_requests_.end()) 3746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return; 3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) pending_permission_requests_.erase(request_itr); 3776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 379116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::PermissionResponseInfo::PermissionResponseInfo() 380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : permission_type(WEB_VIEW_PERMISSION_TYPE_UNKNOWN), 381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch allowed_by_default(false) { 382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 384116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::PermissionResponseInfo::PermissionResponseInfo( 385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const PermissionResponseCallback& callback, 386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebViewPermissionType permission_type, 387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allowed_by_default) 388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : callback(callback), 389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch permission_type(permission_type), 390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch allowed_by_default(allowed_by_default) { 391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 393116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::PermissionResponseInfo::~PermissionResponseInfo() { 394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace extensions 397