diff options
author | kalman@chromium.org <kalman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-06 03:04:25 +0000 |
---|---|---|
committer | kalman@chromium.org <kalman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-06 03:04:25 +0000 |
commit | dd218905608586ad381942d2cdda3cd5aa91111d (patch) | |
tree | e8c4279cda3b7af13895f92632bede529e7b4f22 | |
parent | 867e59190fb08f577827272b43b588702d11282d (diff) | |
download | chromium_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.cc | 4 | ||||
-rw-r--r-- | chrome/renderer/extensions/chrome_v8_context.h | 8 | ||||
-rw-r--r-- | chrome/renderer/extensions/chrome_v8_context_set.cc | 12 |
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); } } |