summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkalman@chromium.org <kalman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-06 03:04:25 +0000
committerkalman@chromium.org <kalman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-06 03:04:25 +0000
commitdd218905608586ad381942d2cdda3cd5aa91111d (patch)
treee8c4279cda3b7af13895f92632bede529e7b4f22
parent867e59190fb08f577827272b43b588702d11282d (diff)
downloadchromium_src-dd218905608586ad381942d2cdda3cd5aa91111d.zip
chromium_src-dd218905608586ad381942d2cdda3cd5aa91111d.tar.gz
chromium_src-dd218905608586ad381942d2cdda3cd5aa91111d.tar.bz2
Check that ChromeV8Contexts are valid before running ChromeV8ContextSet::ForEach
for them. This patch pre-empts likely breakage caused by r204157. BUG=none TBR=koz@chromium.org Review URL: https://codereview.chromium.org/16469002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@204403 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/renderer/extensions/chrome_v8_context.cc4
-rw-r--r--chrome/renderer/extensions/chrome_v8_context.h8
-rw-r--r--chrome/renderer/extensions/chrome_v8_context_set.cc12
3 files changed, 15 insertions, 9 deletions
diff --git a/chrome/renderer/extensions/chrome_v8_context.cc b/chrome/renderer/extensions/chrome_v8_context.cc
index c95a420..9cae7e7 100644
--- a/chrome/renderer/extensions/chrome_v8_context.cc
+++ b/chrome/renderer/extensions/chrome_v8_context.cc
@@ -151,8 +151,4 @@ void ChromeV8Context::OnResponseReceived(const std::string& name,
}
}
-bool ChromeV8Context::is_valid() const {
- return !v8_context_.get().IsEmpty();
-}
-
} // namespace extensions
diff --git a/chrome/renderer/extensions/chrome_v8_context.h b/chrome/renderer/extensions/chrome_v8_context.h
index 55b8d59..5c7bfd8 100644
--- a/chrome/renderer/extensions/chrome_v8_context.h
+++ b/chrome/renderer/extensions/chrome_v8_context.h
@@ -39,6 +39,12 @@ class ChromeV8Context : public RequestSender::Source {
// ModuleSystem.
void Invalidate();
+ // Returns true if this context is still valid, false if it isn't.
+ // A context becomes invalid via Invalidate().
+ bool is_valid() const {
+ return !v8_context_.get().IsEmpty();
+ }
+
v8::Handle<v8::Context> v8_context() const {
return v8_context_.get();
}
@@ -100,8 +106,6 @@ class ChromeV8Context : public RequestSender::Source {
const std::string& error) OVERRIDE;
private:
- bool is_valid() const;
-
// The v8 context the bindings are accessible to.
ScopedPersistent<v8::Context> v8_context_;
diff --git a/chrome/renderer/extensions/chrome_v8_context_set.cc b/chrome/renderer/extensions/chrome_v8_context_set.cc
index c79cd5c..12084ff 100644
--- a/chrome/renderer/extensions/chrome_v8_context_set.cc
+++ b/chrome/renderer/extensions/chrome_v8_context_set.cc
@@ -87,20 +87,26 @@ void ChromeV8ContextSet::ForEach(
for (ContextSet::iterator it = contexts.begin(); it != contexts.end();
++it) {
+ ChromeV8Context* context = *it;
+
+ // For the same reason as above, contexts may become invalid while we run.
+ if (!context->is_valid())
+ continue;
+
if (!extension_id.empty()) {
- const Extension* extension = (*it)->extension();
+ const Extension* extension = context->extension();
if (!extension || (extension_id != extension->id()))
continue;
}
- content::RenderView* context_render_view = (*it)->GetRenderView();
+ content::RenderView* context_render_view = context->GetRenderView();
if (!context_render_view)
continue;
if (render_view && render_view != context_render_view)
continue;
- callback.Run(*it);
+ callback.Run(context);
}
}