~ps-jenkins/unity-chromium-extension/trusty-proposed

« back to all changes in this revision

Viewing changes to chromium-patches/stable-24.0.1312.52/4-chromeless-window-launch-option.patch

  • Committer: CI bot
  • Author(s): Justin McPherson
  • Date: 2014-02-17 23:43:23 UTC
  • mfrom: (239.2.1 remove-patches)
  • Revision ID: ps-jenkins@lists.canonical.com-20140217234323-4pw656wfrooeinde
Chromium patches are no longer maintained in this repo, remove them to avoid confusion. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
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)
5
 
@@ -33,6 +33,7 @@
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"
13
 
@@ -598,6 +599,14 @@
14
 
       if (!ShouldTrackBrowser(browser))
15
 
         return;
16
 
 
17
 
+      // Do not track changes for chromeless windows so that
18
 
+      // it won't be considered for restoration during a 'normal' browser
19
 
+      // instance.
20
 
+      if (browser->is_chromeless_mode() ||
21
 
+          CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)) {
22
 
+        return;
23
 
+      }
24
 
+
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)
32
 
@@ -447,6 +447,16 @@
33
 
   }
34
 
 }
35
 
 
36
 
+bool StartupBrowserCreatorImpl::IsChromelessLaunch(std::string* url)
37
 
+{
38
 
+  if (command_line_.HasSwitch(switches::kChromeless)) {
39
 
+    if (url)
40
 
+      *url = command_line_.GetSwitchValueASCII(switches::kChromeless);
41
 
+    return true;
42
 
+  }
43
 
+  return false;
44
 
+}
45
 
+
46
 
 bool StartupBrowserCreatorImpl::IsAppLaunch(std::string* app_url,
47
 
                                             std::string* app_id) {
48
 
   if (command_line_.HasSwitch(switches::kApp)) {
49
 
@@ -582,6 +592,12 @@
50
 
     return;
51
 
   }
52
 
 
53
 
+  if (IsChromelessLaunch(NULL)) {
54
 
+    // Open user-specified URLs like pinned tabs and startup tabs.
55
 
+    if (ProcessSpecifiedURLs(urls_to_open))
56
 
+      return;
57
 
+  }
58
 
+
59
 
   if (process_startup && ProcessStartupURLs(urls_to_open)) {
60
 
     // ProcessStartupURLs processed the urls, nothing else to do.
61
 
     return;
62
 
@@ -721,7 +737,8 @@
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_);
72
 
@@ -797,6 +814,10 @@
73
 
   if (!profile_ && browser)
74
 
     profile_ = browser->profile();
75
 
 
76
 
+  if (IsChromelessLaunch(NULL)) {
77
 
+    browser = new Browser(Browser::CreateParams::CreateChromeless(profile_));
78
 
+  }
79
 
+
80
 
   if (!browser || !browser->is_type_tabbed()) {
81
 
     browser = new Browser(Browser::CreateParams(profile_));
82
 
   } else {
83
 
@@ -888,6 +909,11 @@
84
 
   if (!browser || !profile_ || browser->tab_count() == 0)
85
 
     return;
86
 
 
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))
90
 
+      return;
91
 
+
92
 
   if (HasPendingUncleanExit(browser->profile()))
93
 
     chrome::ShowSessionCrashedPrompt(browser);
94
 
 
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)
99
 
@@ -72,6 +72,11 @@
100
 
   FRIEND_TEST_ALL_PREFIXES(BrowserTest, RestorePinnedTabs);
101
 
   FRIEND_TEST_ALL_PREFIXES(BrowserTest, AppIdSwitch);
102
 
 
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);
107
 
+
108
 
   // Extracts optional application window size passed in command line.
109
 
   void ExtractOptionalAppWindowSize(gfx::Rect* bounds);
110
 
 
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)
115
 
@@ -782,9 +782,12 @@
116
 
   g_signal_connect(tabstrip_.get(), "drag-data-received",
117
 
                    G_CALLBACK(OnDragDataReceivedThunk), this);
118
 
 
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());
127
 
+  }
128
 
 
129
 
   gtk_widget_show_all(tabstrip_.get());
130
 
 
131
 
@@ -1458,6 +1461,9 @@
132
 
 
133
 
 void TabStripGtk::LayoutNewTabButton(double last_tab_right,
134
 
                                      double unselected_width) {
135
 
+  if (window_ && window_->browser() && window_->browser()->is_chromeless_mode())
136
 
+    return;
137
 
+
138
 
   GtkWidget* toplevel = gtk_widget_get_ancestor(widget(), GTK_TYPE_WINDOW);
139
 
   bool is_maximized = false;
140
 
   if (toplevel) {
141
 
@@ -1511,8 +1517,10 @@
142
 
   int available_width = tabstrip_allocation.width;
143
 
   if (available_width_for_tabs_ < 0) {
144
 
     available_width = bounds_.width();
145
 
-    available_width -=
146
 
+    if (newtab_button_.get() != NULL) {
147
 
+      available_width -=
148
 
         (kNewTabButtonHOffset + newtab_button_->WidgetAllocation().width);
149
 
+    }
150
 
   } else {
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);
155
 
 
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);
163
 
+  }
164
 
 
165
 
   // Paint the tabs in reverse order, so they stack to the left.
166
 
   TabGtk* selected_tab = NULL;
167
 
@@ -2267,6 +2278,9 @@
168
 
 }
169
 
 
170
 
 void TabStripGtk::SetNewTabButtonBackground() {
171
 
+  if (newtab_button_.get() == NULL) {
172
 
+    return;
173
 
+  }
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)
181
 
@@ -24,35 +24,43 @@
182
 
 #include "ui/base/gtk/menu_label_accelerator_util.h"
183
 
 #include "ui/base/l10n/l10n_util.h"
184
 
 
185
 
+typedef bool (*GlobalMenuBarVisibilityHandler) (Browser * browser);
186
 
+
187
 
 struct GlobalMenuBarCommand {
188
 
   int str_id;
189
 
   int command;
190
 
   int tag;
191
 
+  GlobalMenuBarVisibilityHandler visibility_handler;
192
 
 };
193
 
 
194
 
 namespace {
195
 
 
196
 
+bool GlobalMenuBarVisibilityHandler_NotInChromelessMode(
197
 
+    Browser * browser) {
198
 
+  return browser && !browser->is_chromeless_mode();
199
 
+}
200
 
+
201
 
 const int MENU_SEPARATOR =-1;
202
 
 const int MENU_END = -2;
203
 
 const int MENU_DISABLED_LABEL = -3;
204
 
 
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 },
218
 
 
219
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
220
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
221
 
 
222
 
-  { IDS_CREATE_SHORTCUTS, IDC_CREATE_SHORTCUTS },
223
 
+  { IDS_CREATE_SHORTCUTS, IDC_CREATE_SHORTCUTS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
224
 
 
225
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
226
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
227
 
 
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 },
232
 
 
233
 
   { MENU_SEPARATOR, MENU_SEPARATOR },
234
 
 
235
 
@@ -70,17 +78,17 @@
236
 
 
237
 
   { IDS_FIND, IDC_FIND },
238
 
 
239
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
240
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
241
 
 
242
 
-  { IDS_PREFERENCES, IDC_OPTIONS },
243
 
+  { IDS_PREFERENCES, IDC_OPTIONS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
244
 
 
245
 
   { MENU_END, MENU_END }
246
 
 };
247
 
 
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 },
251
 
 
252
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
253
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
254
 
 
255
 
   { IDS_STOP_MENU_LINUX, IDC_STOP },
256
 
   { IDS_RELOAD_MENU_LINUX, IDC_RELOAD },
257
 
@@ -96,48 +104,48 @@
258
 
 };
259
 
 
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 },
267
 
 
268
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
269
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
270
 
 
271
 
   { IDS_HISTORY_VISITED_LINUX, MENU_DISABLED_LABEL,
272
 
-    GlobalMenuBar::TAG_MOST_VISITED_HEADER },
273
 
+    GlobalMenuBar::TAG_MOST_VISITED_HEADER, GlobalMenuBarVisibilityHandler_NotInChromelessMode },
274
 
 
275
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
276
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
277
 
 
278
 
   { IDS_HISTORY_CLOSED_LINUX, MENU_DISABLED_LABEL,
279
 
-    GlobalMenuBar::TAG_RECENTLY_CLOSED_HEADER },
280
 
+    GlobalMenuBar::TAG_RECENTLY_CLOSED_HEADER, GlobalMenuBarVisibilityHandler_NotInChromelessMode },
281
 
 
282
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
283
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
284
 
 
285
 
-  { IDS_SHOWFULLHISTORY_LINK, IDC_SHOW_HISTORY },
286
 
+  { IDS_SHOWFULLHISTORY_LINK, IDC_SHOW_HISTORY, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
287
 
 
288
 
   { MENU_END, MENU_END }
289
 
 };
290
 
 
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 },
298
 
 
299
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
300
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
301
 
 
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 },
306
 
 
307
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
308
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
309
 
 
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 },
316
 
 
317
 
   { MENU_END, MENU_END }
318
 
 };
319
 
 
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 }
325
 
 };
326
 
@@ -190,8 +198,10 @@
327
 
   }
328
 
 
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();
335
 
+  }
336
 
 }
337
 
 
338
 
 GlobalMenuBar::~GlobalMenuBar() {
339
 
@@ -214,8 +224,22 @@
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
344
 
+  size_t count = 0;
345
 
+  for (int i = 0; commands[i].str_id != MENU_END; ++i) {
346
 
+    if (!commands[i].visibility_handler || commands[i].visibility_handler(browser_)) {
347
 
+      count++;
348
 
+    }
349
 
+  }
350
 
+  if (0 == count) {
351
 
+    return;
352
 
+  }
353
 
+
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_)) {
357
 
+      continue;
358
 
+    }
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)
366
 
@@ -305,6 +305,13 @@
367
 
     gtk_window_util::SetWindowCustomClass(window_,
368
 
         std::string(gdk_get_program_class()) + " (" + user_data_dir + ")");
369
 
   }
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"));
376
 
+  }
377
 
 
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
380
 
@@ -873,7 +880,7 @@
381
 
 }
382
 
 
383
 
 void BrowserWindowGtk::SetFocusToLocationBar(bool select_all) {
384
 
-  if (!IsFullscreen())
385
 
+  if (!IsFullscreen() && IsToolbarSupported())
386
 
     GetLocationBar()->FocusLocation(select_all);
387
 
 }
388
 
 
389
 
@@ -1208,6 +1215,21 @@
390
 
   }
391
 
 }
392
 
 
393
 
+void BrowserWindowGtk::HandleTabCountChange(bool is_deleting) {
394
 
+  if (browser_ == NULL || browser_->tab_strip_model() == NULL)
395
 
+    return;
396
 
+
397
 
+  int count = browser_->tab_strip_model()->count();
398
 
+  const int HIDE_TAB_COUNT = is_deleting ? 2 : 1;
399
 
+  if (count == HIDE_TAB_COUNT) {
400
 
+    tabstrip_->Hide();
401
 
+  }
402
 
+  else {
403
 
+    tabstrip_->Show();
404
 
+  }
405
 
+}
406
 
+
407
 
+
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);
413
 
   }
414
 
   contents_container_->DetachTab(contents);
415
 
+
416
 
+  if (browser_->is_chromeless_mode())
417
 
+    HandleTabCountChange(false);
418
 
 }
419
 
 
420
 
+void BrowserWindowGtk::TabInsertedAt(TabContents* contents,
421
 
+                             int index,
422
 
+                             bool foreground) {
423
 
+  if (browser_->is_chromeless_mode())
424
 
+    HandleTabCountChange(false);
425
 
+}
426
 
+
427
 
+void BrowserWindowGtk::TabClosingAt(TabStripModel* tab_strip_model,
428
 
+                                    TabContents* contents,
429
 
+                                    int index) {
430
 
+  if (browser_->is_chromeless_mode())
431
 
+    HandleTabCountChange(true);
432
 
+}
433
 
+
434
 
 void BrowserWindowGtk::ActiveTabChanged(TabContents* old_contents,
435
 
                                         TabContents* new_contents,
436
 
                                         int index,
437
 
@@ -2173,8 +2212,12 @@
438
 
 }
439
 
 
440
 
 void BrowserWindowGtk::ShowSupportedWindowFeatures() {
441
 
-  if (IsTabStripSupported())
442
 
-    tabstrip_->Show();
443
 
+  if (IsTabStripSupported()) {
444
 
+    if (browser_->is_chromeless_mode())
445
 
+      HandleTabCountChange(false);
446
 
+    else
447
 
+      tabstrip_->Show();
448
 
+  }
449
 
 
450
 
   if (IsToolbarSupported()) {
451
 
     toolbar_->Show();
452
 
@@ -2187,8 +2230,12 @@
453
 
 }
454
 
 
455
 
 void BrowserWindowGtk::HideUnsupportedWindowFeatures() {
456
 
-  if (!IsTabStripSupported())
457
 
-    tabstrip_->Hide();
458
 
+  if (!IsTabStripSupported()) {
459
 
+    if (browser_->is_chromeless_mode())
460
 
+      HandleTabCountChange(false);
461
 
+    else
462
 
+      tabstrip_->Hide();
463
 
+  }
464
 
 
465
 
   if (!IsToolbarSupported())
466
 
     toolbar_->Hide();
467
 
@@ -2274,7 +2321,8 @@
468
 
 
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();
474
 
 }
475
 
 
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)
481
 
@@ -188,6 +188,13 @@
482
 
                                 int index,
483
 
                                 bool user_gesture) OVERRIDE;
484
 
 
485
 
+  virtual void TabInsertedAt(TabContents* contents,
486
 
+                             int index,
487
 
+                             bool foreground) OVERRIDE;
488
 
+  virtual void TabClosingAt(TabStripModel* tab_strip_model,
489
 
+                            TabContents* contents,
490
 
+                            int index) OVERRIDE;
491
 
492
 
   // Overridden from ActiveWindowWatcherXObserver.
493
 
   virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE;
494
 
 
495
 
@@ -328,6 +335,9 @@
496
 
   // ctrl-l, etc.).
497
 
   void ConnectAccelerators();
498
 
 
499
 
+  // 
500
 
+  void HandleTabCountChange(bool is_deleting);
501
 
+
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)
509
 
@@ -257,6 +257,7 @@
510
 
       profile(NULL),
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),
516
 
       window(NULL) {
517
 
@@ -267,6 +268,7 @@
518
 
       profile(profile),
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),
524
 
       window(NULL) {
525
 
@@ -277,6 +279,7 @@
526
 
       profile(profile),
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),
532
 
       window(NULL) {
533
 
@@ -289,12 +292,21 @@
534
 
       profile(profile),
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),
540
 
       window(NULL) {
541
 
 }
542
 
 
543
 
 // static
544
 
+Browser::CreateParams Browser::CreateParams::CreateChromeless(Profile * profile)
545
 
+{
546
 
+  CreateParams params(profile);
547
 
+  params.is_chromeless_mode = true;
548
 
+  return params;
549
 
+}
550
 
+
551
 
+// static
552
 
 Browser::CreateParams Browser::CreateParams::CreateForApp(
553
 
     Type type,
554
 
     const std::string& app_name,
555
 
@@ -332,6 +344,7 @@
556
 
       tab_strip_model_(new TabStripModel(tab_strip_model_delegate_.get(),
557
 
                                          params.profile)),
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),
563
 
@@ -531,6 +544,10 @@
564
 
   return find_bar_controller_.get() != NULL;
565
 
 }
566
 
 
567
 
+bool Browser::is_chromeless_mode () const {
568
 
+  return is_chromeless_mode_;
569
 
+}
570
 
+
571
 
 bool Browser::is_app() const {
572
 
   return !app_name_.empty();
573
 
 }
574
 
@@ -571,7 +588,7 @@
575
 
 #else
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
578
 
-  if (is_app())
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);
582
 
 #endif
583
 
@@ -630,7 +647,8 @@
584
 
     tab_restore_service->BrowserClosing(tab_restore_service_delegate());
585
 
 #endif
586
 
 
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());
591
 
 
592
 
   // TODO(sky): convert session/tab restore to use notification.
593
 
@@ -2215,20 +2233,20 @@
594
 
 
595
 
   unsigned int features = FEATURE_INFOBAR | FEATURE_DOWNLOADSHELF;
596
 
 
597
 
-  if (is_type_tabbed())
598
 
+  if (is_type_tabbed() && !is_chromeless_mode())
599
 
     features |= FEATURE_BOOKMARKBAR;
600
 
 
601
 
   if (!hide_ui_for_fullscreen) {
602
 
-    if (!is_type_tabbed())
603
 
+    if (is_type_tabbed() && !is_chromeless_mode())
604
 
       features |= FEATURE_TITLEBAR;
605
 
 
606
 
     if (is_type_tabbed())
607
 
       features |= FEATURE_TABSTRIP;
608
 
 
609
 
-    if (is_type_tabbed())
610
 
+    if (is_type_tabbed() && !is_chromeless_mode())
611
 
       features |= FEATURE_TOOLBAR;
612
 
 
613
 
-    if (!is_app())
614
 
+    if (!is_app() && !is_chromeless_mode())
615
 
       features |= FEATURE_LOCATIONBAR;
616
 
   }
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)
622
 
@@ -434,6 +434,9 @@
623
 
 }
624
 
 
625
 
 void NewTab(Browser* browser) {
626
 
+  if (browser && browser->is_chromeless_mode())
627
 
+    return;
628
 
+
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
632
 
@@ -473,7 +476,8 @@
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();
639
 
 }
640
 
 
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)
646
 
@@ -4,6 +4,7 @@
647
 
 
648
 
 #include "chrome/browser/ui/browser_command_controller.h"
649
 
 
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"
654
 
@@ -29,6 +30,7 @@
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"
662
 
@@ -765,8 +767,12 @@
663
 
 // BrowserCommandController, private:
664
 
 
665
 
 bool BrowserCommandController::IsShowingMainUI(bool is_fullscreen) {
666
 
+  const bool started_in_chromeless =
667
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
668
 
+    || browser_->is_chromeless_mode();
669
 
+
670
 
 #if !defined(OS_MACOSX)
671
 
-  return browser_->is_type_tabbed() && !is_fullscreen;
672
 
+  return browser_->is_type_tabbed() && !is_fullscreen && !started_in_chromeless;
673
 
 #else
674
 
   return browser_->is_type_tabbed();
675
 
 #endif
676
 
@@ -777,6 +783,9 @@
677
 
   // (like Back & Forward with initial page load) must have their state
678
 
   // initialized here, otherwise they will be forever disabled.
679
 
 
680
 
+  bool started_in_chromeless =
681
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless);
682
 
+
683
 
   // Navigation commands
684
 
   command_updater_.UpdateCommandEnabled(IDC_RELOAD, true);
685
 
   command_updater_.UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE, true);
686
 
@@ -784,9 +793,10 @@
687
 
 
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);
715
 
 
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);
721
 
 
722
 
   // Initialize other commands based on the window type.
723
 
   bool normal_window = browser_->is_type_tabbed();
724
 
 
725
 
   // Navigation commands
726
 
-  command_updater_.UpdateCommandEnabled(IDC_HOME, normal_window);
727
 
+  command_updater_.UpdateCommandEnabled(IDC_HOME,
728
 
+                                        normal_window &&
729
 
+                                            !started_in_chromeless);
730
 
 
731
 
   // Window management commands
732
 
   command_updater_.UpdateCommandEnabled(IDC_SELECT_NEXT_TAB, normal_window);
733
 
@@ -890,7 +907,9 @@
734
 
   command_updater_.UpdateCommandEnabled(IDC_TABPOSE, normal_window);
735
 
 
736
 
   // Show various bits of UI
737
 
-  command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, normal_window);
738
 
+  command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA,
739
 
+                                        normal_window &&
740
 
+                                            !started_in_chromeless);
741
 
 
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
744
 
@@ -900,7 +919,8 @@
745
 
 
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);
751
 
 
752
 
   // Toggle speech input
753
 
   command_updater_.UpdateCommandEnabled(IDC_TOGGLE_SPEECH_INPUT, true);
754
 
@@ -916,19 +936,26 @@
755
 
 }
756
 
 
757
 
 void BrowserCommandController::UpdateCommandsForIncognitoAvailability() {
758
 
+  bool started_in_chromeless =
759
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
760
 
+    || browser_->is_chromeless_mode();
761
 
+
762
 
   IncognitoModePrefs::Availability incognito_availability =
763
 
       IncognitoModePrefs::GetAvailability(profile()->GetPrefs());
764
 
   command_updater_.UpdateCommandEnabled(
765
 
       IDC_NEW_WINDOW,
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);
774
 
 
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 @@
785
 
 
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_));
791
 
 
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);
807
 
 
808
 
   // Changing the encoding is not possible on Chrome-internal webpages.
809
 
@@ -988,7 +1018,8 @@
810
 
 #if !defined(OS_MACOSX)
811
 
   command_updater_.UpdateCommandEnabled(
812
 
       IDC_CREATE_SHORTCUTS,
813
 
-      CanCreateApplicationShortcuts(browser_));
814
 
+      CanCreateApplicationShortcuts(browser_)
815
 
+          && !browser_->is_chromeless_mode());
816
 
 #endif
817
 
 
818
 
   command_updater_.UpdateCommandEnabled(
819
 
@@ -1027,21 +1058,31 @@
820
 
 }
821
 
 
822
 
 void BrowserCommandController::UpdateCommandsForBookmarkEditing() {
823
 
+  bool started_in_chromeless =
824
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
825
 
+        || browser_->is_chromeless_mode();
826
 
+
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,
836
 
-                                        true);
837
 
+                                        !started_in_chromeless);
838
 
 }
839
 
 
840
 
 void BrowserCommandController::UpdateCommandsForBookmarkBar() {
841
 
+  const bool started_in_chromeless =
842
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
843
 
+    || browser_->is_chromeless_mode();
844
 
+
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) &&
850
 
-      show_main_ui);
851
 
+      show_main_ui && !started_in_chromeless);
852
 
 }
853
 
 
854
 
 void BrowserCommandController::UpdateCommandsForFullscreenMode(
855
 
@@ -1098,6 +1139,7 @@
856
 
   // mode.
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 @@
864
 
   if (local_state)
865
 
     enabled = local_state->GetBoolean(prefs::kAllowFileSelectionDialogs);
866
 
 
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();
871
 
+
872
 
+  command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE,
873
 
+                                        enabled && !started_in_chromeless);
874
 
 }
875
 
 
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)
881
 
@@ -171,6 +171,9 @@
882
 
                                      const gfx::Rect& window_bounds,
883
 
                                      Profile* profile);
884
 
 
885
 
+    // Like Create, but creates a chromeless browser.
886
 
+    static CreateParams CreateChromeless(Profile * profile);
887
 
+
888
 
     static CreateParams CreateForDevTools(Profile* profile);
889
 
 
890
 
     // The browser type.
891
 
@@ -191,6 +194,9 @@
892
 
     // Type of app (host or child). See description of AppType.
893
 
     AppType app_type;
894
 
 
895
 
+    // If the browser instance is supposed to be a chromeless one.
896
 
+    bool is_chromeless_mode;
897
 
+
898
 
     // The bounds of the window to open.
899
 
     gfx::Rect initial_bounds;
900
 
 
901
 
@@ -463,6 +469,7 @@
902
 
   bool is_type_popup() const { return type_ == TYPE_POPUP; }
903
 
   bool is_type_panel() const { return type_ == TYPE_PANEL; }
904
 
 
905
 
+  bool is_chromeless_mode() const;
906
 
   bool is_app() const;
907
 
   bool is_devtools() const;
908
 
 
909
 
@@ -831,6 +838,8 @@
910
 
   // 2) we launch an undocked devtool window.
911
 
   std::string app_name_;
912
 
 
913
 
+  bool is_chromeless_mode_;
914
 
+
915
 
   // Type of app (host or child). See description of AppType.
916
 
   AppType app_type_;
917
 
 
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)
922
 
@@ -47,4 +47,10 @@
923
 
   virtual bool RunImpl() OVERRIDE;
924
 
 };
925
 
 
926
 
+class IsChromelessWindowFunction : public SyncExtensionFunction {
927
 
+ protected:
928
 
+  virtual bool RunImpl() OVERRIDE;
929
 
+  DECLARE_EXTENSION_FUNCTION_NAME("extension.isChromelessWindow");
930
 
+};
931
 
+
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)
937
 
@@ -324,6 +329,7 @@
938
 
   RegisterFunction<SetUpdateUrlDataFunction>();
939
 
   RegisterFunction<IsAllowedIncognitoAccessFunction>();
940
 
   RegisterFunction<IsAllowedFileSchemeAccessFunction>();
941
 
+  RegisterFunction<IsChromelessWindowFunction>();
942
 
 
943
 
   // WebstorePrivate.
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)
949
 
@@ -7,9 +7,28 @@
950
 
 #include <string>
951
 
 
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"
958
 
 
959
 
+#if defined(OS_LINUX) && defined(TOOLKIT_GTK)
960
 
+#include <gdk/gdk.h>
961
 
+#include <gdk/gdkx.h>
962
 
+#endif
963
 
+
964
 
+#if defined(OS_LINUX) && defined(TOOLKIT_GTK)
965
 
+
966
 
+namespace {
967
 
+
968
 
+const char kNoCurrentWindowError[] = "No current window";
969
 
+const char kCouldNotIdentifyTab[] = "Could not find tab with specified ID";
970
 
+
971
 
+} // namespace {
972
 
+
973
 
+#endif
974
 
+
975
 
 extensions::ExtensionPrefs* SetUpdateUrlDataFunction::extension_prefs() {
976
 
   return profile()->GetExtensionService()->extension_prefs();
977
 
 }
978
 
@@ -39,3 +58,35 @@
979
 
       ext_service->AllowFileAccess(extension)));
980
 
   return true;
981
 
 }
982
 
+
983
 
+bool IsChromelessWindowFunction::RunImpl() {
984
 
+  bool is_chromeless = false;
985
 
+
986
 
+  int tab_id = -1;
987
 
+  if (!args_->GetInteger(0, &tab_id)) {
988
 
+    Browser* browser = GetCurrentBrowser();
989
 
+    if (!browser) {
990
 
+      error_ = kNoCurrentWindowError;
991
 
+      return false;
992
 
+    }
993
 
+    is_chromeless = browser->is_chromeless_mode();
994
 
+  }
995
 
+  else {
996
 
+    Browser* browser = NULL;
997
 
+    if (!ExtensionTabUtil::GetTabById(tab_id,
998
 
+                                      profile(),
999
 
+                                      NULL,
1000
 
+                                      &browser,
1001
 
+                                      NULL,
1002
 
+                                      NULL,
1003
 
+                                      NULL)) {
1004
 
+      error_ = kCouldNotIdentifyTab;
1005
 
+      return false;
1006
 
+    }
1007
 
+    is_chromeless = browser->is_chromeless_mode();
1008
 
+  }
1009
 
+
1010
 
+  SetResult(Value::CreateBooleanValue(is_chromeless));
1011
 
+
1012
 
+  return true;
1013
 
+}
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" } }
1020
 
         }
1021
 
       },
1022
 
+       {
1023
 
+        "name": "isChromelessWindow",
1024
 
+        "type": "function",
1025
 
+        "unprivileged": true,
1026
 
+        "description": "Checks is a given extension runs part of a chromeless window.",
1027
 
+        "parameters": [
1028
 
+          {
1029
 
+            "type": "integer",
1030
 
+            "name": "tabId",
1031
 
+            "optional": true,
1032
 
+            "description": "The tab id corresponding to the window to restrict the request to."
1033
 
+          }
1034
 
+          ,
1035
 
+          {
1036
 
+            "type": "function",
1037
 
+            "name": "callback",
1038
 
+            "parameters": [
1039
 
+              {
1040
 
+                "name": "isChromelessWindow",
1041
 
+                "type": "boolean",
1042
 
+                "description": "True if the extension runs part of a chromeless window, false otherwise."
1043
 
+              }
1044
 
+            ]
1045
 
+          }
1046
 
+        ]
1047
 
+      },
1048
 
       {
1049
 
         "name": "isAllowedIncognitoAccess",
1050
 
         "type": "function",
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)
1055
 
@@ -148,6 +148,9 @@
1056
 
 // Chrome Frame automation channel is closed.
1057
 
 const char kChromeFrameShutdownDelay[]      = "chrome-frame-shutdown-delay";
1058
 
 
1059
 
+// Specifies a given URL to be opened in a chromeless mode.
1060
 
+const char kChromeless[]                    = "chromeless";
1061
 
+
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)
1069
 
@@ -55,6 +55,7 @@
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[];