15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_about_handler.h" 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/incognito_mode_prefs.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h" 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_instant_controller.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/location_bar/location_bar.h" 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/search/instant_search_prerenderer.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/singleton_tabs.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/status_bubble.h" 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/tab_helpers.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_applications/web_app.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/google/core/browser/google_url_tracker.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_url_handler.h" 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(USE_ASH) 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_EXTENSIONS) 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/extension_registry.h" 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension.h" 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension_set.h" 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::GlobalRequestID; 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using content::NavigationController; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BrowserNavigatorWebContentsAdoption { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void AttachTabHelpers(content::WebContents* contents) { 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TabHelpers::AttachTabHelpers(contents); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the specified Browser can open tabs. Not all Browsers support 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// multiple tabs, such as app frames and popups. This function returns false for 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// those types of Browser. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WindowCanOpenTabs(Browser* browser) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser->CanSupportWindowFeature(Browser::FEATURE_TABSTRIP) || 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser->tab_strip_model()->empty(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Finds an existing Browser compatible with |profile|, making a new one if no 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// such Browser is located. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* GetOrCreateBrowser(Profile* profile, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::HostDesktopType host_desktop_type) { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser = chrome::FindTabbedBrowser(profile, false, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_desktop_type); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser ? browser : new Browser( 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser::CreateParams(profile, host_desktop_type)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Change some of the navigation parameters based on the particular URL. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Currently this applies to some chrome:// pages which we always want to open 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in a non-incognito window. Note that even though a ChromeOS guest session is 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// technically an incognito window, these URLs are allowed. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true on success. Otherwise, if changing params leads the browser into 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an erroneous state, returns false. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AdjustNavigateParamsForURL(chrome::NavigateParams* params) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->target_contents != NULL || 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::IsURLAllowedInIncognito(params->url, 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->initiating_profile) || 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->initiating_profile->IsGuestSession()) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = params->initiating_profile; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile->IsOffTheRecord() || params->disposition == OFF_THE_RECORD) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile = profile->GetOriginalProfile(); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If incognito is forced, we punt. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs && IncognitoModePrefs::GetAvailability(prefs) == 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncognitoModePrefs::FORCED) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->disposition = SINGLETON_TAB; 1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) params->browser = GetOrCreateBrowser(profile, params->host_desktop_type); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->window_action = chrome::NavigateParams::SHOW_WINDOW; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a Browser that can host the navigation or tab addition specified in 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |params|. This might just return the same Browser specified in |params|, or 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// some other if that Browser is deemed incompatible. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* GetBrowserForDisposition(chrome::NavigateParams* params) { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If no source WebContents was specified, we use the selected one from 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the target browser. This must happen first, before 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetBrowserForDisposition() has a chance to replace |params->browser| with 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another one. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params->source_contents && params->browser) { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->source_contents = 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->browser->tab_strip_model()->GetActiveWebContents(); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = params->initiating_profile; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (params->disposition) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CURRENT_TAB: 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->browser) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return params->browser; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find a compatible window and re-execute this command in it. Otherwise 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // re-run with NEW_WINDOW. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetOrCreateBrowser(profile, params->host_desktop_type); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SINGLETON_TAB: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_FOREGROUND_TAB: 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_BACKGROUND_TAB: 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See if we can open the tab in the window this navigator is bound to. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->browser && WindowCanOpenTabs(params->browser)) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return params->browser; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find a compatible window and re-execute this command in it. Otherwise 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // re-run with NEW_WINDOW. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetOrCreateBrowser(profile, params->host_desktop_type); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_POPUP: { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make a new popup window. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Coerce app-style if |source| represents an app. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string app_name; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!params->extension_app_id.empty()) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_name = web_app::GenerateApplicationNameFromExtensionId( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->extension_app_id); 160558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } else if (params->browser && !params->browser->app_name().empty()) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_name = params->browser->app_name(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (params->source_contents) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TabHelper* extensions_tab_helper = 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::TabHelper::FromWebContents(params->source_contents); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extensions_tab_helper && extensions_tab_helper->is_app()) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_name = web_app::GenerateApplicationNameFromExtensionId( 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_tab_helper->extension_app()->id()); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (app_name.empty()) { 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser::CreateParams browser_params( 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser::TYPE_POPUP, profile, params->host_desktop_type); 173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch browser_params.trusted_source = params->trusted_source; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_params.initial_bounds = params->window_bounds; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new Browser(browser_params); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new Browser(Browser::CreateParams::CreateForApp( 179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch app_name, 180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch params->trusted_source, 181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch params->window_bounds, 182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch profile, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->host_desktop_type)); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_WINDOW: { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make a new normal browser window. 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new Browser(Browser::CreateParams(profile, 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->host_desktop_type)); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OFF_THE_RECORD: 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make or find an incognito window. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetOrCreateBrowser(profile->GetOffTheRecordProfile(), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->host_desktop_type); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The following types all result in no navigation. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SUPPRESS_OPEN: 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SAVE_TO_DISK: 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IGNORE_ACTION: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fix disposition and other parameter values depending on prevailing 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// conditions. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NormalizeDisposition(chrome::NavigateParams* params) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate the WindowOpenDisposition if necessary. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->browser->tab_strip_model()->empty() && 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (params->disposition == NEW_BACKGROUND_TAB || 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->disposition == CURRENT_TAB || 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->disposition == SINGLETON_TAB)) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->disposition = NEW_FOREGROUND_TAB; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->browser->profile()->IsOffTheRecord() && 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->disposition == OFF_THE_RECORD) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->disposition = NEW_FOREGROUND_TAB; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!params->source_contents && params->disposition == CURRENT_TAB) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->disposition = NEW_FOREGROUND_TAB; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (params->disposition) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_BACKGROUND_TAB: 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disposition trumps add types. ADD_ACTIVE is a default, so we need to 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // remove it if disposition implies the tab is going to open in the 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->tabstrip_add_types &= ~TabStripModel::ADD_ACTIVE; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_WINDOW: 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_POPUP: 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Code that wants to open a new window typically expects it to be shown 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // automatically. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->window_action == chrome::NavigateParams::NO_ACTION) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->window_action = chrome::NavigateParams::SHOW_WINDOW; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fall-through. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_FOREGROUND_TAB: 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SINGLETON_TAB: 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->tabstrip_add_types |= TabStripModel::ADD_ACTIVE; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Obtain the profile used by the code that originated the Navigate() request. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* GetSourceProfile(chrome::NavigateParams* params) { 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params->source_contents) { 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Profile::FromBrowserContext( 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->source_contents->GetBrowserContext()); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return params->initiating_profile; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoadURLInContents(WebContents* target_contents, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NavigateParams* params) { 260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NavigationController::LoadURLParams load_url_params(url); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_url_params.referrer = params->referrer; 262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) load_url_params.frame_tree_node_id = params->frame_tree_node_id; 2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) load_url_params.redirect_chain = params->redirect_chain; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_url_params.transition_type = params->transition; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_url_params.extra_headers = params->extra_headers; 266ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch load_url_params.should_replace_current_entry = 267ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->should_replace_current_entry; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->transferred_global_request_id != GlobalRequestID()) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_url_params.is_renderer_initiated = params->is_renderer_initiated; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_url_params.transferred_global_request_id = 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->transferred_global_request_id; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (params->is_renderer_initiated) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_url_params.is_renderer_initiated = true; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Only allows the browser-initiated navigation to use POST. 278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (params->uses_post && !params->is_renderer_initiated) { 279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) load_url_params.load_type = 280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NavigationController::LOAD_TYPE_BROWSER_INITIATED_HTTP_POST; 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) load_url_params.browser_initiated_post_data = 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params->browser_initiated_post_data; 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_contents->GetController().LoadURLWithParams(load_url_params); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class makes sure the Browser object held in |params| is made visible 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by the time it goes out of scope, provided |params| wants it to be shown. 2890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class ScopedBrowserShower { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) explicit ScopedBrowserShower(chrome::NavigateParams* params) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : params_(params) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ~ScopedBrowserShower() { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params_->window_action == chrome::NavigateParams::SHOW_WINDOW_INACTIVE) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params_->browser->window()->ShowInactive(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (params_->window_action == chrome::NavigateParams::SHOW_WINDOW) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params_->browser->window()->Show(); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NavigateParams* params_; 3020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedBrowserShower); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class manages the lifetime of a WebContents created by the 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Navigate() function. When Navigate() creates a WebContents for a URL, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an instance of this class takes ownership of it via TakeOwnership() until the 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContents is added to a tab strip at which time ownership is 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// relinquished via ReleaseOwnership(). If this object goes out of scope without 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// being added to a tab strip, the created WebContents is deleted to 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// avoid a leak and the params->target_contents field is set to NULL. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedTargetContentsOwner { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedTargetContentsOwner(chrome::NavigateParams* params) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : params_(params) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedTargetContentsOwner() { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target_contents_owner_.get()) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params_->target_contents = NULL; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assumes ownership of |params_|' target_contents until ReleaseOwnership 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is called. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TakeOwnership() { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_contents_owner_.reset(params_->target_contents); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Relinquishes ownership of |params_|' target_contents. 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* ReleaseOwnership() { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target_contents_owner_.release(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NavigateParams* params_; 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WebContents> target_contents_owner_; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedTargetContentsOwner); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::WebContents* CreateTargetContents(const chrome::NavigateParams& params, 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url) { 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents::CreateParams create_params( 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.browser->profile(), 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_util::GetSiteInstanceForNewTab(params.browser->profile(), url)); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params.source_contents) { 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.initial_size = 346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.source_contents->GetContainerBounds().size(); 347a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (params.should_set_opener) 348a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) create_params.opener = params.source_contents; 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (params.disposition == NEW_BACKGROUND_TAB) 3513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) create_params.initially_hidden = true; 3523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params.browser->window() && 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.browser->window()->GetNativeWindow()) { 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.context = 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.browser->window()->GetNativeWindow(); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WebContents* target_contents = WebContents::Create(create_params); 362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // New tabs can have WebUI URLs that will make calls back to arbitrary 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tab helpers, so the entire set of tab helpers needs to be set up 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // immediately. 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserNavigatorWebContentsAdoption::AttachTabHelpers(target_contents); 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::TabHelper::FromWebContents(target_contents)-> 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExtensionAppById(params.extension_app_id); 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return target_contents; 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// If a prerendered page exists for |url|, replace the page at 3738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// |params->target_contents| with it and update to point to the swapped-in 3748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// WebContents. 3758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool SwapInPrerender(const GURL& url, chrome::NavigateParams* params) { 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* profile = 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile::FromBrowserContext(params->target_contents->GetBrowserContext()); 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InstantSearchPrerenderer* prerenderer = 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InstantSearchPrerenderer::GetForProfile(profile); 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (prerenderer && prerenderer->UsePrerenderedPage(url, params)) 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::PrerenderManager* prerender_manager = 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender::PrerenderManagerFactory::GetForProfile(profile); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_manager && 3868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) prerender_manager->MaybeUsePrerenderedPage(url, params); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochchrome::HostDesktopType GetHostDesktop(Browser* browser) { 390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (browser) 391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return browser->host_desktop_type(); 392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return chrome::GetActiveDesktop(); 393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigateParams::NavigateParams(Browser* a_browser, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& a_url, 4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransition a_transition) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : url(a_url), 403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) frame_tree_node_id(-1), 404a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) uses_post(false), 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_contents(NULL), 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents(NULL), 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition(CURRENT_TAB), 408a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch trusted_source(false), 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition(a_transition), 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_renderer_initiated(false), 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tabstrip_index(-1), 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tabstrip_add_types(TabStripModel::ADD_ACTIVE), 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_action(NO_ACTION), 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_gesture(true), 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path_behavior(RESPECT), 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ref_behavior(IGNORE_REF), 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(a_browser), 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) initiating_profile(NULL), 419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_desktop_type(GetHostDesktop(a_browser)), 420a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) should_replace_current_entry(false), 421a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) should_set_opener(false) { 422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigateParams::NavigateParams(Browser* a_browser, 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* a_target_contents) 426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : frame_tree_node_id(-1), 427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uses_post(false), 428a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) target_contents(a_target_contents), 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents(NULL), 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition(CURRENT_TAB), 431a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch trusted_source(false), 4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition(ui::PAGE_TRANSITION_LINK), 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_renderer_initiated(false), 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tabstrip_index(-1), 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tabstrip_add_types(TabStripModel::ADD_ACTIVE), 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_action(NO_ACTION), 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_gesture(true), 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path_behavior(RESPECT), 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ref_behavior(IGNORE_REF), 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(a_browser), 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) initiating_profile(NULL), 442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_desktop_type(GetHostDesktop(a_browser)), 443a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) should_replace_current_entry(false), 444a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) should_set_opener(false) { 445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigateParams::NavigateParams(Profile* a_profile, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& a_url, 4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransition a_transition) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : url(a_url), 451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) frame_tree_node_id(-1), 452a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) uses_post(false), 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_contents(NULL), 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents(NULL), 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition(NEW_FOREGROUND_TAB), 456a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch trusted_source(false), 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition(a_transition), 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_renderer_initiated(false), 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tabstrip_index(-1), 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tabstrip_add_types(TabStripModel::ADD_ACTIVE), 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_action(SHOW_WINDOW), 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_gesture(true), 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path_behavior(RESPECT), 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ref_behavior(IGNORE_REF), 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(NULL), 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initiating_profile(a_profile), 467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_desktop_type(chrome::GetActiveDesktop()), 468a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) should_replace_current_entry(false), 469a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) should_set_opener(false) { 470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigateParams::~NavigateParams() {} 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FillNavigateParamsFromOpenURLParams(chrome::NavigateParams* nav_params, 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::OpenURLParams& params) { 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nav_params->referrer = params.referrer; 477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) nav_params->frame_tree_node_id = params.frame_tree_node_id; 4781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) nav_params->redirect_chain = params.redirect_chain; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nav_params->extra_headers = params.extra_headers; 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nav_params->disposition = params.disposition; 481a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch nav_params->trusted_source = false; 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nav_params->is_renderer_initiated = params.is_renderer_initiated; 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nav_params->transferred_global_request_id = 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transferred_global_request_id; 485ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch nav_params->should_replace_current_entry = 486ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params.should_replace_current_entry; 487a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) nav_params->uses_post = params.uses_post; 488a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) nav_params->browser_initiated_post_data = params.browser_initiated_post_data; 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Navigate(NavigateParams* params) { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* source_browser = params->browser; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_browser) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->initiating_profile = source_browser->profile(); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(params->initiating_profile); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!AdjustNavigateParamsForURL(params)) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_EXTENSIONS) 50123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const extensions::Extension* extension = 50223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) extensions::ExtensionRegistry::Get(params->initiating_profile)-> 50323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) enabled_extensions().GetExtensionOrAppByURL(params->url); 50423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Platform apps cannot navigate. Block the request. 50523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (extension && extension->is_platform_app()) 50623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) params->url = GURL(chrome::kExtensionInvalidRequestURL); 5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The browser window may want to adjust the disposition. 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->disposition == NEW_POPUP && 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_browser && 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_browser->window()) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->disposition = 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_browser->window()->GetDispositionForPopupBounds( 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->window_bounds); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->browser = GetBrowserForDisposition(params); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!params->browser) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(USE_ASH) 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (source_browser && source_browser != params->browser) { 524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // When the newly created browser was spawned by a browser which visits 525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // another user's desktop, it should be shown on the same desktop as the 526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // originating one. (This is part of the desktop separation per profile). 527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MultiUserWindowManager* manager = MultiUserWindowManager::GetInstance(); 528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Some unit tests have no manager instantiated. 529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (manager) { 530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) aura::Window* src_window = source_browser->window()->GetNativeWindow(); 531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) aura::Window* new_window = params->browser->window()->GetNativeWindow(); 532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& src_user = 533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager->GetUserPresentingWindow(src_window); 534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (src_user != manager->GetUserPresentingWindow(new_window)) { 535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Once the window gets presented, it should be shown on the same 536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // desktop as the desktop of the creating browser. Note that this 537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // command will not show the window if it wasn't shown yet by the 538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // browser creation. 539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager->ShowWindowForUser(new_window, src_user); 540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 541a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate() must not return early after this point. 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetSourceProfile(params) != params->browser->profile()) { 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A tab is being opened from a link from a different profile, we must reset 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // source information that may cause state to be shared. 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->source_contents = NULL; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->referrer = content::Referrer(); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the Browser is shown if params call for it. 5550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ScopedBrowserShower shower(params); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Makes sure any WebContents created by this function is destroyed if 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not properly added to a tab strip. 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedTargetContentsOwner target_contents_owner(params); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Some dispositions need coercion to base types. 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NormalizeDisposition(params); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // If a new window has been created, it needs to be shown. 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->window_action == NavigateParams::NO_ACTION && 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_browser != params->browser && 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->browser->tab_strip_model()->empty()) { 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->window_action = NavigateParams::SHOW_WINDOW; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we create a popup window from a non user-gesture, don't activate it. 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->window_action == NavigateParams::SHOW_WINDOW && 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->disposition == NEW_POPUP && 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->user_gesture == false) { 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->window_action = NavigateParams::SHOW_WINDOW_INACTIVE; 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Determine if the navigation was user initiated. If it was, we need to 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // inform the target WebContents, and we may need to update the UI. 5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransition base_transition = 5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransitionStripQualifier(params->transition); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_initiated = 5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params->transition & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR || 5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base_transition == ui::PAGE_TRANSITION_TYPED || 5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base_transition == ui::PAGE_TRANSITION_AUTO_BOOKMARK || 5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base_transition == ui::PAGE_TRANSITION_GENERATED || 5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base_transition == ui::PAGE_TRANSITION_AUTO_TOPLEVEL || 5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base_transition == ui::PAGE_TRANSITION_RELOAD || 5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base_transition == ui::PAGE_TRANSITION_KEYWORD; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if this is a singleton tab that already exists 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int singleton_index = chrome::GetIndexOfSingletonTab(params); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Did we use a prerender? 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool swapped_in_prerender = false; 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If no target WebContents was specified, we need to construct one if 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we are supposed to target a new tab; unless it's a singleton that already 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exists. 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!params->target_contents && singleton_index < 0) { 601cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(!params->url.is_empty()); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->disposition != CURRENT_TAB) { 603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params->target_contents = CreateTargetContents(*params, params->url); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function takes ownership of |params->target_contents| until it 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is added to a TabStripModel. 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_contents_owner.TakeOwnership(); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ... otherwise if we're loading in the current tab, the target is the 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // same as the source. 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(params->source_contents); 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params->target_contents = params->source_contents; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Note: at this point, if |params->disposition| is not CURRENT_TAB, 616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |params->target_contents| has not been attached to a Browser yet. (That 617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // happens later in this function.) However, in that case, the 618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // sessionStorage namespace could not match, so prerender will use the 619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // asynchronous codepath and still swap. 620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(params->target_contents); 621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) swapped_in_prerender = SwapInPrerender(params->url, params); 622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_initiated) 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->target_contents->UserGestureDone(); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!swapped_in_prerender) { 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try to handle non-navigational URLs that popup dialogs and such, these 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should not actually navigate. 629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!HandleNonNavigationAboutURL(params->url)) { 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Perform the actual navigation, tracking whether it came from the 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer. 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadURLInContents(params->target_contents, params->url, params); 634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // For prerender bookkeeping purposes, record that this pending navigate 635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // originated from chrome::Navigate. 636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::NavigationEntry* entry = 637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params->target_contents->GetController().GetPendingEntry(); 638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (entry) 639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) entry->SetExtraData(prerender::kChromeNavigateExtraDataKey, 640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |target_contents| was specified non-NULL, and so we assume it has already 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been navigated appropriately. We need to do nothing more other than 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // add it to the appropriate tabstrip. 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the user navigated from the omnibox, and the selected tab is going to 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lose focus, then make sure the focus for the source tab goes away from the 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // omnibox. 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->source_contents && 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (params->disposition == NEW_FOREGROUND_TAB || 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->disposition == NEW_WINDOW) && 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (params->tabstrip_add_types & TabStripModel::ADD_INHERIT_OPENER)) 656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params->source_contents->Focus(); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params->source_contents == params->target_contents || 6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (swapped_in_prerender && params->disposition == CURRENT_TAB)) { 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The navigation occurred in the source tab. 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->browser->UpdateUIForNavigationInTab(params->target_contents, 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->transition, 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_initiated); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (singleton_index == -1) { 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If some non-default value is set for the index, we should tell the 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TabStripModel to respect it. 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->tabstrip_index != -1) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->tabstrip_add_types |= TabStripModel::ADD_FORCE_INDEX; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The navigation should insert a new tab into the target Browser. 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->browser->tab_strip_model()->AddWebContents( 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->target_contents, 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->tabstrip_index, 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->transition, 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->tabstrip_add_types); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that the |params->target_contents| is safely owned by the target 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Browser's TabStripModel, we can release ownership. 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_contents_owner.ReleaseOwnership(); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (singleton_index >= 0) { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* target = 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->browser->tab_strip_model()->GetWebContentsAt(singleton_index); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target->IsCrashed()) { 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->GetController().Reload(true); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (params->path_behavior == NavigateParams::IGNORE_AND_NAVIGATE && 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->GetURL() != params->url) { 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadURLInContents(target, params->url, params); 690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // For prerender bookkeeping purposes, record that this pending navigate 691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // originated from chrome::Navigate. 692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::NavigationEntry* entry = 693a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) target->GetController().GetPendingEntry(); 694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (entry) 695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) entry->SetExtraData(prerender::kChromeNavigateExtraDataKey, 696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the singleton tab isn't already selected, select it. 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params->source_contents != params->target_contents) { 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->browser->tab_strip_model()->ActivateTabAt(singleton_index, 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_initiated); 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->disposition != CURRENT_TAB) { 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_ADDED, 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<content::WebContentsDelegate>(params->browser), 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Details<WebContents>(params->target_contents)); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsURLAllowedInIncognito(const GURL& url, 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context) { 716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (url.scheme() == content::kViewSourceScheme) { 717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A view-source URL is allowed in incognito mode only if the URL itself 718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is allowed in incognito mode. Remove the "view-source:" from the start 719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of the URL and validate the rest. 720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string stripped_spec = url.spec(); 721868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_GT(stripped_spec.size(), strlen(content::kViewSourceScheme)); 722868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stripped_spec.erase(0, strlen(content::kViewSourceScheme) + 1); 723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL stripped_url(stripped_spec); 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return stripped_url.is_valid() && 725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IsURLAllowedInIncognito(stripped_url, browser_context); 726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Most URLs are allowed in incognito; the following are exceptions. 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome://extensions is on the list because it redirects to 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome://settings. 7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (url.scheme() == content::kChromeUIScheme && 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (url.host() == chrome::kChromeUISettingsHost || 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.host() == chrome::kChromeUISettingsFrameHost || 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.host() == chrome::kChromeUIExtensionsHost || 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.host() == chrome::kChromeUIBookmarksHost || 7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_CHROMEOS) 7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.host() == chrome::kChromeUIChromeSigninHost || 7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 7381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) url.host() == chrome::kChromeUIUberHost || 7391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) url.host() == chrome::kChromeUIThumbnailHost || 7401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) url.host() == chrome::kChromeUIThumbnailHost2 || 741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url.host() == chrome::kChromeUIThumbnailListHost || 742a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch url.host() == chrome::kChromeUISuggestionsHost || 7436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) url.host() == chrome::kChromeUIDevicesHost || 7446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) url.host() == chrome::kChromeUIVoiceSearchHost)) { 7451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return false; 7461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 7471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (url.scheme() == chrome::kChromeSearchScheme && 7491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) (url.host() == chrome::kChromeUIThumbnailHost || 7501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) url.host() == chrome::kChromeUIThumbnailHost2 || 751a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url.host() == chrome::kChromeUIThumbnailListHost || 752a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url.host() == chrome::kChromeUISuggestionsHost)) { 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL rewritten_url = url; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool reverse_on_redirect = false; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserURLHandler::GetInstance()->RewriteURLIfNecessary( 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &rewritten_url, browser_context, &reverse_on_redirect); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Some URLs are mapped to uber subpages. Do not allow them in incognito. 7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !(rewritten_url.scheme() == content::kChromeUIScheme && 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rewritten_url.host() == chrome::kChromeUIUberHost); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 767