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