~justinmcp/unity-chromium-extension/native-messaging-base

« back to all changes in this revision

Viewing changes to chromium-patches/stable-23.0.1271.64/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
 
@@ -584,6 +585,14 @@
14
 
           !should_track_changes_for_browser_type(browser->type(), app_type))
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
 
       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)
32
 
@@ -405,6 +405,17 @@
33
 
   return true;
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
 
+
47
 
 bool StartupBrowserCreatorImpl::IsAppLaunch(std::string* app_url,
48
 
                                             std::string* app_id) {
49
 
   if (command_line_.HasSwitch(switches::kApp)) {
50
 
@@ -536,6 +547,12 @@
51
 
     return;
52
 
   }
53
 
 
54
 
+  if (IsChromelessLaunch(NULL)) {
55
 
+    // Open user-specified URLs like pinned tabs and startup tabs.
56
 
+    if (ProcessSpecifiedURLs(urls_to_open))
57
 
+      return;
58
 
+  }
59
 
+
60
 
   if (process_startup && ProcessStartupURLs(urls_to_open)) {
61
 
     // ProcessStartupURLs processed the urls, nothing else to do.
62
 
     return;
63
 
@@ -642,7 +659,8 @@
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_);
73
 
@@ -718,6 +736,10 @@
74
 
   if (!profile_ && browser)
75
 
     profile_ = browser->profile();
76
 
 
77
 
+  if (IsChromelessLaunch(NULL)) {
78
 
+    browser = new Browser(Browser::CreateParams::CreateChromeless(profile_));
79
 
+  }
80
 
+
81
 
   if (!browser || !browser->is_type_tabbed()) {
82
 
     browser = new Browser(Browser::CreateParams(profile_));
83
 
   } else {
84
 
@@ -790,6 +812,13 @@
85
 
   if (!browser || !profile_ || browser->tab_count() == 0)
86
 
     return;
87
 
 
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))
91
 
+    {
92
 
+      return;
93
 
+    }
94
 
+
95
 
   if (HasPendingUncleanExit(browser->profile()))
96
 
     chrome::ShowSessionCrashedPrompt(browser);
97
 
 
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)
102
 
@@ -68,6 +68,11 @@
103
 
   FRIEND_TEST_ALL_PREFIXES(BrowserTest, RestorePinnedTabs);
104
 
   FRIEND_TEST_ALL_PREFIXES(BrowserTest, AppIdSwitch);
105
 
 
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);
110
 
+
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)
118
 
@@ -782,9 +782,11 @@
119
 
   g_signal_connect(tabstrip_.get(), "drag-data-received",
120
 
                    G_CALLBACK(OnDragDataReceivedThunk), this);
121
 
 
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());
129
 
+  }
130
 
 
131
 
   gtk_widget_show_all(tabstrip_.get());
132
 
 
133
 
@@ -1458,6 +1460,9 @@
134
 
 
135
 
 void TabStripGtk::LayoutNewTabButton(double last_tab_right,
136
 
                                      double unselected_width) {
137
 
+  if (window_ && window_->browser() && window_->browser()->is_chromeless_mode())
138
 
+    return;
139
 
+
140
 
   GtkWidget* toplevel = gtk_widget_get_ancestor(widget(), GTK_TYPE_WINDOW);
141
 
   bool is_maximized = false;
142
 
   if (toplevel) {
143
 
@@ -1511,8 +1516,10 @@
144
 
   int available_width = tabstrip_allocation.width;
145
 
   if (available_width_for_tabs_ < 0) {
146
 
     available_width = bounds_.width();
147
 
-    available_width -=
148
 
+    if (newtab_button_.get() != NULL) {
149
 
+      available_width -=
150
 
         (kNewTabButtonHOffset + newtab_button_->WidgetAllocation().width);
151
 
+    }
152
 
   } else {
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);
157
 
 
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);
165
 
+  }
166
 
 
167
 
   // Paint the tabs in reverse order, so they stack to the left.
168
 
   TabGtk* selected_tab = NULL;
169
 
@@ -2267,6 +2277,9 @@
170
 
 }
171
 
 
172
 
 void TabStripGtk::SetNewTabButtonBackground() {
173
 
+  if (newtab_button_.get() == NULL) {
174
 
+    return;
175
 
+  }
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)
183
 
@@ -24,35 +24,44 @@
184
 
 #include "ui/base/gtk/menu_label_accelerator_util.h"
185
 
 #include "ui/base/l10n/l10n_util.h"
186
 
 
187
 
+typedef bool (*GlobalMenuBarVisibilityHandler) (Browser * browser);
188
 
+
189
 
 struct GlobalMenuBarCommand {
190
 
   int str_id;
191
 
   int command;
192
 
   int tag;
193
 
+  GlobalMenuBarVisibilityHandler visibility_handler;
194
 
 };
195
 
 
196
 
 namespace {
197
 
 
198
 
+// static
199
 
+static bool GlobalMenuBarVisibilityHandler_NotInChromelessMode(
200
 
+    Browser * browser) {
201
 
+  return browser && !browser->is_chromeless_mode();
202
 
+}
203
 
+
204
 
 const int MENU_SEPARATOR =-1;
205
 
 const int MENU_END = -2;
206
 
 const int MENU_DISABLED_LABEL = -3;
207
 
 
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 },
221
 
 
222
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
223
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
224
 
 
225
 
-  { IDS_CREATE_SHORTCUTS, IDC_CREATE_SHORTCUTS },
226
 
+  { IDS_CREATE_SHORTCUTS, IDC_CREATE_SHORTCUTS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
227
 
 
228
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
229
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
230
 
 
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 },
235
 
 
236
 
   { MENU_SEPARATOR, MENU_SEPARATOR },
237
 
 
238
 
@@ -70,17 +79,17 @@
239
 
 
240
 
   { IDS_FIND, IDC_FIND },
241
 
 
242
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
243
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
244
 
 
245
 
-  { IDS_PREFERENCES, IDC_OPTIONS },
246
 
+  { IDS_PREFERENCES, IDC_OPTIONS, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
247
 
 
248
 
   { MENU_END, MENU_END }
249
 
 };
250
 
 
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 },
254
 
 
255
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
256
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
257
 
 
258
 
   { IDS_STOP_MENU_LINUX, IDC_STOP },
259
 
   { IDS_RELOAD_MENU_LINUX, IDC_RELOAD },
260
 
@@ -96,48 +105,48 @@
261
 
 };
262
 
 
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 },
270
 
 
271
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
272
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
273
 
 
274
 
   { IDS_HISTORY_VISITED_LINUX, MENU_DISABLED_LABEL,
275
 
-    GlobalMenuBar::TAG_MOST_VISITED_HEADER },
276
 
+    GlobalMenuBar::TAG_MOST_VISITED_HEADER, GlobalMenuBarVisibilityHandler_NotInChromelessMode },
277
 
 
278
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
279
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
280
 
 
281
 
   { IDS_HISTORY_CLOSED_LINUX, MENU_DISABLED_LABEL,
282
 
-    GlobalMenuBar::TAG_RECENTLY_CLOSED_HEADER },
283
 
+    GlobalMenuBar::TAG_RECENTLY_CLOSED_HEADER, GlobalMenuBarVisibilityHandler_NotInChromelessMode },
284
 
 
285
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
286
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
287
 
 
288
 
-  { IDS_SHOWFULLHISTORY_LINK, IDC_SHOW_HISTORY },
289
 
+  { IDS_SHOWFULLHISTORY_LINK, IDC_SHOW_HISTORY, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
290
 
 
291
 
   { MENU_END, MENU_END }
292
 
 };
293
 
 
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 },
301
 
 
302
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
303
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
304
 
 
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 },
309
 
 
310
 
-  { MENU_SEPARATOR, MENU_SEPARATOR },
311
 
+  { MENU_SEPARATOR, MENU_SEPARATOR, int(), GlobalMenuBarVisibilityHandler_NotInChromelessMode },
312
 
 
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 },
319
 
 
320
 
   { MENU_END, MENU_END }
321
 
 };
322
 
 
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 }
328
 
 };
329
 
@@ -190,8 +199,10 @@
330
 
   }
331
 
 
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();
338
 
+  }
339
 
 }
340
 
 
341
 
 GlobalMenuBar::~GlobalMenuBar() {
342
 
@@ -214,8 +225,22 @@
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
347
 
+  size_t count = 0;
348
 
+  for (int i = 0; commands[i].str_id != MENU_END; ++i) {
349
 
+    if (!commands[i].visibility_handler || commands[i].visibility_handler(browser_)) {
350
 
+      count++;
351
 
+    }
352
 
+  }
353
 
+  if (0 == count) {
354
 
+    return;
355
 
+  }
356
 
+
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_)) {
360
 
+      continue;
361
 
+    }
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)
369
 
@@ -307,6 +314,9 @@
370
 
     gtk_window_util::SetWindowCustomClass(window_,
371
 
         std::string(gdk_get_program_class()) + " (" + user_data_dir + ")");
372
 
   }
373
 
+  else if (browser_->is_chromeless_mode()) {
374
 
+    gtk_window_util::SetWindowCustomClass(window_, web_app::GetWMClassFromAppName("chromeless"));
375
 
+  }
376
 
 
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
379
 
@@ -878,7 +902,7 @@
380
 
 }
381
 
 
382
 
 void BrowserWindowGtk::SetFocusToLocationBar(bool select_all) {
383
 
-  if (!IsFullscreen())
384
 
+  if (!IsFullscreen() && IsToolbarSupported())
385
 
     GetLocationBar()->FocusLocation(select_all);
386
 
 }
387
 
 
388
 
@@ -1219,6 +1243,21 @@
389
 
   }
390
 
 }
391
 
 
392
 
+void BrowserWindowGtk::HandleTabCountChange(bool is_deleting) {
393
 
+  if (browser_ == NULL || browser_->tab_strip_model() == NULL) {
394
 
+    tabstrip_->Show();
395
 
+    return;
396
 
+  }
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) {
400
 
+    tabstrip_->Hide();
401
 
+  }
402
 
+  else {
403
 
+    tabstrip_->Show();
404
 
+  }
405
 
+}
406
 
+
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);
412
 
   }
413
 
   contents_container_->DetachTab(contents);
414
 
+
415
 
+  HandleTabCountChange(false);
416
 
 }
417
 
 
418
 
+void BrowserWindowGtk::TabInsertedAt(TabContents* contents,
419
 
+                             int index,
420
 
+                             bool foreground) {
421
 
+  HandleTabCountChange(false);
422
 
+}
423
 
+
424
 
+void BrowserWindowGtk::TabClosingAt(TabStripModel* tab_strip_model,
425
 
+                                    TabContents* contents,
426
 
+                                    int index) {
427
 
+  HandleTabCountChange(true);
428
 
+}
429
 
+
430
 
 void BrowserWindowGtk::ActiveTabChanged(TabContents* old_contents,
431
 
                                         TabContents* new_contents,
432
 
                                         int index,
433
 
@@ -2281,7 +2334,7 @@
434
 
 
435
 
 void BrowserWindowGtk::ShowSupportedWindowFeatures() {
436
 
   if (IsTabStripSupported())
437
 
-    tabstrip_->Show();
438
 
+    HandleTabCountChange(false);
439
 
 
440
 
   if (IsToolbarSupported()) {
441
 
     toolbar_->Show();
442
 
@@ -2295,7 +2348,7 @@
443
 
 
444
 
 void BrowserWindowGtk::HideUnsupportedWindowFeatures() {
445
 
   if (!IsTabStripSupported())
446
 
-    tabstrip_->Hide();
447
 
+    HandleTabCountChange(false);
448
 
 
449
 
   if (!IsToolbarSupported())
450
 
     toolbar_->Hide();
451
 
@@ -2385,7 +2438,7 @@
452
 
 
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();
457
 
 }
458
 
 
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)
464
 
@@ -182,6 +182,12 @@
465
 
                                 TabContents* new_contents,
466
 
                                 int index,
467
 
                                 bool user_gesture) OVERRIDE;
468
 
+  virtual void TabInsertedAt(TabContents* contents,
469
 
+                             int index,
470
 
+                             bool foreground) OVERRIDE;
471
 
+  virtual void TabClosingAt(TabStripModel* tab_strip_model,
472
 
+                            TabContents* contents,
473
 
+                            int index) OVERRIDE;
474
 
 
475
 
   // Overridden from ActiveWindowWatcherXObserver.
476
 
   virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE;
477
 
@@ -347,6 +353,9 @@
478
 
   // ctrl-l, etc.).
479
 
   void ConnectAccelerators();
480
 
 
481
 
+  // 
482
 
+  void HandleTabCountChange(bool is_deleting);
483
 
+
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)
491
 
@@ -257,6 +257,7 @@
492
 
       profile(NULL),
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),
498
 
       window(NULL) {
499
 
@@ -267,6 +268,7 @@
500
 
       profile(profile),
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),
506
 
       window(NULL) {
507
 
@@ -277,6 +279,7 @@
508
 
       profile(profile),
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),
514
 
       window(NULL) {
515
 
@@ -289,6 +292,7 @@
516
 
       profile(profile),
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),
522
 
       window(NULL) {
523
 
@@ -308,6 +311,14 @@
524
 
 }
525
 
 
526
 
 // static
527
 
+Browser::CreateParams Browser::CreateParams::CreateChromeless(Profile * profile)
528
 
+{
529
 
+  CreateParams params(profile);
530
 
+  params.is_chromeless_mode = true;
531
 
+  return params;
532
 
+}
533
 
+
534
 
+// static
535
 
 Browser::CreateParams Browser::CreateParams::CreateForDevTools(
536
 
     Profile* profile) {
537
 
   CreateParams params(TYPE_POPUP, profile);
538
 
@@ -328,7 +339,8 @@
539
 
       ALLOW_THIS_IN_INITIALIZER_LIST(
540
 
           tab_strip_model_(new TabStripModel(tab_strip_model_delegate_.get(),
541
 
                                              params.profile))),
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),
548
 
@@ -523,6 +535,10 @@
549
 
   return find_bar_controller_.get() != NULL;
550
 
 }
551
 
 
552
 
+bool Browser::is_chromeless_mode () const {
553
 
+  return is_chromeless_mode_;
554
 
+}
555
 
+
556
 
 bool Browser::is_app() const {
557
 
   return !app_name_.empty();
558
 
 }
559
 
@@ -563,7 +579,7 @@
560
 
 #else
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
563
 
-  if (is_app())
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);
567
 
 #endif
568
 
@@ -622,7 +638,7 @@
569
 
     tab_restore_service->BrowserClosing(tab_restore_service_delegate());
570
 
 #endif
571
 
 
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());
575
 
 
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();
583
 
 }
584
 
 
585
 
 bool Browser::ShouldCreateWebContents(
586
 
@@ -2163,20 +2179,20 @@
587
 
 
588
 
   unsigned int features = FEATURE_INFOBAR | FEATURE_DOWNLOADSHELF;
589
 
 
590
 
-  if (is_type_tabbed())
591
 
+  if (is_type_tabbed() && !is_chromeless_mode())
592
 
     features |= FEATURE_BOOKMARKBAR;
593
 
 
594
 
   if (!hide_ui_for_fullscreen) {
595
 
-    if (!is_type_tabbed())
596
 
+    if (is_type_tabbed() && !is_chromeless_mode())
597
 
       features |= FEATURE_TITLEBAR;
598
 
-
599
 
+    
600
 
     if (is_type_tabbed())
601
 
       features |= FEATURE_TABSTRIP;
602
 
-
603
 
-    if (is_type_tabbed())
604
 
+    
605
 
+    if (is_type_tabbed() && !is_chromeless_mode())
606
 
       features |= FEATURE_TOOLBAR;
607
 
-
608
 
-    if (!is_app())
609
 
+    
610
 
+    if (is_type_tabbed() && !is_chromeless_mode())
611
 
       features |= FEATURE_LOCATIONBAR;
612
 
   }
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)
618
 
@@ -392,6 +392,10 @@
619
 
 
620
 
 void NewTab(Browser* browser) {
621
 
   content::RecordAction(UserMetricsAction("NewTab"));
622
 
+
623
 
+  if (browser->is_chromeless_mode())
624
 
+    return;
625
 
+
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.
629
 
@@ -428,7 +432,8 @@
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();
636
 
 }
637
 
 
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)
643
 
@@ -4,6 +4,7 @@
644
 
 
645
 
 #include "chrome/browser/ui/browser_command_controller.h"
646
 
 
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"
651
 
@@ -28,6 +28,7 @@
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"
659
 
@@ -691,8 +692,12 @@
660
 
 // BrowserCommandController, private:
661
 
 
662
 
 bool BrowserCommandController::IsShowingMainUI(bool is_fullscreen) {
663
 
+  const bool started_in_chromeless =
664
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
665
 
+    || browser_->is_chromeless_mode();
666
 
+
667
 
 #if !defined(OS_MACOSX)
668
 
-  return browser_->is_type_tabbed() && !is_fullscreen;
669
 
+  return browser_->is_type_tabbed() && !is_fullscreen && !started_in_chromeless;
670
 
 #else
671
 
   return browser_->is_type_tabbed();
672
 
 #endif
673
 
@@ -703,6 +708,9 @@
674
 
   // (like Back & Forward with initial page load) must have their state
675
 
   // initialized here, otherwise they will be forever disabled.
676
 
 
677
 
+  bool started_in_chromeless =
678
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless);
679
 
+
680
 
   // Navigation commands
681
 
   command_updater_.UpdateCommandEnabled(IDC_RELOAD, true);
682
 
   command_updater_.UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE, true);
683
 
@@ -710,10 +718,12 @@
684
 
 
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);
698
 
 
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);
714
 
 
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);
720
 
 
721
 
   // Initialize other commands based on the window type.
722
 
   bool normal_window = browser_->is_type_tabbed();
723
 
 
724
 
   // Navigation commands
725
 
-  command_updater_.UpdateCommandEnabled(IDC_HOME, normal_window);
726
 
+  command_updater_.UpdateCommandEnabled(IDC_HOME,
727
 
+                                        normal_window
728
 
+                                          && !started_in_chromeless);
729
 
 
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,
738
 
                                         normal_window);
739
 
@@ -821,7 +839,9 @@
740
 
                                         !browser_->is_devtools());
741
 
 
742
 
   // Show various bits of UI
743
 
-  command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, normal_window);
744
 
+  command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA,
745
 
+                                        normal_window
746
 
+                                          && !started_in_chromeless);
747
 
 
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
750
 
@@ -831,7 +851,8 @@
751
 
 
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);
757
 
 
758
 
   // Toggle speech input
759
 
   command_updater_.UpdateCommandEnabled(IDC_TOGGLE_SPEECH_INPUT, true);
760
 
@@ -847,19 +868,26 @@
761
 
 }
762
 
 
763
 
 void BrowserCommandController::UpdateCommandsForIncognitoAvailability() {
764
 
+  bool started_in_chromeless =
765
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
766
 
+    || browser_->is_chromeless_mode();
767
 
+
768
 
   IncognitoModePrefs::Availability incognito_availability =
769
 
       IncognitoModePrefs::GetAvailability(profile()->GetPrefs());
770
 
   command_updater_.UpdateCommandEnabled(
771
 
       IDC_NEW_WINDOW,
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);
780
 
 
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);
790
 
@@ -894,7 +922,8 @@
791
 
 
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_));
797
 
 
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);
814
 
 
815
 
   // Changing the encoding is not possible on Chrome-internal webpages.
816
 
@@ -923,7 +954,8 @@
817
 
 #if !defined(OS_MACOSX)
818
 
   command_updater_.UpdateCommandEnabled(
819
 
       IDC_CREATE_SHORTCUTS,
820
 
-      CanCreateApplicationShortcuts(browser_));
821
 
+      CanCreateApplicationShortcuts(browser_)
822
 
+        && !browser_->is_chromeless_mode());
823
 
 #endif
824
 
 
825
 
   UpdateCommandsForContentRestrictionState();
826
 
@@ -955,21 +987,31 @@
827
 
 }
828
 
 
829
 
 void BrowserCommandController::UpdateCommandsForBookmarkEditing() {
830
 
+  bool started_in_chromeless =
831
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
832
 
+    || browser_->is_chromeless_mode();
833
 
+
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,
843
 
-                                        true);
844
 
+                                        !started_in_chromeless);
845
 
 }
846
 
 
847
 
 void BrowserCommandController::UpdateCommandsForBookmarkBar() {
848
 
+  const bool started_in_chromeless =
849
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
850
 
+    || browser_->is_chromeless_mode();
851
 
+
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) &&
857
 
-      show_main_ui);
858
 
+      show_main_ui && !started_in_chromeless);
859
 
 }
860
 
 
861
 
 void BrowserCommandController::UpdateCommandsForFullscreenMode(
862
 
@@ -1069,7 +1111,12 @@
863
 
   if (local_state)
864
 
     enabled = local_state->GetBoolean(prefs::kAllowFileSelectionDialogs);
865
 
 
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();
870
 
+
871
 
+  command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE,
872
 
+                                        enabled && !started_in_chromeless);
873
 
 }
874
 
 
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)
880
 
@@ -164,6 +164,9 @@
881
 
                                      const gfx::Rect& window_bounds,
882
 
                                      Profile* profile);
883
 
 
884
 
+    // Like Create, but creates a chromeless browser.
885
 
+    static CreateParams CreateChromeless(Profile * profile);
886
 
+
887
 
     static CreateParams CreateForDevTools(Profile* profile);
888
 
 
889
 
     // The browser type.
890
 
@@ -181,6 +184,9 @@
891
 
     // Type of app (host or child). See description of AppType.
892
 
     AppType app_type;
893
 
 
894
 
+    // If the browser instance is supposed to be a chromeless one.
895
 
+    bool is_chromeless_mode;
896
 
+
897
 
     // The bounds of the window to open.
898
 
     gfx::Rect initial_bounds;
899
 
 
900
 
@@ -448,6 +454,7 @@
901
 
   bool is_type_popup() const { return type_ == TYPE_POPUP; }
902
 
   bool is_type_panel() const { return type_ == TYPE_PANEL; }
903
 
 
904
 
+  bool is_chromeless_mode() const;
905
 
   bool is_app() const;
906
 
   bool is_devtools() const;
907
 
 
908
 
@@ -806,6 +813,8 @@
909
 
   // Type of app (host or child). See description of AppType.
910
 
   AppType app_type_;
911
 
 
912
 
+  bool is_chromeless_mode_;
913
 
+
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
916
 
   // across sessions.
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)
921
 
@@ -47,4 +47,11 @@
922
 
   virtual bool RunImpl() OVERRIDE;
923
 
 };
924
 
 
925
 
+class IsChromelessWindowFunction : public SyncExtensionFunction {
926
 
+ protected:
927
 
+  virtual bool RunImpl() OVERRIDE;
928
 
+  DECLARE_EXTENSION_FUNCTION_NAME("extension.isChromelessWindow");
929
 
+};
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
 
@@ -314,6 +319,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
 
@@ -6,10 +6,29 @@
950
 
 
951
 
 #include <string>
952
 
 
953
 
+#if defined(OS_LINUX) && defined(TOOLKIT_GTK)
954
 
+#include <gdk/gdk.h>
955
 
+#include <gdk/gdkx.h>
956
 
+#endif
957
 
+
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"
964
 
 
965
 
+#if defined(OS_LINUX) && defined(TOOLKIT_GTK)
966
 
+
967
 
+namespace {
968
 
+
969
 
+const char kNoCurrentWindowError[] = "No current window";
970
 
+const char kCouldNotIdentifyTab[] = "Could not find tab with specified ID";
971
 
+
972
 
+} // namespace {
973
 
+
974
 
+#endif
975
 
+
976
 
 extensions::ExtensionPrefs* SetUpdateUrlDataFunction::extension_prefs() {
977
 
   return profile()->GetExtensionService()->extension_prefs();
978
 
 }
979
 
@@ -39,3 +58,35 @@
980
 
       ext_service->AllowFileAccess(extension)));
981
 
   return true;
982
 
 }
983
 
+
984
 
+bool IsChromelessWindowFunction::RunImpl() {
985
 
+  bool is_chromeless = false;
986
 
+
987
 
+  int tab_id = -1;
988
 
+  if (!args_->GetInteger(0, &tab_id)) {
989
 
+    Browser* browser = GetCurrentBrowser();
990
 
+    if (!browser) {
991
 
+      error_ = kNoCurrentWindowError;
992
 
+      return false;
993
 
+    }
994
 
+    is_chromeless = browser->is_chromeless_mode();
995
 
+  }
996
 
+  else {
997
 
+    Browser* browser = NULL;
998
 
+    if (!ExtensionTabUtil::GetTabById(tab_id,
999
 
+                                      profile(),
1000
 
+                                      NULL,
1001
 
+                                      &browser,
1002
 
+                                      NULL,
1003
 
+                                      NULL,
1004
 
+                                      NULL)) {
1005
 
+      error_ = kCouldNotIdentifyTab;
1006
 
+      return false;
1007
 
+    }
1008
 
+    is_chromeless = browser->is_chromeless_mode();
1009
 
+  }
1010
 
+
1011
 
+  SetResult(Value::CreateBooleanValue(is_chromeless));
1012
 
+
1013
 
+  return true;
1014
 
+}
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 @@
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
 
         "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)
1056
 
@@ -147,6 +147,9 @@
1057
 
 // Chrome Frame automation channel is closed.
1058
 
 const char kChromeFrameShutdownDelay[]      = "chrome-frame-shutdown-delay";
1059
 
 
1060
 
+// Specifies a given URL to be opened in a chromeless mode.
1061
 
+const char kChromeless[]                    = "chromeless";
1062
 
+
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)
1070
 
@@ -54,6 +54,7 @@
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[];