1// Copyright (c) 2013 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_EXTENSIONS_API_WEBVIEW_WEBVIEW_API_H_
6#define CHROME_BROWSER_EXTENSIONS_API_WEBVIEW_WEBVIEW_API_H_
7
8#include "chrome/browser/extensions/api/capture_web_contents_function.h"
9#include "chrome/browser/extensions/api/execute_code_function.h"
10#include "chrome/browser/guest_view/web_view/web_view_find_helper.h"
11#include "chrome/browser/guest_view/web_view/web_view_guest.h"
12
13// WARNING: Webview could be loaded in an unblessed context, thus any new
14// APIs must extend WebviewExtensionFunction/WebviewExecuteCodeFunction which
15// do a process ID check to prevent abuse by normal renderer processes.
16// TODO(guohui): refactor WebviewExecuteCodeFunction to also extend
17// WebviewExtensionFunction.
18namespace extensions {
19
20// An abstract base class for async webview APIs. It does a process ID check
21// in RunAsync, and then calls RunAsyncSafe which must be overriden by all
22// subclasses.
23class WebviewExtensionFunction : public AsyncExtensionFunction {
24 public:
25   WebviewExtensionFunction() {}
26
27 protected:
28  virtual ~WebviewExtensionFunction() {}
29
30  // ExtensionFunction implementation.
31  virtual bool RunAsync() OVERRIDE FINAL;
32
33 private:
34  virtual bool RunAsyncSafe(WebViewGuest* guest) = 0;
35};
36
37class WebviewContextMenusCreateFunction : public AsyncExtensionFunction {
38 public:
39  DECLARE_EXTENSION_FUNCTION("webview.contextMenusCreate",
40                             WEBVIEW_CONTEXTMENUSCREATE);
41  WebviewContextMenusCreateFunction() {}
42
43 protected:
44  virtual ~WebviewContextMenusCreateFunction() {}
45
46  // ExtensionFunction implementation.
47  virtual bool RunAsync() OVERRIDE;
48
49 private:
50  DISALLOW_COPY_AND_ASSIGN(WebviewContextMenusCreateFunction);
51};
52
53class WebviewContextMenusUpdateFunction : public AsyncExtensionFunction {
54 public:
55  DECLARE_EXTENSION_FUNCTION("webview.contextMenusUpdate",
56                             WEBVIEW_CONTEXTMENUSUPDATE);
57  WebviewContextMenusUpdateFunction() {}
58
59 protected:
60  virtual ~WebviewContextMenusUpdateFunction() {}
61
62  // ExtensionFunction implementation.
63  virtual bool RunAsync() OVERRIDE;
64
65 private:
66  DISALLOW_COPY_AND_ASSIGN(WebviewContextMenusUpdateFunction);
67};
68
69class WebviewContextMenusRemoveFunction : public AsyncExtensionFunction {
70 public:
71  DECLARE_EXTENSION_FUNCTION("webview.contextMenusRemove",
72                             WEBVIEW_CONTEXTMENUSREMOVE);
73  WebviewContextMenusRemoveFunction() {}
74
75 protected:
76  virtual ~WebviewContextMenusRemoveFunction() {}
77
78  // ExtensionFunction implementation.
79  virtual bool RunAsync() OVERRIDE;
80
81 private:
82  DISALLOW_COPY_AND_ASSIGN(WebviewContextMenusRemoveFunction);
83};
84
85class WebviewContextMenusRemoveAllFunction : public AsyncExtensionFunction {
86 public:
87  DECLARE_EXTENSION_FUNCTION("webview.contextMenusRemoveAll",
88                             WEBVIEW_CONTEXTMENUSREMOVEALL);
89  WebviewContextMenusRemoveAllFunction() {}
90
91 protected:
92  virtual ~WebviewContextMenusRemoveAllFunction() {}
93
94  // ExtensionFunction implementation.
95  virtual bool RunAsync() OVERRIDE;
96
97 private:
98  DISALLOW_COPY_AND_ASSIGN(WebviewContextMenusRemoveAllFunction);
99};
100
101class WebviewNavigateFunction : public WebviewExtensionFunction {
102 public:
103  DECLARE_EXTENSION_FUNCTION("webview.navigate", WEBVIEW_NAVIGATE);
104  WebviewNavigateFunction() {}
105
106 protected:
107  virtual ~WebviewNavigateFunction() {}
108
109 private:
110  // WebviewExtensionFunction implementation.
111  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
112
113  DISALLOW_COPY_AND_ASSIGN(WebviewNavigateFunction);
114};
115
116class WebviewClearDataFunction : public WebviewExtensionFunction {
117 public:
118  DECLARE_EXTENSION_FUNCTION("webview.clearData", WEBVIEW_CLEARDATA);
119
120  WebviewClearDataFunction();
121
122 protected:
123  virtual ~WebviewClearDataFunction();
124
125 private:
126  // WebviewExtensionFunction implementation.
127  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
128
129  uint32 GetRemovalMask();
130  void ClearDataDone();
131
132  // Removal start time.
133  base::Time remove_since_;
134  // Removal mask, corresponds to StoragePartition::RemoveDataMask enum.
135  uint32 remove_mask_;
136  // Tracks any data related or parse errors.
137  bool bad_message_;
138
139  DISALLOW_COPY_AND_ASSIGN(WebviewClearDataFunction);
140};
141
142class WebviewExecuteCodeFunction : public extensions::ExecuteCodeFunction {
143 public:
144  WebviewExecuteCodeFunction();
145
146 protected:
147  virtual ~WebviewExecuteCodeFunction();
148
149  // Initialize |details_| if it hasn't already been.
150  virtual bool Init() OVERRIDE;
151  virtual bool ShouldInsertCSS() const OVERRIDE;
152  virtual bool CanExecuteScriptOnPage() OVERRIDE;
153  // Guarded by a process ID check.
154  virtual extensions::ScriptExecutor* GetScriptExecutor() OVERRIDE FINAL;
155  virtual bool IsWebView() const OVERRIDE;
156  virtual const GURL& GetWebViewSrc() const OVERRIDE;
157
158 private:
159  // Contains extension resource built from path of file which is
160  // specified in JSON arguments.
161  extensions::ExtensionResource resource_;
162
163  int guest_instance_id_;
164
165  GURL guest_src_;
166
167  DISALLOW_COPY_AND_ASSIGN(WebviewExecuteCodeFunction);
168};
169
170class WebviewExecuteScriptFunction : public WebviewExecuteCodeFunction {
171 public:
172  WebviewExecuteScriptFunction();
173
174 protected:
175  virtual ~WebviewExecuteScriptFunction() {}
176
177  virtual void OnExecuteCodeFinished(const std::string& error,
178                                     int32 on_page_id,
179                                     const GURL& on_url,
180                                     const base::ListValue& result) OVERRIDE;
181
182  DECLARE_EXTENSION_FUNCTION("webview.executeScript", WEBVIEW_EXECUTESCRIPT)
183
184 private:
185  DISALLOW_COPY_AND_ASSIGN(WebviewExecuteScriptFunction);
186};
187
188class WebviewInsertCSSFunction : public WebviewExecuteCodeFunction {
189 public:
190  WebviewInsertCSSFunction();
191
192 protected:
193  virtual ~WebviewInsertCSSFunction() {}
194
195  virtual bool ShouldInsertCSS() const OVERRIDE;
196
197  DECLARE_EXTENSION_FUNCTION("webview.insertCSS", WEBVIEW_INSERTCSS)
198
199 private:
200  DISALLOW_COPY_AND_ASSIGN(WebviewInsertCSSFunction);
201};
202
203class WebviewCaptureVisibleRegionFunction
204    : public extensions::CaptureWebContentsFunction {
205  DECLARE_EXTENSION_FUNCTION("webview.captureVisibleRegion",
206                             WEBVIEW_CAPTUREVISIBLEREGION);
207
208  WebviewCaptureVisibleRegionFunction();
209
210 protected:
211  virtual ~WebviewCaptureVisibleRegionFunction();
212
213 private:
214  // extensions::CaptureWebContentsFunction implementation.
215  virtual bool IsScreenshotEnabled() OVERRIDE;
216  virtual content::WebContents* GetWebContentsForID(int id) OVERRIDE;
217  virtual void OnCaptureFailure(FailureReason reason) OVERRIDE;
218
219  DISALLOW_COPY_AND_ASSIGN(WebviewCaptureVisibleRegionFunction);
220};
221
222class WebviewSetNameFunction : public WebviewExtensionFunction {
223 public:
224  DECLARE_EXTENSION_FUNCTION("webview.setName", WEBVIEW_SETNAME);
225
226  WebviewSetNameFunction();
227
228 protected:
229  virtual ~WebviewSetNameFunction();
230
231 private:
232  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
233
234  DISALLOW_COPY_AND_ASSIGN(WebviewSetNameFunction);
235};
236
237class WebviewSetZoomFunction : public WebviewExtensionFunction {
238 public:
239  DECLARE_EXTENSION_FUNCTION("webview.setZoom", WEBVIEW_SETZOOM);
240
241  WebviewSetZoomFunction();
242
243 protected:
244  virtual ~WebviewSetZoomFunction();
245
246 private:
247  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
248
249  DISALLOW_COPY_AND_ASSIGN(WebviewSetZoomFunction);
250};
251
252class WebviewGetZoomFunction : public WebviewExtensionFunction {
253 public:
254  DECLARE_EXTENSION_FUNCTION("webview.getZoom", WEBVIEW_GETZOOM);
255
256  WebviewGetZoomFunction();
257
258 protected:
259  virtual ~WebviewGetZoomFunction();
260
261 private:
262  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
263
264  DISALLOW_COPY_AND_ASSIGN(WebviewGetZoomFunction);
265};
266
267class WebviewFindFunction : public WebviewExtensionFunction {
268 public:
269  DECLARE_EXTENSION_FUNCTION("webview.find", WEBVIEW_FIND);
270
271  WebviewFindFunction();
272
273  // Exposes SendResponse() for use by WebviewFindHelper.
274  using WebviewExtensionFunction::SendResponse;
275
276 protected:
277  virtual ~WebviewFindFunction();
278
279 private:
280  // WebviewExtensionFunction implementation.
281  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
282
283  DISALLOW_COPY_AND_ASSIGN(WebviewFindFunction);
284};
285
286class WebviewStopFindingFunction : public WebviewExtensionFunction {
287 public:
288  DECLARE_EXTENSION_FUNCTION("webview.stopFinding", WEBVIEW_STOPFINDING);
289
290  WebviewStopFindingFunction();
291
292 protected:
293  virtual ~WebviewStopFindingFunction();
294
295 private:
296  // WebviewExtensionFunction implementation.
297  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
298
299  DISALLOW_COPY_AND_ASSIGN(WebviewStopFindingFunction);
300};
301
302class WebviewGoFunction : public WebviewExtensionFunction {
303 public:
304  DECLARE_EXTENSION_FUNCTION("webview.go", WEBVIEW_GO);
305
306  WebviewGoFunction();
307
308 protected:
309  virtual ~WebviewGoFunction();
310
311 private:
312  // WebviewExtensionFunction implementation.
313  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
314
315  DISALLOW_COPY_AND_ASSIGN(WebviewGoFunction);
316};
317
318class WebviewReloadFunction : public WebviewExtensionFunction {
319 public:
320  DECLARE_EXTENSION_FUNCTION("webview.reload", WEBVIEW_RELOAD);
321
322  WebviewReloadFunction();
323
324 protected:
325  virtual ~WebviewReloadFunction();
326
327 private:
328  // WebviewExtensionFunction implementation.
329  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
330
331  DISALLOW_COPY_AND_ASSIGN(WebviewReloadFunction);
332};
333
334class WebviewSetPermissionFunction : public WebviewExtensionFunction {
335 public:
336  DECLARE_EXTENSION_FUNCTION("webview.setPermission", WEBVIEW_SETPERMISSION);
337
338  WebviewSetPermissionFunction();
339
340 protected:
341  virtual ~WebviewSetPermissionFunction();
342
343 private:
344  // WebviewExtensionFunction implementation.
345  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
346
347  DISALLOW_COPY_AND_ASSIGN(WebviewSetPermissionFunction);
348};
349
350class WebviewShowContextMenuFunction : public WebviewExtensionFunction {
351 public:
352  DECLARE_EXTENSION_FUNCTION("webview.showContextMenu",
353                             WEBVIEW_SHOWCONTEXTMENU);
354
355  WebviewShowContextMenuFunction();
356
357 protected:
358  virtual ~WebviewShowContextMenuFunction();
359
360 private:
361  // WebviewExtensionFunction implementation.
362  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
363
364  DISALLOW_COPY_AND_ASSIGN(WebviewShowContextMenuFunction);
365};
366
367class WebviewOverrideUserAgentFunction: public WebviewExtensionFunction {
368 public:
369  DECLARE_EXTENSION_FUNCTION("webview.overrideUserAgent",
370                             WEBVIEW_OVERRIDEUSERAGENT);
371
372  WebviewOverrideUserAgentFunction();
373
374 protected:
375  virtual ~WebviewOverrideUserAgentFunction();
376
377 private:
378  // WebviewExtensionFunction implementation.
379  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
380
381  DISALLOW_COPY_AND_ASSIGN(WebviewOverrideUserAgentFunction);
382};
383
384class WebviewStopFunction : public WebviewExtensionFunction {
385 public:
386  DECLARE_EXTENSION_FUNCTION("webview.stop", WEBVIEW_STOP);
387
388  WebviewStopFunction();
389
390 protected:
391  virtual ~WebviewStopFunction();
392
393 private:
394  // WebviewExtensionFunction implementation.
395  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
396
397  DISALLOW_COPY_AND_ASSIGN(WebviewStopFunction);
398};
399
400class WebviewTerminateFunction : public WebviewExtensionFunction {
401 public:
402  DECLARE_EXTENSION_FUNCTION("webview.terminate", WEBVIEW_TERMINATE);
403
404  WebviewTerminateFunction();
405
406 protected:
407  virtual ~WebviewTerminateFunction();
408
409 private:
410  // WebviewExtensionFunction implementation.
411  virtual bool RunAsyncSafe(WebViewGuest* guest) OVERRIDE;
412
413  DISALLOW_COPY_AND_ASSIGN(WebviewTerminateFunction);
414};
415
416}  // namespace extensions
417
418#endif  // CHROME_BROWSER_EXTENSIONS_API_WEBVIEW_WEBVIEW_API_H_
419