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