OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/ui/browser_navigator.h" | 5 #include "chrome/browser/ui/browser_navigator.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
11 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
12 #include "chrome/browser/browser_about_handler.h" | 12 #include "chrome/browser/browser_about_handler.h" |
13 #include "chrome/browser/extensions/extension_service.h" | 13 #include "chrome/browser/extensions/extension_service.h" |
14 #include "chrome/browser/extensions/tab_helper.h" | 14 #include "chrome/browser/extensions/tab_helper.h" |
15 #include "chrome/browser/google/google_url_tracker.h" | 15 #include "chrome/browser/google/google_url_tracker.h" |
16 #include "chrome/browser/prefs/incognito_mode_prefs.h" | 16 #include "chrome/browser/prefs/incognito_mode_prefs.h" |
17 #include "chrome/browser/prefs/pref_service.h" | 17 #include "chrome/browser/prefs/pref_service.h" |
18 #include "chrome/browser/prerender/prerender_manager.h" | 18 #include "chrome/browser/prerender/prerender_manager.h" |
19 #include "chrome/browser/prerender/prerender_manager_factory.h" | 19 #include "chrome/browser/prerender/prerender_manager_factory.h" |
20 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
21 #include "chrome/browser/tab_contents/tab_util.h" | 21 #include "chrome/browser/tab_contents/tab_util.h" |
22 #include "chrome/browser/ui/browser.h" | 22 #include "chrome/browser/ui/browser.h" |
23 #include "chrome/browser/ui/browser_finder.h" | 23 #include "chrome/browser/ui/browser_finder.h" |
| 24 #include "chrome/browser/ui/browser_instant_controller.h" |
24 #include "chrome/browser/ui/browser_tab_contents.h" | 25 #include "chrome/browser/ui/browser_tab_contents.h" |
25 #include "chrome/browser/ui/browser_window.h" | 26 #include "chrome/browser/ui/browser_window.h" |
26 #include "chrome/browser/ui/host_desktop.h" | 27 #include "chrome/browser/ui/host_desktop.h" |
27 #include "chrome/browser/ui/omnibox/location_bar.h" | 28 #include "chrome/browser/ui/omnibox/location_bar.h" |
28 #include "chrome/browser/ui/singleton_tabs.h" | 29 #include "chrome/browser/ui/singleton_tabs.h" |
29 #include "chrome/browser/ui/status_bubble.h" | 30 #include "chrome/browser/ui/status_bubble.h" |
30 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 31 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
31 #include "chrome/browser/web_applications/web_app.h" | 32 #include "chrome/browser/web_applications/web_app.h" |
32 #include "chrome/common/chrome_notification_types.h" | 33 #include "chrome/common/chrome_notification_types.h" |
33 #include "chrome/common/extensions/extension.h" | 34 #include "chrome/common/extensions/extension.h" |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 case NEW_FOREGROUND_TAB: | 222 case NEW_FOREGROUND_TAB: |
222 case SINGLETON_TAB: | 223 case SINGLETON_TAB: |
223 params->tabstrip_add_types |= TabStripModel::ADD_ACTIVE; | 224 params->tabstrip_add_types |= TabStripModel::ADD_ACTIVE; |
224 break; | 225 break; |
225 | 226 |
226 default: | 227 default: |
227 break; | 228 break; |
228 } | 229 } |
229 } | 230 } |
230 | 231 |
| 232 GURL NormalizeURL(chrome::NavigateParams* params) { |
| 233 if (params->url.is_empty()) { |
| 234 params->transition = content::PageTransitionFromInt( |
| 235 params->transition | content::PAGE_TRANSITION_HOME_PAGE); |
| 236 return params->browser->profile()->GetHomePage(); |
| 237 } |
| 238 return params->url; |
| 239 } |
| 240 |
231 // Obtain the profile used by the code that originated the Navigate() request. | 241 // Obtain the profile used by the code that originated the Navigate() request. |
232 Profile* GetSourceProfile(chrome::NavigateParams* params) { | 242 Profile* GetSourceProfile(chrome::NavigateParams* params) { |
233 if (params->source_contents) { | 243 if (params->source_contents) { |
234 return Profile::FromBrowserContext( | 244 return Profile::FromBrowserContext( |
235 params->source_contents->GetBrowserContext()); | 245 params->source_contents->GetBrowserContext()); |
236 } | 246 } |
237 | 247 |
238 return params->initiating_profile; | 248 return params->initiating_profile; |
239 } | 249 } |
240 | 250 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 WebContents* ReleaseOwnership() { | 312 WebContents* ReleaseOwnership() { |
303 return target_contents_owner_.release(); | 313 return target_contents_owner_.release(); |
304 } | 314 } |
305 | 315 |
306 private: | 316 private: |
307 chrome::NavigateParams* params_; | 317 chrome::NavigateParams* params_; |
308 scoped_ptr<WebContents> target_contents_owner_; | 318 scoped_ptr<WebContents> target_contents_owner_; |
309 DISALLOW_COPY_AND_ASSIGN(ScopedTargetContentsOwner); | 319 DISALLOW_COPY_AND_ASSIGN(ScopedTargetContentsOwner); |
310 }; | 320 }; |
311 | 321 |
| 322 content::WebContents* CreateTargetContents(chrome::NavigateParams* params, |
| 323 const GURL& url) { |
| 324 WebContents::CreateParams create_params( |
| 325 params->browser->profile(), |
| 326 tab_util::GetSiteInstanceForNewTab(params->browser->profile(), url)); |
| 327 if (params->source_contents) { |
| 328 create_params.initial_size = |
| 329 params->source_contents->GetView()->GetContainerSize(); |
| 330 } |
| 331 #if defined(USE_AURA) |
| 332 if (params->browser->window() && |
| 333 params->browser->window()->GetNativeWindow()) { |
| 334 create_params.context = |
| 335 params->browser->window()->GetNativeWindow(); |
| 336 } |
| 337 #endif |
| 338 |
| 339 content::WebContents* target_contents = WebContents::Create(create_params); |
| 340 // New tabs can have WebUI URLs that will make calls back to arbitrary |
| 341 // tab helpers, so the entire set of tab helpers needs to be set up |
| 342 // immediately. |
| 343 BrowserNavigatorWebContentsAdoption::AttachTabHelpers(target_contents); |
| 344 extensions::TabHelper::FromWebContents(target_contents)-> |
| 345 SetExtensionAppById(params->extension_app_id); |
| 346 // TODO(sky): Figure out why this is needed. Without it we seem to get |
| 347 // failures in startup tests. |
| 348 // By default, content believes it is not hidden. When adding contents |
| 349 // in the background, tell it that it's hidden. |
| 350 if ((params->tabstrip_add_types & TabStripModel::ADD_ACTIVE) == 0) { |
| 351 // TabStripModel::AddWebContents invokes WasHidden if not foreground. |
| 352 target_contents->WasHidden(); |
| 353 } |
| 354 return target_contents; |
| 355 } |
| 356 |
312 // If a prerendered page exists for |url|, replace the page at |target_contents| | 357 // If a prerendered page exists for |url|, replace the page at |target_contents| |
313 // with it. | 358 // with it. |
314 bool SwapInPrerender(WebContents* target_contents, const GURL& url) { | 359 bool SwapInPrerender(WebContents* target_contents, const GURL& url) { |
315 prerender::PrerenderManager* prerender_manager = | 360 prerender::PrerenderManager* prerender_manager = |
316 prerender::PrerenderManagerFactory::GetForProfile( | 361 prerender::PrerenderManagerFactory::GetForProfile( |
317 Profile::FromBrowserContext(target_contents->GetBrowserContext())); | 362 Profile::FromBrowserContext(target_contents->GetBrowserContext())); |
318 return prerender_manager && | 363 return prerender_manager && |
319 prerender_manager->MaybeUsePrerenderedPage(target_contents, url); | 364 prerender_manager->MaybeUsePrerenderedPage(target_contents, url); |
320 } | 365 } |
321 | 366 |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 base_transition == content::PAGE_TRANSITION_TYPED || | 504 base_transition == content::PAGE_TRANSITION_TYPED || |
460 base_transition == content::PAGE_TRANSITION_AUTO_BOOKMARK || | 505 base_transition == content::PAGE_TRANSITION_AUTO_BOOKMARK || |
461 base_transition == content::PAGE_TRANSITION_GENERATED || | 506 base_transition == content::PAGE_TRANSITION_GENERATED || |
462 base_transition == content::PAGE_TRANSITION_AUTO_TOPLEVEL || | 507 base_transition == content::PAGE_TRANSITION_AUTO_TOPLEVEL || |
463 base_transition == content::PAGE_TRANSITION_RELOAD || | 508 base_transition == content::PAGE_TRANSITION_RELOAD || |
464 base_transition == content::PAGE_TRANSITION_KEYWORD; | 509 base_transition == content::PAGE_TRANSITION_KEYWORD; |
465 | 510 |
466 // Check if this is a singleton tab that already exists | 511 // Check if this is a singleton tab that already exists |
467 int singleton_index = chrome::GetIndexOfSingletonTab(params); | 512 int singleton_index = chrome::GetIndexOfSingletonTab(params); |
468 | 513 |
| 514 // Did we use Instant's NTP contents? |
| 515 bool swapped_in_instant = false; |
| 516 |
469 // If no target WebContents was specified, we need to construct one if | 517 // If no target WebContents was specified, we need to construct one if |
470 // we are supposed to target a new tab; unless it's a singleton that already | 518 // we are supposed to target a new tab; unless it's a singleton that already |
471 // exists. | 519 // exists. |
472 if (!params->target_contents && singleton_index < 0) { | 520 if (!params->target_contents && singleton_index < 0) { |
473 GURL url; | 521 GURL url = NormalizeURL(params); |
474 if (params->url.is_empty()) { | 522 BrowserInstantController* instant = params->browser->instant_controller(); |
475 url = params->browser->profile()->GetHomePage(); | |
476 params->transition = content::PageTransitionFromInt( | |
477 params->transition | content::PAGE_TRANSITION_HOME_PAGE); | |
478 } else { | |
479 url = params->url; | |
480 } | |
481 | |
482 if (params->disposition != CURRENT_TAB) { | 523 if (params->disposition != CURRENT_TAB) { |
483 WebContents::CreateParams create_params( | 524 swapped_in_instant = instant && instant->MaybeSwapInInstantContents( |
484 params->browser->profile(), | 525 url, NULL, ¶ms->target_contents); |
485 tab_util::GetSiteInstanceForNewTab(params->browser->profile(), url)); | 526 if (!swapped_in_instant) |
486 if (params->source_contents) { | 527 params->target_contents = CreateTargetContents(params, url); |
487 create_params.initial_size = | |
488 params->source_contents->GetView()->GetContainerSize(); | |
489 } | |
490 #if defined(USE_AURA) | |
491 if (params->browser->window() && | |
492 params->browser->window()->GetNativeWindow()) { | |
493 create_params.context = | |
494 params->browser->window()->GetNativeWindow(); | |
495 } | |
496 #endif | |
497 params->target_contents = WebContents::Create(create_params); | |
498 // New tabs can have WebUI URLs that will make calls back to arbitrary | |
499 // tab helpers, so the entire set of tab helpers needs to be set up | |
500 // immediately. | |
501 BrowserNavigatorWebContentsAdoption::AttachTabHelpers( | |
502 params->target_contents); | |
503 // This function takes ownership of |params->target_contents| until it | 528 // This function takes ownership of |params->target_contents| until it |
504 // is added to a TabStripModel. | 529 // is added to a TabStripModel. |
505 target_contents_owner.TakeOwnership(); | 530 target_contents_owner.TakeOwnership(); |
506 extensions::TabHelper::FromWebContents(params->target_contents)-> | |
507 SetExtensionAppById(params->extension_app_id); | |
508 // TODO(sky): Figure out why this is needed. Without it we seem to get | |
509 // failures in startup tests. | |
510 // By default, content believes it is not hidden. When adding contents | |
511 // in the background, tell it that it's hidden. | |
512 if ((params->tabstrip_add_types & TabStripModel::ADD_ACTIVE) == 0) { | |
513 // TabStripModel::AddWebContents invokes WasHidden if not foreground. | |
514 params->target_contents->WasHidden(); | |
515 } | |
516 } else { | 531 } else { |
517 // ... otherwise if we're loading in the current tab, the target is the | 532 // ... otherwise if we're loading in the current tab, the target is the |
518 // same as the source. | 533 // same as the source. |
519 params->target_contents = params->source_contents; | 534 DCHECK(params->source_contents); |
| 535 swapped_in_instant = instant && instant->MaybeSwapInInstantContents( |
| 536 url, params->source_contents, ¶ms->target_contents); |
| 537 if (!swapped_in_instant) |
| 538 params->target_contents = params->source_contents; |
520 DCHECK(params->target_contents); | 539 DCHECK(params->target_contents); |
521 } | 540 } |
522 | 541 |
523 if (user_initiated) | 542 if (user_initiated) |
524 params->target_contents->UserGestureDone(); | 543 params->target_contents->UserGestureDone(); |
525 | 544 |
526 if (SwapInPrerender(params->target_contents, url)) | 545 if (!swapped_in_instant) { |
527 return; | 546 if (SwapInPrerender(params->target_contents, url)) |
| 547 return; |
528 | 548 |
529 // Try to handle non-navigational URLs that popup dialogs and such, these | 549 // Try to handle non-navigational URLs that popup dialogs and such, these |
530 // should not actually navigate. | 550 // should not actually navigate. |
531 if (!HandleNonNavigationAboutURL(url)) { | 551 if (!HandleNonNavigationAboutURL(url)) { |
532 // Perform the actual navigation, tracking whether it came from the | 552 // Perform the actual navigation, tracking whether it came from the |
533 // renderer. | 553 // renderer. |
534 | 554 |
535 LoadURLInContents(params->target_contents, url, params); | 555 LoadURLInContents(params->target_contents, url, params); |
| 556 } |
536 } | 557 } |
537 } else { | 558 } else { |
538 // |target_contents| was specified non-NULL, and so we assume it has already | 559 // |target_contents| was specified non-NULL, and so we assume it has already |
539 // been navigated appropriately. We need to do nothing more other than | 560 // been navigated appropriately. We need to do nothing more other than |
540 // add it to the appropriate tabstrip. | 561 // add it to the appropriate tabstrip. |
541 } | 562 } |
542 | 563 |
543 // If the user navigated from the omnibox, and the selected tab is going to | 564 // If the user navigated from the omnibox, and the selected tab is going to |
544 // lose focus, then make sure the focus for the source tab goes away from the | 565 // lose focus, then make sure the focus for the source tab goes away from the |
545 // omnibox. | 566 // omnibox. |
546 if (params->source_contents && | 567 if (params->source_contents && |
547 (params->disposition == NEW_FOREGROUND_TAB || | 568 (params->disposition == NEW_FOREGROUND_TAB || |
548 params->disposition == NEW_WINDOW) && | 569 params->disposition == NEW_WINDOW) && |
549 (params->tabstrip_add_types & TabStripModel::ADD_INHERIT_OPENER)) | 570 (params->tabstrip_add_types & TabStripModel::ADD_INHERIT_OPENER)) |
550 params->source_contents->Focus(); | 571 params->source_contents->Focus(); |
551 | 572 |
552 if (params->source_contents == params->target_contents) { | 573 if (params->source_contents == params->target_contents || |
| 574 (swapped_in_instant && params->disposition == CURRENT_TAB)) { |
553 // The navigation occurred in the source tab. | 575 // The navigation occurred in the source tab. |
554 params->browser->UpdateUIForNavigationInTab(params->target_contents, | 576 params->browser->UpdateUIForNavigationInTab(params->target_contents, |
555 params->transition, | 577 params->transition, |
556 user_initiated); | 578 user_initiated); |
557 } else if (singleton_index == -1) { | 579 } else if (singleton_index == -1) { |
558 // If some non-default value is set for the index, we should tell the | 580 // If some non-default value is set for the index, we should tell the |
559 // TabStripModel to respect it. | 581 // TabStripModel to respect it. |
560 if (params->tabstrip_index != -1) | 582 if (params->tabstrip_index != -1) |
561 params->tabstrip_add_types |= TabStripModel::ADD_FORCE_INDEX; | 583 params->tabstrip_add_types |= TabStripModel::ADD_FORCE_INDEX; |
562 | 584 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 bool reverse_on_redirect = false; | 638 bool reverse_on_redirect = false; |
617 content::BrowserURLHandler::GetInstance()->RewriteURLIfNecessary( | 639 content::BrowserURLHandler::GetInstance()->RewriteURLIfNecessary( |
618 &rewritten_url, browser_context, &reverse_on_redirect); | 640 &rewritten_url, browser_context, &reverse_on_redirect); |
619 | 641 |
620 // Some URLs are mapped to uber subpages. Do not allow them in incognito. | 642 // Some URLs are mapped to uber subpages. Do not allow them in incognito. |
621 return !(rewritten_url.scheme() == chrome::kChromeUIScheme && | 643 return !(rewritten_url.scheme() == chrome::kChromeUIScheme && |
622 rewritten_url.host() == chrome::kChromeUIUberHost); | 644 rewritten_url.host() == chrome::kChromeUIUberHost); |
623 } | 645 } |
624 | 646 |
625 } // namespace chrome | 647 } // namespace chrome |
OLD | NEW |