Index: content/renderer/java/gin_java_bridge_dispatcher.cc |
diff --git a/content/renderer/java/gin_java_bridge_dispatcher.cc b/content/renderer/java/gin_java_bridge_dispatcher.cc |
index bacc23cc9bde03bcca19846243c302bd4c1d81ab..88d502e5ca48f316e245e431436d2e110348d1b0 100644 |
--- a/content/renderer/java/gin_java_bridge_dispatcher.cc |
+++ b/content/renderer/java/gin_java_bridge_dispatcher.cc |
@@ -15,7 +15,8 @@ |
namespace content { |
GinJavaBridgeDispatcher::GinJavaBridgeDispatcher(RenderFrame* render_frame) |
- : RenderFrameObserver(render_frame) { |
+ : RenderFrameObserver(render_frame), |
+ inside_did_clear_window_object_(false) { |
} |
GinJavaBridgeDispatcher::~GinJavaBridgeDispatcher() { |
@@ -31,7 +32,32 @@ bool GinJavaBridgeDispatcher::OnMessageReceived(const IPC::Message& msg) { |
return handled; |
} |
+namespace { |
+ |
+class ScopedFlag { |
+ public: |
+ ScopedFlag(bool* flag) : flag_(flag) { |
+ DCHECK(!*flag_); |
+ *flag_ = true; |
+ } |
+ ~ScopedFlag() { |
+ DCHECK(*flag_); |
+ *flag_ = false; |
+ } |
+ private: |
+ bool* flag_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScopedFlag); |
+}; |
+ |
+} // namespace |
+ |
void GinJavaBridgeDispatcher::DidClearWindowObject() { |
+ // Accessing window object when adding properties to it may trigger |
+ // a nested call to DidClearWindowObject. |
+ if (inside_did_clear_window_object_) |
+ return; |
+ ScopedFlag flag(&inside_did_clear_window_object_); |
for (NamedObjectMap::const_iterator iter = named_objects_.begin(); |
iter != named_objects_.end(); ++iter) { |
// Always create a new GinJavaBridgeObject, so we don't pull any of the V8 |