Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Side by Side Diff: chrome/browser/alternate_nav_url_fetcher.cc

Issue 2747006: Change notification handling to prevent multiple 'Do you mean...?' infobars f... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/alternate_nav_url_fetcher.h" 5 #include "chrome/browser/alternate_nav_url_fetcher.h"
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "app/resource_bundle.h" 8 #include "app/resource_bundle.h"
9 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "chrome/browser/intranet_redirect_detector.h" 10 #include "chrome/browser/intranet_redirect_detector.h"
(...skipping 17 matching lines...) Expand all
28 infobar_contents_(NULL) { 28 infobar_contents_(NULL) {
29 registrar_.Add(this, NotificationType::NAV_ENTRY_PENDING, 29 registrar_.Add(this, NotificationType::NAV_ENTRY_PENDING,
30 NotificationService::AllSources()); 30 NotificationService::AllSources());
31 } 31 }
32 32
33 void AlternateNavURLFetcher::Observe(NotificationType type, 33 void AlternateNavURLFetcher::Observe(NotificationType type,
34 const NotificationSource& source, 34 const NotificationSource& source,
35 const NotificationDetails& details) { 35 const NotificationDetails& details) {
36 switch (type.value) { 36 switch (type.value) {
37 case NotificationType::NAV_ENTRY_PENDING: 37 case NotificationType::NAV_ENTRY_PENDING:
38 controller_ = Source<NavigationController>(source).ptr(); 38 // If we've already received a notification for the same controller, we
39 DCHECK(controller_->pending_entry()); 39 // should delete ourselves as that indicates that the page is being
40 // re-loaded so this instance is now stale.
41 // http://crbug.com/43378
42 if (!infobar_contents_ &&
43 controller_ == Source<NavigationController>(source).ptr()) {
44 delete this;
45 } else if (!controller_) {
Evan Stade 2010/06/09 19:46:11 can the hypothetical else be reached (where contro
csilv 2010/06/09 20:09:22 Yes, that can happen if some other tab sends a NAV
46 controller_ = Source<NavigationController>(source).ptr();
47 DCHECK(controller_->pending_entry());
40 48
41 // Unregister for this notification now that we're pending, and start 49 // Start listening for the commit notification. We also need to listen
42 // listening for the corresponding commit. We also need to listen for the 50 // for the tab close command since that means the load will never
43 // tab close command since that means the load will never commit! 51 // commit!
44 registrar_.Remove(this, NotificationType::NAV_ENTRY_PENDING, 52 registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED,
45 NotificationService::AllSources()); 53 Source<NavigationController>(controller_));
46 registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED, 54 registrar_.Add(this, NotificationType::TAB_CLOSED,
47 Source<NavigationController>(controller_)); 55 Source<NavigationController>(controller_));
48 registrar_.Add(this, NotificationType::TAB_CLOSED,
49 Source<NavigationController>(controller_));
50 56
51 DCHECK_EQ(NOT_STARTED, state_); 57 DCHECK_EQ(NOT_STARTED, state_);
52 state_ = IN_PROGRESS; 58 state_ = IN_PROGRESS;
53 fetcher_.reset(new URLFetcher(GURL(alternate_nav_url_), URLFetcher::HEAD, 59 fetcher_.reset(new URLFetcher(GURL(alternate_nav_url_),
54 this)); 60 URLFetcher::HEAD, this));
55 fetcher_->set_request_context( 61 fetcher_->set_request_context(
56 controller_->profile()->GetRequestContext()); 62 controller_->profile()->GetRequestContext());
57 fetcher_->Start(); 63 fetcher_->Start();
64 }
58 break; 65 break;
59 66
60 case NotificationType::NAV_ENTRY_COMMITTED: 67 case NotificationType::NAV_ENTRY_COMMITTED:
61 // The page was navigated, we can show the infobar now if necessary. 68 // The page was navigated, we can show the infobar now if necessary.
62 registrar_.Remove(this, NotificationType::NAV_ENTRY_COMMITTED, 69 registrar_.Remove(this, NotificationType::NAV_ENTRY_COMMITTED,
63 Source<NavigationController>(controller_)); 70 Source<NavigationController>(controller_));
64 navigated_to_entry_ = true; 71 navigated_to_entry_ = true;
65 ShowInfobarIfPossible(); 72 ShowInfobarIfPossible();
66 break; 73 break;
67 74
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 if (state_ == FAILED) 175 if (state_ == FAILED)
169 delete this; 176 delete this;
170 return; 177 return;
171 } 178 }
172 179
173 infobar_contents_ = controller_->tab_contents(); 180 infobar_contents_ = controller_->tab_contents();
174 StoreActiveEntryUniqueID(infobar_contents_); 181 StoreActiveEntryUniqueID(infobar_contents_);
175 // We will be deleted when the InfoBar is destroyed. (See InfoBarClosed). 182 // We will be deleted when the InfoBar is destroyed. (See InfoBarClosed).
176 infobar_contents_->AddInfoBar(this); 183 infobar_contents_->AddInfoBar(this);
177 } 184 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698