Index: chrome/browser/extensions/api/web_navigation/web_navigation_api.cc |
diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc |
index 42535e737a99286e2ee1433ecb0a86ec06ab39ef..910b52e766da37a70a0395d312a9b7e015edac42 100644 |
--- a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc |
+++ b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc |
@@ -182,7 +182,7 @@ void WebNavigationEventRouter::Retargeting(const RetargetingDetails* details) { |
FrameNavigationState::FrameID frame_id( |
details->source_frame_id, |
- details->source_web_contents->GetRenderViewHost()->GetProcess()->GetID()); |
+ details->source_web_contents->GetRenderViewHost()); |
if (!frame_navigation_state.CanSendEvents(frame_id)) |
return; |
@@ -259,6 +259,19 @@ WebNavigationTabObserver* WebNavigationTabObserver::Get( |
return i == g_tab_observer.Get().end() ? NULL : i->second; |
} |
+content::RenderViewHost* WebNavigationTabObserver::render_view_host_in_process( |
+ int process_id) const { |
+ if (render_view_host_ && |
+ render_view_host_->GetProcess()->GetID() == process_id) { |
+ return render_view_host_; |
+ } |
+ if (pending_render_view_host_ && |
+ pending_render_view_host_->GetProcess()->GetID() == process_id) { |
+ return pending_render_view_host_; |
+ } |
+ return NULL; |
+} |
+ |
void WebNavigationTabObserver::Observe( |
int type, |
const content::NotificationSource& source, |
@@ -271,9 +284,20 @@ void WebNavigationTabObserver::Observe( |
resource_redirect_details->resource_type; |
if (resource_type == ResourceType::MAIN_FRAME || |
resource_type == ResourceType::SUB_FRAME) { |
+ content::RenderViewHost* render_view_host = NULL; |
+ if (render_view_host_ && |
+ resource_redirect_details->origin_child_id == |
+ render_view_host_->GetProcess()->GetID()) { |
+ render_view_host = render_view_host_; |
+ } else if (pending_render_view_host_ && |
+ resource_redirect_details->origin_child_id == |
+ pending_render_view_host_->GetProcess()->GetID()) { |
+ render_view_host = pending_render_view_host_; |
+ } |
+ if (!render_view_host) |
+ return; |
FrameNavigationState::FrameID frame_id( |
- resource_redirect_details->frame_id, |
- resource_redirect_details->origin_child_id); |
+ resource_redirect_details->frame_id, render_view_host); |
if (!navigation_state_.CanSendEvents(frame_id)) |
return; |
navigation_state_.SetIsServerRedirected(frame_id); |
@@ -291,8 +315,8 @@ void WebNavigationTabObserver::AboutToNavigateRenderView( |
if (!render_view_host_) { |
render_view_host_ = render_view_host; |
} else if (render_view_host != render_view_host_) { |
- // TODO(jochen): If pending_render_view_host_ is non-NULL, send error events |
- // for all ongoing navigations in that RVH. |
+ if (pending_render_view_host_) |
+ SendErrorEvents(web_contents(), pending_render_view_host_); |
pending_render_view_host_ = render_view_host; |
} |
} |
@@ -309,8 +333,7 @@ void WebNavigationTabObserver::DidStartProvisionalLoadForFrame( |
render_view_host != pending_render_view_host_) |
return; |
- FrameNavigationState::FrameID frame_id( |
- frame_num, render_view_host->GetProcess()->GetID()); |
+ FrameNavigationState::FrameID frame_id(frame_num, render_view_host); |
navigation_state_.TrackFrame(frame_id, |
validated_url, |
@@ -333,13 +356,12 @@ void WebNavigationTabObserver::DidCommitProvisionalLoadForFrame( |
if (render_view_host != render_view_host_ && |
render_view_host != pending_render_view_host_) |
return; |
- // TODO(jochen): If we switched the RVH, send error events for all ongoing |
- // navigations in the old RVH. |
+ if (render_view_host != render_view_host_) |
+ SendErrorEvents(web_contents(), render_view_host_); |
render_view_host_ = render_view_host; |
pending_render_view_host_ = NULL; |
- FrameNavigationState::FrameID frame_id( |
- frame_num, render_view_host->GetProcess()->GetID()); |
+ FrameNavigationState::FrameID frame_id(frame_num, render_view_host); |
if (!navigation_state_.CanSendEvents(frame_id)) |
return; |
@@ -398,18 +420,21 @@ void WebNavigationTabObserver::DidFailProvisionalLoad( |
if (render_view_host != render_view_host_ && |
render_view_host != pending_render_view_host_) |
return; |
- if (render_view_host == pending_render_view_host_) |
+ bool stop_tracking_frames = false; |
+ if (render_view_host == pending_render_view_host_) { |
pending_render_view_host_ = NULL; |
+ stop_tracking_frames = true; |
+ } |
- FrameNavigationState::FrameID frame_id( |
- frame_num, render_view_host->GetProcess()->GetID()); |
- if (!navigation_state_.CanSendEvents(frame_id)) |
- return; |
- |
- navigation_state_.SetErrorOccurredInFrame(frame_id); |
- helpers::DispatchOnErrorOccurred( |
- web_contents(), render_view_host->GetProcess()->GetID(), validated_url, |
- frame_num, is_main_frame, error_code); |
+ FrameNavigationState::FrameID frame_id(frame_num, render_view_host); |
+ if (navigation_state_.CanSendEvents(frame_id)) { |
+ navigation_state_.SetErrorOccurredInFrame(frame_id); |
+ helpers::DispatchOnErrorOccurred( |
+ web_contents(), render_view_host->GetProcess()->GetID(), validated_url, |
+ frame_num, is_main_frame, error_code); |
+ } |
+ if (stop_tracking_frames) |
+ navigation_state_.StopTrackingFramesInRVH(render_view_host); |
} |
void WebNavigationTabObserver::DocumentLoadedInFrame( |
@@ -417,8 +442,7 @@ void WebNavigationTabObserver::DocumentLoadedInFrame( |
content::RenderViewHost* render_view_host) { |
if (render_view_host != render_view_host_) |
return; |
- FrameNavigationState::FrameID frame_id( |
- frame_num, render_view_host->GetProcess()->GetID()); |
+ FrameNavigationState::FrameID frame_id(frame_num, render_view_host); |
if (!navigation_state_.CanSendEvents(frame_id)) |
return; |
helpers::DispatchOnDOMContentLoaded(web_contents(), |
@@ -434,8 +458,7 @@ void WebNavigationTabObserver::DidFinishLoad( |
content::RenderViewHost* render_view_host) { |
if (render_view_host != render_view_host_) |
return; |
- FrameNavigationState::FrameID frame_id( |
- frame_num, render_view_host->GetProcess()->GetID()); |
+ FrameNavigationState::FrameID frame_id(frame_num, render_view_host); |
if (!navigation_state_.CanSendEvents(frame_id)) |
return; |
navigation_state_.SetNavigationCompleted(frame_id); |
@@ -456,8 +479,7 @@ void WebNavigationTabObserver::DidFailLoad( |
content::RenderViewHost* render_view_host) { |
if (render_view_host != render_view_host_) |
return; |
- FrameNavigationState::FrameID frame_id( |
- frame_num, render_view_host->GetProcess()->GetID()); |
+ FrameNavigationState::FrameID frame_id(frame_num, render_view_host); |
if (!navigation_state_.CanSendEvents(frame_id)) |
return; |
navigation_state_.SetErrorOccurredInFrame(frame_id); |
@@ -473,8 +495,7 @@ void WebNavigationTabObserver::DidOpenRequestedURL( |
WindowOpenDisposition disposition, |
content::PageTransition transition, |
int64 source_frame_num) { |
- FrameNavigationState::FrameID frame_id( |
- source_frame_num, render_view_host_->GetProcess()->GetID()); |
+ FrameNavigationState::FrameID frame_id(source_frame_num, render_view_host_); |
if (!navigation_state_.CanSendEvents(frame_id)) |
return; |
@@ -499,19 +520,28 @@ void WebNavigationTabObserver::DidOpenRequestedURL( |
void WebNavigationTabObserver::WebContentsDestroyed(content::WebContents* tab) { |
g_tab_observer.Get().erase(tab); |
+ SendErrorEvents(tab, NULL); |
+} |
+ |
+void WebNavigationTabObserver::SendErrorEvents( |
+ content::WebContents* web_contents, |
+ content::RenderViewHost* render_view_host) { |
for (FrameNavigationState::const_iterator frame = navigation_state_.begin(); |
frame != navigation_state_.end(); ++frame) { |
if (!navigation_state_.GetNavigationCompleted(*frame) && |
- navigation_state_.CanSendEvents(*frame)) { |
+ navigation_state_.CanSendEvents(*frame) && |
+ (!render_view_host || frame->render_view_host == render_view_host)) { |
helpers::DispatchOnErrorOccurred( |
- tab, |
- frame->render_process_id, |
+ web_contents, |
+ frame->render_view_host->GetProcess()->GetID(), |
navigation_state_.GetUrl(*frame), |
frame->frame_num, |
navigation_state_.IsMainFrame(*frame), |
net::ERR_ABORTED); |
} |
} |
+ if (render_view_host) |
+ navigation_state_.StopTrackingFramesInRVH(render_view_host); |
} |
// See also NavigationController::IsURLInPageNavigation. |
@@ -559,7 +589,12 @@ bool GetFrameFunction::RunImpl() { |
if (frame_id == 0) |
frame_id = frame_navigation_state.GetMainFrameID().frame_num; |
- FrameNavigationState::FrameID internal_frame_id(frame_id, process_id); |
+ content::RenderViewHost* render_view_host = |
+ observer->render_view_host_in_process(process_id); |
+ if (!render_view_host) |
+ return true; |
+ |
+ FrameNavigationState::FrameID internal_frame_id(frame_id, render_view_host); |
if (!frame_navigation_state.IsValidFrame(internal_frame_id)) |
return true; |
@@ -613,7 +648,7 @@ bool GetAllFramesFunction::RunImpl() { |
frame->url = frame_url.spec(); |
frame->frame_id = helpers::GetFrameId( |
navigation_state.IsMainFrame(frame_id), frame_id.frame_num); |
- frame->process_id = frame_id.render_process_id; |
+ frame->process_id = frame_id.render_view_host->GetProcess()->GetID(); |
frame->error_occurred = navigation_state.GetErrorOccurredInFrame(frame_id); |
result_list.push_back(frame); |
} |