15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_context_menu_controller.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_utils.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_utils.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/page_navigator.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "win8/util/win8_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::PageNavigator; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::UserMetricsAction; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PageNavigator implementation that creates a new Browser. This is used when 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// opening a url and there is no Browser open. The Browser is created the first 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// time the PageNavigator method is invoked. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NewBrowserPageNavigator : public PageNavigator { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit NewBrowserPageNavigator(Profile* profile) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_(profile), 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_(NULL) {} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~NewBrowserPageNavigator() { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_->window()->Show(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser() const { return browser_; } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebContents* OpenURL(const OpenURLParams& params) OVERRIDE { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!browser_) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = (params.disposition == OFF_THE_RECORD) ? 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetOffTheRecordProfile() : profile_; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_ = new Browser(Browser::CreateParams(profile, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::GetActiveDesktop())); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams forward_params = params; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forward_params.disposition = NEW_FOREGROUND_TAB; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_->OpenURL(forward_params); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser_; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NewBrowserPageNavigator); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BookmarkContextMenuController::IsPlatformCommandIdEnabled( 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int command_id, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* enabled) const { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In Windows 8 metro mode no new window option on a regular chrome window 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and no new incognito window option on an incognito chrome window. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (win8::IsSingleWindowMetroMode()) { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command_id == IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW && 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !profile_->IsOffTheRecord()) { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *enabled = false; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (command_id == IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO && 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_->IsOffTheRecord()) { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *enabled = false; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BookmarkContextMenuController::ExecutePlatformCommand(int command_id, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int event_flags) { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (win8::IsSingleWindowMetroMode()) { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (command_id) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to handle the open in new window and open in incognito window 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // commands to ensure that they first look for an existing browser object 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to handle the request. If we find one then a new foreground tab is 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opened, else a new browser object is created. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO: { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_to_use = profile_; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command_id == IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile_to_use->IsOffTheRecord()) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_to_use = profile_to_use->GetOriginalProfile(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction( 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserMetricsAction("BookmarkBar_ContextMenu_OpenAllInNewWindow")); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!profile_to_use->IsOffTheRecord()) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_to_use = profile_to_use->GetOffTheRecordProfile(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserMetricsAction("BookmarkBar_ContextMenu_OpenAllIncognito")); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NewBrowserPageNavigator navigator_impl(profile_to_use); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(robertshield): FTB - Switch this to HOST_DESKTOP_TYPE_ASH when 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we make that the default for metro. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser = 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::FindTabbedBrowser(profile_to_use, 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HOST_DESKTOP_TYPE_NATIVE); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PageNavigator* navigator = NULL; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!browser || !browser->tab_strip_model()->GetActiveWebContents()) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigator = &navigator_impl; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->window()->Activate(); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigator = browser->tab_strip_model()->GetActiveWebContents(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::OpenAll(parent_window_, navigator, selection_, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NEW_FOREGROUND_TAB, profile_to_use); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_utils::RecordBookmarkLaunch( 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_utils::LAUNCH_CONTEXT_MENU); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 139