1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_CHROME_WEB_VIEW_PERMISSION_HELPER_DELEGATE_H_
6#define CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_CHROME_WEB_VIEW_PERMISSION_HELPER_DELEGATE_H_
7
8#include "extensions/browser/guest_view/web_view/web_view_permission_helper.h"
9#include "extensions/browser/guest_view/web_view/web_view_permission_helper_delegate.h"
10
11namespace extensions {
12class WebViewGuest;
13}
14
15class ChromeWebViewPermissionHelperDelegate :
16  public extensions::WebViewPermissionHelperDelegate {
17 public:
18  explicit ChromeWebViewPermissionHelperDelegate(
19      extensions::WebViewPermissionHelper* web_view_permission_helper);
20  virtual ~ChromeWebViewPermissionHelperDelegate();
21
22  // WebViewPermissionHelperDelegate implementation.
23  virtual void CanDownload(
24      content::RenderViewHost* render_view_host,
25      const GURL& url,
26      const std::string& request_method,
27      const base::Callback<void(bool)>& callback) OVERRIDE;
28  virtual void RequestPointerLockPermission(
29      bool user_gesture,
30      bool last_unlocked_by_target,
31      const base::Callback<void(bool)>& callback) OVERRIDE;
32  virtual void RequestGeolocationPermission(
33      int bridge_id,
34      const GURL& requesting_frame,
35      bool user_gesture,
36      const base::Callback<void(bool)>& callback) OVERRIDE;
37  virtual void CancelGeolocationPermissionRequest(int bridge_id) OVERRIDE;
38  virtual void RequestFileSystemPermission(
39      const GURL& url,
40      bool allowed_by_default,
41      const base::Callback<void(bool)>& callback) OVERRIDE;
42  virtual void FileSystemAccessedAsync(
43      int render_process_id,
44      int render_frame_id,
45      int request_id,
46      const GURL& url,
47      bool blocked_by_policy) OVERRIDE;
48  virtual void FileSystemAccessedSync(
49      int render_process_id,
50      int render_frame_id,
51      const GURL& url,
52      bool blocked_by_policy,
53      IPC::Message* reply_msg) OVERRIDE;
54#if defined(ENABLE_PLUGINS)
55  // content::WebContentsObserver implementation.
56  virtual bool OnMessageReceived(
57      const IPC::Message& message,
58      content::RenderFrameHost* render_frame_host) OVERRIDE;
59  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
60#endif  // defined(ENABLE_PLUGINS)
61
62 private:
63#if defined(ENABLE_PLUGINS)
64  // Message handlers:
65  void OnBlockedUnauthorizedPlugin(const base::string16& name,
66                                   const std::string& identifier);
67  void OnCouldNotLoadPlugin(const base::FilePath& plugin_path);
68  void OnBlockedOutdatedPlugin(int placeholder_id,
69                               const std::string& identifier);
70  void OnNPAPINotSupported(const std::string& identifier);
71  void OnOpenAboutPlugins();
72#if defined(ENABLE_PLUGIN_INSTALLATION)
73  void OnFindMissingPlugin(int placeholder_id, const std::string& mime_type);
74
75  void OnRemovePluginPlaceholderHost(int placeholder_id);
76#endif  // defined(ENABLE_PLUGIN_INSTALLATION)
77
78  void OnPermissionResponse(const std::string& identifier,
79                            bool allow,
80                            const std::string& user_input);
81#endif  // defined(ENABLE_PLUGINS)
82
83  void OnGeolocationPermissionResponse(
84      int bridge_id,
85      bool user_gesture,
86      const base::Callback<void(bool)>& callback,
87      bool allow,
88      const std::string& user_input);
89
90  void OnFileSystemPermissionResponse(
91      const base::Callback<void(bool)>& callback,
92      bool allow,
93      const std::string& user_input);
94
95  void OnDownloadPermissionResponse(
96      const base::Callback<void(bool)>& callback,
97      bool allow,
98      const std::string& user_input);
99
100  void OnPointerLockPermissionResponse(
101      const base::Callback<void(bool)>& callback,
102      bool allow,
103      const std::string& user_input);
104
105  // Bridge IDs correspond to a geolocation request. This method will remove
106  // the bookkeeping for a particular geolocation request associated with the
107  // provided |bridge_id|. It returns the request ID of the geolocation request.
108  int RemoveBridgeID(int bridge_id);
109
110  void FileSystemAccessedAsyncResponse(int render_process_id,
111                                       int render_frame_id,
112                                       int request_id,
113                                       const GURL& url,
114                                       bool allowed);
115
116  void FileSystemAccessedSyncResponse(int render_process_id,
117                                      int render_frame_id,
118                                      const GURL& url,
119                                      IPC::Message* reply_msg,
120                                      bool allowed);
121
122  extensions::WebViewGuest* web_view_guest() {
123    return web_view_permission_helper()->web_view_guest();
124  }
125
126  std::map<int, int> bridge_id_to_request_id_map_;
127
128  base::WeakPtrFactory<ChromeWebViewPermissionHelperDelegate> weak_factory_;
129
130  DISALLOW_COPY_AND_ASSIGN(ChromeWebViewPermissionHelperDelegate);
131};
132
133#endif  // CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_CHROME_WEB_VIEW_PERMISSION_HELPER_DELEGATE_H_
134