| Index: chrome/browser/browser.cc
|
| ===================================================================
|
| --- chrome/browser/browser.cc (revision 5374)
|
| +++ chrome/browser/browser.cc (working copy)
|
| @@ -2,11 +2,11 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "chrome/browser/browser.h"
|
| -
|
| #include <windows.h>
|
| #include <shellapi.h>
|
|
|
| +#include "chrome/browser/browser.h"
|
| +
|
| #include "base/command_line.h"
|
| #include "base/file_version_info.h"
|
| #include "base/idle_timer.h"
|
| @@ -152,38 +152,20 @@
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // Browser, Constructors, Creation, Showing:
|
|
|
| -Browser::Browser(const gfx::Rect& initial_bounds,
|
| - int show_command,
|
| - Profile* profile,
|
| - BrowserType::Type type,
|
| - const std::wstring& app_name)
|
| - : profile_(profile),
|
| +Browser::Browser(BrowserType::Type type, Profile* profile)
|
| + : type_(type),
|
| + profile_(profile),
|
| window_(NULL),
|
| - initial_show_command_(show_command),
|
| - is_attempting_to_close_browser_(false),
|
| + tabstrip_model_(this, profile),
|
| controller_(this),
|
| + toolbar_model_(this),
|
| chrome_updater_factory_(this),
|
| + is_attempting_to_close_browser_(false),
|
| + override_maximized_(false),
|
| method_factory_(this),
|
| - tabstrip_model_(this, profile),
|
| - toolbar_model_(this),
|
| - type_(type),
|
| - app_name_(app_name),
|
| - idle_task_(new BrowserIdleTimer()) {
|
| + idle_task_(new BrowserIdleTimer) {
|
| tabstrip_model_.AddObserver(this);
|
|
|
| - CommandLine parsed_command_line;
|
| -
|
| - gfx::Rect create_bounds;
|
| - bool maximized = false;
|
| - WindowSizer::GetBrowserWindowBounds(app_name_, initial_bounds,
|
| - &create_bounds, &maximized);
|
| - if (parsed_command_line.HasSwitch(switches::kStartMaximized))
|
| - maximized = true;
|
| - if (maximized)
|
| - initial_show_command_ = SW_SHOWMAXIMIZED;
|
| - window_ = BrowserWindow::CreateBrowserWindow(this, create_bounds,
|
| - show_command);
|
| -
|
| NotificationService::current()->AddObserver(
|
| this, NOTIFY_SSL_STATE_CHANGED, NotificationService::AllSources());
|
|
|
| @@ -196,15 +178,6 @@
|
| // Trim browser memory on idle for low & medium memory models.
|
| if (g_browser_process->memory_model() < BrowserProcess::HIGH_MEMORY_MODEL)
|
| idle_task_->Start();
|
| -
|
| - // Show the First Run information bubble if we've been told to.
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - if (local_state->IsPrefRegistered(prefs::kShouldShowFirstRunBubble) &&
|
| - local_state->GetBoolean(prefs::kShouldShowFirstRunBubble)) {
|
| - // Reset the preference so we don't show the bubble for subsequent windows.
|
| - local_state->ClearPref(prefs::kShouldShowFirstRunBubble);
|
| - GetLocationBarView()->ShowFirstRunBubble();
|
| - }
|
| }
|
|
|
| Browser::~Browser() {
|
| @@ -248,76 +221,76 @@
|
| select_file_dialog_->ListenerDestroyed();
|
| }
|
|
|
| -void Browser::Show() {
|
| - // TODO(beng): this entire function should move to BrowserWindow.
|
| +// static
|
| +Browser* Browser::Create(Profile* profile) {
|
| + Browser* browser = new Browser(BrowserType::TABBED_BROWSER, profile);
|
| + browser->CreateBrowserWindow();
|
| + return browser;
|
| +}
|
|
|
| - // Only allow one call after the browser is created.
|
| - if (initial_show_command_ < 0) {
|
| - // The frame is already visible, we're being invoked again either by the
|
| - // user clicking a link in another app or from a desktop shortcut.
|
| - window_->Activate();
|
| - return;
|
| - }
|
| - window_->Show(initial_show_command_, false);
|
| - if ((initial_show_command_ == SW_SHOWNORMAL) ||
|
| - (initial_show_command_ == SW_SHOWMAXIMIZED))
|
| - window_->Activate();
|
| - initial_show_command_ = -1;
|
| +// static
|
| +Browser* Browser::CreateForPopup(Profile* profile) {
|
| + Browser* browser = new Browser(BrowserType::BROWSER, profile);
|
| + browser->CreateBrowserWindow();
|
| + return browser;
|
| +}
|
|
|
| - // Setting the focus doesn't work when the window is invisible, so any focus
|
| - // initialization that happened before this will be lost.
|
| - //
|
| - // We really "should" restore the focus whenever the window becomes unhidden,
|
| - // but I think initializing is the only time where this can happen where there
|
| - // is some focus change we need to pick up, and this is easier than plumbing
|
| - // through an unhide message all the way from the frame.
|
| - //
|
| - // If we do find there are cases where we need to restore the focus on show,
|
| - // that should be added and this should be removed.
|
| - TabContents* selected_tab_contents = GetSelectedTabContents();
|
| - if (selected_tab_contents)
|
| - selected_tab_contents->RestoreFocus();
|
| +// static
|
| +Browser* Browser::CreateForApp(const std::wstring& app_name,
|
| + Profile* profile) {
|
| + Browser* browser = new Browser(BrowserType::APPLICATION, profile);
|
| + browser->app_name_ = app_name;
|
| + browser->CreateBrowserWindow();
|
| + return browser;
|
| }
|
|
|
| +void Browser::CreateBrowserWindow() {
|
| + DCHECK(!window_);
|
| + window_ = BrowserWindow::CreateBrowserWindow(this);
|
| +
|
| + // Show the First Run information bubble if we've been told to.
|
| + PrefService* local_state = g_browser_process->local_state();
|
| + if (local_state->IsPrefRegistered(prefs::kShouldShowFirstRunBubble) &&
|
| + local_state->GetBoolean(prefs::kShouldShowFirstRunBubble)) {
|
| + // Reset the preference so we don't show the bubble for subsequent windows.
|
| + local_state->ClearPref(prefs::kShouldShowFirstRunBubble);
|
| + GetLocationBarView()->ShowFirstRunBubble();
|
| + }
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // Browser, Creation Helpers:
|
|
|
| // static
|
| -void Browser::OpenNewBrowserWindow(Profile* profile, int show_command) {
|
| - Browser* browser = new Browser(gfx::Rect(), show_command, profile,
|
| - BrowserType::TABBED_BROWSER, L"");
|
| +void Browser::OpenEmptyWindow(Profile* profile) {
|
| + Browser* browser = Browser::Create(profile);
|
| browser->AddBlankTab(true);
|
| - browser->Show();
|
| + browser->window()->Show();
|
| }
|
|
|
| // static
|
| void Browser::OpenURLOffTheRecord(Profile* profile, const GURL& url) {
|
| Profile* off_the_record_profile = profile->GetOffTheRecordProfile();
|
| Browser* browser = BrowserList::FindBrowserWithType(
|
| - off_the_record_profile, BrowserType::TABBED_BROWSER);
|
| - if (browser == NULL) {
|
| - browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, off_the_record_profile,
|
| - BrowserType::TABBED_BROWSER, L"");
|
| - }
|
| + off_the_record_profile,
|
| + BrowserType::TABBED_BROWSER);
|
| + if (!browser)
|
| + browser = Browser::Create(off_the_record_profile);
|
| // TODO(eroman): should we have referrer here?
|
| browser->AddTabWithURL(url, GURL(), PageTransition::LINK, true, NULL);
|
| - browser->Show();
|
| - browser->window()->Activate();
|
| + browser->window()->Show();
|
| }
|
|
|
| // static
|
| -void Browser::OpenWebApplication(Profile* profile,
|
| - WebApp* app,
|
| - int show_command) {
|
| +void Browser::OpenWebApplication(Profile* profile, WebApp* app) {
|
| const std::wstring& app_name =
|
| app->name().empty() ? ComputeApplicationNameFromURL(app->url()) :
|
| app->name();
|
| -
|
| RegisterAppPrefs(app_name);
|
| - Browser* browser = new Browser(gfx::Rect(), show_command, profile,
|
| - BrowserType::APPLICATION, app_name);
|
| +
|
| + Browser* browser = Browser::CreateForApp(app_name, profile);
|
| browser->AddWebApplicationTab(profile, app, false);
|
| - browser->Show();
|
| + browser->window()->Show();
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -356,7 +329,7 @@
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // Browser, State Storage and Retrieval for UI:
|
|
|
| -void Browser::SaveWindowPosition(const gfx::Rect& bounds, bool maximized) {
|
| +void Browser::SaveWindowPlacement(const gfx::Rect& bounds, bool maximized) {
|
| // We don't save window position for popups.
|
| if (type() == BrowserType::BROWSER)
|
| return;
|
| @@ -390,11 +363,39 @@
|
| }
|
| }
|
|
|
| -void Browser::RestoreWindowPosition(gfx::Rect* bounds, bool* maximized) {
|
| - DCHECK(bounds && maximized);
|
| - WindowSizer::GetBrowserWindowBounds(app_name_, *bounds, bounds, maximized);
|
| +gfx::Rect Browser::GetSavedWindowBounds() const {
|
| + CommandLine parsed_command_line;
|
| + bool record_mode = parsed_command_line.HasSwitch(switches::kRecordMode);
|
| + bool playback_mode = parsed_command_line.HasSwitch(switches::kPlaybackMode);
|
| + if (record_mode || playback_mode) {
|
| + // In playback/record mode we always fix the size of the browser and
|
| + // move it to (0,0). The reason for this is two reasons: First we want
|
| + // resize/moves in the playback to still work, and Second we want
|
| + // playbacks to work (as much as possible) on machines w/ different
|
| + // screen sizes.
|
| + return gfx::Rect(0, 0, 800, 600);
|
| + }
|
| +
|
| + gfx::Rect restored_bounds = override_bounds_;
|
| + bool maximized;
|
| + WindowSizer::GetBrowserWindowBounds(app_name_, restored_bounds,
|
| + &restored_bounds, &maximized);
|
| + return restored_bounds;
|
| }
|
|
|
| +// TODO(beng): obtain maximized state some other way so we don't need to go
|
| +// through all this hassle.
|
| +bool Browser::GetSavedMaximizedState() const {
|
| + if (CommandLine().HasSwitch(switches::kStartMaximized))
|
| + return true;
|
| +
|
| + gfx::Rect restored_bounds;
|
| + bool maximized = override_maximized_;
|
| + WindowSizer::GetBrowserWindowBounds(app_name_, restored_bounds,
|
| + &restored_bounds, &maximized);
|
| + return maximized;
|
| +}
|
| +
|
| SkBitmap Browser::GetCurrentPageIcon() const {
|
| TabContents* contents = tabstrip_model_.GetSelectedTabContents();
|
| return contents ? contents->GetFavIcon() : SkBitmap();
|
| @@ -661,10 +662,8 @@
|
| AddBlankTab(true);
|
| } else {
|
| Browser* b = GetOrCreateTabbedBrowser();
|
| - DCHECK(b);
|
| - b->Show();
|
| - b->window()->Activate();
|
| b->AddBlankTab(true);
|
| + b->window()->Show();
|
| }
|
| }
|
|
|
| @@ -680,14 +679,12 @@
|
|
|
| void Browser::NewWindow() {
|
| UserMetrics::RecordAction(L"NewWindow", profile_);
|
| - Browser::OpenNewBrowserWindow(profile_->GetOriginalProfile(),
|
| - SW_SHOWNORMAL);
|
| + Browser::OpenEmptyWindow(profile_->GetOriginalProfile());
|
| }
|
|
|
| void Browser::NewIncognitoWindow() {
|
| UserMetrics::RecordAction(L"NewIncognitoWindow", profile_);
|
| - Browser::OpenNewBrowserWindow(profile_->GetOffTheRecordProfile(),
|
| - SW_SHOWNORMAL);
|
| + Browser::OpenEmptyWindow(profile_->GetOffTheRecordProfile());
|
| }
|
|
|
| void Browser::CloseWindow() {
|
| @@ -748,11 +745,9 @@
|
|
|
| int tab_strip_index = tabstrip_model_.selected_index();
|
| TabContents* contents = tabstrip_model_.DetachTabContentsAt(tab_strip_index);
|
| - Browser* browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, profile_,
|
| - BrowserType::TABBED_BROWSER, L"");
|
| - browser->AddNewContents(NULL, contents, NEW_FOREGROUND_TAB, gfx::Rect(),
|
| - true);
|
| - browser->Show();
|
| + Browser* browser = Browser::Create(profile_);
|
| + browser->tabstrip_model()->AppendTabContents(contents, true);
|
| + browser->window()->Show();
|
| }
|
|
|
| void Browser::Exit() {
|
| @@ -1286,6 +1281,10 @@
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // Browser, TabStripModelDelegate implementation:
|
|
|
| +GURL Browser::GetBlankTabURL() const {
|
| + return NewTabUIURL();
|
| +}
|
| +
|
| void Browser::CreateNewStripWithContents(TabContents* detached_contents,
|
| const gfx::Point& drop_point) {
|
| DCHECK(type_ == BrowserType::TABBED_BROWSER);
|
| @@ -1300,13 +1299,11 @@
|
| rect.SetRect(drop_point.x(), drop_point.y(), browser_rect.Width(),
|
| browser_rect.Height());
|
| }
|
| - Browser* new_window =
|
| - new Browser(rect, SW_SHOWNORMAL, profile_, BrowserType::TABBED_BROWSER,
|
| - std::wstring());
|
| - // Append the TabContents before showing it so the window doesn't flash
|
| - // black.
|
| - new_window->tabstrip_model()->AppendTabContents(detached_contents, true);
|
| - new_window->Show();
|
| + Browser* browser = new Browser(BrowserType::TABBED_BROWSER, profile_);
|
| + browser->set_override_bounds(rect);
|
| + browser->CreateBrowserWindow();
|
| + browser->tabstrip_model()->AppendTabContents(detached_contents, true);
|
| + browser->window()->Show();
|
|
|
| // When we detach a tab we need to make sure any associated Find window moves
|
| // along with it to its new home (basically we just make new_window the parent
|
| @@ -1314,7 +1311,7 @@
|
| // TODO(brettw) this could probably be improved, see
|
| // WebContentsView::ReparentFindWindow for more.
|
| if (detached_contents->AsWebContents())
|
| - detached_contents->AsWebContents()->view()->ReparentFindWindow(new_window);
|
| + detached_contents->AsWebContents()->view()->ReparentFindWindow(browser);
|
| }
|
|
|
| int Browser::GetDragActions() const {
|
| @@ -1377,19 +1374,21 @@
|
| tabstrip_model_.AddTabContents(new_contents, index + 1,
|
| PageTransition::LINK, true);
|
| } else {
|
| - Browser* new_browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, profile(),
|
| - BrowserType::APPLICATION, app_name_);
|
| + Browser* browser = NULL;
|
| + if (type_ == BrowserType::APPLICATION) {
|
| + browser = Browser::CreateForApp(app_name_, profile_);
|
| + } else if (type_ == BrowserType::BROWSER) {
|
| + browser = Browser::CreateForPopup(profile_);
|
| + }
|
|
|
| // We need to show the browser now. Otherwise ContainerWin assumes the
|
| // TabContents is invisible and won't size it.
|
| - new_browser->Show();
|
| + browser->window()->Show();
|
|
|
| // The page transition below is only for the purpose of inserting the tab.
|
| - new_contents = new_browser->AddTabWithNavigationController(
|
| - contents->controller()->Clone(new_browser->GetTopLevelHWND()),
|
| + new_contents = browser->AddTabWithNavigationController(
|
| + contents->controller()->Clone(browser->GetTopLevelHWND()),
|
| PageTransition::LINK);
|
| -
|
| - new_browser->window()->Activate();
|
| }
|
|
|
| if (profile_->HasSessionService()) {
|
| @@ -1588,8 +1587,7 @@
|
| disposition = NEW_FOREGROUND_TAB;
|
|
|
| b->OpenURL(url, referrer, disposition, transition);
|
| - b->Show();
|
| - b->window()->Activate();
|
| + b->window()->Show();
|
| return;
|
| }
|
|
|
| @@ -1597,11 +1595,10 @@
|
| disposition = NEW_FOREGROUND_TAB;
|
|
|
| if (disposition == NEW_WINDOW) {
|
| - Browser* new_browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, profile_,
|
| - BrowserType::TABBED_BROWSER, L"");
|
| - new_contents = new_browser->AddTabWithURL(url, referrer, transition, true,
|
| - instance);
|
| - new_browser->Show();
|
| + Browser* browser = Browser::Create(profile_);
|
| + new_contents = browser->AddTabWithURL(url, referrer, transition, true,
|
| + instance);
|
| + browser->window()->Show();
|
| } else if ((disposition == CURRENT_TAB) && current_tab) {
|
| if (transition == PageTransition::TYPED ||
|
| transition == PageTransition::AUTO_BOOKMARK ||
|
| @@ -1646,9 +1643,8 @@
|
| OpenURLOffTheRecord(profile_, url);
|
| return;
|
| } else if (disposition != SUPPRESS_OPEN) {
|
| - new_contents =
|
| - AddTabWithURL(url, referrer, transition,
|
| - disposition != NEW_BACKGROUND_TAB, instance);
|
| + new_contents = AddTabWithURL(url, referrer, transition,
|
| + disposition != NEW_BACKGROUND_TAB, instance);
|
| }
|
|
|
| if (disposition != NEW_BACKGROUND_TAB && source_tab_was_frontmost) {
|
| @@ -1727,19 +1723,17 @@
|
| if (type_ == BrowserType::APPLICATION)
|
| transition = PageTransition::START_PAGE;
|
| b->tabstrip_model()->AddTabContents(new_contents, -1, transition, true);
|
| - b->Show();
|
| - b->window()->Activate();
|
| + b->window()->Show();
|
| return;
|
| }
|
|
|
| if (disposition == NEW_POPUP) {
|
| BuildPopupWindow(source, new_contents, initial_pos);
|
| } else if (disposition == NEW_WINDOW) {
|
| - Browser* new_browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, profile_,
|
| - BrowserType::TABBED_BROWSER, L"");
|
| - new_browser->AddNewContents(source, new_contents, NEW_FOREGROUND_TAB,
|
| - initial_pos, user_gesture);
|
| - new_browser->Show();
|
| + Browser* browser = Browser::Create(profile_);
|
| + browser->AddNewContents(source, new_contents, NEW_FOREGROUND_TAB,
|
| + initial_pos, user_gesture);
|
| + browser->window()->Show();
|
| } else if (disposition == CURRENT_TAB) {
|
| ReplaceContents(source, new_contents);
|
| } else if (disposition != SUPPRESS_OPEN) {
|
| @@ -1856,11 +1850,9 @@
|
| RegisterAppPrefs(app_name);
|
|
|
| tabstrip_model_.DetachTabContentsAt(index);
|
| - Browser* browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, profile_,
|
| - BrowserType::APPLICATION, app_name);
|
| - browser->AddNewContents(
|
| - NULL, contents, NEW_FOREGROUND_TAB, gfx::Rect(), true);
|
| - browser->Show();
|
| + Browser* browser = Browser::CreateForApp(app_name, profile_);
|
| + browser->tabstrip_model()->AppendTabContents(contents, true);
|
| + browser->window()->Show();
|
| }
|
|
|
| void Browser::ContentsStateChanged(TabContents* source) {
|
| @@ -2406,10 +2398,8 @@
|
| Browser* Browser::GetOrCreateTabbedBrowser() {
|
| Browser* browser = BrowserList::FindBrowserWithType(
|
| profile_, BrowserType::TABBED_BROWSER);
|
| - if (!browser) {
|
| - browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, profile_,
|
| - BrowserType::TABBED_BROWSER, std::wstring());
|
| - }
|
| + if (!browser)
|
| + browser = Browser::Create(profile_);
|
| return browser;
|
| }
|
|
|
| @@ -2418,25 +2408,25 @@
|
| const gfx::Rect& initial_pos) {
|
| BrowserType::Type type =
|
| type_ == BrowserType::APPLICATION ? type_ : BrowserType::BROWSER;
|
| - Browser* browser = new Browser(initial_pos, SW_SHOWNORMAL, profile_, type,
|
| - std::wstring());
|
| - browser->AddNewContents(source, new_contents,
|
| - NEW_FOREGROUND_TAB, gfx::Rect(), true);
|
| - browser->Show();
|
| + Browser* browser = new Browser(type, profile_);
|
| + browser->set_override_bounds(initial_pos);
|
| + browser->CreateBrowserWindow();
|
| + // TODO(beng): See if this can be made to use
|
| + // TabStripModel::AppendTabContents.
|
| + browser->AddNewContents(source, new_contents, NEW_FOREGROUND_TAB,
|
| + gfx::Rect(), true);
|
| + browser->window()->Show();
|
| }
|
|
|
| GURL Browser::GetHomePage() {
|
| - if (profile_->GetPrefs()->GetBoolean(prefs::kHomePageIsNewTabPage)) {
|
| + if (profile_->GetPrefs()->GetBoolean(prefs::kHomePageIsNewTabPage))
|
| return NewTabUIURL();
|
| - } else {
|
| - GURL home_page = GURL(URLFixerUpper::FixupURL(
|
| - profile_->GetPrefs()->GetString(prefs::kHomePage),
|
| - std::wstring()));
|
| - if (!home_page.is_valid())
|
| - return NewTabUIURL();
|
| -
|
| - return home_page;
|
| - }
|
| + GURL home_page = GURL(URLFixerUpper::FixupURL(
|
| + profile_->GetPrefs()->GetString(prefs::kHomePage),
|
| + std::wstring()));
|
| + if (!home_page.is_valid())
|
| + return NewTabUIURL();
|
| + return home_page;
|
| }
|
|
|
| void Browser::AdvanceFindSelection(bool forward_direction) {
|
|
|