| Index: chrome/browser/browser_navigator.cc
|
| diff --git a/chrome/browser/browser_navigator.cc b/chrome/browser/browser_navigator.cc
|
| index d0791ba8539550bfc4748f77173d6d87ca7d4a6f..54edd144c7823c7e45588c0e5ad516685f562ace 100644
|
| --- a/chrome/browser/browser_navigator.cc
|
| +++ b/chrome/browser/browser_navigator.cc
|
| @@ -101,41 +101,59 @@ Browser* GetBrowserForDisposition(browser::NavigateParams* params) {
|
| // If no source TabContents was specified, we use the selected one from the
|
| // target browser. This must happen first, before GetBrowserForDisposition()
|
| // has a chance to replace |params->browser| with another one.
|
| - if (!params->source_contents)
|
| + if (!params->source_contents && params->browser)
|
| params->source_contents = params->browser->GetSelectedTabContents();
|
|
|
| + Profile* profile =
|
| + params->browser ? params->browser->profile() : params->profile;
|
| +
|
| switch (params->disposition) {
|
| case CURRENT_TAB:
|
| + if (!params->browser && profile) {
|
| + // We specified a profile instead of a browser; find or create one.
|
| + params->browser = Browser::GetOrCreateTabbedBrowser(profile);
|
| + }
|
| return params->browser;
|
| case SINGLETON_TAB:
|
| case NEW_FOREGROUND_TAB:
|
| case NEW_BACKGROUND_TAB:
|
| // See if we can open the tab in the window this navigator is bound to.
|
| - if (WindowCanOpenTabs(params->browser))
|
| + if (params->browser && WindowCanOpenTabs(params->browser))
|
| return params->browser;
|
| // Find a compatible window and re-execute this command in it. Otherwise
|
| // re-run with NEW_WINDOW.
|
| - return GetOrCreateBrowser(params->browser->profile());
|
| + if (profile)
|
| + return GetOrCreateBrowser(profile);
|
| + return NULL;
|
| case NEW_POPUP: {
|
| // Make a new popup window. Coerce app-style if |params->browser| or the
|
| // |source| represents an app.
|
| Browser::Type type = Browser::TYPE_POPUP;
|
| - if (params->browser->type() == Browser::TYPE_APP ||
|
| + if ((params->browser && params->browser->type() == Browser::TYPE_APP) ||
|
| (params->source_contents && params->source_contents->is_app())) {
|
| type = Browser::TYPE_APP_POPUP;
|
| }
|
| - Browser* browser = new Browser(type, params->browser->profile());
|
| - browser->set_override_bounds(params->window_bounds);
|
| - browser->CreateBrowserWindow();
|
| - return browser;
|
| + if (profile) {
|
| + Browser* browser = new Browser(type, profile);
|
| + browser->set_override_bounds(params->window_bounds);
|
| + browser->CreateBrowserWindow();
|
| + return browser;
|
| + }
|
| + return NULL;
|
| }
|
| case NEW_WINDOW:
|
| // Make a new normal browser window.
|
| - return Browser::Create(params->browser->profile());
|
| + if (profile) {
|
| + Browser* browser = new Browser(Browser::TYPE_NORMAL, profile);
|
| + browser->CreateBrowserWindow();
|
| + return browser;
|
| + }
|
| + return NULL;
|
| case OFF_THE_RECORD:
|
| // Make or find an incognito window.
|
| - return GetOrCreateBrowser(
|
| - params->browser->profile()->GetOffTheRecordProfile());
|
| + if (profile)
|
| + return GetOrCreateBrowser(profile->GetOffTheRecordProfile());
|
| + return NULL;
|
| // The following types all result in no navigation.
|
| case SUPPRESS_OPEN:
|
| case SAVE_TO_DISK:
|
| @@ -153,7 +171,8 @@ void NormalizeDisposition(browser::NavigateParams* params) {
|
| // Calculate the WindowOpenDisposition if necessary.
|
| if (params->browser->tabstrip_model()->empty() &&
|
| (params->disposition == NEW_BACKGROUND_TAB ||
|
| - params->disposition == CURRENT_TAB)) {
|
| + params->disposition == CURRENT_TAB ||
|
| + params->disposition == SINGLETON_TAB)) {
|
| params->disposition = NEW_FOREGROUND_TAB;
|
| }
|
| if (params->browser->profile()->IsOffTheRecord() &&
|
| @@ -241,8 +260,8 @@ NavigateParams::NavigateParams(
|
| tabstrip_index(-1),
|
| tabstrip_add_types(TabStripModel::ADD_SELECTED),
|
| show_window(false),
|
| - browser(a_browser) {
|
| - DCHECK(browser);
|
| + browser(a_browser),
|
| + profile(NULL) {
|
| }
|
|
|
| NavigateParams::NavigateParams(Browser* a_browser,
|
| @@ -254,8 +273,8 @@ NavigateParams::NavigateParams(Browser* a_browser,
|
| tabstrip_index(-1),
|
| tabstrip_add_types(TabStripModel::ADD_SELECTED),
|
| show_window(false),
|
| - browser(a_browser) {
|
| - DCHECK(browser);
|
| + browser(a_browser),
|
| + profile(NULL) {
|
| }
|
|
|
| NavigateParams::~NavigateParams() {
|
| @@ -310,6 +329,7 @@ void Navigate(NavigateParams* params) {
|
| // ... otherwise if we're loading in the current tab, the target is the
|
| // same as the source.
|
| params->target_contents = params->source_contents;
|
| + DCHECK(params->target_contents);
|
| }
|
|
|
| if (user_initiated) {
|
| @@ -360,4 +380,3 @@ void Navigate(NavigateParams* params) {
|
| }
|
|
|
| } // namespace browser
|
| -
|
|
|