Upstream version 7.35.144.0
[platform/framework/web/crosswalk.git] / src / chrome / renderer / extensions / chrome_v8_context_set.h
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_