Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Unified Diff: chrome/renderer/extensions/extension_custom_bindings.cc

Issue 10114015: Fix bug where transient pages would miss events dispatched while it was (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: yoyo Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/common/extensions/extension_messages.h ('k') | chrome/renderer/extensions/extension_dispatcher.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/renderer/extensions/extension_custom_bindings.cc
diff --git a/chrome/renderer/extensions/extension_custom_bindings.cc b/chrome/renderer/extensions/extension_custom_bindings.cc
index 7b177e1f68703dc5dc8d8c98e2f3cfae5f816675..047588caeddeaf96605858f78a59b319098a1317 100644
--- a/chrome/renderer/extensions/extension_custom_bindings.cc
+++ b/chrome/renderer/extensions/extension_custom_bindings.cc
@@ -14,97 +14,16 @@
#include "chrome/renderer/extensions/extension_dispatcher.h"
#include "chrome/renderer/extensions/extension_helper.h"
#include "content/public/renderer/render_view.h"
-#include "content/public/renderer/render_view_visitor.h"
#include "grit/renderer_resources.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
-#include "v8/include/v8.h"
#include "webkit/glue/webkit_glue.h"
+#include "v8/include/v8.h"
namespace extensions {
namespace {
-// A RenderViewVisitor class that iterates through the set of available
-// views, looking for a view of the given type, in the given browser window
-// and within the given extension.
-// Used to accumulate the list of views associated with an extension.
-class ExtensionViewAccumulator : public content::RenderViewVisitor {
- public:
- ExtensionViewAccumulator(const std::string& extension_id,
- int browser_window_id,
- content::ViewType view_type)
- : extension_id_(extension_id),
- browser_window_id_(browser_window_id),
- view_type_(view_type),
- views_(v8::Array::New()),
- index_(0) {
- }
-
- v8::Local<v8::Array> views() { return views_; }
-
- virtual bool Visit(content::RenderView* render_view) {
- ExtensionHelper* helper = ExtensionHelper::Get(render_view);
- if (!ViewTypeMatches(helper->view_type(), view_type_))
- return true;
-
- GURL url = render_view->GetWebView()->mainFrame()->document().url();
- if (!url.SchemeIs(chrome::kExtensionScheme))
- return true;
- const std::string& extension_id = url.host();
- if (extension_id != extension_id_)
- return true;
-
- if (browser_window_id_ != extension_misc::kUnknownWindowId &&
- helper->browser_window_id() != browser_window_id_) {
- return true;
- }
-
- v8::Local<v8::Context> context =
- render_view->GetWebView()->mainFrame()->mainWorldScriptContext();
- if (!context.IsEmpty()) {
- v8::Local<v8::Value> window = context->Global();
- DCHECK(!window.IsEmpty());
-
- if (!OnMatchedView(window))
- return false;
- }
- return true;
- }
-
- private:
- // Called on each view found matching the search criteria. Returns false
- // to terminate the iteration.
- bool OnMatchedView(v8::Local<v8::Value> view_window) {
- views_->Set(v8::Integer::New(index_), view_window);
- index_++;
-
- if (view_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE)
- return false; // There can be only one...
-
- return true;
- }
-
- // Returns true is |type| "isa" |match|.
- static bool ViewTypeMatches(content::ViewType type, content::ViewType match) {
- if (type == match)
- return true;
-
- // INVALID means match all.
- if (match == content::VIEW_TYPE_INVALID)
- return true;
-
- return false;
- }
-
- std::string extension_id_;
- int browser_window_id_;
- content::ViewType view_type_;
- v8::Local<v8::Array> views_;
- int index_;
-};
-
} // namespace
ExtensionCustomBindings::ExtensionCustomBindings(
@@ -159,10 +78,21 @@ v8::Handle<v8::Value> ExtensionCustomBindings::GetExtensionViews(
if (!extension)
return v8::Undefined();
- ExtensionViewAccumulator accumulator(extension->id(), browser_window_id,
- view_type);
- content::RenderView::ForEach(&accumulator);
- return accumulator.views();
+ std::vector<content::RenderView*> views = ExtensionHelper::GetExtensionViews(
+ extension->id(), browser_window_id, view_type);
+ v8::Local<v8::Array> v8_views = v8::Array::New();
+ int v8_index = 0;
+ for (size_t i = 0; i < views.size(); ++i) {
+ v8::Local<v8::Context> context =
+ views[i]->GetWebView()->mainFrame()->mainWorldScriptContext();
+ if (!context.IsEmpty()) {
+ v8::Local<v8::Value> window = context->Global();
+ DCHECK(!window.IsEmpty());
+ v8_views->Set(v8::Integer::New(v8_index++), window);
+ }
+ }
+
+ return v8_views;
}
// static
« no previous file with comments | « chrome/common/extensions/extension_messages.h ('k') | chrome/renderer/extensions/extension_dispatcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698