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_H_ 6 #define EXTENSIONS_RENDERER_SCRIPT_INJECTION_H_ 7 8 #include "base/basictypes.h" 9 #include "base/macros.h" 10 #include "extensions/common/user_script.h" 11 #include "extensions/renderer/script_injector.h" 12 13 namespace blink { 14 class WebLocalFrame; 15 } 16 17 namespace extensions { 18 class Extension; 19 struct ScriptsRunInfo; 20 21 // A script wrapper which is aware of whether or not it is allowed to execute, 22 // and contains the implementation to do so. 23 class ScriptInjection { 24 public: 25 // Return the id of the extension associated with the given world. 26 static std::string GetExtensionIdForIsolatedWorld(int world_id); 27 28 // Remove the isolated world associated with the given extension. 29 static void RemoveIsolatedWorld(const std::string& extension_id); 30 31 ScriptInjection(scoped_ptr<ScriptInjector> injector, 32 blink::WebLocalFrame* web_frame, 33 const std::string& extension_id, 34 UserScript::RunLocation run_location, 35 int tab_id); 36 ~ScriptInjection(); 37 38 // Try to inject the script at the |current_location|. This returns true if 39 // the script has either injected or will never inject (i.e., if the object 40 // is done), and false if injection is delayed (either for permission purposes 41 // or because |current_location| is not the designated |run_location_|). 42 // NOTE: |extension| may be NULL, if the extension is removed! 43 bool TryToInject(UserScript::RunLocation current_location, 44 const Extension* extension, 45 ScriptsRunInfo* scripts_run_info); 46 47 // Called when permission for the given injection has been granted. 48 // Returns true if the injection ran. 49 bool OnPermissionGranted(const Extension* extension, 50 ScriptsRunInfo* scripts_run_info); 51 52 // Accessors. web_frame()53 blink::WebLocalFrame* web_frame() const { return web_frame_; } extension_id()54 const std::string& extension_id() const { return extension_id_; } request_id()55 int64 request_id() const { return request_id_; } 56 57 private: 58 // Send a message to the browser requesting permission to execute. 59 void RequestPermission(); 60 61 // Injects the script, optionally populating |scripts_run_info|. 62 void Inject(const Extension* extension, ScriptsRunInfo* scripts_run_info); 63 64 // Inject any JS scripts into the |frame|, optionally populating 65 // |execution_results|. 66 void InjectJs(const Extension* extension, 67 blink::WebLocalFrame* frame, 68 base::ListValue* execution_results); 69 70 // Inject any CSS source into the |frame|. 71 void InjectCss(blink::WebLocalFrame* frame); 72 73 // Notify that we will not inject, and mark it as acknowledged. 74 void NotifyWillNotInject(ScriptInjector::InjectFailureReason reason); 75 76 // The injector for this injection. 77 scoped_ptr<ScriptInjector> injector_; 78 79 // The (main) WebFrame into which this should inject the script. 80 blink::WebLocalFrame* web_frame_; 81 82 // The id of the associated extension. 83 std::string extension_id_; 84 85 // The location in the document load at which we inject the script. 86 UserScript::RunLocation run_location_; 87 88 // The tab id associated with the frame. 89 int tab_id_; 90 91 // This injection's request id. This will be -1 unless the injection is 92 // currently waiting on permission. 93 int64 request_id_; 94 95 // Whether or not the injection is complete, either via injecting the script 96 // or because it will never complete. 97 bool complete_; 98 99 DISALLOW_COPY_AND_ASSIGN(ScriptInjection); 100 }; 101 102 } // namespace extensions 103 104 #endif // EXTENSIONS_RENDERER_SCRIPT_INJECTION_H_ 105