// 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_SET_H_ #define EXTENSIONS_RENDERER_USER_SCRIPT_SET_H_ #include #include #include "base/basictypes.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/memory/shared_memory.h" #include "base/observer_list.h" #include "content/public/renderer/render_process_observer.h" #include "extensions/common/user_script.h" class GURL; namespace blink { class WebFrame; } namespace extensions { class ExtensionSet; class ScriptInjection; // The UserScriptSet is a collection of UserScripts which knows how to update // itself from SharedMemory and create ScriptInjections for UserScripts to // inject on a page. class UserScriptSet { public: class Observer { public: virtual void OnUserScriptsUpdated( const std::set& changed_hosts, const std::vector& scripts) = 0; }; explicit UserScriptSet(const ExtensionSet* extensions); ~UserScriptSet(); // Adds or removes observers. void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); // Appends the ids of the extensions that have user scripts to |ids|. void GetActiveExtensionIds(std::set* ids) const; // Append any ScriptInjections that should run on the given |web_frame| and // |tab_id|, at the given |run_location|, to |injections|. // |extensions| is passed in to verify the corresponding extension is still // valid. void GetInjections(ScopedVector* injections, blink::WebFrame* web_frame, int tab_id, UserScript::RunLocation run_location); scoped_ptr GetDeclarativeScriptInjection( int script_id, blink::WebFrame* web_frame, int tab_id, UserScript::RunLocation run_location, const GURL& document_url); // Updates scripts given the shared memory region containing user scripts. // Returns true if the scripts were successfully updated. bool UpdateUserScripts(base::SharedMemoryHandle shared_memory, const std::set& changed_hosts, bool whitelisted_only); const std::vector& scripts() const { return scripts_.get(); } private: // Returns a new ScriptInjection for the given |script| to execute in the // |web_frame|, or NULL if the script should not execute. scoped_ptr GetInjectionForScript( UserScript* script, blink::WebFrame* web_frame, int tab_id, UserScript::RunLocation run_location, const GURL& document_url, bool is_declarative); // Shared memory containing raw script data. scoped_ptr shared_memory_; // The set of all known extensions. Owned by the Dispatcher. const ExtensionSet* extensions_; // The UserScripts this injector manages. ScopedVector scripts_; // The associated observers. base::ObserverList observers_; DISALLOW_COPY_AND_ASSIGN(UserScriptSet); }; } // namespace extensions #endif // EXTENSIONS_RENDERER_USER_SCRIPT_SET_H_