Home | History | Annotate | Download | only in renderer
      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_RENDERER_SCRIPT_INJECTION_MANAGER_H_
      6 #define EXTENSIONS_RENDERER_SCRIPT_INJECTION_MANAGER_H_
      7 
      8 #include <map>
      9 #include <set>
     10 #include <string>
     11 
     12 #include "base/callback.h"
     13 #include "base/memory/scoped_vector.h"
     14 #include "base/memory/shared_memory.h"
     15 #include "base/scoped_observer.h"
     16 #include "extensions/common/user_script.h"
     17 #include "extensions/renderer/script_injection.h"
     18 #include "extensions/renderer/user_script_set_manager.h"
     19 
     20 struct ExtensionMsg_ExecuteCode_Params;
     21 
     22 namespace blink {
     23 class WebFrame;
     24 class WebLocalFrame;
     25 }
     26 
     27 namespace content {
     28 class RenderView;
     29 }
     30 
     31 namespace extensions {
     32 class Extension;
     33 class ExtensionSet;
     34 
     35 // The ScriptInjectionManager manages extensions injecting scripts into frames
     36 // via both content/user scripts and tabs.executeScript(). It is responsible for
     37 // maintaining any pending injections awaiting permission or the appropriate
     38 // load point, and injecting them when ready.
     39 class ScriptInjectionManager : public UserScriptSetManager::Observer {
     40  public:
     41   ScriptInjectionManager(const ExtensionSet* extensions,
     42                          UserScriptSetManager* user_script_set_manager);
     43   virtual ~ScriptInjectionManager();
     44 
     45   // Notifies that a new render view has been created.
     46   void OnRenderViewCreated(content::RenderView* render_view);
     47 
     48  private:
     49   // A RenderViewObserver implementation which watches the various render views
     50   // in order to notify the ScriptInjectionManager of different document load
     51   // states.
     52   class RVOHelper;
     53 
     54   typedef std::map<blink::WebFrame*, UserScript::RunLocation> FrameStatusMap;
     55 
     56   // UserScriptSetManager::Observer implementation.
     57   virtual void OnUserScriptsUpdated(
     58       const std::set<std::string>& changed_extensions,
     59       const std::vector<UserScript*>& scripts) OVERRIDE;
     60 
     61   // Notifies that an RVOHelper should be removed.
     62   void RemoveObserver(RVOHelper* helper);
     63 
     64   // Invalidate any pending tasks associated with |frame|.
     65   void InvalidateForFrame(blink::WebFrame* frame);
     66 
     67   // Inject appropriate scripts into |frame|.
     68   void InjectScripts(blink::WebFrame* frame,
     69                      UserScript::RunLocation run_location);
     70 
     71   // Handle the ExecuteCode extension message.
     72   void HandleExecuteCode(const ExtensionMsg_ExecuteCode_Params& params,
     73                          content::RenderView* render_view);
     74 
     75   // Handle the ExecuteDeclarativeScript extension message.
     76   void HandleExecuteDeclarativeScript(blink::WebFrame* web_frame,
     77                                       int tab_id,
     78                                       const ExtensionId& extension_id,
     79                                       int script_id,
     80                                       const GURL& url);
     81 
     82   // Handle the GrantInjectionPermission extension message.
     83   void HandlePermitScriptInjection(int64 request_id);
     84 
     85   // Extensions metadata, owned by Dispatcher (which owns this object).
     86   const ExtensionSet* extensions_;
     87 
     88   // The map of active web frames to their corresponding statuses. The
     89   // RunLocation of the frame corresponds to the last location that has ran.
     90   FrameStatusMap frame_statuses_;
     91 
     92   // The collection of RVOHelpers.
     93   ScopedVector<RVOHelper> rvo_helpers_;
     94 
     95   // The set of UserScripts associated with extensions. Owned by the Dispatcher.
     96   UserScriptSetManager* user_script_set_manager_;
     97 
     98   // Pending injections which are waiting for either the proper run location or
     99   // user consent.
    100   ScopedVector<ScriptInjection> pending_injections_;
    101 
    102   ScopedObserver<UserScriptSetManager, UserScriptSetManager::Observer>
    103       user_script_set_manager_observer_;
    104 
    105   DISALLOW_COPY_AND_ASSIGN(ScriptInjectionManager);
    106 };
    107 
    108 }  // namespace extensions
    109 
    110 #endif  // EXTENSIONS_RENDERER_SCRIPT_INJECTION_MANAGER_H_
    111