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

« back to all changes in this revision

Viewing changes to chromium-patches/stable-22.0.1229.79/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
 
@@ -409,6 +415,9 @@
370
 
                          std::string(gdk_get_program_class()) +
371
 
                          " (" + user_data_dir + ")");
372
 
   }
373
 
+  else if (browser_->is_chromeless_mode()) {
374
 
+    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
 
@@ -987,7 +1010,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
 
@@ -2541,7 +2564,7 @@
389
 
 
390
 
 bool BrowserWindowGtk::UseCustomFrame() const {
391
 
   // We don't use the custom frame for app mode windows or app window popups.
392
 
-  return use_custom_frame_pref_.GetValue() && !browser_->is_app();
393
 
+  return use_custom_frame_pref_.GetValue() && !browser_->is_app() && !browser_->is_chromeless_mode();
394
 
 }
395
 
 
396
 
 bool BrowserWindowGtk::BoundsMatchMonitorSize() {
397
 
Index: src/chrome/browser/ui/browser.cc
398
 
===================================================================
399
 
--- src/chrome/browser/ui/browser.cc    (revision 158531)
400
 
+++ src/chrome/browser/ui/browser.cc    (working copy)
401
 
@@ -264,6 +264,7 @@
402
 
     : type(TYPE_TABBED),
403
 
       profile(NULL),
404
 
       app_type(APP_TYPE_HOST),
405
 
+      is_chromeless_mode(false),
406
 
       initial_show_state(ui::SHOW_STATE_DEFAULT),
407
 
       is_session_restore(false),
408
 
       window(NULL) {
409
 
@@ -273,6 +274,7 @@
410
 
   : type(TYPE_TABBED),
411
 
     profile(profile),
412
 
     app_type(APP_TYPE_HOST),
413
 
+    is_chromeless_mode(false),
414
 
     initial_show_state(ui::SHOW_STATE_DEFAULT),
415
 
     is_session_restore(false),
416
 
     window(NULL) {
417
 
@@ -282,6 +284,7 @@
418
 
     : type(type),
419
 
       profile(profile),
420
 
       app_type(APP_TYPE_HOST),
421
 
+      is_chromeless_mode(false),
422
 
       initial_show_state(ui::SHOW_STATE_DEFAULT),
423
 
       is_session_restore(false),
424
 
       window(NULL) {
425
 
@@ -308,6 +311,14 @@
426
 
 }
427
 
 
428
 
 // static
429
 
+Browser::CreateParams Browser::CreateParams::CreateChromeless(Profile * profile)
430
 
+{
431
 
+  CreateParams params(profile);
432
 
+  params.is_chromeless_mode = true;
433
 
+  return params;
434
 
+}
435
 
+
436
 
+// static
437
 
 Browser::CreateParams Browser::CreateParams::CreateForDevTools(
438
 
     Profile* profile) {
439
 
   CreateParams params(TYPE_POPUP, profile);
440
 
@@ -328,7 +339,8 @@
441
 
       ALLOW_THIS_IN_INITIALIZER_LIST(
442
 
           tab_strip_model_(new TabStripModel(tab_strip_model_delegate_.get(),
443
 
                                              params.profile))),
444
 
-      app_name_(params.app_name),
445
 
+      app_name_(params.app_name), 
446
 
+      is_chromeless_mode_(params.is_chromeless_mode),
447
 
       app_type_(params.app_type),
448
 
       chrome_updater_factory_(this),
449
 
       cancel_download_confirmation_state_(NOT_PROMPTED),
450
 
@@ -523,6 +535,10 @@
451
 
   return find_bar_controller_.get() != NULL;
452
 
 }
453
 
 
454
 
+bool Browser::is_chromeless_mode () const {
455
 
+  return is_chromeless_mode_;
456
 
+}
457
 
+
458
 
 bool Browser::is_app() const {
459
 
   return !app_name_.empty();
460
 
 }
461
 
@@ -563,7 +579,7 @@
462
 
 #else
463
 
   int string_id = IDS_BROWSER_WINDOW_TITLE_FORMAT;
464
 
   // Don't append the app name to window titles on app frames and app popups
465
 
-  if (is_app())
466
 
+  if (is_app() || is_chromeless_mode())
467
 
     string_id = IDS_BROWSER_WINDOW_TITLE_FORMAT_NO_LOGO;
468
 
   return l10n_util::GetStringFUTF16(string_id, title);
469
 
 #endif
470
 
@@ -622,7 +638,7 @@
471
 
     tab_restore_service->BrowserClosing(tab_restore_service_delegate());
472
 
 #endif
473
 
 
474
 
-  if (tab_restore_service && is_type_tabbed() && tab_count())
475
 
+  if (tab_restore_service && is_type_tabbed() && !is_chromeless_mode() && tab_count())
476
 
     tab_restore_service->BrowserClosing(tab_restore_service_delegate());
477
 
 
478
 
   // TODO(sky): convert session/tab restore to use notification.
479
 
@@ -1466,7 +1482,7 @@
480
 
     const history::HistoryAddPageArgs& add_page_args,
481
 
     content::NavigationType navigation_type) {
482
 
   // Don't update history if running as app.
483
 
-  return !IsApplication();
484
 
+  return !IsApplication() && !is_chromeless_mode();
485
 
 }
486
 
 
487
 
 bool Browser::ShouldCreateWebContents(
488
 
@@ -2163,20 +2179,20 @@
489
 
 
490
 
   unsigned int features = FEATURE_INFOBAR | FEATURE_DOWNLOADSHELF;
491
 
 
492
 
-  if (is_type_tabbed())
493
 
+  if (is_type_tabbed() && !is_chromeless_mode())
494
 
     features |= FEATURE_BOOKMARKBAR;
495
 
 
496
 
   if (!hide_ui_for_fullscreen) {
497
 
-    if (!is_type_tabbed())
498
 
+    if (is_type_tabbed() && !is_chromeless_mode())
499
 
       features |= FEATURE_TITLEBAR;
500
 
-
501
 
+    
502
 
     if (is_type_tabbed())
503
 
       features |= FEATURE_TABSTRIP;
504
 
-
505
 
-    if (is_type_tabbed())
506
 
+    
507
 
+    if (is_type_tabbed() && !is_chromeless_mode())
508
 
       features |= FEATURE_TOOLBAR;
509
 
-
510
 
-    if (!is_app())
511
 
+    
512
 
+    if (is_type_tabbed() && !is_chromeless_mode())
513
 
       features |= FEATURE_LOCATIONBAR;
514
 
   }
515
 
   return !!(features & feature);
516
 
Index: src/chrome/browser/ui/browser_commands.cc
517
 
===================================================================
518
 
--- src/chrome/browser/ui/browser_commands.cc   (revision 158531)
519
 
+++ src/chrome/browser/ui/browser_commands.cc   (working copy)
520
 
@@ -392,6 +392,10 @@
521
 
 
522
 
 void NewTab(Browser* browser) {
523
 
   content::RecordAction(UserMetricsAction("NewTab"));
524
 
+
525
 
+  if (browser->is_chromeless_mode())
526
 
+    return;
527
 
+
528
 
   // TODO(asvitkine): This is invoked programmatically from several places.
529
 
   // Audit the code and change it so that the histogram only gets collected for
530
 
   // user-initiated commands.
531
 
@@ -428,7 +432,8 @@
532
 
 bool CanRestoreTab(const Browser* browser) {
533
 
   TabRestoreService* service =
534
 
       TabRestoreServiceFactory::GetForProfile(browser->profile());
535
 
-  return service && !service->entries().empty();
536
 
+  return service && !service->entries().empty()
537
 
+    && !browser->is_chromeless_mode();
538
 
 }
539
 
 
540
 
 void SelectNextTab(Browser* browser) {
541
 
Index: src/chrome/browser/ui/browser_command_controller.cc
542
 
===================================================================
543
 
--- src/chrome/browser/ui/browser_command_controller.cc (revision 158531)
544
 
+++ src/chrome/browser/ui/browser_command_controller.cc (working copy)
545
 
@@ -28,6 +28,7 @@
546
 
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
547
 
 #include "chrome/browser/ui/webui/sync_promo/sync_promo_ui.h"
548
 
 #include "chrome/common/chrome_notification_types.h"
549
 
+#include "chrome/common/chrome_switches.h"
550
 
 #include "chrome/common/pref_names.h"
551
 
 #include "chrome/common/profiling.h"
552
 
 #include "content/public/browser/native_web_keyboard_event.h"
553
 
@@ -691,8 +692,12 @@
554
 
 // BrowserCommandController, private:
555
 
 
556
 
 bool BrowserCommandController::IsShowingMainUI(bool is_fullscreen) {
557
 
+  const bool started_in_chromeless =
558
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
559
 
+    || browser_->is_chromeless_mode();
560
 
+
561
 
 #if !defined(OS_MACOSX)
562
 
-  return browser_->is_type_tabbed() && !is_fullscreen;
563
 
+  return browser_->is_type_tabbed() && !is_fullscreen && !started_in_chromeless;
564
 
 #else
565
 
   return browser_->is_type_tabbed();
566
 
 #endif
567
 
@@ -703,6 +708,9 @@
568
 
   // (like Back & Forward with initial page load) must have their state
569
 
   // initialized here, otherwise they will be forever disabled.
570
 
 
571
 
+  bool started_in_chromeless =
572
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless);
573
 
+
574
 
   // Navigation commands
575
 
   command_updater_.UpdateCommandEnabled(IDC_RELOAD, true);
576
 
   command_updater_.UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE, true);
577
 
@@ -710,10 +718,12 @@
578
 
 
579
 
   // Window management commands
580
 
   command_updater_.UpdateCommandEnabled(IDC_CLOSE_WINDOW, true);
581
 
-  command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, true);
582
 
+  command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, !started_in_chromeless);
583
 
   command_updater_.UpdateCommandEnabled(IDC_CLOSE_TAB, true);
584
 
-  command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB, true);
585
 
-  command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB, false);
586
 
+  command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB,
587
 
+                                        !started_in_chromeless);
588
 
+  command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB,
589
 
+                                        !started_in_chromeless);
590
 
   command_updater_.UpdateCommandEnabled(IDC_EXIT, true);
591
 
   command_updater_.UpdateCommandEnabled(IDC_DEBUG_FRAME_TOGGLE, true);
592
 
 
593
 
@@ -769,25 +779,33 @@
594
 
   command_updater_.UpdateCommandEnabled(IDC_CREATE_SHORTCUTS, false);
595
 
   UpdateCommandsForDevTools();
596
 
   command_updater_.UpdateCommandEnabled(IDC_TASK_MANAGER, CanOpenTaskManager());
597
 
-  command_updater_.UpdateCommandEnabled(IDC_SHOW_HISTORY, true);
598
 
-  command_updater_.UpdateCommandEnabled(IDC_SHOW_DOWNLOADS, true);
599
 
+  command_updater_.UpdateCommandEnabled(IDC_SHOW_HISTORY,
600
 
+                                        !started_in_chromeless);
601
 
+  command_updater_.UpdateCommandEnabled(IDC_SHOW_DOWNLOADS,
602
 
+                                        !started_in_chromeless);
603
 
   command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_KEYBOARD, true);
604
 
   command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_MENU, true);
605
 
-  command_updater_.UpdateCommandEnabled(IDC_BOOKMARKS_MENU, true);
606
 
+  command_updater_.UpdateCommandEnabled(IDC_BOOKMARKS_MENU,
607
 
+                                        !started_in_chromeless);
608
 
 
609
 
   command_updater_.UpdateCommandEnabled(
610
 
-      IDC_SHOW_SYNC_SETUP, profile()->GetOriginalProfile()->IsSyncAccessible());
611
 
+      IDC_SHOW_SYNC_SETUP,
612
 
+      profile()->GetOriginalProfile()->IsSyncAccessible()
613
 
+        && !started_in_chromeless);
614
 
 
615
 
   // Initialize other commands based on the window type.
616
 
   bool normal_window = browser_->is_type_tabbed();
617
 
 
618
 
   // Navigation commands
619
 
-  command_updater_.UpdateCommandEnabled(IDC_HOME, normal_window);
620
 
+  command_updater_.UpdateCommandEnabled(IDC_HOME,
621
 
+                                        normal_window
622
 
+                                          && !started_in_chromeless);
623
 
 
624
 
   // Window management commands
625
 
   // TODO(rohitrao): Disable fullscreen on non-Lion?
626
 
   command_updater_.UpdateCommandEnabled(IDC_FULLSCREEN,
627
 
-      !(browser_->is_type_panel() && browser_->is_app()));
628
 
+      !(browser_->is_type_panel() && browser_->is_app()
629
 
+        && started_in_chromeless));
630
 
   command_updater_.UpdateCommandEnabled(IDC_SELECT_NEXT_TAB, normal_window);
631
 
   command_updater_.UpdateCommandEnabled(IDC_SELECT_PREVIOUS_TAB,
632
 
                                         normal_window);
633
 
@@ -821,7 +839,9 @@
634
 
                                         !browser_->is_devtools());
635
 
 
636
 
   // Show various bits of UI
637
 
-  command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, normal_window);
638
 
+  command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA,
639
 
+                                        normal_window
640
 
+                                          && !started_in_chromeless);
641
 
 
642
 
   // The upgrade entry and the view incompatibility entry should always be
643
 
   // enabled. Whether they are visible is a separate matter determined on menu
644
 
@@ -831,7 +851,8 @@
645
 
 
646
 
   // View Background Pages entry is always enabled, but is hidden if there are
647
 
   // no background pages.
648
 
-  command_updater_.UpdateCommandEnabled(IDC_VIEW_BACKGROUND_PAGES, true);
649
 
+  command_updater_.UpdateCommandEnabled(IDC_VIEW_BACKGROUND_PAGES,
650
 
+                                        !started_in_chromeless);
651
 
 
652
 
   // Toggle speech input
653
 
   command_updater_.UpdateCommandEnabled(IDC_TOGGLE_SPEECH_INPUT, true);
654
 
@@ -847,19 +868,26 @@
655
 
 }
656
 
 
657
 
 void BrowserCommandController::UpdateCommandsForIncognitoAvailability() {
658
 
+  bool started_in_chromeless =
659
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
660
 
+    || browser_->is_chromeless_mode();
661
 
+
662
 
   IncognitoModePrefs::Availability incognito_availability =
663
 
       IncognitoModePrefs::GetAvailability(profile()->GetPrefs());
664
 
   command_updater_.UpdateCommandEnabled(
665
 
       IDC_NEW_WINDOW,
666
 
-      incognito_availability != IncognitoModePrefs::FORCED);
667
 
+      incognito_availability != IncognitoModePrefs::FORCED
668
 
+        && !started_in_chromeless);
669
 
   command_updater_.UpdateCommandEnabled(
670
 
       IDC_NEW_INCOGNITO_WINDOW,
671
 
-      incognito_availability != IncognitoModePrefs::DISABLED);
672
 
+      incognito_availability != IncognitoModePrefs::DISABLED
673
 
+        && !started_in_chromeless);
674
 
 
675
 
   // Bookmark manager and settings page/subpages are forced to open in normal
676
 
   // mode. For this reason we disable these commands when incognito is forced.
677
 
   const bool command_enabled =
678
 
-      incognito_availability != IncognitoModePrefs::FORCED;
679
 
+      incognito_availability != IncognitoModePrefs::FORCED
680
 
+      && !started_in_chromeless;
681
 
   command_updater_.UpdateCommandEnabled(
682
 
       IDC_SHOW_BOOKMARK_MANAGER,
683
 
       browser_defaults::bookmarks_enabled && command_enabled);
684
 
@@ -894,7 +922,8 @@
685
 
 
686
 
   // Window management commands
687
 
   command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB,
688
 
-      !browser_->is_app() && CanDuplicateTab(browser_));
689
 
+      !browser_->is_chromeless_mode() && !browser_->is_app()
690
 
+        && CanDuplicateTab(browser_));
691
 
 
692
 
   // Page-related commands
693
 
   window()->SetStarredState(
694
 
@@ -904,10 +933,12 @@
695
 
   window()->SetZoomIconTooltipPercent(
696
 
       current_tab_contents->zoom_controller()->zoom_percent());
697
 
   command_updater_.UpdateCommandEnabled(IDC_VIEW_SOURCE,
698
 
-                                        CanViewSource(browser_));
699
 
+                                        CanViewSource(browser_)
700
 
+                                          && !browser_->is_chromeless_mode());
701
 
   command_updater_.UpdateCommandEnabled(IDC_EMAIL_PAGE_LOCATION,
702
 
-                                        CanEmailPageLocation(browser_));
703
 
-  if (browser_->is_devtools())
704
 
+                                        CanEmailPageLocation(browser_)
705
 
+                                          && !browser_->is_chromeless_mode());
706
 
+  if (browser_->is_devtools() && browser_->is_chromeless_mode())
707
 
     command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, false);
708
 
 
709
 
   // Changing the encoding is not possible on Chrome-internal webpages.
710
 
@@ -923,7 +954,8 @@
711
 
 #if !defined(OS_MACOSX)
712
 
   command_updater_.UpdateCommandEnabled(
713
 
       IDC_CREATE_SHORTCUTS,
714
 
-      CanCreateApplicationShortcuts(browser_));
715
 
+      CanCreateApplicationShortcuts(browser_)
716
 
+        && !browser_->is_chromeless_mode());
717
 
 #endif
718
 
 
719
 
   UpdateCommandsForContentRestrictionState();
720
 
@@ -955,21 +987,31 @@
721
 
 }
722
 
 
723
 
 void BrowserCommandController::UpdateCommandsForBookmarkEditing() {
724
 
+  bool started_in_chromeless =
725
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
726
 
+    || browser_->is_chromeless_mode();
727
 
+
728
 
   command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_PAGE,
729
 
-                                        CanBookmarkCurrentPage(browser_));
730
 
+                                        CanBookmarkCurrentPage(browser_)
731
 
+                                          && !started_in_chromeless);
732
 
   command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_ALL_TABS,
733
 
-                                        CanBookmarkAllTabs(browser_));
734
 
+                                        CanBookmarkAllTabs(browser_)
735
 
+                                          && !started_in_chromeless);
736
 
   command_updater_.UpdateCommandEnabled(IDC_PIN_TO_START_SCREEN,
737
 
-                                        true);
738
 
+                                        !started_in_chromeless);
739
 
 }
740
 
 
741
 
 void BrowserCommandController::UpdateCommandsForBookmarkBar() {
742
 
+  const bool started_in_chromeless =
743
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
744
 
+    || browser_->is_chromeless_mode();
745
 
+
746
 
   const bool show_main_ui =
747
 
       IsShowingMainUI(window() && window()->IsFullscreen());
748
 
   command_updater_.UpdateCommandEnabled(IDC_SHOW_BOOKMARK_BAR,
749
 
       browser_defaults::bookmarks_enabled &&
750
 
       !profile()->GetPrefs()->IsManagedPreference(prefs::kShowBookmarkBar) &&
751
 
-      show_main_ui);
752
 
+      show_main_ui && !started_in_chromeless);
753
 
 }
754
 
 
755
 
 void BrowserCommandController::UpdateCommandsForFullscreenMode(
756
 
@@ -1069,7 +1111,12 @@
757
 
   if (local_state)
758
 
     enabled = local_state->GetBoolean(prefs::kAllowFileSelectionDialogs);
759
 
 
760
 
-  command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, enabled);
761
 
+  const bool started_in_chromeless =
762
 
+    CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeless)
763
 
+    || browser_->is_chromeless_mode();
764
 
+
765
 
+  command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE,
766
 
+                                        enabled && !started_in_chromeless);
767
 
 }
768
 
 
769
 
 void BrowserCommandController::UpdateReloadStopState(bool is_loading,
770
 
Index: src/chrome/browser/ui/browser.h
771
 
===================================================================
772
 
--- src/chrome/browser/ui/browser.h     (revision 158531)
773
 
+++ src/chrome/browser/ui/browser.h     (working copy)
774
 
@@ -164,6 +164,9 @@
775
 
                                      const gfx::Rect& window_bounds,
776
 
                                      Profile* profile);
777
 
 
778
 
+    // Like Create, but creates a chromeless browser.
779
 
+    static CreateParams CreateChromeless(Profile * profile);
780
 
+
781
 
     static CreateParams CreateForDevTools(Profile* profile);
782
 
 
783
 
     // The browser type.
784
 
@@ -181,6 +184,9 @@
785
 
     // Type of app (host or child). See description of AppType.
786
 
     AppType app_type;
787
 
 
788
 
+    // If the browser instance is supposed to be a chromeless one.
789
 
+    bool is_chromeless_mode;
790
 
+
791
 
     // The bounds of the window to open.
792
 
     gfx::Rect initial_bounds;
793
 
 
794
 
@@ -448,6 +454,7 @@
795
 
   bool is_type_popup() const { return type_ == TYPE_POPUP; }
796
 
   bool is_type_panel() const { return type_ == TYPE_PANEL; }
797
 
 
798
 
+  bool is_chromeless_mode() const;
799
 
   bool is_app() const;
800
 
   bool is_devtools() const;
801
 
 
802
 
@@ -806,6 +813,8 @@
803
 
   // Type of app (host or child). See description of AppType.
804
 
   AppType app_type_;
805
 
 
806
 
+  bool is_chromeless_mode_;
807
 
+
808
 
   // Unique identifier of this browser for session restore. This id is only
809
 
   // unique within the current session, and is not guaranteed to be unique
810
 
   // across sessions.
811
 
Index: src/chrome/browser/extensions/extension_module.h
812
 
===================================================================
813
 
--- src/chrome/browser/extensions/extension_module.h    (revision 158531)
814
 
+++ src/chrome/browser/extensions/extension_module.h    (working copy)
815
 
@@ -47,4 +47,11 @@
816
 
   virtual bool RunImpl() OVERRIDE;
817
 
 };
818
 
 
819
 
+class IsChromelessWindowFunction : public SyncExtensionFunction {
820
 
+ protected:
821
 
+  virtual bool RunImpl() OVERRIDE;
822
 
+  DECLARE_EXTENSION_FUNCTION_NAME("extension.isChromelessWindow");
823
 
+};
824
 
+
825
 
+
826
 
 #endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_MODULE_H__
827
 
Index: src/chrome/browser/extensions/extension_function_registry.cc
828
 
===================================================================
829
 
--- src/chrome/browser/extensions/extension_function_registry.cc        (revision 158531)
830
 
+++ src/chrome/browser/extensions/extension_function_registry.cc        (working copy)
831
 
@@ -314,6 +319,7 @@
832
 
   RegisterFunction<SetUpdateUrlDataFunction>();
833
 
   RegisterFunction<IsAllowedIncognitoAccessFunction>();
834
 
   RegisterFunction<IsAllowedFileSchemeAccessFunction>();
835
 
+  RegisterFunction<IsChromelessWindowFunction>();
836
 
 
837
 
   // WebstorePrivate.
838
 
   RegisterFunction<extensions::GetBrowserLoginFunction>();
839
 
Index: src/chrome/browser/extensions/extension_module.cc
840
 
===================================================================
841
 
--- src/chrome/browser/extensions/extension_module.cc   (revision 158531)
842
 
+++ src/chrome/browser/extensions/extension_module.cc   (working copy)
843
 
@@ -6,10 +6,29 @@
844
 
 
845
 
 #include <string>
846
 
 
847
 
+#if defined(OS_LINUX) && defined(TOOLKIT_GTK)
848
 
+#include <gdk/gdk.h>
849
 
+#include <gdk/gdkx.h>
850
 
+#endif
851
 
+
852
 
 #include "chrome/browser/extensions/extension_prefs.h"
853
 
+#include "chrome/browser/extensions/extension_tab_util.h"
854
 
 #include "chrome/browser/extensions/extension_service.h"
855
 
+#include "chrome/browser/ui/browser.h"
856
 
 #include "chrome/browser/profiles/profile.h"
857
 
+#include "chrome/common/chrome_switches.h"
858
 
 
859
 
+#if defined(OS_LINUX) && defined(TOOLKIT_GTK)
860
 
+
861
 
+namespace {
862
 
+
863
 
+const char kNoCurrentWindowError[] = "No current window";
864
 
+const char kCouldNotIdentifyTab[] = "Could not find tab with specified ID";
865
 
+
866
 
+} // namespace {
867
 
+
868
 
+#endif
869
 
+
870
 
 extensions::ExtensionPrefs* SetUpdateUrlDataFunction::extension_prefs() {
871
 
   return profile()->GetExtensionService()->extension_prefs();
872
 
 }
873
 
@@ -39,3 +58,35 @@
874
 
       ext_service->AllowFileAccess(extension)));
875
 
   return true;
876
 
 }
877
 
+
878
 
+bool IsChromelessWindowFunction::RunImpl() {
879
 
+  bool is_chromeless = false;
880
 
+
881
 
+  int tab_id = -1;
882
 
+  if (!args_->GetInteger(0, &tab_id)) {
883
 
+    Browser* browser = GetCurrentBrowser();
884
 
+    if (!browser) {
885
 
+      error_ = kNoCurrentWindowError;
886
 
+      return false;
887
 
+    }
888
 
+    is_chromeless = browser->is_chromeless_mode();
889
 
+  }
890
 
+  else {
891
 
+    Browser* browser = NULL;
892
 
+    if (!ExtensionTabUtil::GetTabById(tab_id,
893
 
+                                      profile(),
894
 
+                                      NULL,
895
 
+                                      &browser,
896
 
+                                      NULL,
897
 
+                                      NULL,
898
 
+                                      NULL)) {
899
 
+      error_ = kCouldNotIdentifyTab;
900
 
+      return false;
901
 
+    }
902
 
+    is_chromeless = browser->is_chromeless_mode();
903
 
+  }
904
 
+
905
 
+  SetResult(Value::CreateBooleanValue(is_chromeless));
906
 
+
907
 
+  return true;
908
 
+}
909
 
Index: src/chrome/common/extensions/api/extension.json
910
 
===================================================================
911
 
--- src/chrome/common/extensions/api/extension.json     (revision 158531)
912
 
+++ src/chrome/common/extensions/api/extension.json     (working copy)
913
 
@@ -193,6 +193,32 @@
914
 
         }
915
 
       },
916
 
       {
917
 
+        "name": "isChromelessWindow",
918
 
+        "type": "function",
919
 
+        "unprivileged": true,
920
 
+        "description": "Checks is a given extension runs part of a chromeless window.",
921
 
+        "parameters": [
922
 
+          {
923
 
+            "type": "integer",
924
 
+            "name": "tabId",
925
 
+            "optional": true,
926
 
+            "description": "The tab id corresponding to the window to restrict the request to."
927
 
+          }
928
 
+          ,
929
 
+          {
930
 
+            "type": "function",
931
 
+            "name": "callback",
932
 
+            "parameters": [
933
 
+              {
934
 
+                "name": "isChromelessWindow",
935
 
+                "type": "boolean",
936
 
+                "description": "True if the extension runs part of a chromeless window, false otherwise."
937
 
+              }
938
 
+            ]
939
 
+          }
940
 
+        ]
941
 
+      },
942
 
+      {
943
 
         "name": "isAllowedIncognitoAccess",
944
 
         "type": "function",
945
 
         "description": "Retrieves the state of the extension's access to Incognito-mode (as determined by the user-controlled 'Allowed in Incognito' checkbox.",
946
 
Index: src/chrome/common/chrome_switches.cc
947
 
===================================================================
948
 
--- src/chrome/common/chrome_switches.cc        (revision 158531)
949
 
+++ src/chrome/common/chrome_switches.cc        (working copy)
950
 
@@ -147,6 +147,9 @@
951
 
 // Chrome Frame automation channel is closed.
952
 
 const char kChromeFrameShutdownDelay[]      = "chrome-frame-shutdown-delay";
953
 
 
954
 
+// Specifies a given URL to be opened in a chromeless mode.
955
 
+const char kChromeless[]                    = "chromeless";
956
 
+
957
 
 // Tells chrome to load the specified version of chrome.dll on Windows. If this
958
 
 // version cannot be loaded, Chrome will exit.
959
 
 const char kChromeVersion[]                 = "chrome-version";
960
 
Index: src/chrome/common/chrome_switches.h
961
 
===================================================================
962
 
--- src/chrome/common/chrome_switches.h (revision 158531)
963
 
+++ src/chrome/common/chrome_switches.h (working copy)
964
 
@@ -54,6 +54,7 @@
965
 
 extern const char kCheckForUpdateIntervalSec[];
966
 
 extern const char kCheckCloudPrintConnectorPolicy[];
967
 
 extern const char kChromeFrameShutdownDelay[];
968
 
+extern const char kChromeless[];
969
 
 extern const char kChromeVersion[];
970
 
 extern const char kCipherSuiteBlacklist[];
971
 
 extern const char kClearTokenService[];