Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "build/build_config.h" | 5 #include "build/build_config.h" |
| 6 | 6 |
| 7 #include "chrome/browser/ui/toolbar/back_forward_menu_model.h" | 7 #include "chrome/browser/ui/toolbar/back_forward_menu_model.h" |
| 8 | 8 |
| 9 #include "base/string_number_conversions.h" | 9 #include "base/string_number_conversions.h" |
| 10 #include "chrome/browser/metrics/user_metrics.h" | 10 #include "chrome/browser/metrics/user_metrics.h" |
| 11 #include "chrome/browser/tab_contents/navigation_controller.h" | 11 #include "chrome/browser/tab_contents/navigation_controller.h" |
| 12 #include "chrome/browser/tab_contents/navigation_entry.h" | 12 #include "chrome/browser/tab_contents/navigation_entry.h" |
| 13 #include "chrome/browser/tab_contents/tab_contents.h" | 13 #include "chrome/browser/tab_contents/tab_contents.h" |
| 14 #include "chrome/browser/prefs/pref_service.h" | 14 #include "chrome/browser/prefs/pref_service.h" |
| 15 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
| 16 #include "chrome/browser/ui/browser.h" | 16 #include "chrome/browser/ui/browser.h" |
| 17 #include "chrome/common/pref_names.h" | 17 #include "chrome/common/pref_names.h" |
| 18 #include "chrome/common/url_constants.h" | 18 #include "chrome/common/url_constants.h" |
| 19 #include "grit/generated_resources.h" | 19 #include "grit/generated_resources.h" |
| 20 #include "grit/theme_resources.h" | 20 #include "grit/theme_resources.h" |
| 21 #include "net/base/registry_controlled_domain.h" | 21 #include "net/base/registry_controlled_domain.h" |
| 22 #include "ui/base/l10n/l10n_util.h" | 22 #include "ui/base/l10n/l10n_util.h" |
| 23 #include "ui/base/resource/resource_bundle.h" | 23 #include "ui/base/resource/resource_bundle.h" |
| 24 #include "ui/base/text/text_elider.h" | 24 #include "ui/base/text/text_elider.h" |
| 25 #include "ui/gfx/codec/png_codec.h" | |
| 25 | 26 |
| 26 const int BackForwardMenuModel::kMaxHistoryItems = 12; | 27 const int BackForwardMenuModel::kMaxHistoryItems = 12; |
| 27 const int BackForwardMenuModel::kMaxChapterStops = 5; | 28 const int BackForwardMenuModel::kMaxChapterStops = 5; |
| 28 static const int kMaxWidth = 700; | 29 static const int kMaxWidth = 700; |
| 29 | 30 |
| 30 BackForwardMenuModel::BackForwardMenuModel(Browser* browser, | 31 BackForwardMenuModel::BackForwardMenuModel(Browser* browser, |
| 31 ModelType model_type) | 32 ModelType model_type) |
| 32 : browser_(browser), | 33 : browser_(browser), |
| 33 test_tab_contents_(NULL), | 34 test_tab_contents_(NULL), |
| 34 model_type_(model_type) { | 35 model_type_(model_type), |
| 36 delegate_(NULL) { | |
| 35 } | 37 } |
| 36 | 38 |
| 37 bool BackForwardMenuModel::HasIcons() const { | 39 bool BackForwardMenuModel::HasIcons() const { |
| 38 return true; | 40 return true; |
| 39 } | 41 } |
| 40 | 42 |
| 41 int BackForwardMenuModel::GetItemCount() const { | 43 int BackForwardMenuModel::GetItemCount() const { |
| 42 int items = GetHistoryItemCount(); | 44 int items = GetHistoryItemCount(); |
| 43 | 45 |
| 44 if (items > 0) { | 46 if (items > 0) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 103 } | 105 } |
| 104 | 106 |
| 105 bool BackForwardMenuModel::IsItemCheckedAt(int index) const { | 107 bool BackForwardMenuModel::IsItemCheckedAt(int index) const { |
| 106 return false; | 108 return false; |
| 107 } | 109 } |
| 108 | 110 |
| 109 int BackForwardMenuModel::GetGroupIdAt(int index) const { | 111 int BackForwardMenuModel::GetGroupIdAt(int index) const { |
| 110 return false; | 112 return false; |
| 111 } | 113 } |
| 112 | 114 |
| 113 bool BackForwardMenuModel::GetIconAt(int index, SkBitmap* icon) const { | 115 bool BackForwardMenuModel::GetIconAt(int index, SkBitmap* icon) { |
| 114 if (!ItemHasIcon(index)) | 116 if (!ItemHasIcon(index)) |
| 115 return false; | 117 return false; |
| 116 | 118 |
| 117 if (index == GetItemCount() - 1) { | 119 if (index == GetItemCount() - 1) { |
| 118 *icon = *ResourceBundle::GetSharedInstance().GetBitmapNamed( | 120 *icon = *ResourceBundle::GetSharedInstance().GetBitmapNamed( |
| 119 IDR_HISTORY_FAVICON); | 121 IDR_HISTORY_FAVICON); |
| 120 } else { | 122 } else { |
| 121 NavigationEntry* entry = GetNavigationEntry(index); | 123 NavigationEntry* entry = GetNavigationEntry(index); |
| 122 *icon = entry->favicon().bitmap(); | 124 *icon = entry->favicon().bitmap(); |
| 125 if (!entry->favicon().is_valid()) { | |
| 126 FetchFavicon(entry, index); | |
| 127 } | |
| 123 } | 128 } |
| 124 | 129 |
| 125 return true; | 130 return true; |
| 126 } | 131 } |
| 127 | 132 |
| 128 ui::ButtonMenuItemModel* BackForwardMenuModel::GetButtonMenuItemAt( | 133 ui::ButtonMenuItemModel* BackForwardMenuModel::GetButtonMenuItemAt( |
| 129 int index) const { | 134 int index) const { |
| 130 return NULL; | 135 return NULL; |
| 131 } | 136 } |
| 132 | 137 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 172 int controller_index = MenuIndexToNavEntryIndex(index); | 177 int controller_index = MenuIndexToNavEntryIndex(index); |
| 173 if (!browser_->NavigateToIndexWithDisposition( | 178 if (!browser_->NavigateToIndexWithDisposition( |
| 174 controller_index, static_cast<WindowOpenDisposition>(disposition))) { | 179 controller_index, static_cast<WindowOpenDisposition>(disposition))) { |
| 175 NOTREACHED(); | 180 NOTREACHED(); |
| 176 } | 181 } |
| 177 } | 182 } |
| 178 | 183 |
| 179 void BackForwardMenuModel::MenuWillShow() { | 184 void BackForwardMenuModel::MenuWillShow() { |
| 180 UserMetrics::RecordComputedAction(BuildActionName("Popup", -1), | 185 UserMetrics::RecordComputedAction(BuildActionName("Popup", -1), |
| 181 browser_->profile()); | 186 browser_->profile()); |
| 187 requested_favicons_.clear(); | |
| 188 load_consumer_.CancelAllRequests(); | |
| 182 } | 189 } |
| 183 | 190 |
| 184 bool BackForwardMenuModel::IsSeparator(int index) const { | 191 bool BackForwardMenuModel::IsSeparator(int index) const { |
| 185 int history_items = GetHistoryItemCount(); | 192 int history_items = GetHistoryItemCount(); |
| 186 // If the index is past the number of history items + separator, | 193 // If the index is past the number of history items + separator, |
| 187 // we then consider if it is a chapter-stop entry. | 194 // we then consider if it is a chapter-stop entry. |
| 188 if (index > history_items) { | 195 if (index > history_items) { |
| 189 // We either are in ChapterStop area, or at the end of the list (the "Show | 196 // We either are in ChapterStop area, or at the end of the list (the "Show |
| 190 // Full History" link). | 197 // Full History" link). |
| 191 int chapter_stops = GetChapterStopCount(history_items); | 198 int chapter_stops = GetChapterStopCount(history_items); |
| 192 if (chapter_stops == 0) | 199 if (chapter_stops == 0) |
| 193 return false; // We must have reached the "Show Full History" link. | 200 return false; // We must have reached the "Show Full History" link. |
| 194 // Otherwise, look to see if we have reached the separator for the | 201 // Otherwise, look to see if we have reached the separator for the |
| 195 // chapter-stops. If not, this is a chapter stop. | 202 // chapter-stops. If not, this is a chapter stop. |
| 196 return (index == history_items + 1 + chapter_stops); | 203 return (index == history_items + 1 + chapter_stops); |
| 197 } | 204 } |
| 198 | 205 |
| 199 // Look to see if we have reached the separator for the history items. | 206 // Look to see if we have reached the separator for the history items. |
| 200 return index == history_items; | 207 return index == history_items; |
| 201 } | 208 } |
| 202 | 209 |
| 210 void BackForwardMenuModel::SetDelegate(Delegate* delegate) { | |
| 211 delegate_ = delegate; | |
| 212 } | |
| 213 | |
| 214 void BackForwardMenuModel::FetchFavicon(NavigationEntry* entry, int index) { | |
|
sky
2011/02/22 18:28:28
It doesn't look like you use index here, can it be
dill
2011/02/24 15:00:28
Yes, that was a leftover from when unique_id wasn'
| |
| 215 // If the favicon has already been requested for this menu, don't do | |
| 216 // anything. | |
| 217 if (requested_favicons_.find(entry->unique_id()) != | |
| 218 requested_favicons_.end()) { | |
| 219 return; | |
| 220 } | |
| 221 requested_favicons_.insert(entry->unique_id()); | |
| 222 FaviconService* favicon_service = | |
| 223 browser_->profile()->GetFaviconService(Profile::EXPLICIT_ACCESS); | |
| 224 if (!favicon_service) | |
| 225 return; | |
| 226 FaviconService::Handle handle = favicon_service->GetFaviconForURL( | |
| 227 entry->url(), &load_consumer_, | |
| 228 NewCallback(this, &BackForwardMenuModel::OnFavIconDataAvailable)); | |
| 229 load_consumer_.SetClientData(favicon_service, handle, entry->unique_id()); | |
| 230 } | |
| 231 | |
| 232 void BackForwardMenuModel::OnFavIconDataAvailable( | |
| 233 FaviconService::Handle handle, | |
| 234 bool know_favicon, | |
| 235 scoped_refptr<RefCountedMemory> data, | |
| 236 bool expired, | |
| 237 GURL icon_url) { | |
| 238 if (know_favicon && data.get() && data->size() && data->size() > 0) { | |
|
sky
2011/02/22 18:28:28
How come there is data->size() && data->size() > 0
dill
2011/02/24 15:00:28
data->size() > 0 was from an earlier code review,
| |
| 239 int unique_id = load_consumer_.GetClientDataForCurrentRequest(); | |
| 240 // We need both the NavigationEntry and the model_index so we search for | |
|
sky
2011/02/22 18:28:28
This comment isn't too helpful. The useful comment
dill
2011/02/24 15:00:28
How about here I say "Find the current model_index
sky
2011/02/24 15:12:50
Sounds good.
| |
| 241 // the unique_index by model_index. | |
| 242 NavigationEntry* entry = NULL; | |
| 243 int model_index = -1; | |
| 244 for (int i = 0; i < GetItemCount() - 1; i++) { | |
| 245 if (IsSeparator(i)) | |
| 246 continue; | |
| 247 if (GetNavigationEntry(i)->unique_id() == unique_id) { | |
| 248 model_index = i; | |
| 249 entry = GetNavigationEntry(i); | |
| 250 break; | |
| 251 } | |
| 252 } | |
| 253 if (!entry) | |
| 254 return; | |
| 255 // Now that we have a valid NavigationEntry, decode the favicon and assign | |
| 256 // it to the NavigationEntry. | |
| 257 SkBitmap fav_icon; | |
| 258 if (gfx::PNGCodec::Decode(data->front(), data->size(), &fav_icon)) { | |
| 259 entry->favicon().set_is_valid(true); | |
| 260 entry->favicon().set_url(icon_url); | |
| 261 if (fav_icon.empty()) | |
| 262 return; | |
| 263 entry->favicon().set_bitmap(fav_icon); | |
| 264 if (delegate_) { | |
| 265 delegate_->OnIconChanged(model_index); | |
| 266 } | |
| 267 } | |
| 268 } | |
| 269 } | |
| 270 | |
| 203 int BackForwardMenuModel::GetHistoryItemCount() const { | 271 int BackForwardMenuModel::GetHistoryItemCount() const { |
| 204 TabContents* contents = GetTabContents(); | 272 TabContents* contents = GetTabContents(); |
| 205 int items = 0; | 273 int items = 0; |
| 206 | 274 |
| 207 if (model_type_ == FORWARD_MENU) { | 275 if (model_type_ == FORWARD_MENU) { |
| 208 // Only count items from n+1 to end (if n is current entry) | 276 // Only count items from n+1 to end (if n is current entry) |
| 209 items = contents->controller().entry_count() - | 277 items = contents->controller().entry_count() - |
| 210 contents->controller().GetCurrentEntryIndex() - 1; | 278 contents->controller().GetCurrentEntryIndex() - 1; |
| 211 } else { | 279 } else { |
| 212 items = contents->controller().GetCurrentEntryIndex(); | 280 items = contents->controller().GetCurrentEntryIndex(); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 374 metric_string += "ForwardMenu_"; | 442 metric_string += "ForwardMenu_"; |
| 375 else | 443 else |
| 376 metric_string += "BackMenu_"; | 444 metric_string += "BackMenu_"; |
| 377 metric_string += action; | 445 metric_string += action; |
| 378 if (index != -1) { | 446 if (index != -1) { |
| 379 // +1 is for historical reasons (indices used to start at 1). | 447 // +1 is for historical reasons (indices used to start at 1). |
| 380 metric_string += base::IntToString(index + 1); | 448 metric_string += base::IntToString(index + 1); |
| 381 } | 449 } |
| 382 return metric_string; | 450 return metric_string; |
| 383 } | 451 } |
| OLD | NEW |