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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/core_tab_helper.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddBlankTabAt(Browser* browser, int index, bool foreground) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Time new tab page creation time.  We keep track of the timing data in
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebContents, but we want to include the time it takes to create the
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebContents object too.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks new_tab_start_time = base::TimeTicks::Now();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams params(browser, GURL(chrome::kChromeUINewTabURL),
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                content::PAGE_TRANSITION_TYPED);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.disposition = foreground ? NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.tabstrip_index = index;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&params);
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CoreTabHelper* core_tab_helper =
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CoreTabHelper::FromWebContents(params.target_contents);
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  core_tab_helper->set_new_tab_start_time(new_tab_start_time);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::WebContents* AddSelectedTabWithURL(
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser* browser,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& url,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::PageTransition transition) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateParams params(browser, url, transition);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.disposition = NEW_FOREGROUND_TAB;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Navigate(&params);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return params.target_contents;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddWebContents(Browser* browser,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    content::WebContents* source_contents,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    content::WebContents* new_contents,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    WindowOpenDisposition disposition,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const gfx::Rect& initial_pos,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    bool user_gesture,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    bool* was_blocked) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No code for this yet.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(disposition != SAVE_TO_DISK);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can't create a new contents for the current tab - invalid case.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(disposition != CURRENT_TAB);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockedContentTabHelper* source_blocked_content = NULL;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (source_contents) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    source_blocked_content =
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BlockedContentTabHelper::FromWebContents(source_contents);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (source_blocked_content) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Handle blocking of tabs.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (source_blocked_content->all_contents_blocked()) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_blocked_content->AddWebContents(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new_contents, disposition, initial_pos, user_gesture);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (was_blocked)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *was_blocked = true;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Handle blocking of popups.
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if ((disposition == NEW_POPUP || disposition == NEW_FOREGROUND_TAB ||
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         disposition == NEW_BACKGROUND_TAB) && !user_gesture &&
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !CommandLine::ForCurrentProcess()->HasSwitch(
79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            switches::kDisablePopupBlocking) &&
80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        CommandLine::ForCurrentProcess()->HasSwitch(
81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch            switches::kDisableBetterPopupBlocking)) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Unrequested popups from normal pages are constrained unless they're in
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the white list.  The popup owner will handle checking this.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_blocked_content->AddPopup(
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new_contents, disposition, initial_pos, user_gesture);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (was_blocked)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *was_blocked = true;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_contents->GetRenderViewHost()->DisassociateFromPopupCount();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigateParams params(browser, new_contents);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.source_contents = source_contents;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.disposition = disposition;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.window_bounds = initial_pos;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.window_action = NavigateParams::SHOW_WINDOW;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.user_gesture = user_gesture;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Navigate(&params);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CloseWebContents(Browser* browser,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      content::WebContents* contents,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      bool add_to_history) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = browser->tab_strip_model()->GetIndexOfWebContents(contents);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index == TabStripModel::kNoTab) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "CloseWebContents called for tab not in our strip";
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser->tab_strip_model()->CloseWebContentsAt(
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      index,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      add_to_history ? TabStripModel::CLOSE_CREATE_HISTORICAL_TAB
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     : TabStripModel::CLOSE_NONE);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chrome
119