1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_FUNCTION_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_EXTENSIONS_EXTENSION_FUNCTION_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <list>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_function_dispatcher.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionFunctionDispatcher;
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass ListValue;
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass QuotaLimitHeuristic;
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass Value;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define EXTENSION_FUNCTION_VALIDATE(test) do { \
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!(test)) { \
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bad_message_ = true; \
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false; \
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } \
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } while (0)
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define EXTENSION_FUNCTION_ERROR(error) do { \
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    error_ = error; \
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bad_message_ = true; \
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false; \
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } while (0)
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define DECLARE_EXTENSION_FUNCTION_NAME(name) \
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  public: static const char* function_name() { return name; }
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Abstract base class for extension functions the ExtensionFunctionDispatcher
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// knows how to dispatch to.
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionFunction : public base::RefCountedThreadSafe<ExtensionFunction> {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionFunction();
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Specifies the name of the function.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_name(const std::string& name) { name_ = name; }
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string name() const { return name_; }
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set the profile which contains the extension that has originated this
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // function call.
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_profile(Profile* profile) { profile_ = profile; }
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile() const { return profile_; }
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set the id of this function call's extension.
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_extension_id(std::string extension_id) {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    extension_id_ = extension_id;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string extension_id() const { return extension_id_; }
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Specifies the raw arguments to the function, as a JSON value.
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetArgs(const ListValue* args) = 0;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Retrieves the results of the function as a JSON-encoded string (may
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // be empty).
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const std::string GetResult() = 0;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Retrieves any error string from the function.
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const std::string GetError() = 0;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a quota limit heuristic suitable for this function.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // No quota limiting by default.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void GetQuotaLimitHeuristics(
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::list<QuotaLimitHeuristic*>* heuristics) const {}
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_dispatcher_peer(ExtensionFunctionDispatcher::Peer* peer) {
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    peer_ = peer;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionFunctionDispatcher* dispatcher() const {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return peer_->dispatcher_;
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_request_id(int request_id) { request_id_ = request_id; }
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int request_id() { return request_id_; }
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_source_url(const GURL& source_url) { source_url_ = source_url; }
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const GURL& source_url() { return source_url_; }
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_has_callback(bool has_callback) { has_callback_ = has_callback; }
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool has_callback() { return has_callback_; }
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_include_incognito(bool include) { include_incognito_ = include; }
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool include_incognito() { return include_incognito_; }
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void set_user_gesture(bool user_gesture) { user_gesture_ = user_gesture; }
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool user_gesture() const { return user_gesture_; }
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Execute the API. Clients should call set_raw_args() and
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // set_request_id() before calling this method. Derived classes should be
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ready to return raw_result() and error() before returning from this
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // function.
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Run() = 0;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<ExtensionFunction>;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~ExtensionFunction();
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the extension that called this function. This can return NULL for
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // async functions, for example if the extension is unloaded while the
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // function is running.
110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* GetExtension();
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the "current" browser, if any.
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Many extension APIs operate relative to the current browser, which is the
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // browser the calling code is running inside of. For example, popups, tabs,
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and infobars all have a containing browser, but background pages and
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // notification bubbles do not.
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If there is no containing window, the current browser defaults to the
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // foremost one.
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Incognito browsers are not considered unless the calling extension has
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // incognito access enabled.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This method can return NULL if there is no matching browser, which can
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // happen if only incognito windows are open, or early in startup or shutdown
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // shutdown when there are no active windows.
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* GetCurrentBrowser();
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The peer to the dispatcher that will service this extension function call.
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<ExtensionFunctionDispatcher::Peer> peer_;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Id of this request, used to map the response back to the caller.
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int request_id_;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The Profile of this function's extension.
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The id of this function's extension.
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string extension_id_;
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The name of this function.
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string name_;
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The URL of the frame which is making this request
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL source_url_;
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if the js caller provides a callback function to receive the response
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of this call.
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool has_callback_;
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // True if this callback should include information from incognito contexts
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // even if our profile_ is non-incognito. Note that in the case of a "split"
1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // mode extension, this will always be false, and we will limit access to
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // data from within the same profile_ (either incognito or not).
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool include_incognito_;
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // True if the call was made in response of user gesture.
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool user_gesture_;
1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionFunction);
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Base class for an extension function that runs asynchronously *relative to
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the browser's UI thread*.
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Note that once Run() returns, dispatcher() can be NULL, so be sure to
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NULL-check.
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(aa) Remove this extra level of inheritance once the browser stops
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// parsing JSON (and instead uses custom serialization of Value objects).
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AsyncExtensionFunction : public ExtensionFunction {
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AsyncExtensionFunction();
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetArgs(const ListValue* args);
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const std::string GetResult();
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const std::string GetError();
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Run();
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Derived classes should implement this method to do their work and return
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // success/failure.
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool RunImpl() = 0;
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~AsyncExtensionFunction();
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SendResponse(bool success);
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return true if the argument to this function at |index| was provided and
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is non-null.
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool HasOptionalArgument(size_t index);
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The arguments to the API. Only non-null if argument were specified.
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<ListValue> args_;
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The result of the API. This should be populated by the derived class before
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // SendResponse() is called.
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<Value> result_;
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Any detailed error from the API. This should be populated by the derived
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // class before Run() returns.
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string error_;
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Any class that gets a malformed message should set this to true before
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // returning.  The calling renderer process will be killed.
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool bad_message_;
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AsyncExtensionFunction);
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A SyncExtensionFunction is an ExtensionFunction that runs synchronously
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// *relative to the browser's UI thread*. Note that this has nothing to do with
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// running synchronously relative to the extension process. From the extension
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// process's point of view, the function is still asynchronous.
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This kind of function is convenient for implementing simple APIs that just
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// need to interact with things on the browser UI thread.
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SyncExtensionFunction : public AsyncExtensionFunction {
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SyncExtensionFunction();
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Derived classes should implement this method to do their work and return
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // success/failure.
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool RunImpl() = 0;
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Run();
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~SyncExtensionFunction();
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(SyncExtensionFunction);
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_FUNCTION_H_
235