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