Home | History | Annotate | Download | only in extensions
      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_SCRIPT_EXECUTOR_H_
      6 #define CHROME_BROWSER_EXTENSIONS_SCRIPT_EXECUTOR_H_
      7 
      8 #include <string>
      9 
     10 #include "base/callback_forward.h"
     11 #include "base/observer_list.h"
     12 #include "chrome/browser/extensions/tab_helper.h"
     13 #include "extensions/common/user_script.h"
     14 
     15 class GURL;
     16 
     17 namespace base {
     18 class ListValue;
     19 }  // namespace base
     20 
     21 namespace content {
     22 class WebContents;
     23 }
     24 
     25 namespace extensions {
     26 
     27 // Interface for executing extension content scripts (e.g. executeScript) as
     28 // described by the ExtensionMsg_ExecuteCode_Params IPC, and notifying the
     29 // caller when responded with ExtensionHostMsg_ExecuteCodeFinished.
     30 class ScriptExecutor {
     31  public:
     32   ScriptExecutor(
     33       content::WebContents* web_contents,
     34       // |script_observers| is assumed to be owned by |this|'s owner, and in
     35       // such a way that |this| is destroyed first.
     36       ObserverList<TabHelper::ScriptExecutionObserver>* script_observers);
     37 
     38   ~ScriptExecutor();
     39 
     40   // The type of script being injected.
     41   enum ScriptType {
     42     JAVASCRIPT,
     43     CSS,
     44   };
     45 
     46   // The scope of the script injection across the frames.
     47   enum FrameScope {
     48     TOP_FRAME,
     49     ALL_FRAMES,
     50   };
     51 
     52   // The type of world to inject into (main world, or its own isolated world).
     53   enum WorldType {
     54     MAIN_WORLD,
     55     ISOLATED_WORLD,
     56   };
     57 
     58   // Callback from ExecuteScript. The arguments are (error, on_page_id, on_url,
     59   // result). Success is implied by an empty error.
     60   typedef base::Callback<void(const std::string&, int32, const GURL&,
     61                               const base::ListValue&)>
     62       ExecuteScriptCallback;
     63 
     64   // Executes a script. The arguments match ExtensionMsg_ExecuteCode_Params in
     65   // extension_messages.h (request_id is populated automatically).
     66   //
     67   // |callback| will always be called even if the IPC'd renderer is destroyed
     68   // before a response is received (in this case the callback will be with a
     69   // failure and appropriate error message).
     70   void ExecuteScript(const std::string& extension_id,
     71                      ScriptType script_type,
     72                      const std::string& code,
     73                      FrameScope frame_scope,
     74                      UserScript::RunLocation run_at,
     75                      WorldType world_type,
     76                      bool is_web_view,
     77                      const ExecuteScriptCallback& callback);
     78 
     79  private:
     80   // The next value to use for request_id in ExtensionMsg_ExecuteCode_Params.
     81   int next_request_id_;
     82 
     83   content::WebContents* web_contents_;
     84 
     85   ObserverList<TabHelper::ScriptExecutionObserver>* script_observers_;
     86 };
     87 
     88 }  // namespace extensions
     89 
     90 #endif  // CHROME_BROWSER_EXTENSIONS_SCRIPT_EXECUTOR_H_
     91