1// Copyright (c) 2012 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_TABS_TABS_API_H_
6#define CHROME_BROWSER_EXTENSIONS_API_TABS_TABS_API_H_
7
8#include <string>
9#include <vector>
10
11#include "base/compiler_specific.h"
12#include "chrome/browser/extensions/api/execute_code_function.h"
13#include "chrome/browser/extensions/extension_function.h"
14#include "chrome/common/extensions/api/tabs.h"
15#include "content/public/browser/notification_observer.h"
16#include "content/public/browser/notification_registrar.h"
17#include "extensions/common/extension_resource.h"
18#include "extensions/common/user_script.h"
19#include "url/gurl.h"
20
21class BackingStore;
22class GURL;
23class SkBitmap;
24class TabStripModel;
25
26namespace base {
27class DictionaryValue;
28}
29
30namespace content {
31class WebContents;
32}
33
34namespace ui {
35class ListSelectionModel;
36}
37
38namespace user_prefs {
39class PrefRegistrySyncable;
40}
41
42namespace extensions {
43
44// Windows
45class WindowsGetFunction : public SyncExtensionFunction {
46  virtual ~WindowsGetFunction() {}
47  virtual bool RunImpl() OVERRIDE;
48  DECLARE_EXTENSION_FUNCTION("windows.get", WINDOWS_GET)
49};
50class WindowsGetCurrentFunction : public SyncExtensionFunction {
51  virtual ~WindowsGetCurrentFunction() {}
52  virtual bool RunImpl() OVERRIDE;
53  DECLARE_EXTENSION_FUNCTION("windows.getCurrent", WINDOWS_GETCURRENT)
54};
55class WindowsGetLastFocusedFunction : public SyncExtensionFunction {
56  virtual ~WindowsGetLastFocusedFunction() {}
57  virtual bool RunImpl() OVERRIDE;
58  DECLARE_EXTENSION_FUNCTION("windows.getLastFocused", WINDOWS_GETLASTFOCUSED)
59};
60class WindowsGetAllFunction : public SyncExtensionFunction {
61  virtual ~WindowsGetAllFunction() {}
62  virtual bool RunImpl() OVERRIDE;
63  DECLARE_EXTENSION_FUNCTION("windows.getAll", WINDOWS_GETALL)
64};
65class WindowsCreateFunction : public SyncExtensionFunction {
66  virtual ~WindowsCreateFunction() {}
67  virtual bool RunImpl() OVERRIDE;
68  // Returns whether the window should be created in incognito mode.
69  // |urls| is the list of urls to open. If we are creating an incognito window,
70  // the function will remove these urls which may not be opened in incognito
71  // mode.  If window creation leads the browser into an erroneous state,
72  // |is_error| is set to true (also, error_ member variable is assigned
73  // the proper error message).
74  bool ShouldOpenIncognitoWindow(const base::DictionaryValue* args,
75                                 std::vector<GURL>* urls,
76                                 bool* is_error);
77  DECLARE_EXTENSION_FUNCTION("windows.create", WINDOWS_CREATE)
78};
79class WindowsUpdateFunction : public SyncExtensionFunction {
80  virtual ~WindowsUpdateFunction() {}
81  virtual bool RunImpl() OVERRIDE;
82  DECLARE_EXTENSION_FUNCTION("windows.update", WINDOWS_UPDATE)
83};
84class WindowsRemoveFunction : public SyncExtensionFunction {
85  virtual ~WindowsRemoveFunction() {}
86  virtual bool RunImpl() OVERRIDE;
87  DECLARE_EXTENSION_FUNCTION("windows.remove", WINDOWS_REMOVE)
88};
89
90// Tabs
91class TabsGetFunction : public SyncExtensionFunction {
92  virtual ~TabsGetFunction() {}
93  virtual bool RunImpl() OVERRIDE;
94  DECLARE_EXTENSION_FUNCTION("tabs.get", TABS_GET)
95};
96class TabsGetCurrentFunction : public SyncExtensionFunction {
97  virtual ~TabsGetCurrentFunction() {}
98  virtual bool RunImpl() OVERRIDE;
99  DECLARE_EXTENSION_FUNCTION("tabs.getCurrent", TABS_GETCURRENT)
100};
101class TabsGetSelectedFunction : public SyncExtensionFunction {
102  virtual ~TabsGetSelectedFunction() {}
103  virtual bool RunImpl() OVERRIDE;
104  DECLARE_EXTENSION_FUNCTION("tabs.getSelected", TABS_GETSELECTED)
105};
106class TabsGetAllInWindowFunction : public SyncExtensionFunction {
107  virtual ~TabsGetAllInWindowFunction() {}
108  virtual bool RunImpl() OVERRIDE;
109  DECLARE_EXTENSION_FUNCTION("tabs.getAllInWindow", TABS_GETALLINWINDOW)
110};
111class TabsQueryFunction : public SyncExtensionFunction {
112  virtual ~TabsQueryFunction() {}
113  virtual bool RunImpl() OVERRIDE;
114  DECLARE_EXTENSION_FUNCTION("tabs.query", TABS_QUERY)
115};
116class TabsCreateFunction : public SyncExtensionFunction {
117  virtual ~TabsCreateFunction() {}
118  virtual bool RunImpl() OVERRIDE;
119  DECLARE_EXTENSION_FUNCTION("tabs.create", TABS_CREATE)
120};
121class TabsDuplicateFunction : public SyncExtensionFunction {
122  virtual ~TabsDuplicateFunction() {}
123  virtual bool RunImpl() OVERRIDE;
124  DECLARE_EXTENSION_FUNCTION("tabs.duplicate", TABS_DUPLICATE)
125};
126class TabsHighlightFunction : public SyncExtensionFunction {
127  virtual ~TabsHighlightFunction() {}
128  virtual bool RunImpl() OVERRIDE;
129  bool HighlightTab(TabStripModel* tabstrip,
130                    ui::ListSelectionModel* selection,
131                    int *active_index,
132                    int index);
133  DECLARE_EXTENSION_FUNCTION("tabs.highlight", TABS_HIGHLIGHT)
134};
135class TabsUpdateFunction : public AsyncExtensionFunction {
136 public:
137  TabsUpdateFunction();
138
139 protected:
140  virtual ~TabsUpdateFunction() {}
141  virtual bool UpdateURL(const std::string& url,
142                         int tab_id,
143                         bool* is_async);
144  virtual void PopulateResult();
145
146  content::WebContents* web_contents_;
147
148 private:
149  virtual bool RunImpl() OVERRIDE;
150  void OnExecuteCodeFinished(const std::string& error,
151                             int32 on_page_id,
152                             const GURL& on_url,
153                             const base::ListValue& script_result);
154
155  DECLARE_EXTENSION_FUNCTION("tabs.update", TABS_UPDATE)
156};
157class TabsMoveFunction : public SyncExtensionFunction {
158  virtual ~TabsMoveFunction() {}
159  virtual bool RunImpl() OVERRIDE;
160  bool MoveTab(int tab_id,
161               int* new_index,
162               int iteration,
163               base::ListValue* tab_values,
164               int* window_id);
165  DECLARE_EXTENSION_FUNCTION("tabs.move", TABS_MOVE)
166};
167class TabsReloadFunction : public SyncExtensionFunction {
168  virtual ~TabsReloadFunction() {}
169  virtual bool RunImpl() OVERRIDE;
170  DECLARE_EXTENSION_FUNCTION("tabs.reload", TABS_RELOAD)
171};
172class TabsRemoveFunction : public SyncExtensionFunction {
173  virtual ~TabsRemoveFunction() {}
174  virtual bool RunImpl() OVERRIDE;
175  bool RemoveTab(int tab_id);
176  DECLARE_EXTENSION_FUNCTION("tabs.remove", TABS_REMOVE)
177};
178class TabsDetectLanguageFunction : public AsyncExtensionFunction,
179                                  public content::NotificationObserver {
180 private:
181  virtual ~TabsDetectLanguageFunction() {}
182  virtual bool RunImpl() OVERRIDE;
183
184  virtual void Observe(int type,
185                       const content::NotificationSource& source,
186                       const content::NotificationDetails& details) OVERRIDE;
187  void GotLanguage(const std::string& language);
188  content::NotificationRegistrar registrar_;
189  DECLARE_EXTENSION_FUNCTION("tabs.detectLanguage", TABS_DETECTLANGUAGE)
190};
191class TabsCaptureVisibleTabFunction : public AsyncExtensionFunction {
192 public:
193  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
194
195 protected:
196  typedef api::tabs::CaptureVisibleTab::Params::Options::Format ImageFormat;
197
198  // The default quality setting used when encoding jpegs.
199  static const int kDefaultQuality;
200
201  virtual ~TabsCaptureVisibleTabFunction() {}
202  virtual bool RunImpl() OVERRIDE;
203  virtual bool GetTabToCapture(content::WebContents** web_contents);
204  void SendResultFromBitmap(const SkBitmap& screen_capture);
205
206 private:
207  // Callback for the RWH::CopyFromBackingStore call.
208  void CopyFromBackingStoreComplete(bool succeeded,
209                                    const SkBitmap& bitmap);
210
211  // Callback for the RWH::GetSnapshotFromRenderer call. This path is used if
212  // CopyFromBackingStore fails for some reason.
213  void GetSnapshotFromRendererComplete(bool succeeded,
214                                       const SkBitmap& bitmap);
215  void SendInternalError();
216
217  // The format (JPEG vs PNG) of the resulting image.  Set in RunImpl().
218  ImageFormat image_format_;
219
220  // Quality setting to use when encoding jpegs.  Set in RunImpl().
221  int image_quality_;
222
223  DECLARE_EXTENSION_FUNCTION("tabs.captureVisibleTab", TABS_CAPTUREVISIBLETAB)
224};
225
226// Implement API call tabs.executeScript and tabs.insertCSS.
227class ExecuteCodeInTabFunction : public ExecuteCodeFunction {
228 public:
229  ExecuteCodeInTabFunction();
230
231 protected:
232  virtual ~ExecuteCodeInTabFunction();
233
234  // ExtensionFunction:
235  virtual bool HasPermission() OVERRIDE;
236
237  // Initialize the |execute_tab_id_| and |details_| if they haven't already
238  // been. Returns whether initialization was successful.
239  virtual bool Init() OVERRIDE;
240  virtual bool CanExecuteScriptOnPage() OVERRIDE;
241  virtual ScriptExecutor* GetScriptExecutor() OVERRIDE;
242  virtual bool IsWebView() const OVERRIDE;
243
244 private:
245  // Id of tab which executes code.
246  int execute_tab_id_;
247};
248
249class TabsExecuteScriptFunction : public ExecuteCodeInTabFunction {
250 protected:
251  virtual bool ShouldInsertCSS() const OVERRIDE;
252
253 private:
254  virtual ~TabsExecuteScriptFunction() {}
255
256  virtual void OnExecuteCodeFinished(
257      const std::string& error,
258      int32 on_page_id,
259      const GURL& on_url,
260      const base::ListValue& script_result) OVERRIDE;
261
262  DECLARE_EXTENSION_FUNCTION("tabs.executeScript", TABS_EXECUTESCRIPT)
263};
264
265class TabsInsertCSSFunction : public ExecuteCodeInTabFunction {
266 private:
267  virtual ~TabsInsertCSSFunction() {}
268
269  virtual bool ShouldInsertCSS() const OVERRIDE;
270
271  DECLARE_EXTENSION_FUNCTION("tabs.insertCSS", TABS_INSERTCSS)
272};
273
274}  // namespace extensions
275
276#endif  // CHROME_BROWSER_EXTENSIONS_API_TABS_TABS_API_H_
277