OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_EXTENSIONS_USER_SCRIPT_MASTER_H_ | 5 #ifndef CHROME_BROWSER_EXTENSIONS_USER_SCRIPT_MASTER_H_ |
6 #define CHROME_BROWSER_EXTENSIONS_USER_SCRIPT_MASTER_H_ | 6 #define CHROME_BROWSER_EXTENSIONS_USER_SCRIPT_MASTER_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/scoped_observer.h" | 13 #include "base/scoped_observer.h" |
14 #include "content/public/browser/browser_thread.h" | 14 #include "content/public/browser/browser_thread.h" |
15 #include "content/public/browser/notification_observer.h" | 15 #include "content/public/browser/notification_observer.h" |
16 #include "content/public/browser/notification_registrar.h" | 16 #include "content/public/browser/notification_registrar.h" |
17 #include "extensions/browser/extension_registry_observer.h" | 17 #include "extensions/browser/extension_registry_observer.h" |
18 #include "extensions/common/extension_messages.h" | 18 #include "extensions/common/extension_messages.h" |
19 #include "extensions/common/extension_set.h" | 19 #include "extensions/common/extension_set.h" |
20 #include "extensions/common/user_script.h" | 20 #include "extensions/common/user_script.h" |
21 | 21 |
22 namespace content { | 22 namespace content { |
23 class RenderProcessHost; | 23 class RenderProcessHost; |
24 } | 24 } |
25 | 25 |
26 class Profile; | 26 class Profile; |
27 | 27 |
28 namespace extensions { | 28 namespace extensions { |
29 | 29 |
| 30 class ContentVerifier; |
30 class ExtensionRegistry; | 31 class ExtensionRegistry; |
31 | 32 |
32 typedef std::map<std::string, ExtensionSet::ExtensionPathAndDefaultLocale> | 33 typedef std::map<std::string, ExtensionSet::ExtensionPathAndDefaultLocale> |
33 ExtensionsInfo; | 34 ExtensionsInfo; |
34 | 35 |
35 // Manages a segment of shared memory that contains the user scripts the user | 36 // Manages a segment of shared memory that contains the user scripts the user |
36 // has installed. Lives on the UI thread. | 37 // has installed. Lives on the UI thread. |
37 class UserScriptMaster : public base::RefCountedThreadSafe<UserScriptMaster>, | 38 class UserScriptMaster : public base::RefCountedThreadSafe<UserScriptMaster>, |
38 public content::NotificationObserver, | 39 public content::NotificationObserver, |
39 public ExtensionRegistryObserver { | 40 public ExtensionRegistryObserver { |
40 public: | 41 public: |
41 explicit UserScriptMaster(Profile* profile); | 42 explicit UserScriptMaster(Profile* profile); |
42 | 43 |
43 // Kicks off a process on the file thread to reload scripts from disk | 44 // Kicks off a process on the file thread to reload scripts from disk |
44 // into a new chunk of shared memory and notify renderers. | 45 // into a new chunk of shared memory and notify renderers. |
45 virtual void StartLoad(); | 46 virtual void StartLoad(); |
46 | 47 |
47 // Gets the segment of shared memory for the scripts. | 48 // Gets the segment of shared memory for the scripts. |
48 base::SharedMemory* GetSharedMemory() const { | 49 base::SharedMemory* GetSharedMemory() const { |
49 return shared_memory_.get(); | 50 return shared_memory_.get(); |
50 } | 51 } |
51 | 52 |
52 // Called by the script reloader when new scripts have been loaded. | 53 // Called by the script reloader when new scripts have been loaded. |
53 void NewScriptsAvailable(base::SharedMemory* handle); | 54 void NewScriptsAvailable(base::SharedMemory* handle); |
54 | 55 |
55 // Return true if we have any scripts ready. | 56 // Return true if we have any scripts ready. |
56 bool ScriptsReady() const { return shared_memory_.get() != NULL; } | 57 bool ScriptsReady() const { return shared_memory_.get() != NULL; } |
57 | 58 |
| 59 // Returns the content verifier for our browser context. |
| 60 ContentVerifier* content_verifier(); |
| 61 |
58 protected: | 62 protected: |
59 friend class base::RefCountedThreadSafe<UserScriptMaster>; | 63 friend class base::RefCountedThreadSafe<UserScriptMaster>; |
60 | 64 |
61 virtual ~UserScriptMaster(); | 65 virtual ~UserScriptMaster(); |
62 | 66 |
63 public: | 67 public: |
64 // We reload user scripts on the file thread to prevent blocking the UI. | 68 // We reload user scripts on the file thread to prevent blocking the UI. |
65 // ScriptReloader lives on the file thread and does the reload | 69 // ScriptReloader lives on the file thread and does the reload |
66 // work, and then sends a message back to its master with a new SharedMemory*. | 70 // work, and then sends a message back to its master with a new SharedMemory*. |
67 // ScriptReloader is the worker that manages running the script load | 71 // ScriptReloader is the worker that manages running the script load |
68 // on the file thread. It must be created on, and its public API must only be | 72 // on the file thread. It must be created on, and its public API must only be |
69 // called from, the master's thread. | 73 // called from, the master's thread. |
70 class ScriptReloader | 74 class ScriptReloader |
71 : public base::RefCountedThreadSafe<UserScriptMaster::ScriptReloader> { | 75 : public base::RefCountedThreadSafe<UserScriptMaster::ScriptReloader> { |
72 public: | 76 public: |
73 // Parses the includes out of |script| and returns them in |includes|. | 77 // Parses the includes out of |script| and returns them in |includes|. |
74 static bool ParseMetadataHeader(const base::StringPiece& script_text, | 78 static bool ParseMetadataHeader(const base::StringPiece& script_text, |
75 UserScript* script); | 79 UserScript* script); |
76 | 80 |
77 explicit ScriptReloader(UserScriptMaster* master); | 81 explicit ScriptReloader(UserScriptMaster* master); |
78 | 82 |
79 // Start loading of scripts. | 83 // Start loading of scripts. |
80 // Will always send a message to the master upon completion. | 84 // Will always send a message to the master upon completion. |
81 void StartLoad(const UserScriptList& external_scripts, | 85 void StartLoad(const UserScriptList& external_scripts, |
82 const ExtensionsInfo& extension_info_); | 86 const ExtensionsInfo& extensions_info); |
83 | 87 |
84 // The master is going away; don't call it back. | 88 // The master is going away; don't call it back. |
85 void DisownMaster() { | 89 void DisownMaster() { |
86 master_ = NULL; | 90 master_ = NULL; |
87 } | 91 } |
88 | 92 |
89 private: | 93 private: |
90 FRIEND_TEST_ALL_PREFIXES(UserScriptMasterTest, SkipBOMAtTheBeginning); | 94 FRIEND_TEST_ALL_PREFIXES(UserScriptMasterTest, SkipBOMAtTheBeginning); |
91 FRIEND_TEST_ALL_PREFIXES(UserScriptMasterTest, LeaveBOMNotAtTheBeginning); | 95 FRIEND_TEST_ALL_PREFIXES(UserScriptMasterTest, LeaveBOMNotAtTheBeginning); |
92 friend class base::RefCountedThreadSafe<UserScriptMaster::ScriptReloader>; | 96 friend class base::RefCountedThreadSafe<UserScriptMaster::ScriptReloader>; |
(...skipping 26 matching lines...) Expand all Loading... |
119 // May be NULL if DisownMaster() is called. | 123 // May be NULL if DisownMaster() is called. |
120 UserScriptMaster* master_; | 124 UserScriptMaster* master_; |
121 | 125 |
122 // Maps extension info needed for localization to an extension ID. | 126 // Maps extension info needed for localization to an extension ID. |
123 ExtensionsInfo extensions_info_; | 127 ExtensionsInfo extensions_info_; |
124 | 128 |
125 // The message loop to call our master back on. | 129 // The message loop to call our master back on. |
126 // Expected to always outlive us. | 130 // Expected to always outlive us. |
127 content::BrowserThread::ID master_thread_id_; | 131 content::BrowserThread::ID master_thread_id_; |
128 | 132 |
| 133 scoped_refptr<ContentVerifier> verifier_; |
| 134 |
129 DISALLOW_COPY_AND_ASSIGN(ScriptReloader); | 135 DISALLOW_COPY_AND_ASSIGN(ScriptReloader); |
130 }; | 136 }; |
131 | 137 |
132 private: | 138 private: |
133 // content::NotificationObserver implementation. | 139 // content::NotificationObserver implementation. |
134 virtual void Observe(int type, | 140 virtual void Observe(int type, |
135 const content::NotificationSource& source, | 141 const content::NotificationSource& source, |
136 const content::NotificationDetails& details) OVERRIDE; | 142 const content::NotificationDetails& details) OVERRIDE; |
137 | 143 |
138 // ExtensionRegistryObserver implementation. | 144 // ExtensionRegistryObserver implementation. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 // Listen to extension load, unloaded notifications. | 183 // Listen to extension load, unloaded notifications. |
178 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> | 184 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> |
179 extension_registry_observer_; | 185 extension_registry_observer_; |
180 | 186 |
181 DISALLOW_COPY_AND_ASSIGN(UserScriptMaster); | 187 DISALLOW_COPY_AND_ASSIGN(UserScriptMaster); |
182 }; | 188 }; |
183 | 189 |
184 } // namespace extensions | 190 } // namespace extensions |
185 | 191 |
186 #endif // CHROME_BROWSER_EXTENSIONS_USER_SCRIPT_MASTER_H_ | 192 #endif // CHROME_BROWSER_EXTENSIONS_USER_SCRIPT_MASTER_H_ |
OLD | NEW |