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

Side by Side Diff: chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc

Issue 11410067: alternate ntp: favicons and menu width enhancements for "Recent tabs" menu (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed typo Created 8 years, 1 month 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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/ui/toolbar/recent_tabs_sub_menu_model.h" 5 #include "chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/string_number_conversions.h" 8 #include "base/string_number_conversions.h"
9 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "chrome/app/chrome_command_ids.h" 10 #include "chrome/app/chrome_command_ids.h"
11 #include "chrome/browser/favicon/favicon_service_factory.h" 11 #include "chrome/browser/favicon/favicon_service_factory.h"
12 #include "chrome/browser/prefs/scoped_user_pref_update.h" 12 #include "chrome/browser/prefs/scoped_user_pref_update.h"
13 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/sessions/session_restore.h" 14 #include "chrome/browser/sessions/session_restore.h"
15 #include "chrome/browser/sessions/tab_restore_service_delegate.h" 15 #include "chrome/browser/sessions/tab_restore_service_delegate.h"
16 #include "chrome/browser/sessions/tab_restore_service_factory.h" 16 #include "chrome/browser/sessions/tab_restore_service_factory.h"
17 #include "chrome/browser/sync/glue/session_model_associator.h" 17 #include "chrome/browser/sync/glue/session_model_associator.h"
18 #include "chrome/browser/sync/glue/synced_session.h" 18 #include "chrome/browser/sync/glue/synced_session.h"
19 #include "chrome/browser/sync/profile_sync_service.h" 19 #include "chrome/browser/sync/profile_sync_service.h"
20 #include "chrome/browser/sync/profile_sync_service_factory.h" 20 #include "chrome/browser/sync/profile_sync_service_factory.h"
21 #include "chrome/browser/ui/browser.h" 21 #include "chrome/browser/ui/browser.h"
22 #include "chrome/browser/ui/browser_commands.h" 22 #include "chrome/browser/ui/browser_commands.h"
23 #include "chrome/browser/ui/browser_tabstrip.h" 23 #include "chrome/browser/ui/browser_tabstrip.h"
24 #include "chrome/browser/ui/tabs/tab_strip_model.h" 24 #include "chrome/browser/ui/tabs/tab_strip_model.h"
25 #include "chrome/common/pref_names.h" 25 #include "chrome/common/pref_names.h"
26 #include "chrome/common/time_format.h" 26 #include "chrome/common/time_format.h"
27 #include "chrome/common/url_constants.h" 27 #include "chrome/common/url_constants.h"
28 #include "grit/generated_resources.h" 28 #include "grit/generated_resources.h"
29 #include "grit/theme_resources.h"
29 #include "grit/ui_resources.h" 30 #include "grit/ui_resources.h"
30 #include "ui/base/accelerators/accelerator.h" 31 #include "ui/base/accelerators/accelerator.h"
31 #include "ui/base/l10n/l10n_util.h" 32 #include "ui/base/l10n/l10n_util.h"
32 #include "ui/base/resource/resource_bundle.h" 33 #include "ui/base/resource/resource_bundle.h"
33 #include "ui/base/text/text_elider.h"
34 #include "ui/gfx/favicon_size.h" 34 #include "ui/gfx/favicon_size.h"
35 35
36 #if defined(USE_ASH) 36 #if defined(USE_ASH)
37 #include "ash/accelerators/accelerator_table.h" 37 #include "ash/accelerators/accelerator_table.h"
38 #endif // defined(USE_ASH) 38 #endif // defined(USE_ASH)
39 39
40 namespace { 40 namespace {
41 41
42 // First comamnd id for navigatable (and hence executable) tab menu item. 42 // First comamnd id for navigatable (and hence executable) tab menu item.
43 // The model and menu are not 1-1: 43 // The model and menu are not 1-1:
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 std::sort(tabs_in_session.begin(), tabs_in_session.end(), 302 std::sort(tabs_in_session.begin(), tabs_in_session.end(),
303 SortTabsByRecency); 303 SortTabsByRecency);
304 304
305 // Build tab menu items from sorted session tabs. 305 // Build tab menu items from sorted session tabs.
306 const size_t kMaxTabsPerSessionToShow = 4; 306 const size_t kMaxTabsPerSessionToShow = 4;
307 for (size_t k = 0; 307 for (size_t k = 0;
308 k < std::min(tabs_in_session.size(), kMaxTabsPerSessionToShow); 308 k < std::min(tabs_in_session.size(), kMaxTabsPerSessionToShow);
309 ++k) { 309 ++k) {
310 BuildForeignTabItem(session_tag, *tabs_in_session[k], 310 BuildForeignTabItem(session_tag, *tabs_in_session[k],
311 // Only need |session_name| for the first tab of the session. 311 // Only need |session_name| for the first tab of the session.
312 !k ? session->session_name : std::string(), need_separator); 312 !k ? session->session_name : std::string(), session->device_type,
313 need_separator);
313 need_separator = false; 314 need_separator = false;
314 } // for all tabs in one session 315 } // for all tabs in one session
315 316
316 ++num_sessions_added; 317 ++num_sessions_added;
317 need_separator = true; 318 need_separator = true;
318 } // for all sessions 319 } // for all sessions
319 } 320 }
320 321
321 void RecentTabsSubMenuModel::BuildForeignTabItem( 322 void RecentTabsSubMenuModel::BuildForeignTabItem(
322 const std::string& session_tag, 323 const std::string& session_tag,
323 const SessionTab& tab, 324 const SessionTab& tab,
324 const std::string& session_name, 325 const std::string& session_name,
326 browser_sync::SyncedSession::DeviceType device_type,
325 bool need_separator) { 327 bool need_separator) {
326 if (need_separator) 328 if (need_separator)
327 AddSeparator(ui::NORMAL_SEPARATOR); 329 AddSeparator(ui::NORMAL_SEPARATOR);
328 330
329 if (!session_name.empty()) 331 if (!session_name.empty()) {
330 AddItem(kDisabledCommandId, UTF8ToUTF16(session_name)); 332 AddItem(kDisabledCommandId, UTF8ToUTF16(session_name));
333 AddDeviceFavicon(GetItemCount() - 1, device_type);
334 }
331 335
332 const TabNavigation& current_navigation = 336 const TabNavigation& current_navigation =
333 tab.navigations.at(tab.normalized_navigation_index()); 337 tab.navigations.at(tab.normalized_navigation_index());
334 NavigationItem item(session_tag, tab.tab_id.id(), 338 NavigationItem item(session_tag, tab.tab_id.id(),
335 current_navigation.virtual_url()); 339 current_navigation.virtual_url());
336 int command_id = ModelIndexToCommandId(model_.size()); 340 int command_id = ModelIndexToCommandId(model_.size());
337 AddItem(command_id, current_navigation.title()); 341 AddItem(command_id, current_navigation.title());
338 AddFavicon(model_.size(), command_id, item.url); 342 AddTabFavicon(model_.size(), command_id, item.url);
339 model_.push_back(item); 343 model_.push_back(item);
340 } 344 }
341 345
342 void RecentTabsSubMenuModel::AddFavicon(int model_index, int command_id, 346 void RecentTabsSubMenuModel::AddDeviceFavicon(
343 const GURL& url) { 347 int index_in_menu,
348 browser_sync::SyncedSession::DeviceType device_type) {
349 int favicon_id = -1;
350 switch (device_type) {
351 case browser_sync::SyncedSession::TYPE_PHONE:
352 favicon_id = IDR_PHONE_FAVICON;
353 break;
354
355 case browser_sync::SyncedSession::TYPE_TABLET:
356 favicon_id = IDR_TABLET_FAVICON;
357 break;
358
359 case browser_sync::SyncedSession::TYPE_CHROMEOS:
360 case browser_sync::SyncedSession::TYPE_WIN:
361 case browser_sync::SyncedSession::TYPE_MACOSX:
362 case browser_sync::SyncedSession::TYPE_LINUX:
363 case browser_sync::SyncedSession::TYPE_OTHER:
364 case browser_sync::SyncedSession::TYPE_UNSET:
365 favicon_id = IDR_LAPTOP_FAVICON;
366 break;
367 };
368
369 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
370 SetIcon(index_in_menu, rb.GetNativeImageNamed(favicon_id));
371 }
372
373 void RecentTabsSubMenuModel::AddTabFavicon(int model_index,
374 int command_id,
375 const GURL& url) {
376 int index_in_menu = GetIndexOfCommandId(command_id);
377
378 // If tab has synced favicon, use it.
379 // Note that currently, foreign tab only has favicon if --sync-tab-favicons
380 // switch is on; according to zea@, this flag is now automatically enabled for
381 // iOS and android, and they're looking into enabling it for other platforms.
382 browser_sync::SessionModelAssociator* associator = GetModelAssociator();
383 std::string favicon_png;
384 if (associator &&
385 associator->GetSyncedFaviconForPageURL(url.spec(), &favicon_png)) {
386 SetIcon(index_in_menu, gfx::Image(reinterpret_cast<const unsigned char*>(
387 favicon_png.data()), favicon_png.size()));
388 return;
389 }
390
391 // Otherwise, start to fetch the favicon from local history asynchronously.
344 // Set default icon first. 392 // Set default icon first.
345 SetIcon(GetIndexOfCommandId(command_id), default_favicon_); 393 SetIcon(index_in_menu, default_favicon_);
346 // Start request to fetch actual icon if possible. 394 // Start request to fetch actual icon if possible.
347 FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( 395 FaviconService* favicon_service = FaviconServiceFactory::GetForProfile(
348 browser_->profile(), Profile::EXPLICIT_ACCESS); 396 browser_->profile(), Profile::EXPLICIT_ACCESS);
349 if (!favicon_service) 397 if (!favicon_service)
350 return; 398 return;
351 FaviconService::Handle handle = favicon_service->GetFaviconImageForURL( 399 FaviconService::Handle handle = favicon_service->GetFaviconImageForURL(
352 FaviconService::FaviconForURLParams(browser_->profile(), url, 400 FaviconService::FaviconForURLParams(browser_->profile(), url,
353 history::FAVICON, gfx::kFaviconSize, &favicon_consumer_), 401 history::FAVICON, gfx::kFaviconSize, &favicon_consumer_),
354 base::Bind(&RecentTabsSubMenuModel::OnFaviconDataAvailable, 402 base::Bind(&RecentTabsSubMenuModel::OnFaviconDataAvailable,
355 weak_ptr_factory_.GetWeakPtr())); 403 weak_ptr_factory_.GetWeakPtr()));
(...skipping 21 matching lines...) Expand all
377 RecentTabsSubMenuModel::GetModelAssociator() { 425 RecentTabsSubMenuModel::GetModelAssociator() {
378 if (!associator_) { 426 if (!associator_) {
379 ProfileSyncService* service = ProfileSyncServiceFactory::GetInstance()-> 427 ProfileSyncService* service = ProfileSyncServiceFactory::GetInstance()->
380 GetForProfile(browser_->profile()); 428 GetForProfile(browser_->profile());
381 // Only return the associator if it exists and it is done syncing sessions. 429 // Only return the associator if it exists and it is done syncing sessions.
382 if (service && service->ShouldPushChanges()) 430 if (service && service->ShouldPushChanges())
383 associator_ = service->GetSessionModelAssociator(); 431 associator_ = service->GetSessionModelAssociator();
384 } 432 }
385 return associator_; 433 return associator_;
386 } 434 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h ('k') | chrome/browser/ui/views/wrench_menu.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698