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_RENDERER_EXTENSIONS_USER_SCRIPT_SLAVE_H_ 6 #define CHROME_RENDERER_EXTENSIONS_USER_SCRIPT_SLAVE_H_ 7 8 #include <map> 9 #include <set> 10 #include <string> 11 #include <vector> 12 13 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/shared_memory.h" 15 #include "base/stl_util.h" 16 #include "base/strings/string_piece.h" 17 #include "extensions/common/user_script.h" 18 #include "third_party/WebKit/public/web/WebScriptSource.h" 19 20 class ExtensionSet; 21 class GURL; 22 23 namespace blink { 24 class WebFrame; 25 } 26 27 using blink::WebScriptSource; 28 29 namespace extensions { 30 class Extension; 31 32 // Manages installed UserScripts for a render process. 33 class UserScriptSlave { 34 public: 35 // Utility to get the URL we will match against for a frame. If the frame has 36 // committed, this is the commited URL. Otherwise it is the provisional URL. 37 static GURL GetDataSourceURLForFrame(const blink::WebFrame* frame); 38 39 explicit UserScriptSlave(const ExtensionSet* extensions); 40 ~UserScriptSlave(); 41 42 // Returns the unique set of extension IDs this UserScriptSlave knows about. 43 void GetActiveExtensions(std::set<std::string>* extension_ids); 44 45 // Update the parsed scripts from shared memory. 46 bool UpdateScripts(base::SharedMemoryHandle shared_memory); 47 48 // Inject the appropriate scripts into a frame based on its URL. 49 // TODO(aa): Extract a UserScriptFrame interface out of this to improve 50 // testability. 51 void InjectScripts(blink::WebFrame* frame, UserScript::RunLocation location); 52 53 // Gets the isolated world ID to use for the given |extension| in the given 54 // |frame|. If no isolated world has been created for that extension, 55 // one will be created and initialized. 56 int GetIsolatedWorldIdForExtension(const Extension* extension, 57 blink::WebFrame* frame); 58 59 // Gets the id of the extension running in a given isolated world. If no such 60 // isolated world exists, or no extension is running in it, returns empty 61 // string. 62 std::string GetExtensionIdForIsolatedWorld(int isolated_world_id); 63 64 void RemoveIsolatedWorld(const std::string& extension_id); 65 66 private: 67 static void InitializeIsolatedWorld(int isolated_world_id, 68 const Extension* extension); 69 70 // Shared memory containing raw script data. 71 scoped_ptr<base::SharedMemory> shared_memory_; 72 73 // Parsed script data. 74 std::vector<UserScript*> scripts_; 75 STLElementDeleter<std::vector<UserScript*> > script_deleter_; 76 77 // Greasemonkey API source that is injected with the scripts. 78 base::StringPiece api_js_; 79 80 // Extension metadata. 81 const ExtensionSet* extensions_; 82 83 typedef std::map<std::string, int> IsolatedWorldMap; 84 IsolatedWorldMap isolated_world_ids_; 85 86 DISALLOW_COPY_AND_ASSIGN(UserScriptSlave); 87 }; 88 89 } // namespace extensions 90 91 #endif // CHROME_RENDERER_EXTENSIONS_USER_SCRIPT_SLAVE_H_ 92