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
gtk_window_util::SetWindowCustomClass(window_,
371
std::string(gdk_get_program_class()) + " (" + user_data_dir + ")");
373
+ else if (browser_->is_chromeless_mode()) {
374
+ gtk_window_util::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
@@ -1219,6 +1243,21 @@
392
+void BrowserWindowGtk::HandleTabCountChange(bool is_deleting) {
393
+ 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 (browser_->is_chromeless_mode() && count == HIDE_TAB_COUNT) {
407
void BrowserWindowGtk::TabDetachedAt(TabContents* contents, int index) {
408
// We use index here rather than comparing |contents| because by this time
409
// the model has already removed |contents| from its list, so
410
@@ -1229,8 +1268,22 @@
411
UpdateDevToolsForContents(NULL);
413
contents_container_->DetachTab(contents);
415
+ HandleTabCountChange(false);
418
+void BrowserWindowGtk::TabInsertedAt(TabContents* contents,
421
+ HandleTabCountChange(false);
424
+void BrowserWindowGtk::TabClosingAt(TabStripModel* tab_strip_model,
425
+ TabContents* contents,
427
+ HandleTabCountChange(true);
430
void BrowserWindowGtk::ActiveTabChanged(TabContents* old_contents,
431
TabContents* new_contents,
433
@@ -2281,7 +2334,7 @@
435
void BrowserWindowGtk::ShowSupportedWindowFeatures() {
436
if (IsTabStripSupported())
438
+ HandleTabCountChange(false);
440
if (IsToolbarSupported()) {
442
@@ -2295,7 +2348,7 @@
444
void BrowserWindowGtk::HideUnsupportedWindowFeatures() {
445
if (!IsTabStripSupported())
447
+ HandleTabCountChange(false);
449
if (!IsToolbarSupported())
451
@@ -2385,7 +2438,7 @@
453
bool BrowserWindowGtk::UseCustomFrame() const {
454
// We don't use the custom frame for app mode windows or app window popups.
455
- return use_custom_frame_pref_.GetValue() && !browser_->is_app();
456
+ return use_custom_frame_pref_.GetValue() && !browser_->is_app() && !browser_->is_chromeless_mode();
459
void BrowserWindowGtk::PlaceBookmarkBar(bool is_floating) {
460
Index: src/chrome/browser/ui/gtk/browser_window_gtk.h
461
===================================================================
462
--- src/chrome/browser/ui/gtk/browser_window_gtk.h (revision 165188)
463
+++ src/chrome/browser/ui/gtk/browser_window_gtk.h (working copy)
465
TabContents* new_contents,
467
bool user_gesture) OVERRIDE;
468
+ virtual void TabInsertedAt(TabContents* contents,
470
+ bool foreground) OVERRIDE;
471
+ virtual void TabClosingAt(TabStripModel* tab_strip_model,
472
+ TabContents* contents,
473
+ int index) OVERRIDE;
475
// Overridden from ActiveWindowWatcherXObserver.
476
virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE;
479
void ConnectAccelerators();
482
+ void HandleTabCountChange(bool is_deleting);
484
// Whether we should draw the tab background instead of the theme_frame
485
// background because this window is a popup.
486
bool UsingCustomPopupFrame() const;
487
Index: src/chrome/browser/ui/browser.cc
488
===================================================================
489
--- src/chrome/browser/ui/browser.cc (revision 158531)
490
+++ src/chrome/browser/ui/browser.cc (working copy)
493
host_desktop_type(kDefaultHostDesktopType),
494
app_type(APP_TYPE_HOST),
495
+ is_chromeless_mode(false),
496
initial_show_state(ui::SHOW_STATE_DEFAULT),
497
is_session_restore(false),
501
host_desktop_type(kDefaultHostDesktopType),
502
app_type(APP_TYPE_HOST),
503
+ is_chromeless_mode(false),
504
initial_show_state(ui::SHOW_STATE_DEFAULT),
505
is_session_restore(false),
509
host_desktop_type(kDefaultHostDesktopType),
510
app_type(APP_TYPE_HOST),
511
+ is_chromeless_mode(false),
512
initial_show_state(ui::SHOW_STATE_DEFAULT),
513
is_session_restore(false),
517
host_desktop_type(host_desktop_type),
518
app_type(APP_TYPE_HOST),
519
+ is_chromeless_mode(false),
520
initial_show_state(ui::SHOW_STATE_DEFAULT),
521
is_session_restore(false),
527
+Browser::CreateParams Browser::CreateParams::CreateChromeless(Profile * profile)
529
+ CreateParams params(profile);
530
+ params.is_chromeless_mode = true;
535
Browser::CreateParams Browser::CreateParams::CreateForDevTools(
537
CreateParams params(TYPE_POPUP, profile);
539
ALLOW_THIS_IN_INITIALIZER_LIST(
540
tab_strip_model_(new TabStripModel(tab_strip_model_delegate_.get(),
542
- app_name_(params.app_name),
543
+ app_name_(params.app_name),
544
+ is_chromeless_mode_(params.is_chromeless_mode),
545
app_type_(params.app_type),
546
chrome_updater_factory_(this),
547
cancel_download_confirmation_state_(NOT_PROMPTED),
549
return find_bar_controller_.get() != NULL;
552
+bool Browser::is_chromeless_mode () const {
553
+ return is_chromeless_mode_;
556
bool Browser::is_app() const {
557
return !app_name_.empty();
561
int string_id = IDS_BROWSER_WINDOW_TITLE_FORMAT;
562
// Don't append the app name to window titles on app frames and app popups
564
+ if (is_app() || is_chromeless_mode())
565
string_id = IDS_BROWSER_WINDOW_TITLE_FORMAT_NO_LOGO;
566
return l10n_util::GetStringFUTF16(string_id, title);
569
tab_restore_service->BrowserClosing(tab_restore_service_delegate());
572
- if (tab_restore_service && is_type_tabbed() && tab_count())
573
+ if (tab_restore_service && is_type_tabbed() && !is_chromeless_mode() && tab_count())
574
tab_restore_service->BrowserClosing(tab_restore_service_delegate());
576
// TODO(sky): convert session/tab restore to use notification.
577
@@ -1466,7 +1482,7 @@
578
const history::HistoryAddPageArgs& add_page_args,
579
content::NavigationType navigation_type) {
580
// Don't update history if running as app.
581
- return !IsApplication();
582
+ return !IsApplication() && !is_chromeless_mode();
585
bool Browser::ShouldCreateWebContents(
586
@@ -2163,20 +2179,20 @@
588
unsigned int features = FEATURE_INFOBAR | FEATURE_DOWNLOADSHELF;
590
- if (is_type_tabbed())
591
+ if (is_type_tabbed() && !is_chromeless_mode())
592
features |= FEATURE_BOOKMARKBAR;
594
if (!hide_ui_for_fullscreen) {
595
- if (!is_type_tabbed())
596
+ if (is_type_tabbed() && !is_chromeless_mode())
597
features |= FEATURE_TITLEBAR;
600
if (is_type_tabbed())
601
features |= FEATURE_TABSTRIP;
603
- if (is_type_tabbed())
605
+ if (is_type_tabbed() && !is_chromeless_mode())
606
features |= FEATURE_TOOLBAR;
610
+ if (is_type_tabbed() && !is_chromeless_mode())
611
features |= FEATURE_LOCATIONBAR;
613
return !!(features & feature);
614
Index: src/chrome/browser/ui/browser_commands.cc
615
===================================================================
616
--- src/chrome/browser/ui/browser_commands.cc (revision 158531)
617
+++ src/chrome/browser/ui/browser_commands.cc (working copy)
620
void NewTab(Browser* browser) {
621
content::RecordAction(UserMetricsAction("NewTab"));
623
+ if (browser->is_chromeless_mode())
626
// TODO(asvitkine): This is invoked programmatically from several places.
627
// Audit the code and change it so that the histogram only gets collected for
628
// user-initiated commands.
630
bool CanRestoreTab(const Browser* browser) {
631
TabRestoreService* service =
632
TabRestoreServiceFactory::GetForProfile(browser->profile());
633
- return service && !service->entries().empty();
634
+ return service && !service->entries().empty()
635
+ && !browser->is_chromeless_mode();
638
void SelectNextTab(Browser* browser) {
639
Index: src/chrome/browser/ui/browser_command_controller.cc
640
===================================================================
641
--- src/chrome/browser/ui/browser_command_controller.cc (revision 158531)
642
+++ src/chrome/browser/ui/browser_command_controller.cc (working copy)
645
#include "chrome/browser/ui/browser_command_controller.h"
647
+#include "base/command_line.h"
648
#include "chrome/app/chrome_command_ids.h"
649
#include "chrome/browser/browser_process.h"
650
#include "chrome/browser/defaults.h"
652
#include "chrome/browser/ui/tabs/tab_strip_model.h"
653
#include "chrome/browser/ui/webui/sync_promo/sync_promo_ui.h"
654
#include "chrome/common/chrome_notification_types.h"
655
+#include "chrome/common/chrome_switches.h"
656
#include "chrome/common/pref_names.h"
657
#include "chrome/common/profiling.h"
658
#include "content/public/browser/native_web_keyboard_event.h"
660
// BrowserCommandController, private:
662
bool BrowserCommandController::IsShowingMainUI(bool is_fullscreen) {
663
+ const bool started_in_chromeless =
664
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
665
+ || browser_->is_chromeless_mode();
667
#if !defined(OS_MACOSX)
668
- return browser_->is_type_tabbed() && !is_fullscreen;
669
+ return browser_->is_type_tabbed() && !is_fullscreen && !started_in_chromeless;
671
return browser_->is_type_tabbed();
674
// (like Back & Forward with initial page load) must have their state
675
// initialized here, otherwise they will be forever disabled.
677
+ bool started_in_chromeless =
678
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless);
680
// Navigation commands
681
command_updater_.UpdateCommandEnabled(IDC_RELOAD, true);
682
command_updater_.UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE, true);
683
@@ -710,10 +718,12 @@
685
// Window management commands
686
command_updater_.UpdateCommandEnabled(IDC_CLOSE_WINDOW, true);
687
- command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, true);
688
+ command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, !started_in_chromeless);
689
command_updater_.UpdateCommandEnabled(IDC_CLOSE_TAB, true);
690
- command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB, true);
691
- command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB, false);
692
+ command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB,
693
+ !started_in_chromeless);
694
+ command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB,
695
+ !started_in_chromeless);
696
command_updater_.UpdateCommandEnabled(IDC_EXIT, true);
697
command_updater_.UpdateCommandEnabled(IDC_DEBUG_FRAME_TOGGLE, true);
699
@@ -769,25 +779,33 @@
700
command_updater_.UpdateCommandEnabled(IDC_CREATE_SHORTCUTS, false);
701
UpdateCommandsForDevTools();
702
command_updater_.UpdateCommandEnabled(IDC_TASK_MANAGER, CanOpenTaskManager());
703
- command_updater_.UpdateCommandEnabled(IDC_SHOW_HISTORY, true);
704
- command_updater_.UpdateCommandEnabled(IDC_SHOW_DOWNLOADS, true);
705
+ command_updater_.UpdateCommandEnabled(IDC_SHOW_HISTORY,
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, true);
712
+ command_updater_.UpdateCommandEnabled(IDC_BOOKMARKS_MENU,
713
+ !started_in_chromeless);
715
command_updater_.UpdateCommandEnabled(
716
- IDC_SHOW_SYNC_SETUP, profile()->GetOriginalProfile()->IsSyncAccessible());
717
+ IDC_SHOW_SYNC_SETUP,
718
+ profile()->GetOriginalProfile()->IsSyncAccessible()
719
+ && !started_in_chromeless);
721
// Initialize other commands based on the window type.
722
bool normal_window = browser_->is_type_tabbed();
724
// Navigation commands
725
- command_updater_.UpdateCommandEnabled(IDC_HOME, normal_window);
726
+ command_updater_.UpdateCommandEnabled(IDC_HOME,
728
+ && !started_in_chromeless);
730
// Window management commands
731
// TODO(rohitrao): Disable fullscreen on non-Lion?
732
command_updater_.UpdateCommandEnabled(IDC_FULLSCREEN,
733
- !(browser_->is_type_panel() && browser_->is_app()));
734
+ !(browser_->is_type_panel() && browser_->is_app()
735
+ && started_in_chromeless));
736
command_updater_.UpdateCommandEnabled(IDC_SELECT_NEXT_TAB, normal_window);
737
command_updater_.UpdateCommandEnabled(IDC_SELECT_PREVIOUS_TAB,
740
!browser_->is_devtools());
742
// Show various bits of UI
743
- command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, normal_window);
744
+ command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA,
746
+ && !started_in_chromeless);
748
// The upgrade entry and the view incompatibility entry should always be
749
// enabled. Whether they are visible is a separate matter determined on menu
752
// View Background Pages entry is always enabled, but is hidden if there are
753
// no background pages.
754
- command_updater_.UpdateCommandEnabled(IDC_VIEW_BACKGROUND_PAGES, true);
755
+ command_updater_.UpdateCommandEnabled(IDC_VIEW_BACKGROUND_PAGES,
756
+ !started_in_chromeless);
758
// Toggle speech input
759
command_updater_.UpdateCommandEnabled(IDC_TOGGLE_SPEECH_INPUT, true);
760
@@ -847,19 +868,26 @@
763
void BrowserCommandController::UpdateCommandsForIncognitoAvailability() {
764
+ bool started_in_chromeless =
765
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
766
+ || browser_->is_chromeless_mode();
768
IncognitoModePrefs::Availability incognito_availability =
769
IncognitoModePrefs::GetAvailability(profile()->GetPrefs());
770
command_updater_.UpdateCommandEnabled(
772
- incognito_availability != IncognitoModePrefs::FORCED);
773
+ incognito_availability != IncognitoModePrefs::FORCED
774
+ && !started_in_chromeless);
775
command_updater_.UpdateCommandEnabled(
776
IDC_NEW_INCOGNITO_WINDOW,
777
- incognito_availability != IncognitoModePrefs::DISABLED);
778
+ incognito_availability != IncognitoModePrefs::DISABLED
779
+ && !started_in_chromeless);
781
// Bookmark manager and settings page/subpages are forced to open in normal
782
// mode. For this reason we disable these commands when incognito is forced.
783
const bool command_enabled =
784
- incognito_availability != IncognitoModePrefs::FORCED;
785
+ incognito_availability != IncognitoModePrefs::FORCED
786
+ && !started_in_chromeless;
787
command_updater_.UpdateCommandEnabled(
788
IDC_SHOW_BOOKMARK_MANAGER,
789
browser_defaults::bookmarks_enabled && command_enabled);
792
// Window management commands
793
command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB,
794
- !browser_->is_app() && CanDuplicateTab(browser_));
795
+ !browser_->is_chromeless_mode() && !browser_->is_app()
796
+ && CanDuplicateTab(browser_));
798
// Page-related commands
799
window()->SetStarredState(
800
@@ -904,10 +933,12 @@
801
window()->SetZoomIconTooltipPercent(
802
current_tab_contents->zoom_controller()->zoom_percent());
803
command_updater_.UpdateCommandEnabled(IDC_VIEW_SOURCE,
804
- CanViewSource(browser_));
805
+ CanViewSource(browser_)
806
+ && !browser_->is_chromeless_mode());
807
command_updater_.UpdateCommandEnabled(IDC_EMAIL_PAGE_LOCATION,
808
- CanEmailPageLocation(browser_));
809
- if (browser_->is_devtools())
810
+ CanEmailPageLocation(browser_)
811
+ && !browser_->is_chromeless_mode());
812
+ if (browser_->is_devtools() && browser_->is_chromeless_mode())
813
command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, false);
815
// Changing the encoding is not possible on Chrome-internal webpages.
817
#if !defined(OS_MACOSX)
818
command_updater_.UpdateCommandEnabled(
819
IDC_CREATE_SHORTCUTS,
820
- CanCreateApplicationShortcuts(browser_));
821
+ CanCreateApplicationShortcuts(browser_)
822
+ && !browser_->is_chromeless_mode());
825
UpdateCommandsForContentRestrictionState();
826
@@ -955,21 +987,31 @@
829
void BrowserCommandController::UpdateCommandsForBookmarkEditing() {
830
+ bool started_in_chromeless =
831
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
832
+ || browser_->is_chromeless_mode();
834
command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_PAGE,
835
- CanBookmarkCurrentPage(browser_));
836
+ CanBookmarkCurrentPage(browser_)
837
+ && !started_in_chromeless);
838
command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_ALL_TABS,
839
- CanBookmarkAllTabs(browser_));
840
+ CanBookmarkAllTabs(browser_)
841
+ && !started_in_chromeless);
842
command_updater_.UpdateCommandEnabled(IDC_PIN_TO_START_SCREEN,
844
+ !started_in_chromeless);
847
void BrowserCommandController::UpdateCommandsForBookmarkBar() {
848
+ const bool started_in_chromeless =
849
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
850
+ || browser_->is_chromeless_mode();
852
const bool show_main_ui =
853
IsShowingMainUI(window() && window()->IsFullscreen());
854
command_updater_.UpdateCommandEnabled(IDC_SHOW_BOOKMARK_BAR,
855
browser_defaults::bookmarks_enabled &&
856
!profile()->GetPrefs()->IsManagedPreference(prefs::kShowBookmarkBar) &&
858
+ show_main_ui && !started_in_chromeless);
861
void BrowserCommandController::UpdateCommandsForFullscreenMode(
862
@@ -1069,7 +1111,12 @@
864
enabled = local_state->GetBoolean(prefs::kAllowFileSelectionDialogs);
866
- command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, enabled);
867
+ const bool started_in_chromeless =
868
+ CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
869
+ || browser_->is_chromeless_mode();
871
+ command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE,
872
+ enabled && !started_in_chromeless);
875
void BrowserCommandController::UpdateReloadStopState(bool is_loading,
876
Index: src/chrome/browser/ui/browser.h
877
===================================================================
878
--- src/chrome/browser/ui/browser.h (revision 158531)
879
+++ src/chrome/browser/ui/browser.h (working copy)
881
const gfx::Rect& window_bounds,
884
+ // Like Create, but creates a chromeless browser.
885
+ static CreateParams CreateChromeless(Profile * profile);
887
static CreateParams CreateForDevTools(Profile* profile);
891
// Type of app (host or child). See description of AppType.
894
+ // If the browser instance is supposed to be a chromeless one.
895
+ bool is_chromeless_mode;
897
// The bounds of the window to open.
898
gfx::Rect initial_bounds;
901
bool is_type_popup() const { return type_ == TYPE_POPUP; }
902
bool is_type_panel() const { return type_ == TYPE_PANEL; }
904
+ bool is_chromeless_mode() const;
906
bool is_devtools() const;
909
// Type of app (host or child). See description of AppType.
912
+ bool is_chromeless_mode_;
914
// Unique identifier of this browser for session restore. This id is only
915
// unique within the current session, and is not guaranteed to be unique
917
Index: src/chrome/browser/extensions/extension_module.h
918
===================================================================
919
--- src/chrome/browser/extensions/extension_module.h (revision 158531)
920
+++ src/chrome/browser/extensions/extension_module.h (working copy)
922
virtual bool RunImpl() OVERRIDE;
925
+class IsChromelessWindowFunction : public SyncExtensionFunction {
927
+ virtual bool RunImpl() OVERRIDE;
928
+ 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)
953
+#if defined(OS_LINUX) && defined(TOOLKIT_GTK)
954
+#include <gdk/gdk.h>
955
+#include <gdk/gdkx.h>
958
#include "chrome/browser/extensions/extension_prefs.h"
959
+#include "chrome/browser/extensions/extension_tab_util.h"
960
#include "chrome/browser/extensions/extension_service.h"
961
+#include "chrome/browser/ui/browser.h"
962
#include "chrome/browser/profiles/profile.h"
963
+#include "chrome/common/chrome_switches.h"
965
+#if defined(OS_LINUX) && defined(TOOLKIT_GTK)
969
+const char kNoCurrentWindowError[] = "No current window";
970
+const char kCouldNotIdentifyTab[] = "Could not find tab with specified ID";
976
extensions::ExtensionPrefs* SetUpdateUrlDataFunction::extension_prefs() {
977
return profile()->GetExtensionService()->extension_prefs();
980
ext_service->AllowFileAccess(extension)));
984
+bool IsChromelessWindowFunction::RunImpl() {
985
+ bool is_chromeless = false;
988
+ if (!args_->GetInteger(0, &tab_id)) {
989
+ Browser* browser = GetCurrentBrowser();
991
+ error_ = kNoCurrentWindowError;
994
+ is_chromeless = browser->is_chromeless_mode();
997
+ Browser* browser = NULL;
998
+ if (!ExtensionTabUtil::GetTabById(tab_id,
1005
+ error_ = kCouldNotIdentifyTab;
1008
+ is_chromeless = browser->is_chromeless_mode();
1011
+ SetResult(Value::CreateBooleanValue(is_chromeless));
1015
Index: src/chrome/common/extensions/api/extension.json
1016
===================================================================
1017
--- src/chrome/common/extensions/api/extension.json (revision 158531)
1018
+++ src/chrome/common/extensions/api/extension.json (working copy)
1019
@@ -193,6 +193,32 @@
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
"description": "Retrieves the state of the extension's access to Incognito-mode (as determined by the user-controlled 'Allowed in Incognito' checkbox.",
1052
Index: src/chrome/common/chrome_switches.cc
1053
===================================================================
1054
--- src/chrome/common/chrome_switches.cc (revision 158531)
1055
+++ src/chrome/common/chrome_switches.cc (working copy)
1057
// Chrome Frame automation channel is closed.
1058
const char kChromeFrameShutdownDelay[] = "chrome-frame-shutdown-delay";
1060
+// Specifies a given URL to be opened in a chromeless mode.
1061
+const char kChromeless[] = "chromeless";
1063
// Tells chrome to load the specified version of chrome.dll on Windows. If this
1064
// version cannot be loaded, Chrome will exit.
1065
const char kChromeVersion[] = "chrome-version";
1066
Index: src/chrome/common/chrome_switches.h
1067
===================================================================
1068
--- src/chrome/common/chrome_switches.h (revision 158531)
1069
+++ src/chrome/common/chrome_switches.h (working copy)
1071
extern const char kCheckForUpdateIntervalSec[];
1072
extern const char kCheckCloudPrintConnectorPolicy[];
1073
extern const char kChromeFrameShutdownDelay[];
1074
+extern const char kChromeless[];
1075
extern const char kChromeVersion[];
1076
extern const char kCipherSuiteBlacklist[];
1077
extern const char kClearTokenService[];