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

Side by Side Diff: chrome/browser/ui/search/other_device_menu.cc

Issue 11009013: NTP5: Starting implementation of a native menu for showing other device sessions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 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
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/search/other_device_menu.h"
6
7 #include "base/string16.h"
8 #include "base/utf_string_conversions.h"
dhollowa 2012/10/01 17:37:38 This should be removed. We'll put the string in r
jeremycho 2012/10/01 22:53:40 Done.
9 #include "chrome/browser/ui/browser.h"
10 #include "chrome/browser/ui/browser_finder.h"
11 #include "chrome/browser/ui/browser_window.h"
12 #include "chrome/browser/ui/webui/ntp/foreign_session_handler.h"
13 #include "content/public/browser/web_contents.h"
14 #include "content/public/browser/web_ui.h"
15 #include "chrome/browser/sync/glue/session_model_associator.h"
16 #include "ui/base/text/text_elider.h"
17 #include "ui/views/controls/menu/menu_model_adapter.h"
18 #include "ui/views/controls/menu/menu_runner.h"
19 #include "ui/views/widget/widget.h"
20 #include "webkit/glue/window_open_disposition.h"
21
22 using browser_sync::ForeignSessionHandler;
23 using browser_sync::SessionModelAssociator;
24
25 // The max width of a menu. Menu text exceeding this will be elided.
26 static const int kMaxWidth = 375;
27
28 OtherDeviceMenu::OtherDeviceMenu(content::WebUI* web_ui,
29 const std::string& session_id,
30 const gfx::Point& location) :
31 web_ui_(web_ui), session_id_(session_id), location_(location),
32 ALLOW_THIS_IN_INITIALIZER_LIST(menu_model_(this)) {
33 SessionModelAssociator* associator =
34 ForeignSessionHandler::GetModelAssociator(web_ui);
35 std::vector<const SessionWindow*> windows;
36
37 // Populate the menu with the device's tabs, using separators between windows.
38 // TODO(jeremycho): Limit the number of menu items?
dhollowa 2012/10/01 17:37:38 I see browser_sync::kMaxSessionsToShow. Use that?
jeremycho 2012/10/01 22:53:40 A menu should only contain a single session. Adde
39 if (associator && associator->GetForeignSession(session_id, &windows)) {
dhollowa 2012/10/01 17:37:38 Should |associator| ever be NULL here? If not pre
jeremycho 2012/10/01 22:53:40 Yes it can be, e.g. if it hasn't finished syncing.
40 int command_id = 0;
41 bool lastWindowHasTabs = false;
dhollowa 2012/10/01 17:37:38 C++ style is: |last_window_has_tabs|.
jeremycho 2012/10/01 22:53:40 Done.
42 for (std::vector<const SessionWindow*>::const_iterator it =
43 windows.begin(); it != windows.end(); ++it) {
44 if (lastWindowHasTabs)
45 menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
46 lastWindowHasTabs = false;
47
48 const SessionWindow* window = *it;
49 for (size_t i = 0; i < window->tabs.size(); ++i) {
50 linked_ptr<DictionaryValue> tab_value =
51 linked_ptr<DictionaryValue>(new DictionaryValue());
52 if (ForeignSessionHandler::SessionTabToValue(
53 *window->tabs[i], tab_value.get())) {
54 lastWindowHasTabs = true;
55 tab_value->SetInteger("windowId", window->window_id.id());
56 string16 title;
57 tab_value->GetString("title", &title);
58 title = ui::ElideText(
59 title, gfx::Font(), kMaxWidth, ui::ELIDE_AT_END);
60 menu_model_.AddItem(command_id, title);
61 session_data_[++command_id] = tab_value;
62 // TODO(jeremycho): Use tab_value.GetString("url", &url) to
dhollowa 2012/10/01 17:37:38 Please add a link to associated bug in this TODO.
jeremycho 2012/10/01 22:53:40 Done.
63 // request favicons.
64 }
65 }
66 }
67
68 // Add a "Show all" menu item if there is more than one tab.
69 if (session_data_.size() > 1) {
70 linked_ptr<DictionaryValue> show_all_tab_value =
71 linked_ptr<DictionaryValue>(new DictionaryValue());
72 // kInvalidId signifies that the entire session should be opened.
73 show_all_tab_value->SetInteger(
74 "sessionId",
75 ForeignSessionHandler::kInvalidId);
76 show_all_tab_value->SetInteger(
77 "windowId",
78 ForeignSessionHandler::kInvalidId);
79 menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
80 // TODO(jeremycho): i18n.
81 menu_model_.AddItem(command_id, UTF8ToUTF16("Show all"));
dhollowa 2012/10/01 17:37:38 Let's do this now. We shouldn't be hard coding st
jeremycho 2012/10/01 22:53:40 Reused the existing string from NTP4's other devic
82 session_data_[++command_id] = show_all_tab_value;
83 }
84 }
85 }
86
87 OtherDeviceMenu::~OtherDeviceMenu() {
88 }
89
90 void OtherDeviceMenu::ShowMenu() {
91 content::WebContents* web_contents = web_ui_->GetWebContents();
dhollowa 2012/10/01 17:37:38 Is it possible to get a NULL result back here? I'
jeremycho 2012/10/01 22:53:40 WebContents* shouldn't be NULL, but the others cou
92 Browser* browser = browser::FindBrowserWithWebContents(web_contents);
93 views::Widget* widget = views::Widget::GetWidgetForNativeWindow(
94 browser->window()->GetNativeWindow());
95 views::MenuModelAdapter menu_model_adapter(&menu_model_);
96 menu_runner_.reset(new views::MenuRunner(menu_model_adapter.CreateMenu()));
97
98 if (menu_runner_->RunMenuAt(widget, NULL, gfx::Rect(location_, gfx::Size()),
dhollowa 2012/10/01 17:37:38 Prefer: RunResult result = menu_runner_->RunMenuAt
jeremycho 2012/10/01 22:53:40 We don't expect that necessarily - only if the Men
99 views::MenuItemView::TOPLEFT, 0) ==
100 views::MenuRunner::MENU_DELETED)
101 return;
102 }
103
104 bool OtherDeviceMenu::IsCommandIdChecked(int command_id) const {
105 return false;
106 }
107
108 bool OtherDeviceMenu::IsCommandIdEnabled(int command_id) const {
109 return true;
110 }
111
112 void OtherDeviceMenu::ExecuteCommand(int command_id) {
113 ExecuteCommand(command_id, 0);
114 }
115
116 // TODO(jeremycho): Figure out why mouse wheel clicks don't trigger this.
117 void OtherDeviceMenu::ExecuteCommand(int command_id, int event_flags) {
118 if (session_data_.count(command_id) == 0) {
dhollowa 2012/10/01 17:37:38 Chrome style typically does not mask logic errors
jeremycho 2012/10/01 22:53:40 Done.
119 NOTREACHED() << "Invalid command_id from other device menu.";
120 return;
121 }
122
123 linked_ptr<DictionaryValue> tab_data = session_data_[command_id];
124 // This is not a mistake - sessionId actually refers to the tab id.
125 // See ForeignSessionHandler::SessionTabToValue.
126 int tab_id = ForeignSessionHandler::kInvalidId;
127 tab_data->GetInteger("sessionId", &tab_id);
128
129 int window_id = ForeignSessionHandler::kInvalidId;
130 tab_data->GetInteger("windowId", &window_id);
131
132 WindowOpenDisposition disposition =
133 chrome::DispositionFromEventFlags(event_flags);
134 ForeignSessionHandler::OpenForeignSession(
135 web_ui_, session_id_, window_id, tab_id, disposition);
136 // TODO(jeremycho): Figure out what we want to log.
dhollowa 2012/10/01 17:37:38 If in doubt, log nothing.
jeremycho 2012/10/01 22:53:40 other_sessions.js logs session clicks, so most lik
137 }
138
139 bool OtherDeviceMenu::GetAcceleratorForCommandId(
140 int command_id,
141 ui::Accelerator* accelerator) {
142 return false;
143 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698