OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/browser_navigator.h" | 5 #include "chrome/browser/browser_navigator.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "chrome/browser/browser.h" | 8 #include "chrome/browser/browser.h" |
9 #include "chrome/browser/browser_list.h" | 9 #include "chrome/browser/browser_list.h" |
10 #include "chrome/browser/browser_url_handler.h" | 10 #include "chrome/browser/browser_url_handler.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 return -1; | 94 return -1; |
95 } | 95 } |
96 | 96 |
97 // Returns a Browser that can host the navigation or tab addition specified in | 97 // Returns a Browser that can host the navigation or tab addition specified in |
98 // |params|. This might just return the same Browser specified in |params|, or | 98 // |params|. This might just return the same Browser specified in |params|, or |
99 // some other if that Browser is deemed incompatible. | 99 // some other if that Browser is deemed incompatible. |
100 Browser* GetBrowserForDisposition(browser::NavigateParams* params) { | 100 Browser* GetBrowserForDisposition(browser::NavigateParams* params) { |
101 // If no source TabContents was specified, we use the selected one from the | 101 // If no source TabContents was specified, we use the selected one from the |
102 // target browser. This must happen first, before GetBrowserForDisposition() | 102 // target browser. This must happen first, before GetBrowserForDisposition() |
103 // has a chance to replace |params->browser| with another one. | 103 // has a chance to replace |params->browser| with another one. |
104 if (!params->source_contents) | 104 if (!params->source_contents && params->browser) |
105 params->source_contents = params->browser->GetSelectedTabContents(); | 105 params->source_contents = params->browser->GetSelectedTabContents(); |
106 | 106 |
| 107 Profile* profile = |
| 108 params->browser ? params->browser->profile() : params->profile; |
| 109 |
107 switch (params->disposition) { | 110 switch (params->disposition) { |
108 case CURRENT_TAB: | 111 case CURRENT_TAB: |
| 112 if (!params->browser && profile) { |
| 113 // We specified a profile instead of a browser; find or create one. |
| 114 params->browser = Browser::GetOrCreateTabbedBrowser(profile); |
| 115 } |
109 return params->browser; | 116 return params->browser; |
110 case SINGLETON_TAB: | 117 case SINGLETON_TAB: |
111 case NEW_FOREGROUND_TAB: | 118 case NEW_FOREGROUND_TAB: |
112 case NEW_BACKGROUND_TAB: | 119 case NEW_BACKGROUND_TAB: |
113 // See if we can open the tab in the window this navigator is bound to. | 120 // See if we can open the tab in the window this navigator is bound to. |
114 if (WindowCanOpenTabs(params->browser)) | 121 if (params->browser && WindowCanOpenTabs(params->browser)) |
115 return params->browser; | 122 return params->browser; |
116 // Find a compatible window and re-execute this command in it. Otherwise | 123 // Find a compatible window and re-execute this command in it. Otherwise |
117 // re-run with NEW_WINDOW. | 124 // re-run with NEW_WINDOW. |
118 return GetOrCreateBrowser(params->browser->profile()); | 125 if (profile) |
| 126 return GetOrCreateBrowser(profile); |
| 127 return NULL; |
119 case NEW_POPUP: { | 128 case NEW_POPUP: { |
120 // Make a new popup window. Coerce app-style if |params->browser| or the | 129 // Make a new popup window. Coerce app-style if |params->browser| or the |
121 // |source| represents an app. | 130 // |source| represents an app. |
122 Browser::Type type = Browser::TYPE_POPUP; | 131 Browser::Type type = Browser::TYPE_POPUP; |
123 if (params->browser->type() == Browser::TYPE_APP || | 132 if ((params->browser && params->browser->type() == Browser::TYPE_APP) || |
124 (params->source_contents && params->source_contents->is_app())) { | 133 (params->source_contents && params->source_contents->is_app())) { |
125 type = Browser::TYPE_APP_POPUP; | 134 type = Browser::TYPE_APP_POPUP; |
126 } | 135 } |
127 Browser* browser = new Browser(type, params->browser->profile()); | 136 if (profile) { |
128 browser->set_override_bounds(params->window_bounds); | 137 Browser* browser = new Browser(type, profile); |
129 browser->CreateBrowserWindow(); | 138 browser->set_override_bounds(params->window_bounds); |
130 return browser; | 139 browser->CreateBrowserWindow(); |
| 140 return browser; |
| 141 } |
| 142 return NULL; |
131 } | 143 } |
132 case NEW_WINDOW: | 144 case NEW_WINDOW: |
133 // Make a new normal browser window. | 145 // Make a new normal browser window. |
134 return Browser::Create(params->browser->profile()); | 146 if (profile) { |
| 147 Browser* browser = new Browser(Browser::TYPE_NORMAL, profile); |
| 148 browser->CreateBrowserWindow(); |
| 149 return browser; |
| 150 } |
| 151 return NULL; |
135 case OFF_THE_RECORD: | 152 case OFF_THE_RECORD: |
136 // Make or find an incognito window. | 153 // Make or find an incognito window. |
137 return GetOrCreateBrowser( | 154 if (profile) |
138 params->browser->profile()->GetOffTheRecordProfile()); | 155 return GetOrCreateBrowser(profile->GetOffTheRecordProfile()); |
| 156 return NULL; |
139 // The following types all result in no navigation. | 157 // The following types all result in no navigation. |
140 case SUPPRESS_OPEN: | 158 case SUPPRESS_OPEN: |
141 case SAVE_TO_DISK: | 159 case SAVE_TO_DISK: |
142 case IGNORE_ACTION: | 160 case IGNORE_ACTION: |
143 return NULL; | 161 return NULL; |
144 default: | 162 default: |
145 NOTREACHED(); | 163 NOTREACHED(); |
146 } | 164 } |
147 return NULL; | 165 return NULL; |
148 } | 166 } |
149 | 167 |
150 // Fix disposition and other parameter values depending on prevailing | 168 // Fix disposition and other parameter values depending on prevailing |
151 // conditions. | 169 // conditions. |
152 void NormalizeDisposition(browser::NavigateParams* params) { | 170 void NormalizeDisposition(browser::NavigateParams* params) { |
153 // Calculate the WindowOpenDisposition if necessary. | 171 // Calculate the WindowOpenDisposition if necessary. |
154 if (params->browser->tabstrip_model()->empty() && | 172 if (params->browser->tabstrip_model()->empty() && |
155 (params->disposition == NEW_BACKGROUND_TAB || | 173 (params->disposition == NEW_BACKGROUND_TAB || |
156 params->disposition == CURRENT_TAB)) { | 174 params->disposition == CURRENT_TAB || |
| 175 params->disposition == SINGLETON_TAB)) { |
157 params->disposition = NEW_FOREGROUND_TAB; | 176 params->disposition = NEW_FOREGROUND_TAB; |
158 } | 177 } |
159 if (params->browser->profile()->IsOffTheRecord() && | 178 if (params->browser->profile()->IsOffTheRecord() && |
160 params->disposition == OFF_THE_RECORD) { | 179 params->disposition == OFF_THE_RECORD) { |
161 params->disposition = NEW_FOREGROUND_TAB; | 180 params->disposition = NEW_FOREGROUND_TAB; |
162 } | 181 } |
163 | 182 |
164 // Disposition trumps add types. ADD_SELECTED is a default, so we need to | 183 // Disposition trumps add types. ADD_SELECTED is a default, so we need to |
165 // remove it if disposition implies the tab is going to open in the | 184 // remove it if disposition implies the tab is going to open in the |
166 // background. | 185 // background. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 const GURL& a_url, | 253 const GURL& a_url, |
235 PageTransition::Type a_transition) | 254 PageTransition::Type a_transition) |
236 : url(a_url), | 255 : url(a_url), |
237 target_contents(NULL), | 256 target_contents(NULL), |
238 source_contents(NULL), | 257 source_contents(NULL), |
239 disposition(CURRENT_TAB), | 258 disposition(CURRENT_TAB), |
240 transition(a_transition), | 259 transition(a_transition), |
241 tabstrip_index(-1), | 260 tabstrip_index(-1), |
242 tabstrip_add_types(TabStripModel::ADD_SELECTED), | 261 tabstrip_add_types(TabStripModel::ADD_SELECTED), |
243 show_window(false), | 262 show_window(false), |
244 browser(a_browser) { | 263 browser(a_browser), |
245 DCHECK(browser); | 264 profile(NULL) { |
246 } | 265 } |
247 | 266 |
248 NavigateParams::NavigateParams(Browser* a_browser, | 267 NavigateParams::NavigateParams(Browser* a_browser, |
249 TabContents* a_target_contents) | 268 TabContents* a_target_contents) |
250 : target_contents(a_target_contents), | 269 : target_contents(a_target_contents), |
251 source_contents(NULL), | 270 source_contents(NULL), |
252 disposition(CURRENT_TAB), | 271 disposition(CURRENT_TAB), |
253 transition(PageTransition::LINK), | 272 transition(PageTransition::LINK), |
254 tabstrip_index(-1), | 273 tabstrip_index(-1), |
255 tabstrip_add_types(TabStripModel::ADD_SELECTED), | 274 tabstrip_add_types(TabStripModel::ADD_SELECTED), |
256 show_window(false), | 275 show_window(false), |
257 browser(a_browser) { | 276 browser(a_browser), |
258 DCHECK(browser); | 277 profile(NULL) { |
259 } | 278 } |
260 | 279 |
261 NavigateParams::~NavigateParams() { | 280 NavigateParams::~NavigateParams() { |
262 } | 281 } |
263 | 282 |
264 void Navigate(NavigateParams* params) { | 283 void Navigate(NavigateParams* params) { |
265 params->browser = GetBrowserForDisposition(params); | 284 params->browser = GetBrowserForDisposition(params); |
266 if (!params->browser) | 285 if (!params->browser) |
267 return; | 286 return; |
268 // Navigate() must not return early after this point. | 287 // Navigate() must not return early after this point. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 // By default, content believes it is not hidden. When adding contents | 322 // By default, content believes it is not hidden. When adding contents |
304 // in the background, tell it that it's hidden. | 323 // in the background, tell it that it's hidden. |
305 if ((params->tabstrip_add_types & TabStripModel::ADD_SELECTED) == 0) { | 324 if ((params->tabstrip_add_types & TabStripModel::ADD_SELECTED) == 0) { |
306 // TabStripModel::AddTabContents invokes HideContents if not foreground. | 325 // TabStripModel::AddTabContents invokes HideContents if not foreground. |
307 params->target_contents->WasHidden(); | 326 params->target_contents->WasHidden(); |
308 } | 327 } |
309 } else { | 328 } else { |
310 // ... otherwise if we're loading in the current tab, the target is the | 329 // ... otherwise if we're loading in the current tab, the target is the |
311 // same as the source. | 330 // same as the source. |
312 params->target_contents = params->source_contents; | 331 params->target_contents = params->source_contents; |
| 332 DCHECK(params->target_contents); |
313 } | 333 } |
314 | 334 |
315 if (user_initiated) { | 335 if (user_initiated) { |
316 RenderViewHostDelegate::BrowserIntegration* integration = | 336 RenderViewHostDelegate::BrowserIntegration* integration = |
317 params->target_contents; | 337 params->target_contents; |
318 integration->OnUserGesture(); | 338 integration->OnUserGesture(); |
319 } | 339 } |
320 | 340 |
321 // Perform the actual navigation. | 341 // Perform the actual navigation. |
322 GURL url = params->url.is_empty() ? params->browser->GetHomePage() | 342 GURL url = params->url.is_empty() ? params->browser->GetHomePage() |
(...skipping 30 matching lines...) Expand all Loading... |
353 params->transition, | 373 params->transition, |
354 params->tabstrip_add_types); | 374 params->tabstrip_add_types); |
355 // Now that the |params->target_contents| is safely owned by the target | 375 // Now that the |params->target_contents| is safely owned by the target |
356 // Browser's TabStripModel, we can release ownership. | 376 // Browser's TabStripModel, we can release ownership. |
357 target_contents_owner.ReleaseOwnership(); | 377 target_contents_owner.ReleaseOwnership(); |
358 } | 378 } |
359 } | 379 } |
360 } | 380 } |
361 | 381 |
362 } // namespace browser | 382 } // namespace browser |
363 | |
OLD | NEW |