1
Index: src/chrome/browser/sessions/session_service.cc
2
===================================================================
3
--- src/chrome/browser/sessions/session_service.cc (revision 158531)
4
+++ src/chrome/browser/sessions/session_service.cc (working copy)
6
#include "chrome/browser/ui/tab_contents/tab_contents.h"
7
#include "chrome/browser/ui/tabs/tab_strip_model.h"
8
#include "chrome/common/chrome_notification_types.h"
9
+#include "chrome/common/chrome_switches.h"
10
#include "chrome/common/extensions/extension.h"
11
#include "content/public/browser/navigation_details.h"
12
#include "content/public/browser/navigation_entry.h"
14
!should_track_changes_for_browser_type(browser->type(), app_type))
17
+ // Do not track changes for chromeless windows so that
18
+ // it won't be considered for restoration during a 'normal' browser
20
+ if (browser->is_chromeless_mode() ||
21
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)) {
25
RestoreIfNecessary(std::vector<GURL>(), browser);
26
SetWindowType(browser->session_id(), browser->type(), app_type);
27
SetWindowAppName(browser->session_id(), browser->app_name());
28
Index: src/chrome/browser/ui/startup/startup_browser_creator_impl.cc
29
===================================================================
30
--- src/chrome/browser/ui/startup/startup_browser_creator_impl.cc (revision 158531)
31
+++ src/chrome/browser/ui/startup/startup_browser_creator_impl.cc (working copy)
36
+bool StartupBrowserCreatorImpl::IsChromelessLaunch(std::string* url)
38
+ if (command_line_.HasSwitch(switches::kChromeless)) {
40
+ *url = command_line_.GetSwitchValueASCII(switches::kChromeless);
47
bool StartupBrowserCreatorImpl::IsAppLaunch(std::string* app_url,
48
std::string* app_id) {
49
if (command_line_.HasSwitch(switches::kApp)) {
54
+ if (IsChromelessLaunch(NULL)) {
55
+ // Open user-specified URLs like pinned tabs and startup tabs.
56
+ if (ProcessSpecifiedURLs(urls_to_open))
60
if (process_startup && ProcessStartupURLs(urls_to_open)) {
61
// ProcessStartupURLs processed the urls, nothing else to do.
64
// mode. Also, no pages should be opened automatically if the session
65
// crashed. Otherwise it might trigger another crash, locking the user out of
66
// chrome. The crash infobar is shown in this case.
67
- if (!IncognitoModePrefs::ShouldLaunchIncognito(command_line_,
68
+ if (!IsChromelessLaunch(NULL) &&
69
+ !IncognitoModePrefs::ShouldLaunchIncognito(command_line_,
70
profile_->GetPrefs()) &&
71
!HasPendingUncleanExit(profile_)) {
72
tabs = PinnedTabCodec::ReadPinnedTabs(profile_);
74
if (!profile_ && browser)
75
profile_ = browser->profile();
77
+ if (IsChromelessLaunch(NULL)) {
78
+ browser = new Browser(Browser::CreateParams::CreateChromeless(profile_));
81
if (!browser || !browser->is_type_tabbed()) {
82
browser = new Browser(Browser::CreateParams(profile_));
85
if (!browser || !profile_ || browser->tab_count() == 0)
88
+ // We consider that being in a chromeless launch, we are to minimize as much as
89
+ // possible the most obvious "classic" Chromium behavior.
90
+ if (IsChromelessLaunch(NULL))
95
if (HasPendingUncleanExit(browser->profile()))
96
chrome::ShowSessionCrashedPrompt(browser);
98
Index: src/chrome/browser/ui/startup/startup_browser_creator_impl.h
99
===================================================================
100
--- src/chrome/browser/ui/startup/startup_browser_creator_impl.h (revision 158531)
101
+++ src/chrome/browser/ui/startup/startup_browser_creator_impl.h (working copy)
103
FRIEND_TEST_ALL_PREFIXES(BrowserTest, RestorePinnedTabs);
104
FRIEND_TEST_ALL_PREFIXES(BrowserTest, AppIdSwitch);
106
+ // If the process was launched with the chromeless command line flag,
107
+ // e.g. --chromeless=http://www.google.com/ return true.
108
+ // In this case |url| is populated if they're non-null.
109
+ bool IsChromelessLaunch(std::string* url);
111
// If the process was launched with the web application command line flags,
112
// e.g. --app=http://www.google.com/ or --app_id=... return true.
113
// In this case |app_url| or |app_id| are populated if they're non-null.
114
Index: src/chrome/browser/ui/gtk/tabs/tab_strip_gtk.cc
115
===================================================================
116
--- src/chrome/browser/ui/gtk/tabs/tab_strip_gtk.cc (revision 158531)
117
+++ src/chrome/browser/ui/gtk/tabs/tab_strip_gtk.cc (working copy)
119
g_signal_connect(tabstrip_.get(), "drag-data-received",
120
G_CALLBACK(OnDragDataReceivedThunk), this);
122
- newtab_button_.reset(MakeNewTabButton());
123
- newtab_surface_bounds_.SetRect(0, 0, newtab_button_->SurfaceWidth(),
124
- newtab_button_->SurfaceHeight());
125
+ if (window_ && window_->browser() && ! window_->browser()->is_chromeless_mode()) {
126
+ newtab_button_.reset(MakeNewTabButton());
127
+ newtab_surface_bounds_.SetRect(0, 0, newtab_button_->SurfaceWidth(),
128
+ newtab_button_->SurfaceHeight());
131
gtk_widget_show_all(tabstrip_.get());
133
@@ -1458,6 +1460,9 @@
135
void TabStripGtk::LayoutNewTabButton(double last_tab_right,
136
double unselected_width) {
137
+ if (window_ && window_->browser() && window_->browser()->is_chromeless_mode())
140
GtkWidget* toplevel = gtk_widget_get_ancestor(widget(), GTK_TYPE_WINDOW);
141
bool is_maximized = false;
143
@@ -1511,8 +1516,10 @@
144
int available_width = tabstrip_allocation.width;
145
if (available_width_for_tabs_ < 0) {
146
available_width = bounds_.width();
148
+ if (newtab_button_.get() != NULL) {
150
(kNewTabButtonHOffset + newtab_button_->WidgetAllocation().width);
153
// Interesting corner case: if |available_width_for_tabs_| > the result
154
// of the calculation in the conditional arm above, the strip is in
155
@@ -2070,8 +2077,11 @@
156
gdk_region_union_with_rect(event->region, &event->area);
158
// Paint the New Tab button.
159
- gtk_container_propagate_expose(GTK_CONTAINER(tabstrip_.get()),
160
- newtab_button_->widget(), event);
161
+ if (newtab_button_.get() != NULL) {
162
+ // Paint the New Tab button.
163
+ gtk_container_propagate_expose(GTK_CONTAINER(tabstrip_.get()),
164
+ newtab_button_->widget(), event);
167
// Paint the tabs in reverse order, so they stack to the left.
168
TabGtk* selected_tab = NULL;
169
@@ -2267,6 +2277,9 @@
172
void TabStripGtk::SetNewTabButtonBackground() {
173
+ if (newtab_button_.get() == NULL) {
176
SkColor color = theme_service_->GetColor(
177
ThemeService::COLOR_BUTTON_BACKGROUND);
178
SkBitmap* background = theme_service_->GetBitmapNamed(
179
Index: src/chrome/browser/ui/gtk/global_menu_bar.cc
180
===================================================================
181
--- src/chrome/browser/ui/gtk/global_menu_bar.cc (revision 158531)
182
+++ src/chrome/browser/ui/gtk/global_menu_bar.cc (working copy)
184
#include "ui/base/gtk/menu_label_accelerator_util.h"
185
#include "ui/base/l10n/l10n_util.h"
187
+typedef bool (*GlobalMenuBarVisibilityHandler) (Browser * browser);
189
struct GlobalMenuBarCommand {
193
+ GlobalMenuBarVisibilityHandler visibility_handler;
199
+static bool GlobalMenuBarVisibilityHandler_NotInChromelessMode(
200
+ Browser * browser) {
201
+ return browser && !browser->is_chromeless_mode();
204
const int MENU_SEPARATOR =-1;
205
const int MENU_END = -2;
206
const int MENU_DISABLED_LABEL = -3;
208
GlobalMenuBarCommand file_menu[] = {
209
- { IDS_NEW_TAB, IDC_NEW_TAB },
210
- { IDS_NEW_WINDOW, IDC_NEW_WINDOW },
211
- { IDS_NEW_INCOGNITO_WINDOW, IDC_NEW_INCOGNITO_WINDOW },
212
- { IDS_REOPEN_CLOSED_TABS_LINUX, IDC_RESTORE_TAB },
213
- { IDS_OPEN_FILE_LINUX, IDC_OPEN_FILE },
214
- { IDS_OPEN_LOCATION_LINUX, IDC_FOCUS_LOCATION },
215
+ { IDS_NEW_TAB, IDC_NEW_TAB, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
216
+ { IDS_NEW_WINDOW, IDC_NEW_WINDOW, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
217
+ { IDS_NEW_INCOGNITO_WINDOW, IDC_NEW_INCOGNITO_WINDOW, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
218
+ { IDS_REOPEN_CLOSED_TABS_LINUX, IDC_RESTORE_TAB, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
219
+ { IDS_OPEN_FILE_LINUX, IDC_OPEN_FILE, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
220
+ { IDS_OPEN_LOCATION_LINUX, IDC_FOCUS_LOCATION, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
222
- { MENU_SEPARATOR, MENU_SEPARATOR },
223
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
225
- { IDS_CREATE_SHORTCUTS, IDC_CREATE_SHORTCUTS },
226
+ { IDS_CREATE_SHORTCUTS, IDC_CREATE_SHORTCUTS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
228
- { MENU_SEPARATOR, MENU_SEPARATOR },
229
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
231
{ IDS_CLOSE_WINDOW_LINUX, IDC_CLOSE_WINDOW },
232
{ IDS_CLOSE_TAB_LINUX, IDC_CLOSE_TAB },
233
- { IDS_SAVE_PAGE, IDC_SAVE_PAGE },
234
+ { IDS_SAVE_PAGE, IDC_SAVE_PAGE, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
236
{ MENU_SEPARATOR, MENU_SEPARATOR },
240
{ IDS_FIND, IDC_FIND },
242
- { MENU_SEPARATOR, MENU_SEPARATOR },
243
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
245
- { IDS_PREFERENCES, IDC_OPTIONS },
246
+ { IDS_PREFERENCES, IDC_OPTIONS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
248
{ MENU_END, MENU_END }
251
GlobalMenuBarCommand view_menu[] = {
252
- { IDS_SHOW_BOOKMARK_BAR, IDC_SHOW_BOOKMARK_BAR },
253
+ { IDS_SHOW_BOOKMARK_BAR, IDC_SHOW_BOOKMARK_BAR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
255
- { MENU_SEPARATOR, MENU_SEPARATOR },
256
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
258
{ IDS_STOP_MENU_LINUX, IDC_STOP },
259
{ IDS_RELOAD_MENU_LINUX, IDC_RELOAD },
263
GlobalMenuBarCommand history_menu[] = {
264
- { IDS_HISTORY_HOME_LINUX, IDC_HOME },
265
- { IDS_HISTORY_BACK_LINUX, IDC_BACK },
266
- { IDS_HISTORY_FORWARD_LINUX, IDC_FORWARD },
267
+ { IDS_HISTORY_HOME_LINUX, IDC_HOME, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
268
+ { IDS_HISTORY_BACK_LINUX, IDC_BACK, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
269
+ { IDS_HISTORY_FORWARD_LINUX, IDC_FORWARD, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
271
- { MENU_SEPARATOR, MENU_SEPARATOR },
272
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
274
{ IDS_HISTORY_VISITED_LINUX, MENU_DISABLED_LABEL,
275
- GlobalMenuBar::TAG_MOST_VISITED_HEADER },
276
+ GlobalMenuBar::TAG_MOST_VISITED_HEADER, GlobalMenuBarVisibilityHandler_NotInChromelessMode },
278
- { MENU_SEPARATOR, MENU_SEPARATOR },
279
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
281
{ IDS_HISTORY_CLOSED_LINUX, MENU_DISABLED_LABEL,
282
- GlobalMenuBar::TAG_RECENTLY_CLOSED_HEADER },
283
+ GlobalMenuBar::TAG_RECENTLY_CLOSED_HEADER, GlobalMenuBarVisibilityHandler_NotInChromelessMode },
285
- { MENU_SEPARATOR, MENU_SEPARATOR },
286
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
288
- { IDS_SHOWFULLHISTORY_LINK, IDC_SHOW_HISTORY },
289
+ { IDS_SHOWFULLHISTORY_LINK, IDC_SHOW_HISTORY, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
291
{ MENU_END, MENU_END }
294
GlobalMenuBarCommand tools_menu[] = {
295
- { IDS_SHOW_DOWNLOADS, IDC_SHOW_DOWNLOADS },
296
- { IDS_SHOW_HISTORY, IDC_SHOW_HISTORY },
297
- { IDS_SHOW_EXTENSIONS, IDC_MANAGE_EXTENSIONS },
298
+ { IDS_SHOW_DOWNLOADS, IDC_SHOW_DOWNLOADS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
299
+ { IDS_SHOW_HISTORY, IDC_SHOW_HISTORY, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
300
+ { IDS_SHOW_EXTENSIONS, IDC_MANAGE_EXTENSIONS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
302
- { MENU_SEPARATOR, MENU_SEPARATOR },
303
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
305
- { IDS_TASK_MANAGER, IDC_TASK_MANAGER },
306
- { IDS_CLEAR_BROWSING_DATA, IDC_CLEAR_BROWSING_DATA },
307
+ { IDS_TASK_MANAGER, IDC_TASK_MANAGER, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
308
+ { IDS_CLEAR_BROWSING_DATA, IDC_CLEAR_BROWSING_DATA, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
310
- { MENU_SEPARATOR, MENU_SEPARATOR },
311
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
313
- { IDS_VIEW_SOURCE, IDC_VIEW_SOURCE },
314
- { IDS_DEV_TOOLS, IDC_DEV_TOOLS },
315
- { IDS_DEV_TOOLS_CONSOLE, IDC_DEV_TOOLS_CONSOLE },
316
+ { IDS_VIEW_SOURCE, IDC_VIEW_SOURCE, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
317
+ { IDS_DEV_TOOLS, IDC_DEV_TOOLS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
318
+ { IDS_DEV_TOOLS_CONSOLE, IDC_DEV_TOOLS_CONSOLE, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
320
{ MENU_END, MENU_END }
323
GlobalMenuBarCommand help_menu[] = {
324
- { IDS_FEEDBACK, IDC_FEEDBACK },
325
+ { IDS_FEEDBACK, IDC_FEEDBACK, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
326
{ IDS_HELP_PAGE , IDC_HELP_PAGE_VIA_MENU },
327
{ MENU_END, MENU_END }
332
pref_change_registrar_.Init(browser_->profile()->GetPrefs());
333
- pref_change_registrar_.Add(prefs::kShowBookmarkBar, this);
334
- OnBookmarkBarVisibilityChanged();
335
+ if (! browser_->is_chromeless_mode()) {
336
+ pref_change_registrar_.Add(prefs::kShowBookmarkBar, this);
337
+ OnBookmarkBarVisibilityChanged();
341
GlobalMenuBar::~GlobalMenuBar() {
343
std::map<int, GtkWidget*>* id_to_menu_item,
344
GlobalMenuBarCommand* commands,
345
GlobalMenuOwner* owner) {
346
+ // first pass to count the number of "visible" items
348
+ for (int i = 0; commands[i].str_id != MENU_END; ++i) {
349
+ if (!commands[i].visibility_handler || commands[i].visibility_handler(browser_)) {
357
GtkWidget* menu = gtk_menu_new();
358
for (int i = 0; commands[i].str_id != MENU_END; ++i) {
359
+ if (commands[i].visibility_handler && !commands[i].visibility_handler(browser_)) {
362
GtkWidget* menu_item = BuildMenuItem(
363
commands[i].str_id, commands[i].command, commands[i].tag,
364
id_to_menu_item, menu);
365
Index: src/chrome/browser/ui/gtk/browser_window_gtk.cc
366
===================================================================
367
--- src/chrome/browser/ui/gtk/browser_window_gtk.cc (revision 158531)
368
+++ src/chrome/browser/ui/gtk/browser_window_gtk.cc (working copy)
370
std::string(gdk_get_program_class()) +
371
" (" + user_data_dir + ")");
373
+ else if (browser_->is_chromeless_mode()) {
374
+ SetWindowCustomClass(window_, web_app::GetWMClassFromAppName("chromeless"));
377
// For popups, we initialize widgets then set the window geometry, because
378
// popups need the widgets inited before they can set the window size
382
void BrowserWindowGtk::SetFocusToLocationBar(bool select_all) {
383
- if (!IsFullscreen())
384
+ if (!IsFullscreen() && IsToolbarSupported())
385
GetLocationBar()->FocusLocation(select_all);
388
@@ -2541,7 +2564,7 @@
390
bool BrowserWindowGtk::UseCustomFrame() const {
391
// We don't use the custom frame for app mode windows or app window popups.
392
- return use_custom_frame_pref_.GetValue() && !browser_->is_app();
393
+ return use_custom_frame_pref_.GetValue() && !browser_->is_app() && !browser_->is_chromeless_mode();
396
bool BrowserWindowGtk::BoundsMatchMonitorSize() {
397
Index: src/chrome/browser/ui/browser.cc
398
===================================================================
399
--- src/chrome/browser/ui/browser.cc (revision 158531)
400
+++ src/chrome/browser/ui/browser.cc (working copy)
404
app_type(APP_TYPE_HOST),
405
+ is_chromeless_mode(false),
406
initial_show_state(ui::SHOW_STATE_DEFAULT),
407
is_session_restore(false),
412
app_type(APP_TYPE_HOST),
413
+ is_chromeless_mode(false),
414
initial_show_state(ui::SHOW_STATE_DEFAULT),
415
is_session_restore(false),
420
app_type(APP_TYPE_HOST),
421
+ is_chromeless_mode(false),
422
initial_show_state(ui::SHOW_STATE_DEFAULT),
423
is_session_restore(false),
429
+Browser::CreateParams Browser::CreateParams::CreateChromeless(Profile * profile)
431
+ CreateParams params(profile);
432
+ params.is_chromeless_mode = true;
437
Browser::CreateParams Browser::CreateParams::CreateForDevTools(
439
CreateParams params(TYPE_POPUP, profile);
441
ALLOW_THIS_IN_INITIALIZER_LIST(
442
tab_strip_model_(new TabStripModel(tab_strip_model_delegate_.get(),
444
- app_name_(params.app_name),
445
+ app_name_(params.app_name),
446
+ is_chromeless_mode_(params.is_chromeless_mode),
447
app_type_(params.app_type),
448
chrome_updater_factory_(this),
449
cancel_download_confirmation_state_(NOT_PROMPTED),
451
return find_bar_controller_.get() != NULL;
454
+bool Browser::is_chromeless_mode () const {
455
+ return is_chromeless_mode_;
458
bool Browser::is_app() const {
459
return !app_name_.empty();
463
int string_id = IDS_BROWSER_WINDOW_TITLE_FORMAT;
464
// Don't append the app name to window titles on app frames and app popups
466
+ if (is_app() || is_chromeless_mode())
467
string_id = IDS_BROWSER_WINDOW_TITLE_FORMAT_NO_LOGO;
468
return l10n_util::GetStringFUTF16(string_id, title);
471
tab_restore_service->BrowserClosing(tab_restore_service_delegate());
474
- if (tab_restore_service && is_type_tabbed() && tab_count())
475
+ if (tab_restore_service && is_type_tabbed() && !is_chromeless_mode() && tab_count())
476
tab_restore_service->BrowserClosing(tab_restore_service_delegate());
478
// TODO(sky): convert session/tab restore to use notification.
479
@@ -1466,7 +1482,7 @@
480
const history::HistoryAddPageArgs& add_page_args,
481
content::NavigationType navigation_type) {
482
// Don't update history if running as app.
483
- return !IsApplication();
484
+ return !IsApplication() && !is_chromeless_mode();
487
bool Browser::ShouldCreateWebContents(
488
@@ -2163,20 +2179,20 @@
490
unsigned int features = FEATURE_INFOBAR | FEATURE_DOWNLOADSHELF;
492
- if (is_type_tabbed())
493
+ if (is_type_tabbed() && !is_chromeless_mode())
494
features |= FEATURE_BOOKMARKBAR;
496
if (!hide_ui_for_fullscreen) {
497
- if (!is_type_tabbed())
498
+ if (is_type_tabbed() && !is_chromeless_mode())
499
features |= FEATURE_TITLEBAR;
502
if (is_type_tabbed())
503
features |= FEATURE_TABSTRIP;
505
- if (is_type_tabbed())
507
+ if (is_type_tabbed() && !is_chromeless_mode())
508
features |= FEATURE_TOOLBAR;
512
+ if (is_type_tabbed() && !is_chromeless_mode())
513
features |= FEATURE_LOCATIONBAR;
515
return !!(features & feature);
516
Index: src/chrome/browser/ui/browser_commands.cc
517
===================================================================
518
--- src/chrome/browser/ui/browser_commands.cc (revision 158531)
519
+++ src/chrome/browser/ui/browser_commands.cc (working copy)
522
void NewTab(Browser* browser) {
523
content::RecordAction(UserMetricsAction("NewTab"));
525
+ if (browser->is_chromeless_mode())
528
// TODO(asvitkine): This is invoked programmatically from several places.
529
// Audit the code and change it so that the histogram only gets collected for
530
// user-initiated commands.
532
bool CanRestoreTab(const Browser* browser) {
533
TabRestoreService* service =
534
TabRestoreServiceFactory::GetForProfile(browser->profile());
535
- return service && !service->entries().empty();
536
+ return service && !service->entries().empty()
537
+ && !browser->is_chromeless_mode();
540
void SelectNextTab(Browser* browser) {
541
Index: src/chrome/browser/ui/browser_command_controller.cc
542
===================================================================
543
--- src/chrome/browser/ui/browser_command_controller.cc (revision 158531)
544
+++ src/chrome/browser/ui/browser_command_controller.cc (working copy)
546
#include "chrome/browser/ui/tabs/tab_strip_model.h"
547
#include "chrome/browser/ui/webui/sync_promo/sync_promo_ui.h"
548
#include "chrome/common/chrome_notification_types.h"
549
+#include "chrome/common/chrome_switches.h"
550
#include "chrome/common/pref_names.h"
551
#include "chrome/common/profiling.h"
552
#include "content/public/browser/native_web_keyboard_event.h"
554
// BrowserCommandController, private:
556
bool BrowserCommandController::IsShowingMainUI(bool is_fullscreen) {
557
+ const bool started_in_chromeless =
558
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
559
+ || browser_->is_chromeless_mode();
561
#if !defined(OS_MACOSX)
562
- return browser_->is_type_tabbed() && !is_fullscreen;
563
+ return browser_->is_type_tabbed() && !is_fullscreen && !started_in_chromeless;
565
return browser_->is_type_tabbed();
568
// (like Back & Forward with initial page load) must have their state
569
// initialized here, otherwise they will be forever disabled.
571
+ bool started_in_chromeless =
572
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless);
574
// Navigation commands
575
command_updater_.UpdateCommandEnabled(IDC_RELOAD, true);
576
command_updater_.UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE, true);
577
@@ -710,10 +718,12 @@
579
// Window management commands
580
command_updater_.UpdateCommandEnabled(IDC_CLOSE_WINDOW, true);
581
- command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, true);
582
+ command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, !started_in_chromeless);
583
command_updater_.UpdateCommandEnabled(IDC_CLOSE_TAB, true);
584
- command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB, true);
585
- command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB, false);
586
+ command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB,
587
+ !started_in_chromeless);
588
+ command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB,
589
+ !started_in_chromeless);
590
command_updater_.UpdateCommandEnabled(IDC_EXIT, true);
591
command_updater_.UpdateCommandEnabled(IDC_DEBUG_FRAME_TOGGLE, true);
593
@@ -769,25 +779,33 @@
594
command_updater_.UpdateCommandEnabled(IDC_CREATE_SHORTCUTS, false);
595
UpdateCommandsForDevTools();
596
command_updater_.UpdateCommandEnabled(IDC_TASK_MANAGER, CanOpenTaskManager());
597
- command_updater_.UpdateCommandEnabled(IDC_SHOW_HISTORY, true);
598
- command_updater_.UpdateCommandEnabled(IDC_SHOW_DOWNLOADS, true);
599
+ command_updater_.UpdateCommandEnabled(IDC_SHOW_HISTORY,
600
+ !started_in_chromeless);
601
+ command_updater_.UpdateCommandEnabled(IDC_SHOW_DOWNLOADS,
602
+ !started_in_chromeless);
603
command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_KEYBOARD, true);
604
command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_MENU, true);
605
- command_updater_.UpdateCommandEnabled(IDC_BOOKMARKS_MENU, true);
606
+ command_updater_.UpdateCommandEnabled(IDC_BOOKMARKS_MENU,
607
+ !started_in_chromeless);
609
command_updater_.UpdateCommandEnabled(
610
- IDC_SHOW_SYNC_SETUP, profile()->GetOriginalProfile()->IsSyncAccessible());
611
+ IDC_SHOW_SYNC_SETUP,
612
+ profile()->GetOriginalProfile()->IsSyncAccessible()
613
+ && !started_in_chromeless);
615
// Initialize other commands based on the window type.
616
bool normal_window = browser_->is_type_tabbed();
618
// Navigation commands
619
- command_updater_.UpdateCommandEnabled(IDC_HOME, normal_window);
620
+ command_updater_.UpdateCommandEnabled(IDC_HOME,
622
+ && !started_in_chromeless);
624
// Window management commands
625
// TODO(rohitrao): Disable fullscreen on non-Lion?
626
command_updater_.UpdateCommandEnabled(IDC_FULLSCREEN,
627
- !(browser_->is_type_panel() && browser_->is_app()));
628
+ !(browser_->is_type_panel() && browser_->is_app()
629
+ && started_in_chromeless));
630
command_updater_.UpdateCommandEnabled(IDC_SELECT_NEXT_TAB, normal_window);
631
command_updater_.UpdateCommandEnabled(IDC_SELECT_PREVIOUS_TAB,
634
!browser_->is_devtools());
636
// Show various bits of UI
637
- command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, normal_window);
638
+ command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA,
640
+ && !started_in_chromeless);
642
// The upgrade entry and the view incompatibility entry should always be
643
// enabled. Whether they are visible is a separate matter determined on menu
646
// View Background Pages entry is always enabled, but is hidden if there are
647
// no background pages.
648
- command_updater_.UpdateCommandEnabled(IDC_VIEW_BACKGROUND_PAGES, true);
649
+ command_updater_.UpdateCommandEnabled(IDC_VIEW_BACKGROUND_PAGES,
650
+ !started_in_chromeless);
652
// Toggle speech input
653
command_updater_.UpdateCommandEnabled(IDC_TOGGLE_SPEECH_INPUT, true);
654
@@ -847,19 +868,26 @@
657
void BrowserCommandController::UpdateCommandsForIncognitoAvailability() {
658
+ bool started_in_chromeless =
659
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
660
+ || browser_->is_chromeless_mode();
662
IncognitoModePrefs::Availability incognito_availability =
663
IncognitoModePrefs::GetAvailability(profile()->GetPrefs());
664
command_updater_.UpdateCommandEnabled(
666
- incognito_availability != IncognitoModePrefs::FORCED);
667
+ incognito_availability != IncognitoModePrefs::FORCED
668
+ && !started_in_chromeless);
669
command_updater_.UpdateCommandEnabled(
670
IDC_NEW_INCOGNITO_WINDOW,
671
- incognito_availability != IncognitoModePrefs::DISABLED);
672
+ incognito_availability != IncognitoModePrefs::DISABLED
673
+ && !started_in_chromeless);
675
// Bookmark manager and settings page/subpages are forced to open in normal
676
// mode. For this reason we disable these commands when incognito is forced.
677
const bool command_enabled =
678
- incognito_availability != IncognitoModePrefs::FORCED;
679
+ incognito_availability != IncognitoModePrefs::FORCED
680
+ && !started_in_chromeless;
681
command_updater_.UpdateCommandEnabled(
682
IDC_SHOW_BOOKMARK_MANAGER,
683
browser_defaults::bookmarks_enabled && command_enabled);
686
// Window management commands
687
command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB,
688
- !browser_->is_app() && CanDuplicateTab(browser_));
689
+ !browser_->is_chromeless_mode() && !browser_->is_app()
690
+ && CanDuplicateTab(browser_));
692
// Page-related commands
693
window()->SetStarredState(
694
@@ -904,10 +933,12 @@
695
window()->SetZoomIconTooltipPercent(
696
current_tab_contents->zoom_controller()->zoom_percent());
697
command_updater_.UpdateCommandEnabled(IDC_VIEW_SOURCE,
698
- CanViewSource(browser_));
699
+ CanViewSource(browser_)
700
+ && !browser_->is_chromeless_mode());
701
command_updater_.UpdateCommandEnabled(IDC_EMAIL_PAGE_LOCATION,
702
- CanEmailPageLocation(browser_));
703
- if (browser_->is_devtools())
704
+ CanEmailPageLocation(browser_)
705
+ && !browser_->is_chromeless_mode());
706
+ if (browser_->is_devtools() && browser_->is_chromeless_mode())
707
command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, false);
709
// Changing the encoding is not possible on Chrome-internal webpages.
711
#if !defined(OS_MACOSX)
712
command_updater_.UpdateCommandEnabled(
713
IDC_CREATE_SHORTCUTS,
714
- CanCreateApplicationShortcuts(browser_));
715
+ CanCreateApplicationShortcuts(browser_)
716
+ && !browser_->is_chromeless_mode());
719
UpdateCommandsForContentRestrictionState();
720
@@ -955,21 +987,31 @@
723
void BrowserCommandController::UpdateCommandsForBookmarkEditing() {
724
+ bool started_in_chromeless =
725
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
726
+ || browser_->is_chromeless_mode();
728
command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_PAGE,
729
- CanBookmarkCurrentPage(browser_));
730
+ CanBookmarkCurrentPage(browser_)
731
+ && !started_in_chromeless);
732
command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_ALL_TABS,
733
- CanBookmarkAllTabs(browser_));
734
+ CanBookmarkAllTabs(browser_)
735
+ && !started_in_chromeless);
736
command_updater_.UpdateCommandEnabled(IDC_PIN_TO_START_SCREEN,
738
+ !started_in_chromeless);
741
void BrowserCommandController::UpdateCommandsForBookmarkBar() {
742
+ const bool started_in_chromeless =
743
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
744
+ || browser_->is_chromeless_mode();
746
const bool show_main_ui =
747
IsShowingMainUI(window() && window()->IsFullscreen());
748
command_updater_.UpdateCommandEnabled(IDC_SHOW_BOOKMARK_BAR,
749
browser_defaults::bookmarks_enabled &&
750
!profile()->GetPrefs()->IsManagedPreference(prefs::kShowBookmarkBar) &&
752
+ show_main_ui && !started_in_chromeless);
755
void BrowserCommandController::UpdateCommandsForFullscreenMode(
756
@@ -1069,7 +1111,12 @@
758
enabled = local_state->GetBoolean(prefs::kAllowFileSelectionDialogs);
760
- command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, enabled);
761
+ const bool started_in_chromeless =
762
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
763
+ || browser_->is_chromeless_mode();
765
+ command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE,
766
+ enabled && !started_in_chromeless);
769
void BrowserCommandController::UpdateReloadStopState(bool is_loading,
770
Index: src/chrome/browser/ui/browser.h
771
===================================================================
772
--- src/chrome/browser/ui/browser.h (revision 158531)
773
+++ src/chrome/browser/ui/browser.h (working copy)
775
const gfx::Rect& window_bounds,
778
+ // Like Create, but creates a chromeless browser.
779
+ static CreateParams CreateChromeless(Profile * profile);
781
static CreateParams CreateForDevTools(Profile* profile);
785
// Type of app (host or child). See description of AppType.
788
+ // If the browser instance is supposed to be a chromeless one.
789
+ bool is_chromeless_mode;
791
// The bounds of the window to open.
792
gfx::Rect initial_bounds;
795
bool is_type_popup() const { return type_ == TYPE_POPUP; }
796
bool is_type_panel() const { return type_ == TYPE_PANEL; }
798
+ bool is_chromeless_mode() const;
800
bool is_devtools() const;
803
// Type of app (host or child). See description of AppType.
806
+ bool is_chromeless_mode_;
808
// Unique identifier of this browser for session restore. This id is only
809
// unique within the current session, and is not guaranteed to be unique
811
Index: src/chrome/browser/extensions/extension_module.h
812
===================================================================
813
--- src/chrome/browser/extensions/extension_module.h (revision 158531)
814
+++ src/chrome/browser/extensions/extension_module.h (working copy)
816
virtual bool RunImpl() OVERRIDE;
819
+class IsChromelessWindowFunction : public SyncExtensionFunction {
821
+ virtual bool RunImpl() OVERRIDE;
822
+ DECLARE_EXTENSION_FUNCTION_NAME("extension.isChromelessWindow");
826
#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_MODULE_H__
827
Index: src/chrome/browser/extensions/extension_function_registry.cc
828
===================================================================
829
--- src/chrome/browser/extensions/extension_function_registry.cc (revision 158531)
830
+++ src/chrome/browser/extensions/extension_function_registry.cc (working copy)
832
RegisterFunction<SetUpdateUrlDataFunction>();
833
RegisterFunction<IsAllowedIncognitoAccessFunction>();
834
RegisterFunction<IsAllowedFileSchemeAccessFunction>();
835
+ RegisterFunction<IsChromelessWindowFunction>();
838
RegisterFunction<extensions::GetBrowserLoginFunction>();
839
Index: src/chrome/browser/extensions/extension_module.cc
840
===================================================================
841
--- src/chrome/browser/extensions/extension_module.cc (revision 158531)
842
+++ src/chrome/browser/extensions/extension_module.cc (working copy)
847
+#if defined(OS_LINUX) && defined(TOOLKIT_GTK)
848
+#include <gdk/gdk.h>
849
+#include <gdk/gdkx.h>
852
#include "chrome/browser/extensions/extension_prefs.h"
853
+#include "chrome/browser/extensions/extension_tab_util.h"
854
#include "chrome/browser/extensions/extension_service.h"
855
+#include "chrome/browser/ui/browser.h"
856
#include "chrome/browser/profiles/profile.h"
857
+#include "chrome/common/chrome_switches.h"
859
+#if defined(OS_LINUX) && defined(TOOLKIT_GTK)
863
+const char kNoCurrentWindowError[] = "No current window";
864
+const char kCouldNotIdentifyTab[] = "Could not find tab with specified ID";
870
extensions::ExtensionPrefs* SetUpdateUrlDataFunction::extension_prefs() {
871
return profile()->GetExtensionService()->extension_prefs();
874
ext_service->AllowFileAccess(extension)));
878
+bool IsChromelessWindowFunction::RunImpl() {
879
+ bool is_chromeless = false;
882
+ if (!args_->GetInteger(0, &tab_id)) {
883
+ Browser* browser = GetCurrentBrowser();
885
+ error_ = kNoCurrentWindowError;
888
+ is_chromeless = browser->is_chromeless_mode();
891
+ Browser* browser = NULL;
892
+ if (!ExtensionTabUtil::GetTabById(tab_id,
899
+ error_ = kCouldNotIdentifyTab;
902
+ is_chromeless = browser->is_chromeless_mode();
905
+ SetResult(Value::CreateBooleanValue(is_chromeless));
909
Index: src/chrome/common/extensions/api/extension.json
910
===================================================================
911
--- src/chrome/common/extensions/api/extension.json (revision 158531)
912
+++ src/chrome/common/extensions/api/extension.json (working copy)
917
+ "name": "isChromelessWindow",
918
+ "type": "function",
919
+ "unprivileged": true,
920
+ "description": "Checks is a given extension runs part of a chromeless window.",
926
+ "description": "The tab id corresponding to the window to restrict the request to."
930
+ "type": "function",
931
+ "name": "callback",
934
+ "name": "isChromelessWindow",
936
+ "description": "True if the extension runs part of a chromeless window, false otherwise."
943
"name": "isAllowedIncognitoAccess",
945
"description": "Retrieves the state of the extension's access to Incognito-mode (as determined by the user-controlled 'Allowed in Incognito' checkbox.",
946
Index: src/chrome/common/chrome_switches.cc
947
===================================================================
948
--- src/chrome/common/chrome_switches.cc (revision 158531)
949
+++ src/chrome/common/chrome_switches.cc (working copy)
951
// Chrome Frame automation channel is closed.
952
const char kChromeFrameShutdownDelay[] = "chrome-frame-shutdown-delay";
954
+// Specifies a given URL to be opened in a chromeless mode.
955
+const char kChromeless[] = "chromeless";
957
// Tells chrome to load the specified version of chrome.dll on Windows. If this
958
// version cannot be loaded, Chrome will exit.
959
const char kChromeVersion[] = "chrome-version";
960
Index: src/chrome/common/chrome_switches.h
961
===================================================================
962
--- src/chrome/common/chrome_switches.h (revision 158531)
963
+++ src/chrome/common/chrome_switches.h (working copy)
965
extern const char kCheckForUpdateIntervalSec[];
966
extern const char kCheckCloudPrintConnectorPolicy[];
967
extern const char kChromeFrameShutdownDelay[];
968
+extern const char kChromeless[];
969
extern const char kChromeVersion[];
970
extern const char kCipherSuiteBlacklist[];
971
extern const char kClearTokenService[];