diff options
author | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-18 20:33:29 +0000 |
---|---|---|
committer | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-18 20:33:29 +0000 |
commit | 5792d936fb199d7875e7670e82f812fc2c7bee51 (patch) | |
tree | 6de3429fddaa34a30e0d1ebf93e4476d0a456ce1 /chrome/renderer | |
parent | 5e8bfe45ebc244188e836fd1c349da683be7fd63 (diff) | |
download | chromium_src-5792d936fb199d7875e7670e82f812fc2c7bee51.zip chromium_src-5792d936fb199d7875e7670e82f812fc2c7bee51.tar.gz chromium_src-5792d936fb199d7875e7670e82f812fc2c7bee51.tar.bz2 |
Fix race condition where chrome.tabs.executeScript sometimes wouldn't
inject scripts.
This is done by reusing the same UserScriptIdleScheduler for reference fragment navigations.
BUG=64093
TEST=See bug for repro.
Review URL: http://codereview.chromium.org/6099013
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@71693 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/navigation_state.cc | 5 | ||||
-rw-r--r-- | chrome/renderer/navigation_state.h | 1 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 22 | ||||
-rw-r--r-- | chrome/renderer/user_script_idle_scheduler.h | 2 |
4 files changed, 16 insertions, 14 deletions
diff --git a/chrome/renderer/navigation_state.cc b/chrome/renderer/navigation_state.cc index 49ee7a7..47759f8 100644 --- a/chrome/renderer/navigation_state.cc +++ b/chrome/renderer/navigation_state.cc @@ -15,6 +15,11 @@ void NavigationState::set_user_script_idle_scheduler( user_script_idle_scheduler_.reset(scheduler); } +void NavigationState::swap_user_script_idle_scheduler( + NavigationState* state) { + user_script_idle_scheduler_.swap(state->user_script_idle_scheduler_); +} + void NavigationState::set_password_form_data(webkit_glue::PasswordForm* data) { password_form_data_.reset(data); } diff --git a/chrome/renderer/navigation_state.h b/chrome/renderer/navigation_state.h index bc2ff3a..6a4cdb5 100644 --- a/chrome/renderer/navigation_state.h +++ b/chrome/renderer/navigation_state.h @@ -66,6 +66,7 @@ class NavigationState : public WebKit::WebDataSource::ExtraData { return user_script_idle_scheduler_.get(); } void set_user_script_idle_scheduler(UserScriptIdleScheduler* scheduler); + void swap_user_script_idle_scheduler(NavigationState* state); // Contains the page_id for this navigation or -1 if there is none yet. int32 pending_page_id() const { return pending_page_id_; } diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 9b71058..fe84d68 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -3181,8 +3181,16 @@ void RenderView::didCreateDataSource(WebFrame* frame, WebDataSource* ds) { } } - state->set_user_script_idle_scheduler( - new UserScriptIdleScheduler(this, frame)); + // If this datasource already has a UserScriptIdleScheduler, reuse that one. + // This is for navigations within a page (didNavigateWithinPage). See + // http://code.google.com/p/chromium/issues/detail?id=64093 + NavigationState* old_state = NavigationState::FromDataSource(ds); + if (old_state && old_state->user_script_idle_scheduler()) { + state->swap_user_script_idle_scheduler(old_state); + } else { + state->set_user_script_idle_scheduler( + new UserScriptIdleScheduler(this, frame)); + } ds->setExtraData(state); } @@ -3507,11 +3515,6 @@ void RenderView::didFinishLoad(WebFrame* frame) { void RenderView::didNavigateWithinPage( WebFrame* frame, bool is_new_navigation) { - // Determine if the UserScriptIdleScheduler already ran scripts on this page, - // since a new one gets created by didCreateDataSource. - NavigationState* state = NavigationState::FromDataSource(frame->dataSource()); - bool idle_scheduler_ran = state->user_script_idle_scheduler()->has_run(); - // If this was a reference fragment navigation that we initiated, then we // could end up having a non-null pending navigation state. We just need to // update the ExtraData on the datasource so that others who read the @@ -3525,11 +3528,6 @@ void RenderView::didNavigateWithinPage( NavigationState::FromDataSource(frame->dataSource()); new_state->set_was_within_same_page(true); - if (idle_scheduler_ran) { - // Update the new UserScriptIdleScheduler so we don't re-run scripts. - new_state->user_script_idle_scheduler()->set_has_run(true); - } - didCommitProvisionalLoad(frame, is_new_navigation); UpdateTitle(frame, frame->view()->mainFrame()->dataSource()->pageTitle()); diff --git a/chrome/renderer/user_script_idle_scheduler.h b/chrome/renderer/user_script_idle_scheduler.h index d287d75..165db5a 100644 --- a/chrome/renderer/user_script_idle_scheduler.h +++ b/chrome/renderer/user_script_idle_scheduler.h @@ -31,8 +31,6 @@ class UserScriptIdleScheduler { bool has_run() { return has_run_; } - void set_has_run(bool has_run) { has_run_ = has_run; } - // Called when the DOM has been completely constructed. void DidFinishDocumentLoad(); |