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#ifndef EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_PERMISSION_HELPER_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_PERMISSION_HELPER_H_ 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/weak_ptr.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/metrics/user_metrics_action.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/web_contents.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/web_contents_observer.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/media_stream_request.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_permission_types.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/guest_view/guest_view_constants.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing base::UserMetricsAction; 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace extensions { 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass WebViewGuest; 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class WebViewPermissionHelperDelegate; 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// WebViewPermissionHelper manages <webview> permission requests. This helper 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// class is owned by WebViewGuest. Its purpose is to request permission for 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// various operations from the <webview> embedder, and reply back via callbacks 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// to the callers on a response from the embedder. 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass WebViewPermissionHelper 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : public content::WebContentsObserver { 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch explicit WebViewPermissionHelper(WebViewGuest* guest); 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~WebViewPermissionHelper(); 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef base::Callback< 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void(bool /* allow */, const std::string& /* user_input */)> 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PermissionResponseCallback; 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // A map to store the callback for a request keyed by the request's id. 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch struct PermissionResponseInfo { 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PermissionResponseCallback callback; 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebViewPermissionType permission_type; 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allowed_by_default; 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PermissionResponseInfo(); 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PermissionResponseInfo(const PermissionResponseCallback& callback, 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebViewPermissionType permission_type, 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allowed_by_default); 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ~PermissionResponseInfo(); 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef std::map<int, PermissionResponseInfo> RequestMap; 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int RequestPermission(WebViewPermissionType permission_type, 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::DictionaryValue& request_info, 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const PermissionResponseCallback& callback, 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allowed_by_default); 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static WebViewPermissionHelper* FromWebContents( 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::WebContents* web_contents); 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static WebViewPermissionHelper* FromFrameID(int render_process_id, 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int render_frame_id); 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void RequestMediaAccessPermission( 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::WebContents* source, 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const content::MediaStreamRequest& request, 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const content::MediaResponseCallback& callback); 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool CheckMediaAccessPermission(content::WebContents* source, 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& security_origin, 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::MediaStreamType type); 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void CanDownload(content::RenderViewHost* render_view_host, 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& url, 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& request_method, 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Callback<void(bool)>& callback); 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void RequestPointerLockPermission(bool user_gesture, 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool last_unlocked_by_target, 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Callback<void(bool)>& callback); 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Requests Geolocation Permission from the embedder. 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void RequestGeolocationPermission(int bridge_id, 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& requesting_frame, 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool user_gesture, 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Callback<void(bool)>& callback); 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void CancelGeolocationPermissionRequest(int bridge_id); 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void RequestFileSystemPermission(const GURL& url, 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allowed_by_default, 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Callback<void(bool)>& callback); 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Called when file system access is requested by the guest content using the 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // asynchronous HTML5 file system API. The request is plumbed through the 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // <webview> permission request API. The request will be: 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // - Allowed if the embedder explicitly allowed it. 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // - Denied if the embedder explicitly denied. 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // - Determined by the guest's content settings if the embedder does not 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // perform an explicit action. 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If access was blocked due to the page's content settings, 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |blocked_by_policy| should be true, and this function should invoke 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // OnContentBlocked. 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void FileSystemAccessedAsync(int render_process_id, 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int render_frame_id, 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int request_id, 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& url, 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool blocked_by_policy); 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Called when file system access is requested by the guest content using the 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // synchronous HTML5 file system API in a worker thread or shared worker. The 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // request is plumbed through the <webview> permission request API. The 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // request will be: 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // - Allowed if the embedder explicitly allowed it. 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // - Denied if the embedder explicitly denied. 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // - Determined by the guest's content settings if the embedder does not 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // perform an explicit action. 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If access was blocked due to the page's content settings, 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |blocked_by_policy| should be true, and this function should invoke 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // OnContentBlocked. 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void FileSystemAccessedSync(int render_process_id, 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int render_frame_id, 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& url, 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool blocked_by_policy, 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC::Message* reply_msg); 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch enum PermissionResponseAction { DENY, ALLOW, DEFAULT }; 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch enum SetPermissionResult { 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SET_PERMISSION_INVALID, 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SET_PERMISSION_ALLOWED, 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SET_PERMISSION_DENIED 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Responds to the permission request |request_id| with |action| and 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |user_input|. Returns whether there was a pending request for the provided 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |request_id|. 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetPermissionResult SetPermission(int request_id, 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PermissionResponseAction action, 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& user_input); 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void CancelPendingPermissionRequest(int request_id); 1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebViewGuest* web_view_guest() { return web_view_guest_; } 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnMediaPermissionResponse(const content::MediaStreamRequest& request, 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const content::MediaResponseCallback& callback, 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool allow, 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& user_input); 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_PLUGINS) 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // content::WebContentsObserver implementation. 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual bool OnMessageReceived( 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const IPC::Message& message, 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* render_frame_host) OVERRIDE; 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif // defined(ENABLE_PLUGINS) 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // A counter to generate a unique request id for a permission request. 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We only need the ids to be unique for a given WebViewGuest. 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int next_permission_request_id_; 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebViewPermissionHelper::RequestMap pending_permission_requests_; 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<WebViewPermissionHelperDelegate> 1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) web_view_permission_helper_delegate_; 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebViewGuest* const web_view_guest_; 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::WeakPtrFactory<WebViewPermissionHelper> weak_factory_; 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(WebViewPermissionHelper); 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace extensions 1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_PERMISSION_HELPER_H_ 170