// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef EXTENSIONS_RENDERER_USER_SCRIPT_SLAVE_H_ #define EXTENSIONS_RENDERER_USER_SCRIPT_SLAVE_H_ #include #include #include #include #include "base/memory/linked_ptr.h" #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/memory/shared_memory.h" #include "base/strings/string_piece.h" #include "extensions/common/user_script.h" #include "extensions/renderer/script_injection.h" #include "third_party/WebKit/public/platform/WebString.h" class GURL; namespace blink { class WebFrame; } namespace content { class RenderView; } namespace extensions { class Extension; class ExtensionSet; // Manages installed UserScripts for a render process. class UserScriptSlave { public: explicit UserScriptSlave(const ExtensionSet* extensions); ~UserScriptSlave(); // Returns the unique set of extension IDs this UserScriptSlave knows about. void GetActiveExtensions(std::set* extension_ids); // Gets the extension with the given |id|, if one exists. const Extension* GetExtension(const std::string& extension_id); // Update the parsed scripts from shared memory. // If |changed_extensions| is not empty, only those extensions will be // updated. // Otherwise, all extensions will be updated. bool UpdateScripts(base::SharedMemoryHandle shared_memory, const std::set& changed_extensions); // Gets the isolated world ID to use for the given |extension| in the given // |frame|. If no isolated world has been created for that extension, // one will be created and initialized. int GetIsolatedWorldIdForExtension(const Extension* extension, blink::WebFrame* frame); // Gets the id of the extension running in a given isolated world. If no such // isolated world exists, or no extension is running in it, returns empty // string. std::string GetExtensionIdForIsolatedWorld(int isolated_world_id); void RemoveIsolatedWorld(const std::string& extension_id); // Inject the appropriate scripts into a frame based on its URL. // TODO(aa): Extract a UserScriptFrame interface out of this to improve // testability. void InjectScripts(blink::WebFrame* frame, UserScript::RunLocation location); // Allow an extension to inject scripts that were previously delayed for user // approval. void OnContentScriptGrantedPermission( content::RenderView* render_view, int request_id); // Notify the UserScriptSlave that the |frame| is detached, and about to die. void FrameDetached(blink::WebFrame* frame); private: // Log the data from scripts being run, including doing UMA and notifying the // browser. void LogScriptsRun(blink::WebFrame* frame, UserScript::RunLocation location, const ScriptInjection::ScriptsRunInfo& info); // Shared memory containing raw script data. scoped_ptr shared_memory_; // Parsed script data, ready to inject. ScopedVector script_injections_; // Extension metadata. const ExtensionSet* extensions_; typedef std::map IsolatedWorldMap; IsolatedWorldMap isolated_world_ids_; DISALLOW_COPY_AND_ASSIGN(UserScriptSlave); }; } // namespace extensions #endif // EXTENSIONS_RENDERER_USER_SCRIPT_SLAVE_H_