1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef EXTENSIONS_RENDERER_USER_SCRIPT_SET_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define EXTENSIONS_RENDERER_USER_SCRIPT_SET_H_
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <set>
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string>
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/basictypes.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/macros.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_vector.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/shared_memory.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/observer_list.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/renderer/render_process_observer.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/user_script.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass GURL;
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace blink {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass WebFrame;
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace extensions {
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass Extension;
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ExtensionSet;
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ScriptInjection;
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// The UserScriptSet is a collection of UserScripts which knows how to update
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// itself from SharedMemory and create ScriptInjections for UserScripts to
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// inject on a page.
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class UserScriptSet {
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  class Observer {
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   public:
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    virtual void OnUserScriptsUpdated(
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        const std::set<std::string>& changed_extensions,
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        const std::vector<UserScript*>& scripts) = 0;
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  };
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit UserScriptSet(const ExtensionSet* extensions);
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ~UserScriptSet();
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Adds or removes observers.
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void AddObserver(Observer* observer);
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void RemoveObserver(Observer* observer);
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Appends the ids of the extensions that have user scripts to |ids|.
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void GetActiveExtensionIds(std::set<std::string>* ids) const;
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Populate |injections| with any ScriptInjections that should run on the
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // given |web_frame| and |tab_id|, at the given |run_location|.
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |extensions| is passed in to verify the corresponding extension is still
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // valid.
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void GetInjections(ScopedVector<ScriptInjection>* injections,
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     blink::WebFrame* web_frame,
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     int tab_id,
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     UserScript::RunLocation run_location);
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ScriptInjection> GetDeclarativeScriptInjection(
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int script_id,
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blink::WebFrame* web_frame,
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int tab_id,
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      UserScript::RunLocation run_location,
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const GURL& document_url,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const Extension* extension);
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Updates scripts given the shared memory region containing user scripts.
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Returns true if the scripts were successfully updated.
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool UpdateUserScripts(base::SharedMemoryHandle shared_memory,
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         const std::set<std::string>& changed_extensions);
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const std::vector<UserScript*>& scripts() const { return scripts_.get(); }
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns a new ScriptInjection for the given |script| to execute in the
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |web_frame|, or NULL if the script should not execute.
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<ScriptInjection> GetInjectionForScript(
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      UserScript* script,
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      blink::WebFrame* web_frame,
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      int tab_id,
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      UserScript::RunLocation run_location,
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const GURL& document_url,
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const Extension* extension,
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool is_declarative);
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Shared memory containing raw script data.
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::SharedMemory> shared_memory_;
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The set of all known extensions. Owned by the Dispatcher.
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const ExtensionSet* extensions_;
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The UserScripts this injector manages.
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedVector<UserScript> scripts_;
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The associated observers.
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ObserverList<Observer> observers_;
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(UserScriptSet);
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace extensions
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // EXTENSIONS_RENDERER_USER_SCRIPT_SET_H_
107