Chromium Code Reviews| 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 d26b7f996de8b022360ace6a88252e59cf8fca0c..c09dc03ba13a6d3279f26eb3aeff6ee7d58bac6c 100644 |
| --- a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc |
| +++ b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc |
| @@ -236,7 +236,9 @@ void WebNavigationEventRouter::TabDestroyed(content::WebContents* tab) { |
| WebNavigationTabObserver::WebNavigationTabObserver( |
| content::WebContents* web_contents) |
| - : WebContentsObserver(web_contents) { |
| + : WebContentsObserver(web_contents), |
| + render_view_host_(NULL), |
| + pending_render_view_host_(NULL) { |
| g_tab_observer.Get().insert(TabObserverMap::value_type(web_contents, this)); |
| registrar_.Add(this, |
| content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, |
| @@ -283,6 +285,21 @@ void WebNavigationTabObserver::DidStartProvisionalLoadForFrame( |
| const GURL& validated_url, |
| bool is_error_page, |
| content::RenderViewHost* render_view_host) { |
| + if (render_view_host == pending_render_view_host_) { |
| + DCHECK(is_main_frame); |
| + // Suppress incorrect duplicate navigation signals triggered by the |
| + // TransfernavigationResourceThrottle. http://crbug.com/137219 |
| + return; |
| + } |
| + |
| + if (render_view_host_ == NULL) { |
|
Charlie Reis
2012/07/18 17:21:18
nit: if (!render_view_host_) {
|
| + render_view_host_ = render_view_host; |
| + } else if (render_view_host != render_view_host_) { |
| + DCHECK(is_main_frame); |
| + DCHECK(!pending_render_view_host_); |
|
Charlie Reis
2012/07/18 17:21:18
Are you sure DidCommit or DidFail is always going
jochen (gone - plz use gerrit)
2012/07/18 18:03:40
No, I'm not sure.
However, wouldn't that mean tha
Charlie Reis
2012/07/18 18:51:34
Yes, I don't see why messages couldn't come in fro
|
| + pending_render_view_host_ = render_view_host; |
| + } |
| + |
| // Ignore navigations of sub frames, if the main frame isn't committed yet. |
| // This might happen if a sub frame triggers a navigation for both the main |
| // frame and itself. Since the sub frame is about to be deleted, and there's |
| @@ -310,6 +327,11 @@ void WebNavigationTabObserver::DidCommitProvisionalLoadForFrame( |
| const GURL& url, |
| content::PageTransition transition_type, |
| content::RenderViewHost* render_view_host) { |
| + DCHECK(render_view_host == render_view_host_ || |
| + (render_view_host == pending_render_view_host_ && is_main_frame)); |
| + render_view_host_ = render_view_host; |
| + pending_render_view_host_ = NULL; |
| + |
| if (!navigation_state_.CanSendEvents(frame_id)) |
| return; |
| @@ -365,6 +387,11 @@ void WebNavigationTabObserver::DidFailProvisionalLoad( |
| int error_code, |
| const string16& error_description, |
| content::RenderViewHost* render_view_host) { |
| + DCHECK(render_view_host == render_view_host_ || |
| + (render_view_host == pending_render_view_host_ && is_main_frame)); |
| + if (render_view_host == pending_render_view_host_) |
| + pending_render_view_host_ = NULL; |
| + |
| if (!navigation_state_.CanSendEvents(frame_id)) |
| return; |
| navigation_state_.SetErrorOccurredInFrame(frame_id); |