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_infobar_delegate.h" | 5 #include "chrome/browser/google/google_url_tracker_infobar_delegate.h" |
6 | 6 |
7 #include "chrome/browser/google/google_url_tracker.h" | 7 #include "chrome/browser/google/google_url_tracker.h" |
8 #include "chrome/browser/google/google_util.h" | 8 #include "chrome/browser/google/google_util.h" |
9 #include "chrome/browser/infobars/infobar_tab_helper.h" | 9 #include "chrome/browser/infobars/infobar_tab_helper.h" |
10 #include "content/public/browser/navigation_details.h" | 10 #include "content/public/browser/navigation_details.h" |
11 #include "content/public/browser/navigation_entry.h" | 11 #include "content/public/browser/navigation_entry.h" |
12 #include "content/public/browser/page_navigator.h" | 12 #include "content/public/browser/page_navigator.h" |
13 #include "content/public/browser/web_contents.h" | 13 #include "content/public/browser/web_contents.h" |
14 #include "grit/generated_resources.h" | 14 #include "grit/generated_resources.h" |
15 #include "net/base/net_util.h" | 15 #include "net/base/net_util.h" |
16 #include "ui/base/l10n/l10n_util.h" | 16 #include "ui/base/l10n/l10n_util.h" |
17 | 17 |
18 | 18 |
19 GoogleURLTrackerInfoBarDelegate::GoogleURLTrackerInfoBarDelegate( | 19 GoogleURLTrackerInfoBarDelegate::GoogleURLTrackerInfoBarDelegate( |
20 InfoBarTabHelper* infobar_helper, | 20 InfoBarTabHelper* infobar_helper, |
21 GoogleURLTracker* google_url_tracker, | 21 GoogleURLTracker* google_url_tracker, |
22 const GURL& new_google_url) | 22 const GURL& search_url) |
23 : ConfirmInfoBarDelegate(infobar_helper), | 23 : ConfirmInfoBarDelegate(infobar_helper), |
24 map_key_(infobar_helper), | |
25 google_url_tracker_(google_url_tracker), | 24 google_url_tracker_(google_url_tracker), |
26 new_google_url_(new_google_url), | 25 search_url_(search_url), |
27 showing_(false), | |
28 pending_id_(0) { | 26 pending_id_(0) { |
29 } | 27 } |
30 | 28 |
31 bool GoogleURLTrackerInfoBarDelegate::Accept() { | 29 bool GoogleURLTrackerInfoBarDelegate::Accept() { |
32 google_url_tracker_->AcceptGoogleURL(new_google_url_, true); | 30 google_url_tracker_->AcceptGoogleURL(true); |
33 return false; | 31 return false; |
34 } | 32 } |
35 | 33 |
36 bool GoogleURLTrackerInfoBarDelegate::Cancel() { | 34 bool GoogleURLTrackerInfoBarDelegate::Cancel() { |
37 google_url_tracker_->CancelGoogleURL(new_google_url_); | 35 google_url_tracker_->CancelGoogleURL(); |
38 return false; | 36 return false; |
39 } | 37 } |
40 | 38 |
41 string16 GoogleURLTrackerInfoBarDelegate::GetLinkText() const { | 39 string16 GoogleURLTrackerInfoBarDelegate::GetLinkText() const { |
42 return l10n_util::GetStringUTF16(IDS_LEARN_MORE); | 40 return l10n_util::GetStringUTF16(IDS_LEARN_MORE); |
43 } | 41 } |
44 | 42 |
45 bool GoogleURLTrackerInfoBarDelegate::LinkClicked( | 43 bool GoogleURLTrackerInfoBarDelegate::LinkClicked( |
46 WindowOpenDisposition disposition) { | 44 WindowOpenDisposition disposition) { |
47 content::OpenURLParams params(google_util::AppendGoogleLocaleParam(GURL( | 45 content::OpenURLParams params(google_util::AppendGoogleLocaleParam(GURL( |
48 "https://www.google.com/support/chrome/bin/answer.py?answer=1618699")), | 46 "https://www.google.com/support/chrome/bin/answer.py?answer=1618699")), |
49 content::Referrer(), | 47 content::Referrer(), |
50 (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition, | 48 (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition, |
51 content::PAGE_TRANSITION_LINK, false); | 49 content::PAGE_TRANSITION_LINK, false); |
52 owner()->GetWebContents()->OpenURL(params); | 50 owner()->GetWebContents()->OpenURL(params); |
53 return false; | 51 return false; |
54 } | 52 } |
55 | 53 |
56 bool GoogleURLTrackerInfoBarDelegate::ShouldExpireInternal( | 54 bool GoogleURLTrackerInfoBarDelegate::ShouldExpireInternal( |
57 const content::LoadCommittedDetails& details) const { | 55 const content::LoadCommittedDetails& details) const { |
58 int unique_id = details.entry->GetUniqueID(); | 56 int unique_id = details.entry->GetUniqueID(); |
59 return (unique_id != contents_unique_id()) && (unique_id != pending_id_); | 57 return (unique_id != contents_unique_id()) && (unique_id != pending_id_); |
60 } | 58 } |
61 | 59 |
62 void GoogleURLTrackerInfoBarDelegate::SetGoogleURL(const GURL& new_google_url) { | 60 void GoogleURLTrackerInfoBarDelegate::Update(const GURL& search_url) { |
63 DCHECK_EQ(net::StripWWWFromHost(new_google_url_), | |
64 net::StripWWWFromHost(new_google_url)); | |
65 new_google_url_ = new_google_url; | |
66 } | |
67 | |
68 void GoogleURLTrackerInfoBarDelegate::Show(const GURL& search_url) { | |
69 if (!owner()) | |
70 return; | |
71 StoreActiveEntryUniqueID(owner()); | 61 StoreActiveEntryUniqueID(owner()); |
72 search_url_ = search_url; | 62 search_url_ = search_url; |
73 pending_id_ = 0; | 63 pending_id_ = 0; |
74 if (!showing_) { | |
75 showing_ = true; | |
76 owner()->AddInfoBar(this); // May delete |this| on failure! | |
77 } | |
78 } | 64 } |
79 | 65 |
80 void GoogleURLTrackerInfoBarDelegate::Close(bool redo_search) { | 66 void GoogleURLTrackerInfoBarDelegate::Close(bool redo_search) { |
81 if (!showing_) { | |
82 // We haven't been added to a tab, so just delete ourselves. | |
83 delete this; | |
84 return; | |
85 } | |
86 | |
87 // Synchronously remove ourselves from the URL tracker's list, because the | |
88 // RemoveInfoBar() call below may result in either a synchronous or an | |
89 // asynchronous call back to InfoBarClosed(), and it's easier to handle when | |
90 // we just guarantee the removal is synchronous. | |
91 google_url_tracker_->InfoBarClosed(map_key_); | |
92 google_url_tracker_ = NULL; | |
93 | |
94 // If we're already animating closed, we won't have an owner. Do nothing in | |
95 // this case. | |
96 // TODO(pkasting): For now, this can also happen if we were showing in a | |
97 // background tab that was then closed, in which case we'll have leaked and | |
98 // subsequently reached here due to GoogleURLTracker::CloseAllInfoBars(). | |
99 // This case will no longer happen once infobars are refactored to own their | |
100 // delegates. | |
101 if (!owner()) | |
102 return; | |
103 | |
104 if (redo_search) { | 67 if (redo_search) { |
105 // Re-do the user's search on the new domain. | 68 // Re-do the user's search on the new domain. |
106 DCHECK(search_url_.is_valid()); | 69 DCHECK(search_url_.is_valid()); |
107 url_canon::Replacements<char> replacements; | 70 url_canon::Replacements<char> replacements; |
108 const std::string& host(new_google_url_.host()); | 71 const std::string& host(google_url_tracker_->fetched_google_url().host()); |
109 replacements.SetHost(host.data(), url_parse::Component(0, host.length())); | 72 replacements.SetHost(host.data(), url_parse::Component(0, host.length())); |
110 GURL new_search_url(search_url_.ReplaceComponents(replacements)); | 73 GURL new_search_url(search_url_.ReplaceComponents(replacements)); |
111 if (new_search_url.is_valid()) { | 74 if (new_search_url.is_valid()) { |
112 content::OpenURLParams params(new_search_url, content::Referrer(), | 75 owner()->GetWebContents()->OpenURL(content::OpenURLParams( |
113 CURRENT_TAB, content::PAGE_TRANSITION_GENERATED, false); | 76 new_search_url, content::Referrer(), CURRENT_TAB, |
114 owner()->GetWebContents()->OpenURL(params); | 77 content::PAGE_TRANSITION_GENERATED, false)); |
115 } | 78 } |
116 } | 79 } |
117 | 80 |
118 owner()->RemoveInfoBar(this); | 81 owner()->RemoveInfoBar(this); |
119 } | 82 } |
120 | 83 |
121 GoogleURLTrackerInfoBarDelegate::~GoogleURLTrackerInfoBarDelegate() { | 84 GoogleURLTrackerInfoBarDelegate::~GoogleURLTrackerInfoBarDelegate() { |
122 if (google_url_tracker_) | |
123 google_url_tracker_->InfoBarClosed(map_key_); | |
124 } | 85 } |
125 | 86 |
126 string16 GoogleURLTrackerInfoBarDelegate::GetMessageText() const { | 87 string16 GoogleURLTrackerInfoBarDelegate::GetMessageText() const { |
127 return l10n_util::GetStringFUTF16( | 88 return l10n_util::GetStringFUTF16( |
128 IDS_GOOGLE_URL_TRACKER_INFOBAR_MESSAGE, | 89 IDS_GOOGLE_URL_TRACKER_INFOBAR_MESSAGE, |
129 net::StripWWWFromHost(new_google_url_), | 90 net::StripWWWFromHost(google_url_tracker_->fetched_google_url()), |
130 net::StripWWWFromHost(google_url_tracker_->google_url_)); | 91 net::StripWWWFromHost(google_url_tracker_->google_url())); |
131 } | 92 } |
132 | 93 |
133 string16 GoogleURLTrackerInfoBarDelegate::GetButtonLabel( | 94 string16 GoogleURLTrackerInfoBarDelegate::GetButtonLabel( |
134 InfoBarButton button) const { | 95 InfoBarButton button) const { |
135 bool new_host = (button == BUTTON_OK); | 96 if (button == BUTTON_OK) { |
| 97 return l10n_util::GetStringFUTF16( |
| 98 IDS_GOOGLE_URL_TRACKER_INFOBAR_SWITCH, |
| 99 net::StripWWWFromHost(google_url_tracker_->fetched_google_url())); |
| 100 } |
136 return l10n_util::GetStringFUTF16( | 101 return l10n_util::GetStringFUTF16( |
137 new_host ? | 102 IDS_GOOGLE_URL_TRACKER_INFOBAR_DONT_SWITCH, |
138 IDS_GOOGLE_URL_TRACKER_INFOBAR_SWITCH : | 103 net::StripWWWFromHost(google_url_tracker_->google_url())); |
139 IDS_GOOGLE_URL_TRACKER_INFOBAR_DONT_SWITCH, | |
140 net::StripWWWFromHost(new_host ? | |
141 new_google_url_ : google_url_tracker_->google_url_)); | |
142 } | 104 } |
OLD | NEW |