Home | History | Annotate | Download | only in extensions
      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_
     91