diff options
Diffstat (limited to 'chrome/renderer/extensions/bindings_utils.h')
-rw-r--r-- | chrome/renderer/extensions/bindings_utils.h | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/chrome/renderer/extensions/bindings_utils.h b/chrome/renderer/extensions/bindings_utils.h new file mode 100644 index 0000000..5318da9 --- /dev/null +++ b/chrome/renderer/extensions/bindings_utils.h @@ -0,0 +1,89 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_RENDERER_EXTENSIONS_BINDINGS_UTILS_H_ +#define CHROME_RENDERER_EXTENSIONS_BINDINGS_UTILS_H_ +#pragma once + +#include "base/memory/linked_ptr.h" +#include "base/memory/singleton.h" +#include "v8/include/v8.h" + +#include <list> +#include <map> +#include <string> + +class RenderView; + +namespace WebKit { +class WebFrame; +} + +namespace bindings_utils { + +// Contains information about a JavaScript context that is hosting extension +// bindings. +struct ContextInfo { + ContextInfo(v8::Persistent<v8::Context> context, + const std::string& extension_id, + WebKit::WebFrame* frame); + ~ContextInfo(); + + v8::Persistent<v8::Context> context; + + // The extension ID this context is associated with. + std::string extension_id; + + // The frame the context is associated with. ContextInfo can outlive its + // frame, so this should not be dereferenced. It is stored only for use for + // comparison. + void* unsafe_frame; + + // A count of the number of events that are listening in this context. When + // this is zero, |context| will be a weak handle. + int num_connected_events; +}; +typedef std::list< linked_ptr<ContextInfo> > ContextList; + +// Returns a mutable reference to the ContextList. Note: be careful using this. +// Calling into javascript may result in the list being modified, so don't rely +// on iterators remaining valid between calls to javascript. +ContextList& GetContexts(); + +// Returns the ContextInfo item that has the given context. +ContextList::iterator FindContext(v8::Handle<v8::Context> context); + +// Returns the ContextInfo for the current v8 context. +ContextInfo* GetInfoForCurrentContext(); + +// Returns the 'chromeHidden' object for the specified context. +v8::Handle<v8::Object> GetChromeHiddenForContext( + v8::Handle<v8::Context> context); + +// Contains info relevant to a pending API request. +struct PendingRequest { + public : + PendingRequest(v8::Persistent<v8::Context> context, const std::string& name); + ~PendingRequest(); + + v8::Persistent<v8::Context> context; + std::string name; +}; +typedef std::map<int, linked_ptr<PendingRequest> > PendingRequestMap; + +// Returns a mutable reference to the PendingRequestMap. +PendingRequestMap& GetPendingRequestMap(); + +// Call the named javascript function with the given arguments in a context. +// The function name should be reachable from the chromeHidden object, and can +// be a sub-property like "Port.dispatchOnMessage". Returns the result of +// the function call. If an exception is thrown an empty Handle will be +// returned. +v8::Handle<v8::Value> CallFunctionInContext(v8::Handle<v8::Context> context, + const std::string& function_name, int argc, + v8::Handle<v8::Value>* argv); + +} // namespace bindings_utils + +#endif // CHROME_RENDERER_EXTENSIONS_BINDINGS_UTILS_H_ |