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
if (!ShouldTrackBrowser(browser))
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
AppType app_type = browser->is_app() ? TYPE_APP : TYPE_NORMAL;
26
RestoreIfNecessary(std::vector<GURL>(), browser);
27
SetWindowType(browser->session_id(), browser->type(), app_type);
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);
46
bool StartupBrowserCreatorImpl::IsAppLaunch(std::string* app_url,
47
std::string* app_id) {
48
if (command_line_.HasSwitch(switches::kApp)) {
53
+ if (IsChromelessLaunch(NULL)) {
54
+ // Open user-specified URLs like pinned tabs and startup tabs.
55
+ if (ProcessSpecifiedURLs(urls_to_open))
59
if (process_startup && ProcessStartupURLs(urls_to_open)) {
60
// ProcessStartupURLs processed the urls, nothing else to do.
63
// mode. Also, no pages should be opened automatically if the session
64
// crashed. Otherwise it might trigger another crash, locking the user out of
65
// chrome. The crash infobar is shown in this case.
66
- if (!IncognitoModePrefs::ShouldLaunchIncognito(command_line_,
67
+ if (!IsChromelessLaunch(NULL) &&
68
+ !IncognitoModePrefs::ShouldLaunchIncognito(command_line_,
69
profile_->GetPrefs()) &&
70
!HasPendingUncleanExit(profile_)) {
71
tabs = PinnedTabCodec::ReadPinnedTabs(profile_);
73
if (!profile_ && browser)
74
profile_ = browser->profile();
76
+ if (IsChromelessLaunch(NULL)) {
77
+ browser = new Browser(Browser::CreateParams::CreateChromeless(profile_));
80
if (!browser || !browser->is_type_tabbed()) {
81
browser = new Browser(Browser::CreateParams(profile_));
84
if (!browser || !profile_ || browser->tab_count() == 0)
87
+ // We consider that being in a chromeless launch, we are to minimize
88
+ // as much as possible the most obvious "classic" Chromium behavior.
89
+ if (IsChromelessLaunch(NULL))
92
if (HasPendingUncleanExit(browser->profile()))
93
chrome::ShowSessionCrashedPrompt(browser);
95
Index: src/chrome/browser/ui/startup/startup_browser_creator_impl.h
96
===================================================================
97
--- src/chrome/browser/ui/startup/startup_browser_creator_impl.h (revision 158531)
98
+++ src/chrome/browser/ui/startup/startup_browser_creator_impl.h (working copy)
100
FRIEND_TEST_ALL_PREFIXES(BrowserTest, RestorePinnedTabs);
101
FRIEND_TEST_ALL_PREFIXES(BrowserTest, AppIdSwitch);
103
+ // If the process was launched with the chromeless command line flag,
104
+ // e.g. --chromeless=http://www.google.com/ return true.
105
+ // In this case |url| is populated if they're non-null.
106
+ bool IsChromelessLaunch(std::string* url);
108
// Extracts optional application window size passed in command line.
109
void ExtractOptionalAppWindowSize(gfx::Rect* bounds);
111
Index: src/chrome/browser/ui/gtk/tabs/tab_strip_gtk.cc
112
===================================================================
113
--- src/chrome/browser/ui/gtk/tabs/tab_strip_gtk.cc (revision 158531)
114
+++ src/chrome/browser/ui/gtk/tabs/tab_strip_gtk.cc (working copy)
116
g_signal_connect(tabstrip_.get(), "drag-data-received",
117
G_CALLBACK(OnDragDataReceivedThunk), this);
119
- newtab_button_.reset(MakeNewTabButton());
120
- newtab_surface_bounds_.SetRect(0, 0, newtab_button_->SurfaceWidth(),
121
- newtab_button_->SurfaceHeight());
122
+ if (window_ && window_->browser() &&
123
+ ! window_->browser()->is_chromeless_mode()) {
124
+ newtab_button_.reset(MakeNewTabButton());
125
+ newtab_surface_bounds_.SetRect(0, 0, newtab_button_->SurfaceWidth(),
126
+ newtab_button_->SurfaceHeight());
129
gtk_widget_show_all(tabstrip_.get());
131
@@ -1458,6 +1461,9 @@
133
void TabStripGtk::LayoutNewTabButton(double last_tab_right,
134
double unselected_width) {
135
+ if (window_ && window_->browser() && window_->browser()->is_chromeless_mode())
138
GtkWidget* toplevel = gtk_widget_get_ancestor(widget(), GTK_TYPE_WINDOW);
139
bool is_maximized = false;
141
@@ -1511,8 +1517,10 @@
142
int available_width = tabstrip_allocation.width;
143
if (available_width_for_tabs_ < 0) {
144
available_width = bounds_.width();
146
+ if (newtab_button_.get() != NULL) {
148
(kNewTabButtonHOffset + newtab_button_->WidgetAllocation().width);
151
// Interesting corner case: if |available_width_for_tabs_| > the result
152
// of the calculation in the conditional arm above, the strip is in
153
@@ -2070,8 +2078,11 @@
154
gdk_region_union_with_rect(event->region, &event->area);
156
// Paint the New Tab button.
157
- gtk_container_propagate_expose(GTK_CONTAINER(tabstrip_.get()),
158
- newtab_button_->widget(), event);
159
+ if (newtab_button_.get() != NULL) {
160
+ // Paint the New Tab button.
161
+ gtk_container_propagate_expose(GTK_CONTAINER(tabstrip_.get()),
162
+ newtab_button_->widget(), event);
165
// Paint the tabs in reverse order, so they stack to the left.
166
TabGtk* selected_tab = NULL;
167
@@ -2267,6 +2278,9 @@
170
void TabStripGtk::SetNewTabButtonBackground() {
171
+ if (newtab_button_.get() == NULL) {
174
SkColor color = theme_service_->GetColor(
175
ThemeService::COLOR_BUTTON_BACKGROUND);
176
SkBitmap background = theme_service_->GetImageNamed(
177
Index: src/chrome/browser/ui/gtk/global_menu_bar.cc
178
===================================================================
179
--- src/chrome/browser/ui/gtk/global_menu_bar.cc (revision 158531)
180
+++ src/chrome/browser/ui/gtk/global_menu_bar.cc (working copy)
182
#include "ui/base/gtk/menu_label_accelerator_util.h"
183
#include "ui/base/l10n/l10n_util.h"
185
+typedef bool (*GlobalMenuBarVisibilityHandler) (Browser * browser);
187
struct GlobalMenuBarCommand {
191
+ GlobalMenuBarVisibilityHandler visibility_handler;
196
+bool GlobalMenuBarVisibilityHandler_NotInChromelessMode(
197
+ Browser * browser) {
198
+ return browser && !browser->is_chromeless_mode();
201
const int MENU_SEPARATOR =-1;
202
const int MENU_END = -2;
203
const int MENU_DISABLED_LABEL = -3;
205
GlobalMenuBarCommand file_menu[] = {
206
- { IDS_NEW_TAB, IDC_NEW_TAB },
207
- { IDS_NEW_WINDOW, IDC_NEW_WINDOW },
208
- { IDS_NEW_INCOGNITO_WINDOW, IDC_NEW_INCOGNITO_WINDOW },
209
- { IDS_REOPEN_CLOSED_TABS_LINUX, IDC_RESTORE_TAB },
210
- { IDS_OPEN_FILE_LINUX, IDC_OPEN_FILE },
211
- { IDS_OPEN_LOCATION_LINUX, IDC_FOCUS_LOCATION },
212
+ { IDS_NEW_TAB, IDC_NEW_TAB, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
213
+ { IDS_NEW_WINDOW, IDC_NEW_WINDOW, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
214
+ { IDS_NEW_INCOGNITO_WINDOW, IDC_NEW_INCOGNITO_WINDOW, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
215
+ { IDS_REOPEN_CLOSED_TABS_LINUX, IDC_RESTORE_TAB, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
216
+ { IDS_OPEN_FILE_LINUX, IDC_OPEN_FILE, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
217
+ { IDS_OPEN_LOCATION_LINUX, IDC_FOCUS_LOCATION, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
219
- { MENU_SEPARATOR, MENU_SEPARATOR },
220
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
222
- { IDS_CREATE_SHORTCUTS, IDC_CREATE_SHORTCUTS },
223
+ { IDS_CREATE_SHORTCUTS, IDC_CREATE_SHORTCUTS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
225
- { MENU_SEPARATOR, MENU_SEPARATOR },
226
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
228
{ IDS_CLOSE_WINDOW_LINUX, IDC_CLOSE_WINDOW },
229
{ IDS_CLOSE_TAB_LINUX, IDC_CLOSE_TAB },
230
- { IDS_SAVE_PAGE, IDC_SAVE_PAGE },
231
+ { IDS_SAVE_PAGE, IDC_SAVE_PAGE, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
233
{ MENU_SEPARATOR, MENU_SEPARATOR },
237
{ IDS_FIND, IDC_FIND },
239
- { MENU_SEPARATOR, MENU_SEPARATOR },
240
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
242
- { IDS_PREFERENCES, IDC_OPTIONS },
243
+ { IDS_PREFERENCES, IDC_OPTIONS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
245
{ MENU_END, MENU_END }
248
GlobalMenuBarCommand view_menu[] = {
249
- { IDS_SHOW_BOOKMARK_BAR, IDC_SHOW_BOOKMARK_BAR },
250
+ { IDS_SHOW_BOOKMARK_BAR, IDC_SHOW_BOOKMARK_BAR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
252
- { MENU_SEPARATOR, MENU_SEPARATOR },
253
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
255
{ IDS_STOP_MENU_LINUX, IDC_STOP },
256
{ IDS_RELOAD_MENU_LINUX, IDC_RELOAD },
260
GlobalMenuBarCommand history_menu[] = {
261
- { IDS_HISTORY_HOME_LINUX, IDC_HOME },
262
- { IDS_HISTORY_BACK_LINUX, IDC_BACK },
263
- { IDS_HISTORY_FORWARD_LINUX, IDC_FORWARD },
264
+ { IDS_HISTORY_HOME_LINUX, IDC_HOME, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
265
+ { IDS_HISTORY_BACK_LINUX, IDC_BACK, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
266
+ { IDS_HISTORY_FORWARD_LINUX, IDC_FORWARD, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
268
- { MENU_SEPARATOR, MENU_SEPARATOR },
269
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
271
{ IDS_HISTORY_VISITED_LINUX, MENU_DISABLED_LABEL,
272
- GlobalMenuBar::TAG_MOST_VISITED_HEADER },
273
+ GlobalMenuBar::TAG_MOST_VISITED_HEADER, GlobalMenuBarVisibilityHandler_NotInChromelessMode },
275
- { MENU_SEPARATOR, MENU_SEPARATOR },
276
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
278
{ IDS_HISTORY_CLOSED_LINUX, MENU_DISABLED_LABEL,
279
- GlobalMenuBar::TAG_RECENTLY_CLOSED_HEADER },
280
+ GlobalMenuBar::TAG_RECENTLY_CLOSED_HEADER, GlobalMenuBarVisibilityHandler_NotInChromelessMode },
282
- { MENU_SEPARATOR, MENU_SEPARATOR },
283
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
285
- { IDS_SHOWFULLHISTORY_LINK, IDC_SHOW_HISTORY },
286
+ { IDS_SHOWFULLHISTORY_LINK, IDC_SHOW_HISTORY, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
288
{ MENU_END, MENU_END }
291
GlobalMenuBarCommand tools_menu[] = {
292
- { IDS_SHOW_DOWNLOADS, IDC_SHOW_DOWNLOADS },
293
- { IDS_SHOW_HISTORY, IDC_SHOW_HISTORY },
294
- { IDS_SHOW_EXTENSIONS, IDC_MANAGE_EXTENSIONS },
295
+ { IDS_SHOW_DOWNLOADS, IDC_SHOW_DOWNLOADS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
296
+ { IDS_SHOW_HISTORY, IDC_SHOW_HISTORY, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
297
+ { IDS_SHOW_EXTENSIONS, IDC_MANAGE_EXTENSIONS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
299
- { MENU_SEPARATOR, MENU_SEPARATOR },
300
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
302
- { IDS_TASK_MANAGER, IDC_TASK_MANAGER },
303
- { IDS_CLEAR_BROWSING_DATA, IDC_CLEAR_BROWSING_DATA },
304
+ { IDS_TASK_MANAGER, IDC_TASK_MANAGER, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
305
+ { IDS_CLEAR_BROWSING_DATA, IDC_CLEAR_BROWSING_DATA, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
307
- { MENU_SEPARATOR, MENU_SEPARATOR },
308
+ { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
310
- { IDS_VIEW_SOURCE, IDC_VIEW_SOURCE },
311
- { IDS_DEV_TOOLS, IDC_DEV_TOOLS },
312
- { IDS_DEV_TOOLS_CONSOLE, IDC_DEV_TOOLS_CONSOLE },
313
+ { IDS_VIEW_SOURCE, IDC_VIEW_SOURCE, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
314
+ { IDS_DEV_TOOLS, IDC_DEV_TOOLS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
315
+ { IDS_DEV_TOOLS_CONSOLE, IDC_DEV_TOOLS_CONSOLE, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
317
{ MENU_END, MENU_END }
320
GlobalMenuBarCommand help_menu[] = {
321
- { IDS_FEEDBACK, IDC_FEEDBACK },
322
+ { IDS_FEEDBACK, IDC_FEEDBACK, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
323
{ IDS_HELP_PAGE , IDC_HELP_PAGE_VIA_MENU },
324
{ MENU_END, MENU_END }
329
pref_change_registrar_.Init(browser_->profile()->GetPrefs());
330
- pref_change_registrar_.Add(prefs::kShowBookmarkBar, this);
331
- OnBookmarkBarVisibilityChanged();
332
+ if (! browser_->is_chromeless_mode()) {
333
+ pref_change_registrar_.Add(prefs::kShowBookmarkBar, this);
334
+ OnBookmarkBarVisibilityChanged();
338
GlobalMenuBar::~GlobalMenuBar() {
340
std::map<int, GtkWidget*>* id_to_menu_item,
341
GlobalMenuBarCommand* commands,
342
GlobalMenuOwner* owner) {
343
+ // first pass to count the number of "visible" items
345
+ for (int i = 0; commands[i].str_id != MENU_END; ++i) {
346
+ if (!commands[i].visibility_handler || commands[i].visibility_handler(browser_)) {
354
GtkWidget* menu = gtk_menu_new();
355
for (int i = 0; commands[i].str_id != MENU_END; ++i) {
356
+ if (commands[i].visibility_handler && !commands[i].visibility_handler(browser_)) {
359
GtkWidget* menu_item = BuildMenuItem(
360
commands[i].str_id, commands[i].command, commands[i].tag,
361
id_to_menu_item, menu);
362
Index: src/chrome/browser/ui/gtk/browser_window_gtk.cc
363
===================================================================
364
--- src/chrome/browser/ui/gtk/browser_window_gtk.cc (revision 158531)
365
+++ src/chrome/browser/ui/gtk/browser_window_gtk.cc (working copy)
367
gtk_window_util::SetWindowCustomClass(window_,
368
std::string(gdk_get_program_class()) + " (" + user_data_dir + ")");
370
+ else if (browser_->is_chromeless_mode()) {
371
+ // The web application's url associated with the chromeless launch
372
+ // is appended for later reference.
373
+ // TODO: very so-so, find a better approach.
374
+ gtk_window_util::SetWindowCustomClass(window_,
375
+ web_app::GetWMClassFromAppName("chromeless"));
378
// For popups, we initialize widgets then set the window geometry, because
379
// popups need the widgets inited before they can set the window size
383
void BrowserWindowGtk::SetFocusToLocationBar(bool select_all) {
384
- if (!IsFullscreen())
385
+ if (!IsFullscreen() && IsToolbarSupported())
386
GetLocationBar()->FocusLocation(select_all);
389
@@ -1208,6 +1215,21 @@
393
+void BrowserWindowGtk::HandleTabCountChange(bool is_deleting) {
394
+ if (browser_ == NULL || browser_->tab_strip_model() == NULL)
397
+ int count = browser_->tab_strip_model()->count();
398
+ const int HIDE_TAB_COUNT = is_deleting ? 2 : 1;
399
+ if (count == HIDE_TAB_COUNT) {
408
void BrowserWindowGtk::TabDetachedAt(TabContents* contents, int index) {
409
// We use index here rather than comparing |contents| because by this time
410
// the model has already removed |contents| from its list, so
411
@@ -1218,8 +1240,25 @@
412
UpdateDevToolsForContents(NULL);
414
contents_container_->DetachTab(contents);
416
+ if (browser_->is_chromeless_mode())
417
+ HandleTabCountChange(false);
420
+void BrowserWindowGtk::TabInsertedAt(TabContents* contents,
423
+ if (browser_->is_chromeless_mode())
424
+ HandleTabCountChange(false);
427
+void BrowserWindowGtk::TabClosingAt(TabStripModel* tab_strip_model,
428
+ TabContents* contents,
430
+ if (browser_->is_chromeless_mode())
431
+ HandleTabCountChange(true);
434
void BrowserWindowGtk::ActiveTabChanged(TabContents* old_contents,
435
TabContents* new_contents,
437
@@ -2173,8 +2212,12 @@
440
void BrowserWindowGtk::ShowSupportedWindowFeatures() {
441
- if (IsTabStripSupported())
443
+ if (IsTabStripSupported()) {
444
+ if (browser_->is_chromeless_mode())
445
+ HandleTabCountChange(false);
450
if (IsToolbarSupported()) {
452
@@ -2187,8 +2230,12 @@
455
void BrowserWindowGtk::HideUnsupportedWindowFeatures() {
456
- if (!IsTabStripSupported())
458
+ if (!IsTabStripSupported()) {
459
+ if (browser_->is_chromeless_mode())
460
+ HandleTabCountChange(false);
465
if (!IsToolbarSupported())
467
@@ -2274,7 +2321,8 @@
469
bool BrowserWindowGtk::UseCustomFrame() const {
470
// We don't use the custom frame for app mode windows or app window popups.
471
- return use_custom_frame_pref_.GetValue() && !browser_->is_app();
472
+ return use_custom_frame_pref_.GetValue() &&
473
+ !browser_->is_app() && !browser_->is_chromeless_mode();
476
void BrowserWindowGtk::PlaceBookmarkBar(bool is_floating) {
477
Index: src/chrome/browser/ui/gtk/browser_window_gtk.h
478
===================================================================
479
--- src/chrome/browser/ui/gtk/browser_window_gtk.h (revision 165188)
480
+++ src/chrome/browser/ui/gtk/browser_window_gtk.h (working copy)
483
bool user_gesture) OVERRIDE;
485
+ virtual void TabInsertedAt(TabContents* contents,
487
+ bool foreground) OVERRIDE;
488
+ virtual void TabClosingAt(TabStripModel* tab_strip_model,
489
+ TabContents* contents,
490
+ int index) OVERRIDE;
492
// Overridden from ActiveWindowWatcherXObserver.
493
virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE;
497
void ConnectAccelerators();
500
+ void HandleTabCountChange(bool is_deleting);
502
// Whether we should draw the tab background instead of the theme_frame
503
// background because this window is a popup.
504
bool UsingCustomPopupFrame() const;
505
Index: src/chrome/browser/ui/browser.cc
506
===================================================================
507
--- src/chrome/browser/ui/browser.cc (revision 158531)
508
+++ src/chrome/browser/ui/browser.cc (working copy)
511
host_desktop_type(kDefaultHostDesktopType),
512
app_type(APP_TYPE_HOST),
513
+ is_chromeless_mode(false),
514
initial_show_state(ui::SHOW_STATE_DEFAULT),
515
is_session_restore(false),
519
host_desktop_type(kDefaultHostDesktopType),
520
app_type(APP_TYPE_HOST),
521
+ is_chromeless_mode(false),
522
initial_show_state(ui::SHOW_STATE_DEFAULT),
523
is_session_restore(false),
527
host_desktop_type(kDefaultHostDesktopType),
528
app_type(APP_TYPE_HOST),
529
+ is_chromeless_mode(false),
530
initial_show_state(ui::SHOW_STATE_DEFAULT),
531
is_session_restore(false),
533
@@ -289,12 +292,21 @@
535
host_desktop_type(host_desktop_type),
536
app_type(APP_TYPE_HOST),
537
+ is_chromeless_mode(false),
538
initial_show_state(ui::SHOW_STATE_DEFAULT),
539
is_session_restore(false),
544
+Browser::CreateParams Browser::CreateParams::CreateChromeless(Profile * profile)
546
+ CreateParams params(profile);
547
+ params.is_chromeless_mode = true;
552
Browser::CreateParams Browser::CreateParams::CreateForApp(
554
const std::string& app_name,
556
tab_strip_model_(new TabStripModel(tab_strip_model_delegate_.get(),
558
app_name_(params.app_name),
559
+ is_chromeless_mode_(params.is_chromeless_mode),
560
app_type_(params.app_type),
561
chrome_updater_factory_(this),
562
cancel_download_confirmation_state_(NOT_PROMPTED),
564
return find_bar_controller_.get() != NULL;
567
+bool Browser::is_chromeless_mode () const {
568
+ return is_chromeless_mode_;
571
bool Browser::is_app() const {
572
return !app_name_.empty();
576
int string_id = IDS_BROWSER_WINDOW_TITLE_FORMAT;
577
// Don't append the app name to window titles on app frames and app popups
579
+ if (is_app() || is_chromeless_mode())
580
string_id = IDS_BROWSER_WINDOW_TITLE_FORMAT_NO_LOGO;
581
return l10n_util::GetStringFUTF16(string_id, title);
584
tab_restore_service->BrowserClosing(tab_restore_service_delegate());
587
- if (tab_restore_service && is_type_tabbed() && tab_count())
588
+ if (tab_restore_service && is_type_tabbed() &&
589
+ !is_chromeless_mode() && tab_count())
590
tab_restore_service->BrowserClosing(tab_restore_service_delegate());
592
// TODO(sky): convert session/tab restore to use notification.
593
@@ -2215,20 +2233,20 @@
595
unsigned int features = FEATURE_INFOBAR | FEATURE_DOWNLOADSHELF;
597
- if (is_type_tabbed())
598
+ if (is_type_tabbed() && !is_chromeless_mode())
599
features |= FEATURE_BOOKMARKBAR;
601
if (!hide_ui_for_fullscreen) {
602
- if (!is_type_tabbed())
603
+ if (is_type_tabbed() && !is_chromeless_mode())
604
features |= FEATURE_TITLEBAR;
606
if (is_type_tabbed())
607
features |= FEATURE_TABSTRIP;
609
- if (is_type_tabbed())
610
+ if (is_type_tabbed() && !is_chromeless_mode())
611
features |= FEATURE_TOOLBAR;
614
+ if (!is_app() && !is_chromeless_mode())
615
features |= FEATURE_LOCATIONBAR;
617
return !!(features & feature);
618
Index: src/chrome/browser/ui/browser_commands.cc
619
===================================================================
620
--- src/chrome/browser/ui/browser_commands.cc (revision 158531)
621
+++ src/chrome/browser/ui/browser_commands.cc (working copy)
625
void NewTab(Browser* browser) {
626
+ if (browser && browser->is_chromeless_mode())
629
content::RecordAction(UserMetricsAction("NewTab"));
630
// TODO(asvitkine): This is invoked programmatically from several places.
631
// Audit the code and change it so that the histogram only gets collected for
633
bool CanRestoreTab(const Browser* browser) {
634
TabRestoreService* service =
635
TabRestoreServiceFactory::GetForProfile(browser->profile());
636
- return service && !service->entries().empty();
637
+ return service && !service->entries().empty()
638
+ && !browser->is_chromeless_mode();
641
void SelectNextTab(Browser* browser) {
642
Index: src/chrome/browser/ui/browser_command_controller.cc
643
===================================================================
644
--- src/chrome/browser/ui/browser_command_controller.cc (revision 158531)
645
+++ src/chrome/browser/ui/browser_command_controller.cc (working copy)
648
#include "chrome/browser/ui/browser_command_controller.h"
650
+#include "base/command_line.h"
651
#include "chrome/app/chrome_command_ids.h"
652
#include "chrome/browser/browser_process.h"
653
#include "chrome/browser/defaults.h"
655
#include "chrome/browser/ui/tabs/tab_strip_model_utils.h"
656
#include "chrome/browser/ui/webui/sync_promo/sync_promo_ui.h"
657
#include "chrome/common/chrome_notification_types.h"
658
+#include "chrome/common/chrome_switches.h"
659
#include "chrome/common/pref_names.h"
660
#include "chrome/common/profiling.h"
661
#include "content/public/browser/native_web_keyboard_event.h"
663
// BrowserCommandController, private:
665
bool BrowserCommandController::IsShowingMainUI(bool is_fullscreen) {
666
+ const bool started_in_chromeless =
667
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
668
+ || browser_->is_chromeless_mode();
670
#if !defined(OS_MACOSX)
671
- return browser_->is_type_tabbed() && !is_fullscreen;
672
+ return browser_->is_type_tabbed() && !is_fullscreen && !started_in_chromeless;
674
return browser_->is_type_tabbed();
677
// (like Back & Forward with initial page load) must have their state
678
// initialized here, otherwise they will be forever disabled.
680
+ bool started_in_chromeless =
681
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless);
683
// Navigation commands
684
command_updater_.UpdateCommandEnabled(IDC_RELOAD, true);
685
command_updater_.UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE, true);
688
// Window management commands
689
command_updater_.UpdateCommandEnabled(IDC_CLOSE_WINDOW, true);
690
- command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, true);
691
+ command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, !started_in_chromeless);
692
command_updater_.UpdateCommandEnabled(IDC_CLOSE_TAB, true);
693
- command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB, true);
694
+ command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB,
695
+ !started_in_chromeless);
696
command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB, false);
697
command_updater_.UpdateCommandEnabled(IDC_EXIT, true);
698
command_updater_.UpdateCommandEnabled(IDC_DEBUG_FRAME_TOGGLE, true);
699
@@ -848,21 +858,28 @@
700
UpdateCommandsForDevTools();
701
command_updater_.UpdateCommandEnabled(IDC_TASK_MANAGER, CanOpenTaskManager());
702
command_updater_.UpdateCommandEnabled(IDC_SHOW_HISTORY,
703
- !Profile::IsGuestSession());
704
- command_updater_.UpdateCommandEnabled(IDC_SHOW_DOWNLOADS, true);
705
+ !Profile::IsGuestSession() &&
706
+ !started_in_chromeless);
707
+ command_updater_.UpdateCommandEnabled(IDC_SHOW_DOWNLOADS,
708
+ !started_in_chromeless);
709
command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_KEYBOARD, true);
710
command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_MENU, true);
711
command_updater_.UpdateCommandEnabled(IDC_BOOKMARKS_MENU,
712
- !Profile::IsGuestSession());
713
+ !Profile::IsGuestSession() &&
714
+ !started_in_chromeless);
716
command_updater_.UpdateCommandEnabled(
717
- IDC_SHOW_SYNC_SETUP, profile()->GetOriginalProfile()->IsSyncAccessible());
718
+ IDC_SHOW_SYNC_SETUP,
719
+ profile()->GetOriginalProfile()->IsSyncAccessible() &&
720
+ !started_in_chromeless);
722
// Initialize other commands based on the window type.
723
bool normal_window = browser_->is_type_tabbed();
725
// Navigation commands
726
- command_updater_.UpdateCommandEnabled(IDC_HOME, normal_window);
727
+ command_updater_.UpdateCommandEnabled(IDC_HOME,
729
+ !started_in_chromeless);
731
// Window management commands
732
command_updater_.UpdateCommandEnabled(IDC_SELECT_NEXT_TAB, normal_window);
734
command_updater_.UpdateCommandEnabled(IDC_TABPOSE, normal_window);
736
// Show various bits of UI
737
- command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, normal_window);
738
+ command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA,
740
+ !started_in_chromeless);
742
// The upgrade entry and the view incompatibility entry should always be
743
// enabled. Whether they are visible is a separate matter determined on menu
746
// View Background Pages entry is always enabled, but is hidden if there are
747
// no background pages.
748
- command_updater_.UpdateCommandEnabled(IDC_VIEW_BACKGROUND_PAGES, true);
749
+ command_updater_.UpdateCommandEnabled(IDC_VIEW_BACKGROUND_PAGES,
750
+ !started_in_chromeless);
752
// Toggle speech input
753
command_updater_.UpdateCommandEnabled(IDC_TOGGLE_SPEECH_INPUT, true);
754
@@ -916,19 +936,26 @@
757
void BrowserCommandController::UpdateCommandsForIncognitoAvailability() {
758
+ bool started_in_chromeless =
759
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
760
+ || browser_->is_chromeless_mode();
762
IncognitoModePrefs::Availability incognito_availability =
763
IncognitoModePrefs::GetAvailability(profile()->GetPrefs());
764
command_updater_.UpdateCommandEnabled(
766
- incognito_availability != IncognitoModePrefs::FORCED);
767
+ incognito_availability != IncognitoModePrefs::FORCED
768
+ && !started_in_chromeless);
769
command_updater_.UpdateCommandEnabled(
770
IDC_NEW_INCOGNITO_WINDOW,
771
- incognito_availability != IncognitoModePrefs::DISABLED);
772
+ incognito_availability != IncognitoModePrefs::DISABLED
773
+ && !started_in_chromeless);
775
// Bookmark manager and settings page/subpages are forced to open in normal
776
// mode. For this reason we disable these commands when incognito is forced.
777
const bool command_enabled =
778
- incognito_availability != IncognitoModePrefs::FORCED;
779
+ incognito_availability != IncognitoModePrefs::FORCED
780
+ && !started_in_chromeless;
781
command_updater_.UpdateCommandEnabled(
782
IDC_SHOW_BOOKMARK_MANAGER,
783
browser_defaults::bookmarks_enabled && command_enabled);
784
@@ -962,17 +989,20 @@
786
// Window management commands
787
command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB,
788
- !browser_->is_app() && CanDuplicateTab(browser_));
789
+ !browser_->is_chromeless_mode() && !browser_->is_app()
790
+ && CanDuplicateTab(browser_));
792
// Page-related commands
793
window()->SetStarredState(
794
BookmarkTabHelper::FromWebContents(current_web_contents)->is_starred());
795
window()->ZoomChangedForActiveTab(false);
796
command_updater_.UpdateCommandEnabled(IDC_VIEW_SOURCE,
797
- CanViewSource(browser_));
798
+ CanViewSource(browser_)
799
+ && !browser_->is_chromeless_mode());
800
command_updater_.UpdateCommandEnabled(IDC_EMAIL_PAGE_LOCATION,
801
- CanEmailPageLocation(browser_));
802
- if (browser_->is_devtools())
803
+ CanEmailPageLocation(browser_)
804
+ && !browser_->is_chromeless_mode());
805
+ if (browser_->is_devtools() && browser_->is_chromeless_mode())
806
command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, false);
808
// Changing the encoding is not possible on Chrome-internal webpages.
810
#if !defined(OS_MACOSX)
811
command_updater_.UpdateCommandEnabled(
812
IDC_CREATE_SHORTCUTS,
813
- CanCreateApplicationShortcuts(browser_));
814
+ CanCreateApplicationShortcuts(browser_)
815
+ && !browser_->is_chromeless_mode());
818
command_updater_.UpdateCommandEnabled(
819
@@ -1027,21 +1058,31 @@
822
void BrowserCommandController::UpdateCommandsForBookmarkEditing() {
823
+ bool started_in_chromeless =
824
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
825
+ || browser_->is_chromeless_mode();
827
command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_PAGE,
828
- CanBookmarkCurrentPage(browser_));
829
+ CanBookmarkCurrentPage(browser_)
830
+ && !started_in_chromeless);
831
command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_ALL_TABS,
832
- CanBookmarkAllTabs(browser_));
833
+ CanBookmarkAllTabs(browser_)
834
+ && !started_in_chromeless);
835
command_updater_.UpdateCommandEnabled(IDC_PIN_TO_START_SCREEN,
837
+ !started_in_chromeless);
840
void BrowserCommandController::UpdateCommandsForBookmarkBar() {
841
+ const bool started_in_chromeless =
842
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
843
+ || browser_->is_chromeless_mode();
845
const bool show_main_ui =
846
IsShowingMainUI(window() && window()->IsFullscreen());
847
command_updater_.UpdateCommandEnabled(IDC_SHOW_BOOKMARK_BAR,
848
browser_defaults::bookmarks_enabled &&
849
!profile()->GetPrefs()->IsManagedPreference(prefs::kShowBookmarkBar) &&
851
+ show_main_ui && !started_in_chromeless);
854
void BrowserCommandController::UpdateCommandsForFullscreenMode(
855
@@ -1098,6 +1139,7 @@
857
bool fullscreen_enabled =
858
!(browser_->is_type_panel() && browser_->is_app()) &&
859
+ !browser_->is_chromeless_mode() &&
860
fullscreen_mode != FULLSCREEN_METRO_SNAP;
861
#if defined(OS_MACOSX)
862
// The Mac implementation doesn't support switching to fullscreen while
863
@@ -1153,7 +1195,12 @@
865
enabled = local_state->GetBoolean(prefs::kAllowFileSelectionDialogs);
867
- command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, enabled);
868
+ const bool started_in_chromeless =
869
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
870
+ || browser_->is_chromeless_mode();
872
+ command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE,
873
+ enabled && !started_in_chromeless);
876
void BrowserCommandController::UpdateReloadStopState(bool is_loading,
877
Index: src/chrome/browser/ui/browser.h
878
===================================================================
879
--- src/chrome/browser/ui/browser.h (revision 158531)
880
+++ src/chrome/browser/ui/browser.h (working copy)
882
const gfx::Rect& window_bounds,
885
+ // Like Create, but creates a chromeless browser.
886
+ static CreateParams CreateChromeless(Profile * profile);
888
static CreateParams CreateForDevTools(Profile* profile);
892
// Type of app (host or child). See description of AppType.
895
+ // If the browser instance is supposed to be a chromeless one.
896
+ bool is_chromeless_mode;
898
// The bounds of the window to open.
899
gfx::Rect initial_bounds;
902
bool is_type_popup() const { return type_ == TYPE_POPUP; }
903
bool is_type_panel() const { return type_ == TYPE_PANEL; }
905
+ bool is_chromeless_mode() const;
907
bool is_devtools() const;
910
// 2) we launch an undocked devtool window.
911
std::string app_name_;
913
+ bool is_chromeless_mode_;
915
// Type of app (host or child). See description of AppType.
918
Index: src/chrome/browser/extensions/extension_module.h
919
===================================================================
920
--- src/chrome/browser/extensions/extension_module.h (revision 158531)
921
+++ src/chrome/browser/extensions/extension_module.h (working copy)
923
virtual bool RunImpl() OVERRIDE;
926
+class IsChromelessWindowFunction : public SyncExtensionFunction {
928
+ virtual bool RunImpl() OVERRIDE;
929
+ DECLARE_EXTENSION_FUNCTION_NAME("extension.isChromelessWindow");
932
#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_MODULE_H__
933
Index: src/chrome/browser/extensions/extension_function_registry.cc
934
===================================================================
935
--- src/chrome/browser/extensions/extension_function_registry.cc (revision 158531)
936
+++ src/chrome/browser/extensions/extension_function_registry.cc (working copy)
938
RegisterFunction<SetUpdateUrlDataFunction>();
939
RegisterFunction<IsAllowedIncognitoAccessFunction>();
940
RegisterFunction<IsAllowedFileSchemeAccessFunction>();
941
+ RegisterFunction<IsChromelessWindowFunction>();
944
RegisterFunction<extensions::GetBrowserLoginFunction>();
945
Index: src/chrome/browser/extensions/extension_module.cc
946
===================================================================
947
--- src/chrome/browser/extensions/extension_module.cc (revision 158531)
948
+++ src/chrome/browser/extensions/extension_module.cc (working copy)
952
#include "chrome/browser/extensions/extension_prefs.h"
953
+#include "chrome/browser/extensions/extension_tab_util.h"
954
#include "chrome/browser/extensions/extension_service.h"
955
+#include "chrome/browser/ui/browser.h"
956
#include "chrome/browser/profiles/profile.h"
957
+#include "chrome/common/chrome_switches.h"
959
+#if defined(OS_LINUX) && defined(TOOLKIT_GTK)
960
+#include <gdk/gdk.h>
961
+#include <gdk/gdkx.h>
964
+#if defined(OS_LINUX) && defined(TOOLKIT_GTK)
968
+const char kNoCurrentWindowError[] = "No current window";
969
+const char kCouldNotIdentifyTab[] = "Could not find tab with specified ID";
975
extensions::ExtensionPrefs* SetUpdateUrlDataFunction::extension_prefs() {
976
return profile()->GetExtensionService()->extension_prefs();
979
ext_service->AllowFileAccess(extension)));
983
+bool IsChromelessWindowFunction::RunImpl() {
984
+ bool is_chromeless = false;
987
+ if (!args_->GetInteger(0, &tab_id)) {
988
+ Browser* browser = GetCurrentBrowser();
990
+ error_ = kNoCurrentWindowError;
993
+ is_chromeless = browser->is_chromeless_mode();
996
+ Browser* browser = NULL;
997
+ if (!ExtensionTabUtil::GetTabById(tab_id,
1004
+ error_ = kCouldNotIdentifyTab;
1007
+ is_chromeless = browser->is_chromeless_mode();
1010
+ SetResult(Value::CreateBooleanValue(is_chromeless));
1014
Index: src/chrome/common/extensions/api/extension.json
1015
===================================================================
1016
--- src/chrome/common/extensions/api/extension.json (revision 158531)
1017
+++ src/chrome/common/extensions/api/extension.json (working copy)
1018
@@ -254,6 +254,32 @@
1019
"items": { "type": "object", "isInstanceOf": "global", "additionalProperties": { "type": "any" } }
1023
+ "name": "isChromelessWindow",
1024
+ "type": "function",
1025
+ "unprivileged": true,
1026
+ "description": "Checks is a given extension runs part of a chromeless window.",
1029
+ "type": "integer",
1032
+ "description": "The tab id corresponding to the window to restrict the request to."
1036
+ "type": "function",
1037
+ "name": "callback",
1040
+ "name": "isChromelessWindow",
1041
+ "type": "boolean",
1042
+ "description": "True if the extension runs part of a chromeless window, false otherwise."
1049
"name": "isAllowedIncognitoAccess",
1051
Index: src/chrome/common/chrome_switches.cc
1052
===================================================================
1053
--- src/chrome/common/chrome_switches.cc (revision 158531)
1054
+++ src/chrome/common/chrome_switches.cc (working copy)
1056
// Chrome Frame automation channel is closed.
1057
const char kChromeFrameShutdownDelay[] = "chrome-frame-shutdown-delay";
1059
+// Specifies a given URL to be opened in a chromeless mode.
1060
+const char kChromeless[] = "chromeless";
1062
// Tells chrome to load the specified version of chrome.dll on Windows. If this
1063
// version cannot be loaded, Chrome will exit.
1064
const char kChromeVersion[] = "chrome-version";
1065
Index: src/chrome/common/chrome_switches.h
1066
===================================================================
1067
--- src/chrome/common/chrome_switches.h (revision 158531)
1068
+++ src/chrome/common/chrome_switches.h (working copy)
1070
extern const char kCheckForUpdateIntervalSec[];
1071
extern const char kCheckCloudPrintConnectorPolicy[];
1072
extern const char kChromeFrameShutdownDelay[];
1073
+extern const char kChromeless[];
1074
extern const char kChromeVersion[];
1075
extern const char kCipherSuiteBlacklist[];
1076
extern const char kClearTokenService[];