1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef EXTENSIONS_BROWSER_EXTENSION_FUNCTION_H_
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define EXTENSIONS_BROWSER_EXTENSION_FUNCTION_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/callback.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
16bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/process.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner_helpers.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/console_message_level.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/extension_function_histogram_value.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/info_map.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/common/features/feature.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionFunction;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UIThreadExtensionFunction;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IOThreadExtensionFunction;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class BrowserContext;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class RenderFrameHost;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions {
43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass ExtensionFunctionDispatcher;
44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass ExtensionMessageFilter;
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class QuotaLimitHeuristic;
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace IPC {
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class Sender;
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef NDEBUG
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define EXTENSION_FUNCTION_VALIDATE(test) \
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  do {                                    \
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (!(test)) {                        \
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      this->bad_message_ = true;          \
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return ValidationFailure(this);     \
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }                                     \
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (0)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else   // NDEBUG
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define EXTENSION_FUNCTION_VALIDATE(test) CHECK(test)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NDEBUG
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define EXTENSION_FUNCTION_ERROR(error) \
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  do {                                  \
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    error_ = error;                     \
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    this->bad_message_ = true;          \
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return ValidationFailure(this);     \
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (0)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Declares a callable extension function with the given |name|. You must also
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// supply a unique |histogramvalue| used for histograms of extension function
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// invocation (add new ones at the end of the enum in
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// extension_function_histogram_value.h).
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DECLARE_EXTENSION_FUNCTION(name, histogramvalue) \
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  public: static const char* function_name() { return name; } \
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  public: static extensions::functions::HistogramValue histogram_value() \
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { return extensions::functions::histogramvalue; }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Traits that describe how ExtensionFunction should be deleted. This just calls
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the virtual "Destruct" method on ExtensionFunction, allowing derived classes
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to override the behavior.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ExtensionFunctionDeleteTraits {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void Destruct(const ExtensionFunction* x);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Abstract base class for extension functions the ExtensionFunctionDispatcher
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// knows how to dispatch to.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionFunction
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCountedThreadSafe<ExtensionFunction,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        ExtensionFunctionDeleteTraits> {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  enum ResponseType {
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // The function has succeeded.
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SUCCEEDED,
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // The function has failed.
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    FAILED,
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // The input message is malformed.
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    BAD_MESSAGE
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef base::Callback<void(ResponseType type,
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                              const base::ListValue& results,
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                              const std::string& error)> ResponseCallback;
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionFunction();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual UIThreadExtensionFunction* AsUIThreadExtensionFunction();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual IOThreadExtensionFunction* AsIOThreadExtensionFunction();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the function has permission to run.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The default implementation is to check the Extension's permissions against
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // what this function requires to run, but some APIs may require finer
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // grained control, such as tabs.executeScript being allowed for active tabs.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This will be run after the function has been set up but before Run().
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasPermission();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The result of a function call.
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  //
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Use NoArguments(), OneArgument(), ArgumentList(), or Error()
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // rather than this class directly.
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  class ResponseValueObject {
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   public:
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    virtual ~ResponseValueObject() {}
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Returns true for success, false for failure.
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    virtual bool Apply() = 0;
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  typedef scoped_ptr<ResponseValueObject> ResponseValue;
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The action to use when returning from RunAsync.
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  //
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Use RespondNow() or RespondLater() rather than this class directly.
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  class ResponseActionObject {
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   public:
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    virtual ~ResponseActionObject() {}
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    virtual void Execute() = 0;
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  typedef scoped_ptr<ResponseActionObject> ResponseAction;
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Runs the function and returns the action to take when the caller is ready
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // to respond.
1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  //
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Typical return values might be:
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   * RespondNow(NoArguments())
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   * RespondNow(OneArgument(42))
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   * RespondNow(ArgumentList(my_result.ToValue()))
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   * RespondNow(Error("Warp core breach"))
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   * RespondNow(Error("Warp core breach on *", GetURL()))
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   * RespondLater(), then later,
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //     * Respond(NoArguments())
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //     * ... etc.
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Callers must call Execute() on the return ResponseAction at some point,
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // exactly once.
161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  //
162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // SyncExtensionFunction and AsyncExtensionFunction implement this in terms
163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // of SyncExtensionFunction::RunSync and AsyncExtensionFunction::RunAsync,
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // but this is deprecated. ExtensionFunction implementations are encouraged
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // to just implement Run.
166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ResponseAction Run() WARN_UNUSED_RESULT = 0;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets whether quota should be applied to this individual function
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invocation. This is different to GetQuotaLimitHeuristics which is only
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invoked once and then cached.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false by default.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldSkipQuotaLimiting() const;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Optionally adds one or multiple QuotaLimitHeuristic instances suitable for
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this function to |heuristics|. The ownership of the new QuotaLimitHeuristic
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instances is passed to the owner of |heuristics|.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No quota limiting by default.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Only called once per lifetime of the QuotaService.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetQuotaLimitHeuristics(
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      extensions::QuotaLimitHeuristics* heuristics) const {}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when the quota limit has been exceeded. The default implementation
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns an error.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnQuotaExceeded(const std::string& violation_error);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Specifies the raw arguments to the function, as a JSON value.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetArgs(const base::ListValue* args);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets a single Value as the results of the function.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetResult(base::Value* result);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Sets multiple Values as the results of the function.
1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void SetResultList(scoped_ptr<base::ListValue> results);
1965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieves the results of the function as a ListValue.
1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const base::ListValue* GetResultList() const;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieves any error string from the function.
2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual std::string GetError() const;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the function's error string.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetError(const std::string& error);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Sets the function's bad message state.
2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void set_bad_message(bool bad_message) { bad_message_ = bad_message; }
2085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Specifies the name of the function.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_name(const std::string& name) { name_ = name; }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& name() const { return name_; }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_profile_id(void* profile_id) { profile_id_ = profile_id; }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* profile_id() const { return profile_id_; }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void set_extension(
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const scoped_refptr<const extensions::Extension>& extension) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_ = extension;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const extensions::Extension* extension() const { return extension_.get(); }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& extension_id() const { return extension_->id(); }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_request_id(int request_id) { request_id_ = request_id; }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int request_id() { return request_id_; }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_source_url(const GURL& source_url) { source_url_ = source_url; }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& source_url() { return source_url_; }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_has_callback(bool has_callback) { has_callback_ = has_callback; }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_callback() { return has_callback_; }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_include_incognito(bool include) { include_incognito_ = include; }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool include_incognito() const { return include_incognito_; }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_user_gesture(bool user_gesture) { user_gesture_ = user_gesture; }
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool user_gesture() const { return user_gesture_; }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_histogram_value(
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::functions::HistogramValue histogram_value) {
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    histogram_value_ = histogram_value; }
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::functions::HistogramValue histogram_value() const {
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return histogram_value_; }
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void set_response_callback(const ResponseCallback& callback) {
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    response_callback_ = callback;
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_source_tab_id(int source_tab_id) { source_tab_id_ = source_tab_id; }
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int source_tab_id() const { return source_tab_id_; }
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void set_source_context_type(extensions::Feature::Context type) {
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    source_context_type_ = type;
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  extensions::Feature::Context source_context_type() const {
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return source_context_type_;
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct ExtensionFunctionDeleteTraits;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // ResponseValues.
2625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  //
2635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Success, no arguments to pass to caller
2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResponseValue NoArguments();
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Success, a single argument |arg| to pass to caller. TAKES OWNERSHIP -- a
266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // raw pointer for convenience, since callers usually construct the argument
267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to this by hand.
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResponseValue OneArgument(base::Value* arg);
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Success, two arguments |arg1| and |arg2| to pass to caller. TAKES
270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // OWNERSHIP -- raw pointers for convenience, since callers usually construct
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // the argument to this by hand. Note that use of this function may imply you
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // should be using the generated Result struct and ArgumentList.
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResponseValue TwoArguments(base::Value* arg1, base::Value* arg2);
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Success, a list of arguments |results| to pass to caller. TAKES OWNERSHIP
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // --
276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // a scoped_ptr<> for convenience, since callers usually get this from the
277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // result of a ToValue() call on the generated Result struct.
278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResponseValue ArgumentList(scoped_ptr<base::ListValue> results);
2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Error. chrome.runtime.lastError.message will be set to |error|.
2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResponseValue Error(const std::string& error);
281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Error with formatting. Args are processed using
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // ErrorUtils::FormatErrorMessage, that is, each occurence of * is replaced
283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // by the corresponding |s*|:
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Error("Error in *: *", "foo", "bar") <--> // Error("Error in foo: bar").
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResponseValue Error(const std::string& format, const std::string& s1);
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResponseValue Error(const std::string& format,
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      const std::string& s1,
288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      const std::string& s2);
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResponseValue Error(const std::string& format,
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      const std::string& s1,
291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      const std::string& s2,
292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      const std::string& s3);
2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Bad message. A ResponseValue equivalent to EXTENSION_FUNCTION_VALIDATE().
2945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResponseValue BadMessage();
2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // ResponseActions.
2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  //
2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Respond to the extension immediately with |result|.
2995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResponseAction RespondNow(ResponseValue result);
300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Don't respond now, but promise to call Respond() later.
3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResponseAction RespondLater();
3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // This is the return value of the EXTENSION_FUNCTION_VALIDATE macro, which
304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // needs to work from Run(), RunAsync(), and RunSync(). The former of those
305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // has a different return type (ResponseAction) than the latter two (bool).
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static ResponseAction ValidationFailure(ExtensionFunction* function);
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // If RespondLater() was used, functions must at some point call Respond()
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // with |result| as their result.
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void Respond(ResponseValue result);
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionFunction();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method for ExtensionFunctionDeleteTraits. Deletes this object.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Destruct() const = 0;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Do not call this function directly, return the appropriate ResponseAction
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // from Run() instead. If using RespondLater then call Respond().
3195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  //
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Call with true to indicate success, false to indicate failure, in which
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // case please set |error_|.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SendResponse(bool success) = 0;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Common implementation for SendResponse.
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SendResponseImpl(bool success);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return true if the argument to this function at |index| was provided and
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is non-null.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasOptionalArgument(size_t index);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Id of this request, used to map the response back to the caller.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int request_id_;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // The id of the profile of this function's extension.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* profile_id_;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extension that called this function.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<const extensions::Extension> extension_;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The name of this function.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string name_;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The URL of the frame which is making this request
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL source_url_;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the js caller provides a callback function to receive the response
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of this call.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_callback_;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if this callback should include information from incognito contexts
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // even if our profile_ is non-incognito. Note that in the case of a "split"
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mode extension, this will always be false, and we will limit access to
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // data from within the same profile_ (either incognito or not).
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool include_incognito_;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the call was made in response of user gesture.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool user_gesture_;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The arguments to the API. Only non-null if argument were specified.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> args_;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The results of the API. This should be populated by the derived class
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before SendResponse() is called.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> results_;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Any detailed error from the API. This should be populated by the derived
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class before Run() returns.
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Any class that gets a malformed message should set this to true before
37190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // returning.  Usually we want to kill the message sending process.
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool bad_message_;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The sample value to record with the histogram API when the function
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is invoked.
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::functions::HistogramValue histogram_value_;
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The callback to run once the function has done execution.
37990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ResponseCallback response_callback_;
38090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The ID of the tab triggered this function call, or -1 if there is no tab.
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int source_tab_id_;
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The type of the JavaScript context where this call originated.
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  extensions::Feature::Context source_context_type_;
3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnRespondingLater(ResponseValue response);
389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionFunction);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extension functions that run on the UI thread. Most functions fall into
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this category.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UIThreadExtensionFunction : public ExtensionFunction {
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
39790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // TODO(yzshen): We should be able to remove this interface now that we
39890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // support overriding the response callback.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A delegate for use in testing, to intercept the call to SendResponse.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class DelegateForTests {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnSendResponse(UIThreadExtensionFunction* function,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool success,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool bad_message) = 0;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UIThreadExtensionFunction();
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual UIThreadExtensionFunction* AsUIThreadExtensionFunction() OVERRIDE;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_test_delegate(DelegateForTests* delegate) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_ = delegate;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when a message was received.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should return true if it processed the message.
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Set the browser context which contains the extension that has originated
4201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // this function call.
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_browser_context(content::BrowserContext* context) {
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    context_ = context;
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::BrowserContext* browser_context() const { return context_; }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetRenderViewHost(content::RenderViewHost* render_view_host);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* render_view_host() const {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return render_view_host_;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetRenderFrameHost(content::RenderFrameHost* render_frame_host);
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::RenderFrameHost* render_frame_host() const {
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return render_frame_host_;
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void set_dispatcher(const base::WeakPtr<
436e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      extensions::ExtensionFunctionDispatcher>& dispatcher) {
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dispatcher_ = dispatcher;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
439e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  extensions::ExtensionFunctionDispatcher* dispatcher() const {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return dispatcher_.get();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the "current" web contents if any. If there is no associated web
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // contents then defaults to the foremost one.
4451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual content::WebContents* GetAssociatedWebContents();
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Emits a message to the extension's devtools console.
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void WriteToConsole(content::ConsoleMessageLevel level,
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const std::string& message);
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct content::BrowserThread::DeleteOnThread<
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserThread::UI>;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::DeleteHelper<UIThreadExtensionFunction>;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~UIThreadExtensionFunction();
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SendResponse(bool success) OVERRIDE;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Sets the Blob UUIDs whose ownership is being transferred to the renderer.
46146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SetTransferredBlobUUIDs(const std::vector<std::string>& blob_uuids);
46246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The dispatcher that will service this extension function call.
464e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  base::WeakPtr<extensions::ExtensionFunctionDispatcher> dispatcher_;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The RenderViewHost we will send responses to.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* render_view_host_;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The RenderFrameHost we will send responses to.
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // NOTE: either render_view_host_ or render_frame_host_ will be set, as we
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // port code to use RenderFrames for OOPIF. See http://crbug.com/304341.
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::RenderFrameHost* render_frame_host_;
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // The content::BrowserContext of this function's extension.
4751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::BrowserContext* context_;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  class RenderHostTracker;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Destruct() const OVERRIDE;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // TODO(tommycli): Remove once RenderViewHost is gone.
48346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  IPC::Sender* GetIPCSender();
48446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int GetRoutingID();
48546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<RenderHostTracker> tracker_;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelegateForTests* delegate_;
48946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
49046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // The blobs transferred to the renderer process.
49146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<std::string> transferred_blob_uuids_;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extension functions that run on the IO thread. This type of function avoids
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a roundtrip to and from the UI thread (because communication with the
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extension process happens on the IO thread). It's intended to be used when
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// performance is critical (e.g. the webRequest API which can block network
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requests). Generally, UIThreadExtensionFunction is more appropriate and will
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be easier to use and interface with the rest of the browser.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IOThreadExtensionFunction : public ExtensionFunction {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IOThreadExtensionFunction();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual IOThreadExtensionFunction* AsIOThreadExtensionFunction() OVERRIDE;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
506e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void set_ipc_sender(
507e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      base::WeakPtr<extensions::ExtensionMessageFilter> ipc_sender,
508e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      int routing_id) {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ipc_sender_ = ipc_sender;
510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    routing_id_ = routing_id;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
513e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  base::WeakPtr<extensions::ExtensionMessageFilter> ipc_sender_weak() const {
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ipc_sender_;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int routing_id() const { return routing_id_; }
518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void set_extension_info_map(const extensions::InfoMap* extension_info_map) {
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_info_map_ = extension_info_map;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const extensions::InfoMap* extension_info_map() const {
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension_info_map_.get();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct content::BrowserThread::DeleteOnThread<
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserThread::IO>;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::DeleteHelper<IOThreadExtensionFunction>;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~IOThreadExtensionFunction();
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Destruct() const OVERRIDE;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SendResponse(bool success) OVERRIDE;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
538e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  base::WeakPtr<extensions::ExtensionMessageFilter> ipc_sender_;
539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int routing_id_;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<const extensions::InfoMap> extension_info_map_;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for an extension function that runs asynchronously *relative to
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the browser's UI thread*.
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AsyncExtensionFunction : public UIThreadExtensionFunction {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncExtensionFunction();
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AsyncExtensionFunction();
552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Deprecated: Override UIThreadExtensionFunction and implement Run() instead.
554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  //
555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // AsyncExtensionFunctions implement this method. Return true to indicate that
5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // nothing has gone wrong yet; SendResponse must be called later. Return false
557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // to respond immediately with an error.
558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool RunAsync() = 0;
559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ValidationFailure override to match RunAsync().
561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static bool ValidationFailure(AsyncExtensionFunction* function);
562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ResponseAction Run() OVERRIDE;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A SyncExtensionFunction is an ExtensionFunction that runs synchronously
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// *relative to the browser's UI thread*. Note that this has nothing to do with
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// running synchronously relative to the extension process. From the extension
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// process's point of view, the function is still asynchronous.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This kind of function is convenient for implementing simple APIs that just
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// need to interact with things on the browser UI thread.
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncExtensionFunction : public UIThreadExtensionFunction {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncExtensionFunction();
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~SyncExtensionFunction();
580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Deprecated: Override UIThreadExtensionFunction and implement Run() instead.
582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  //
583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // SyncExtensionFunctions implement this method. Return true to respond
584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // immediately with success, false to respond immediately with an error.
5855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual bool RunSync() = 0;
5865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ValidationFailure override to match RunSync().
588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static bool ValidationFailure(SyncExtensionFunction* function);
589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ResponseAction Run() OVERRIDE;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncIOThreadExtensionFunction : public IOThreadExtensionFunction {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncIOThreadExtensionFunction();
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~SyncIOThreadExtensionFunction();
600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Deprecated: Override IOThreadExtensionFunction and implement Run() instead.
602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  //
603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // SyncIOThreadExtensionFunctions implement this method. Return true to
604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // respond immediately with success, false to respond immediately with an
605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // error.
6065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual bool RunSync() = 0;
6075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ValidationFailure override to match RunSync().
609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static bool ValidationFailure(SyncIOThreadExtensionFunction* function);
610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ResponseAction Run() OVERRIDE;
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // EXTENSIONS_BROWSER_EXTENSION_FUNCTION_H_
616