browser_tabstrip.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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. 4 5#include "chrome/browser/ui/browser_tabstrip.h" 6 7#include "base/command_line.h" 8#include "chrome/browser/profiles/profile.h" 9#include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" 10#include "chrome/browser/ui/browser.h" 11#include "chrome/browser/ui/browser_navigator.h" 12#include "chrome/browser/ui/tabs/tab_strip_model.h" 13#include "chrome/common/chrome_switches.h" 14#include "chrome/common/url_constants.h" 15#include "content/public/browser/navigation_entry.h" 16#include "content/public/browser/render_view_host.h" 17#include "content/public/browser/web_contents.h" 18 19namespace chrome { 20 21void AddBlankTabAt(Browser* browser, int index, bool foreground) { 22 // Time new tab page creation time. We keep track of the timing data in 23 // WebContents, but we want to include the time it takes to create the 24 // WebContents object too. 25 base::TimeTicks new_tab_start_time = base::TimeTicks::Now(); 26 chrome::NavigateParams params(browser, GURL(chrome::kChromeUINewTabURL), 27 content::PAGE_TRANSITION_TYPED); 28 params.disposition = foreground ? NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB; 29 params.tabstrip_index = index; 30 chrome::Navigate(¶ms); 31 params.target_contents->SetNewTabStartTime(new_tab_start_time); 32} 33 34content::WebContents* AddSelectedTabWithURL( 35 Browser* browser, 36 const GURL& url, 37 content::PageTransition transition) { 38 NavigateParams params(browser, url, transition); 39 params.disposition = NEW_FOREGROUND_TAB; 40 Navigate(¶ms); 41 return params.target_contents; 42} 43 44void AddWebContents(Browser* browser, 45 content::WebContents* source_contents, 46 content::WebContents* new_contents, 47 WindowOpenDisposition disposition, 48 const gfx::Rect& initial_pos, 49 bool user_gesture, 50 bool* was_blocked) { 51 // No code for this yet. 52 DCHECK(disposition != SAVE_TO_DISK); 53 // Can't create a new contents for the current tab - invalid case. 54 DCHECK(disposition != CURRENT_TAB); 55 56 BlockedContentTabHelper* source_blocked_content = NULL; 57 if (source_contents) { 58 source_blocked_content = 59 BlockedContentTabHelper::FromWebContents(source_contents); 60 } 61 62 if (source_blocked_content) { 63 // Handle blocking of tabs. 64 if (source_blocked_content->all_contents_blocked()) { 65 source_blocked_content->AddWebContents( 66 new_contents, disposition, initial_pos, user_gesture); 67 if (was_blocked) 68 *was_blocked = true; 69 return; 70 } 71 72 // Handle blocking of popups. 73 if ((disposition == NEW_POPUP || disposition == NEW_FOREGROUND_TAB) && 74 !user_gesture && 75 !CommandLine::ForCurrentProcess()->HasSwitch( 76 switches::kDisablePopupBlocking)) { 77 // Unrequested popups from normal pages are constrained unless they're in 78 // the white list. The popup owner will handle checking this. 79 source_blocked_content->AddPopup( 80 new_contents, disposition, initial_pos, user_gesture); 81 if (was_blocked) 82 *was_blocked = true; 83 return; 84 } 85 86 new_contents->GetRenderViewHost()->DisassociateFromPopupCount(); 87 } 88 89 NavigateParams params(browser, new_contents); 90 params.source_contents = source_contents; 91 params.disposition = disposition; 92 params.window_bounds = initial_pos; 93 params.window_action = NavigateParams::SHOW_WINDOW; 94 params.user_gesture = user_gesture; 95 Navigate(¶ms); 96} 97 98void CloseWebContents(Browser* browser, 99 content::WebContents* contents, 100 bool add_to_history) { 101 int index = browser->tab_strip_model()->GetIndexOfWebContents(contents); 102 if (index == TabStripModel::kNoTab) { 103 NOTREACHED() << "CloseWebContents called for tab not in our strip"; 104 return; 105 } 106 107 browser->tab_strip_model()->CloseWebContentsAt( 108 index, 109 add_to_history ? TabStripModel::CLOSE_CREATE_HISTORICAL_TAB 110 : TabStripModel::CLOSE_NONE); 111} 112 113} // namespace chrome 114