OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef CHROME_RENDERER_EXTENSIONS_CHROME_V8_CONTEXT_SET_H_ | |
6 #define CHROME_RENDERER_EXTENSIONS_CHROME_V8_CONTEXT_SET_H_ | |
7 | |
8 #include <set> | |
9 #include <string> | |
10 | |
11 #include "base/basictypes.h" | |
12 #include "base/bind.h" | |
13 #include "v8/include/v8.h" | |
14 | |
15 class GURL; | |
16 | |
17 namespace base { | |
18 class ListValue; | |
19 } | |
20 | |
21 namespace content { | |
22 class RenderView; | |
23 } | |
24 | |
25 namespace v8 { | |
26 class Context; | |
27 } | |
28 | |
29 namespace extensions { | |
30 class ChromeV8Context; | |
31 | |
32 // A container of ExtensionBindingsContext. Since calling JavaScript within a | |
33 // context can cause any number of contexts to be created or destroyed, this | |
34 // has additional smarts to help with the set changing underneath callers. | |
35 class ChromeV8ContextSet { | |
36 public: | |
37 ChromeV8ContextSet(); | |
38 ~ChromeV8ContextSet(); | |
39 | |
40 int size() const; | |
41 | |
42 // Takes ownership of |context|. | |
43 void Add(ChromeV8Context* context); | |
44 | |
45 // If the specified context is contained in this set, remove it, then delete | |
46 // it asynchronously. After this call returns the context object will still | |
47 // be valid, but its frame() pointer will be cleared. | |
48 void Remove(ChromeV8Context* context); | |
49 | |
50 // Returns a copy to protect against changes. | |
51 typedef std::set<ChromeV8Context*> ContextSet; | |
52 ContextSet GetAll() const; | |
53 | |
54 // Gets the ChromeV8Context corresponding to v8::Context::GetCurrent(), or | |
55 // NULL if no such context exists. | |
56 ChromeV8Context* GetCurrent() const; | |
57 | |
58 // Gets the ChromeV8Context corresponding to v8::Context::GetCalling(), or | |
59 // NULL if no such context exists. | |
60 ChromeV8Context* GetCalling() const; | |
61 | |
62 // Gets the ChromeV8Context corresponding to the specified | |
63 // v8::Context or NULL if no such context exists. | |
64 ChromeV8Context* GetByV8Context(v8::Handle<v8::Context> context) const; | |
65 | |
66 // Synchronously runs |callback| with each ChromeV8Context that belongs to | |
67 // |extension_id| in |render_view|. | |
68 // | |
69 // |extension_id| may be "" to match all extensions. | |
70 // |render_view| may be NULL to match all render views. | |
71 void ForEach(const std::string& extension_id, | |
72 content::RenderView* render_view, | |
73 const base::Callback<void(ChromeV8Context*)>& callback) const; | |
74 | |
75 // Cleans up contexts belonging to an unloaded extension. | |
76 // | |
77 // Returns the set of ChromeV8Contexts that were removed as a result. These | |
78 // are safe to interact with until the end of the current event loop, since | |
79 // they're deleted asynchronously. | |
80 ContextSet OnExtensionUnloaded(const std::string& extension_id); | |
81 | |
82 private: | |
83 ContextSet contexts_; | |
84 | |
85 DISALLOW_COPY_AND_ASSIGN(ChromeV8ContextSet); | |
86 }; | |
87 | |
88 } // namespace extensions | |
89 | |
90 #endif // CHROME_RENDERER_EXTENSIONS_CHROME_V8_CONTEXT_SET_H_ | |
OLD | NEW |