| // 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 <map> |
| #include <memory> |
| #include <set> |
| #include <string> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "base/memory/read_only_shared_memory_region.h" |
| #include "base/observer_list.h" |
| #include "extensions/common/mojom/host_id.mojom-forward.h" |
| #include "extensions/common/mojom/run_location.mojom-shared.h" |
| #include "extensions/common/user_script.h" |
| #include "third_party/blink/public/platform/web_string.h" |
| |
| class GURL; |
| |
| namespace content { |
| class RenderFrame; |
| } |
| |
| namespace extensions { |
| 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: |
| // Called when the set of user scripts is updated, which invalidates all |
| // previous script objects from this UserScriptSet. |
| virtual void OnUserScriptsUpdated() = 0; |
| |
| // Called when this UserScriptSet is destroyed. |
| virtual void OnUserScriptSetDestroyed() = 0; |
| }; |
| |
| explicit UserScriptSet(mojom::HostID host_id); |
| ~UserScriptSet(); |
| |
| // Adds or removes observers. |
| void AddObserver(Observer* observer); |
| void RemoveObserver(Observer* observer); |
| |
| // Append any ScriptInjections that should run on the given |render_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(std::vector<std::unique_ptr<ScriptInjection>>* injections, |
| content::RenderFrame* render_frame, |
| int tab_id, |
| mojom::RunLocation run_location, |
| bool log_activity); |
| |
| std::unique_ptr<ScriptInjection> GetDeclarativeScriptInjection( |
| const std::string& script_id, |
| content::RenderFrame* render_frame, |
| int tab_id, |
| mojom::RunLocation run_location, |
| const GURL& document_url, |
| bool log_activity); |
| |
| // Updates scripts given the shared memory region containing user scripts. |
| // Returns true if the scripts were successfully updated. |
| bool UpdateUserScripts(base::ReadOnlySharedMemoryRegion shared_memory); |
| |
| bool HasScripts() const { return !scripts_.empty(); } |
| |
| // Clears all user scripts managed by this set and notifies observers. |
| void ClearUserScripts(); |
| |
| // Returns the contents of a script file. |
| // Note that copying is cheap as this uses WebString. |
| blink::WebString GetJsSource(const UserScript::File& file, |
| bool emulate_greasemonkey); |
| blink::WebString GetCssSource(const UserScript::File& file); |
| |
| private: |
| // Returns a new ScriptInjection for the given |script| to execute in the |
| // |render_frame|, or NULL if the script should not execute. |
| std::unique_ptr<ScriptInjection> GetInjectionForScript( |
| const UserScript* script, |
| content::RenderFrame* render_frame, |
| int tab_id, |
| mojom::RunLocation run_location, |
| const GURL& document_url, |
| bool is_declarative, |
| bool log_activity); |
| |
| // Shared memory mapping containing raw script data. |
| base::ReadOnlySharedMemoryMapping shared_memory_mapping_; |
| |
| // The UserScripts this injector manages. |
| UserScriptList scripts_; |
| |
| // Map of user script file url -> source. |
| std::map<GURL, blink::WebString> script_sources_; |
| |
| // The HostID which |scripts_| is associated with. |
| mojom::HostID host_id_; |
| |
| // The associated observers. |
| base::ObserverList<Observer>::Unchecked observers_; |
| |
| DISALLOW_COPY_AND_ASSIGN(UserScriptSet); |
| }; |
| |
| } // namespace extensions |
| |
| #endif // EXTENSIONS_RENDERER_USER_SCRIPT_SET_H_ |