1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/bookmarks/bookmark_context_menu_controller.h"
7 #include "chrome/app/chrome_command_ids.h"
8 #include "chrome/browser/bookmarks/bookmark_stats.h"
9 #include "chrome/browser/profiles/profile.h"
10 #include "chrome/browser/ui/bookmarks/bookmark_utils.h"
11 #include "chrome/browser/ui/browser.h"
12 #include "chrome/browser/ui/browser_finder.h"
13 #include "chrome/browser/ui/browser_window.h"
14 #include "chrome/browser/ui/tabs/tab_strip_model.h"
15 #include "content/public/browser/page_navigator.h"
16 #include "content/public/browser/user_metrics.h"
17 #include "content/public/browser/web_contents.h"
18 #include "win8/util/win8_util.h"
20 using base::UserMetricsAction
;
21 using content::OpenURLParams
;
22 using content::PageNavigator
;
23 using content::WebContents
;
27 // A PageNavigator implementation that creates a new Browser. This is used when
28 // opening a url and there is no Browser open. The Browser is created the first
29 // time the PageNavigator method is invoked.
30 class NewBrowserPageNavigator
: public PageNavigator
{
32 explicit NewBrowserPageNavigator(Profile
* profile
)
36 virtual ~NewBrowserPageNavigator() {
38 browser_
->window()->Show();
41 Browser
* browser() const { return browser_
; }
43 virtual WebContents
* OpenURL(const OpenURLParams
& params
) OVERRIDE
{
45 Profile
* profile
= (params
.disposition
== OFF_THE_RECORD
) ?
46 profile_
->GetOffTheRecordProfile() : profile_
;
47 browser_
= new Browser(Browser::CreateParams(profile
,
48 chrome::GetActiveDesktop()));
51 OpenURLParams forward_params
= params
;
52 forward_params
.disposition
= NEW_FOREGROUND_TAB
;
53 return browser_
->OpenURL(forward_params
);
60 DISALLOW_COPY_AND_ASSIGN(NewBrowserPageNavigator
);
65 bool BookmarkContextMenuController::IsPlatformCommandIdEnabled(
67 bool* enabled
) const {
68 // In Windows 8 metro mode no new window option on a regular chrome window
69 // and no new incognito window option on an incognito chrome window.
70 if (win8::IsSingleWindowMetroMode()) {
71 if (command_id
== IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW
&&
72 !profile_
->IsOffTheRecord()) {
75 } else if (command_id
== IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO
&&
76 profile_
->IsOffTheRecord()) {
84 bool BookmarkContextMenuController::ExecutePlatformCommand(int command_id
,
86 if (win8::IsSingleWindowMetroMode()) {
88 // We need to handle the open in new window and open in incognito window
89 // commands to ensure that they first look for an existing browser object
90 // to handle the request. If we find one then a new foreground tab is
91 // opened, else a new browser object is created.
92 case IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW
:
93 case IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO
: {
94 Profile
* profile_to_use
= profile_
;
95 if (command_id
== IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW
) {
96 if (profile_to_use
->IsOffTheRecord())
97 profile_to_use
= profile_to_use
->GetOriginalProfile();
99 content::RecordAction(
100 UserMetricsAction("BookmarkBar_ContextMenu_OpenAllInNewWindow"));
102 if (!profile_to_use
->IsOffTheRecord())
103 profile_to_use
= profile_to_use
->GetOffTheRecordProfile();
105 content::RecordAction(
106 UserMetricsAction("BookmarkBar_ContextMenu_OpenAllIncognito"));
109 NewBrowserPageNavigator
navigator_impl(profile_to_use
);
111 // TODO(robertshield): FTB - Switch this to HOST_DESKTOP_TYPE_ASH when
112 // we make that the default for metro.
114 chrome::FindTabbedBrowser(profile_to_use
,
116 chrome::HOST_DESKTOP_TYPE_NATIVE
);
117 PageNavigator
* navigator
= NULL
;
118 if (!browser
|| !browser
->tab_strip_model()->GetActiveWebContents()) {
119 navigator
= &navigator_impl
;
121 browser
->window()->Activate();
122 navigator
= browser
->tab_strip_model()->GetActiveWebContents();
125 chrome::OpenAll(parent_window_
, navigator
, selection_
,
126 NEW_FOREGROUND_TAB
, profile_to_use
);
127 for (size_t i
= 0; i
< selection_
.size(); ++i
) {
128 RecordBookmarkLaunch(selection_
[i
],
129 BOOKMARK_LAUNCH_LOCATION_CONTEXT_MENU
);