| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/google/google_url_tracker.h" | 5 #include "chrome/browser/google/google_url_tracker.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 content::OpenURLParams params(google_util::AppendGoogleLocaleParam(GURL( | 79 content::OpenURLParams params(google_util::AppendGoogleLocaleParam(GURL( |
| 80 "https://www.google.com/support/chrome/bin/answer.py?answer=1618699")), | 80 "https://www.google.com/support/chrome/bin/answer.py?answer=1618699")), |
| 81 content::Referrer(), | 81 content::Referrer(), |
| 82 (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition, | 82 (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition, |
| 83 content::PAGE_TRANSITION_LINK, false); | 83 content::PAGE_TRANSITION_LINK, false); |
| 84 owner()->web_contents()->OpenURL(params); | 84 owner()->web_contents()->OpenURL(params); |
| 85 return false; | 85 return false; |
| 86 } | 86 } |
| 87 | 87 |
| 88 void GoogleURLTrackerInfoBarDelegate::Show() { | 88 void GoogleURLTrackerInfoBarDelegate::Show() { |
| 89 owner()->AddInfoBar(this); | |
| 90 showing_ = true; | 89 showing_ = true; |
| 90 owner()->AddInfoBar(this); // May delete |this| on failure! |
| 91 } | 91 } |
| 92 | 92 |
| 93 void GoogleURLTrackerInfoBarDelegate::Close(bool redo_search) { | 93 void GoogleURLTrackerInfoBarDelegate::Close(bool redo_search) { |
| 94 if (redo_search) { |
| 95 // Re-do the user's search on the new domain. |
| 96 url_canon::Replacements<char> replacements; |
| 97 const std::string& host(new_google_url_.host()); |
| 98 replacements.SetHost(host.data(), url_parse::Component(0, host.length())); |
| 99 GURL new_search_url(search_url_.ReplaceComponents(replacements)); |
| 100 if (new_search_url.is_valid()) { |
| 101 content::OpenURLParams params(new_search_url, content::Referrer(), |
| 102 CURRENT_TAB, content::PAGE_TRANSITION_GENERATED, false); |
| 103 owner()->web_contents()->OpenURL(params); |
| 104 } |
| 105 } |
| 106 |
| 94 if (!showing_) { | 107 if (!showing_) { |
| 95 // We haven't been added to a tab, so just delete ourselves. | 108 // We haven't been added to a tab, so just delete ourselves. |
| 96 delete this; | 109 delete this; |
| 97 return; | 110 return; |
| 98 } | 111 } |
| 99 | 112 |
| 100 // Synchronously remove ourselves from the URL tracker's list, because the | 113 // Synchronously remove ourselves from the URL tracker's list, because the |
| 101 // RemoveInfoBar() call below may result in either a synchronous or an | 114 // RemoveInfoBar() call below may result in either a synchronous or an |
| 102 // asynchronous call back to InfoBarClosed(), and it's easier to handle when | 115 // asynchronous call back to InfoBarClosed(), and it's easier to handle when |
| 103 // we just guarantee the removal is synchronous. | 116 // we just guarantee the removal is synchronous. |
| 104 google_url_tracker_->InfoBarClosed(map_key_); | 117 google_url_tracker_->InfoBarClosed(map_key_); |
| 105 google_url_tracker_ = NULL; | 118 google_url_tracker_ = NULL; |
| 106 | 119 |
| 107 // If we were showing in a background tab that was then closed, we could have | 120 // If we're already animating closed, we won't have an owner. Do nothing in |
| 108 // been leaked, and subsequently reached here due to | 121 // this case. |
| 109 // GoogleURLTracker::CloseAllInfoBars(). In this case our owner is now NULL | 122 // TODO(pkasting): For now, this can also happen if we were showing in a |
| 110 // so we should just do nothing. | 123 // background tab that was then closed, in which case we'll have leaked and |
| 111 // TODO(pkasting): This can go away once the InfoBar ownership model is fixed | 124 // subsequently reached here due to GoogleURLTracker::CloseAllInfoBars(). |
| 112 // so that infobars in background tabs don't leak on tab closure. | 125 // This case will no longer happen once infobars are refactored to own their |
| 113 if (!owner()) | 126 // delegates. |
| 114 return; | 127 if (owner()) |
| 115 | 128 owner()->RemoveInfoBar(this); |
| 116 if (redo_search) { | |
| 117 // Re-do the user's search on the new domain. | |
| 118 url_canon::Replacements<char> replacements; | |
| 119 const std::string& host(new_google_url_.host()); | |
| 120 replacements.SetHost(host.data(), url_parse::Component(0, host.length())); | |
| 121 GURL new_search_url(search_url_.ReplaceComponents(replacements)); | |
| 122 if (new_search_url.is_valid()) { | |
| 123 content::OpenURLParams params(new_search_url, content::Referrer(), | |
| 124 CURRENT_TAB, content::PAGE_TRANSITION_GENERATED, false); | |
| 125 owner()->web_contents()->OpenURL(params); | |
| 126 } | |
| 127 } | |
| 128 | |
| 129 owner()->RemoveInfoBar(this); | |
| 130 } | 129 } |
| 131 | 130 |
| 132 GoogleURLTrackerInfoBarDelegate::~GoogleURLTrackerInfoBarDelegate() { | 131 GoogleURLTrackerInfoBarDelegate::~GoogleURLTrackerInfoBarDelegate() { |
| 133 if (google_url_tracker_) | 132 if (google_url_tracker_) |
| 134 google_url_tracker_->InfoBarClosed(map_key_); | 133 google_url_tracker_->InfoBarClosed(map_key_); |
| 135 } | 134 } |
| 136 | 135 |
| 137 string16 GoogleURLTrackerInfoBarDelegate::GetMessageText() const { | 136 string16 GoogleURLTrackerInfoBarDelegate::GetMessageText() const { |
| 138 return l10n_util::GetStringFUTF16(IDS_GOOGLE_URL_TRACKER_INFOBAR_MESSAGE, | 137 return l10n_util::GetStringFUTF16(IDS_GOOGLE_URL_TRACKER_INFOBAR_MESSAGE, |
| 139 GetHost(true), GetHost(false)); | 138 GetHost(true), GetHost(false)); |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 | 452 |
| 454 void GoogleURLTracker::CloseAllInfoBars(bool redo_searches) { | 453 void GoogleURLTracker::CloseAllInfoBars(bool redo_searches) { |
| 455 // Close all infobars, whether they've been added to tabs or not. | 454 // Close all infobars, whether they've been added to tabs or not. |
| 456 while (!infobar_map_.empty()) | 455 while (!infobar_map_.empty()) |
| 457 infobar_map_.begin()->second->Close(redo_searches); | 456 infobar_map_.begin()->second->Close(redo_searches); |
| 458 | 457 |
| 459 // Any registered listeners for NAV_ENTRY_COMMITTED and TAB_CLOSED are now | 458 // Any registered listeners for NAV_ENTRY_COMMITTED and TAB_CLOSED are now |
| 460 // irrelevant as the associated infobars are gone. | 459 // irrelevant as the associated infobars are gone. |
| 461 registrar_.RemoveAll(); | 460 registrar_.RemoveAll(); |
| 462 } | 461 } |
| OLD | NEW |