diff options
-rw-r--r-- | chrome/browser/automation/testing_automation_provider.cc | 2 | ||||
-rw-r--r-- | chrome/browser/background/background_mode_manager.cc | 2 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_management_api.cc | 2 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_omnibox_api.cc | 3 | ||||
-rw-r--r-- | chrome/browser/resources/ntp4/apps_page.js | 17 | ||||
-rw-r--r-- | chrome/browser/resources/shared/js/util.js | 16 | ||||
-rw-r--r-- | chrome/browser/ui/browser.cc | 68 | ||||
-rw-r--r-- | chrome/browser/ui/browser.h | 8 | ||||
-rw-r--r-- | chrome/browser/ui/browser_browsertest.cc | 1 | ||||
-rw-r--r-- | chrome/browser/ui/browser_init.cc | 4 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_app_browsertest.cc | 1 | ||||
-rw-r--r-- | chrome/browser/ui/webui/ntp/app_launcher_handler.cc | 86 | ||||
-rw-r--r-- | chrome/browser/ui/webui/ntp/app_launcher_handler.h | 9 | ||||
-rw-r--r-- | chrome/browser/ui/webui/ntp/new_tab_ui.cc | 4 |
14 files changed, 103 insertions, 120 deletions
diff --git a/chrome/browser/automation/testing_automation_provider.cc b/chrome/browser/automation/testing_automation_provider.cc index b403ec4..a3ee268 100644 --- a/chrome/browser/automation/testing_automation_provider.cc +++ b/chrome/browser/automation/testing_automation_provider.cc @@ -5642,7 +5642,7 @@ void TestingAutomationProvider::LaunchApp( // This observer will delete itself. new AppLaunchObserver(&old_contents->controller(), this, reply_message, launch_container); - Browser::OpenApplication(profile(), extension, launch_container, + Browser::OpenApplication(profile(), extension, launch_container, GURL(), CURRENT_TAB); } diff --git a/chrome/browser/background/background_mode_manager.cc b/chrome/browser/background/background_mode_manager.cc index 93f5347..de71250 100644 --- a/chrome/browser/background/background_mode_manager.cc +++ b/chrome/browser/background/background_mode_manager.cc @@ -242,7 +242,7 @@ void BackgroundModeManager::LaunchBackgroundApplication( extension_misc::LaunchContainer launch_container = service->extension_prefs()->GetLaunchContainer( extension, ExtensionPrefs::LAUNCH_REGULAR); - Browser::OpenApplication(profile, extension, launch_container, + Browser::OpenApplication(profile, extension, launch_container, GURL(), NEW_FOREGROUND_TAB); } diff --git a/chrome/browser/extensions/extension_management_api.cc b/chrome/browser/extensions/extension_management_api.cc index 912f726..53906fa 100644 --- a/chrome/browser/extensions/extension_management_api.cc +++ b/chrome/browser/extensions/extension_management_api.cc @@ -356,7 +356,7 @@ bool LaunchAppFunction::RunImpl() { extension_misc::LaunchContainer launch_container = service()->extension_prefs()->GetLaunchContainer( extension, ExtensionPrefs::LAUNCH_DEFAULT); - Browser::OpenApplication(profile(), extension, launch_container, + Browser::OpenApplication(profile(), extension, launch_container, GURL(), NEW_FOREGROUND_TAB); UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram, extension_misc::APP_LAUNCH_EXTENSION_API, diff --git a/chrome/browser/extensions/extension_omnibox_api.cc b/chrome/browser/extensions/extension_omnibox_api.cc index 524f65b..1590927b 100644 --- a/chrome/browser/extensions/extension_omnibox_api.cc +++ b/chrome/browser/extensions/extension_omnibox_api.cc @@ -291,5 +291,6 @@ void LaunchAppFromOmnibox(const AutocompleteMatch& match, service->extension_prefs()->GetLaunchContainer( extension, ExtensionPrefs::LAUNCH_REGULAR); - Browser::OpenApplication(profile, extension, launch_container, disposition); + Browser::OpenApplication(profile, extension, launch_container, GURL(), + disposition); } diff --git a/chrome/browser/resources/ntp4/apps_page.js b/chrome/browser/resources/ntp4/apps_page.js index dd96ad5..aff343f 100644 --- a/chrome/browser/resources/ntp4/apps_page.js +++ b/chrome/browser/resources/ntp4/apps_page.js @@ -238,8 +238,7 @@ cr.define('ntp4', function() { this.appContents_.addEventListener('contextmenu', cr.ui.contextMenuHandler); - this.isStore_ = this.appData_.is_webstore; - if (this.isStore_) + if (this.appData_.is_webstore) this.createAppsPromoExtras_(); this.addEventListener('mousedown', this.onMousedown_, true); @@ -435,8 +434,18 @@ cr.define('ntp4', function() { * @private */ onClick_: function(e) { + var is_promo = this.appsPromoExtras_ && + window.getComputedStyle(this.appsPromoExtras_).display != 'none'; + var url = !this.appData_.is_webstore ? '' : + is_promo ? appendParam(this.appsPromoLink_.href, + 'utm_source', + 'chrome-ntp-promo') : + appendParam(this.appData_.url, + 'utm_source', + 'chrome-ntp-icon'); + chrome.send('launchApp', - [this.appId, APP_LAUNCH.NTP_APPS_MAXIMIZED, + [this.appId, APP_LAUNCH.NTP_APPS_MAXIMIZED, url, e.altKey, e.ctrlKey, e.metaKey, e.shiftKey, e.button]); // Don't allow the click to trigger a link or anything @@ -451,7 +460,7 @@ cr.define('ntp4', function() { onKeydown_: function(e) { if (e.keyIdentifier == 'Enter') { chrome.send('launchApp', - [this.appId, APP_LAUNCH.NTP_APPS_MAXIMIZED, + [this.appId, APP_LAUNCH.NTP_APPS_MAXIMIZED, '', e.altKey, e.ctrlKey, e.metaKey, e.shiftKey, 0]); e.preventDefault(); e.stopPropagation(); diff --git a/chrome/browser/resources/shared/js/util.js b/chrome/browser/resources/shared/js/util.js index 9552fd9..a669297 100644 --- a/chrome/browser/resources/shared/js/util.js +++ b/chrome/browser/resources/shared/js/util.js @@ -187,3 +187,19 @@ document.addEventListener('click', function(e) { } } }); + +/** + * Creates a new URL which is the old URL with a GET param of key=value. + * @param {string} url The base URL. There is not sanity checking on the URL so + * it must be passed in a proper format. + * @param {string} key The key of the param. + * @param {string} value The value of the param. + * @return {string} + */ +function appendParam(url, key, value) { + var param = encodeURIComponent(key) + '=' + encodeURIComponent(value); + + if (url.indexOf('?') == -1) + return url + '?' + param; + return url + '&' + param; +} diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 35f6c63..49d66f9 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc @@ -250,6 +250,33 @@ bool HasInternalURL(const NavigationEntry* entry) { return false; } +// Get the launch URL for a given extension, with optional override/fallback. +// |override_url|, if non-empty, will be preferred over the extension's +// launch url. +GURL UrlForExtension(const Extension* extension, const GURL& override_url) { + if (!extension) + return override_url; + + GURL url; + if (!override_url.is_empty()) { + DCHECK(extension->web_extent().MatchesURL(override_url)); + url = override_url; + } else { + url = extension->GetFullLaunchURL(); + } + + // For extensions lacking launch urls, determine a reasonable fallback. + if (!url.is_valid()) { + url = extension->options_url(); + if (!url.is_valid()) { + url = GURL(std::string(chrome::kChromeUISettingsURL) + + chrome::kExtensionsSubPage); + } + } + + return url; +} + } // namespace //////////////////////////////////////////////////////////////////////////////// @@ -581,6 +608,7 @@ TabContents* Browser::OpenApplication( Profile* profile, const Extension* extension, extension_misc::LaunchContainer container, + const GURL& override_url, WindowOpenDisposition disposition) { #if defined(USE_AURA) // On aura we're experimenting with making all apps open in windows. @@ -596,10 +624,11 @@ TabContents* Browser::OpenApplication( case extension_misc::LAUNCH_WINDOW: case extension_misc::LAUNCH_PANEL: tab = Browser::OpenApplicationWindow(profile, extension, container, - GURL(), NULL); + override_url, NULL); break; case extension_misc::LAUNCH_TAB: { - tab = Browser::OpenApplicationTab(profile, extension, disposition); + tab = Browser::OpenApplicationTab(profile, extension, override_url, + disposition); break; } default: @@ -616,22 +645,13 @@ TabContents* Browser::OpenApplicationWindow( extension_misc::LaunchContainer container, const GURL& url_input, Browser** app_browser) { - GURL url; - if (!url_input.is_empty()) { - if (extension) - DCHECK(extension->web_extent().MatchesURL(url_input)); - url = url_input; - } else { - DCHECK(extension); // Empty url and no extension. Nothing to open. - url = extension->GetFullLaunchURL(); - } + DCHECK(!url_input.is_empty() || extension); + GURL url = UrlForExtension(extension, url_input); std::string app_name; - if (extension) - app_name = - web_app::GenerateApplicationNameFromExtensionId(extension->id()); - else - app_name = web_app::GenerateApplicationNameFromURL(url); + app_name = extension ? + web_app::GenerateApplicationNameFromExtensionId(extension->id()) : + web_app::GenerateApplicationNameFromURL(url); Type type = extension && (container == extension_misc::LAUNCH_PANEL) ? TYPE_PANEL : TYPE_POPUP; @@ -690,6 +710,7 @@ TabContents* Browser::OpenAppShortcutWindow(Profile* profile, // static TabContents* Browser::OpenApplicationTab(Profile* profile, const Extension* extension, + const GURL& override_url, WindowOpenDisposition disposition) { Browser* browser = BrowserList::FindTabbedBrowser(profile, false); TabContents* contents = NULL; @@ -723,15 +744,7 @@ TabContents* Browser::OpenApplicationTab(Profile* profile, if (launch_type == ExtensionPrefs::LAUNCH_PINNED) add_type |= TabStripModel::ADD_PINNED; - // For extensions lacking launch urls, determine a reasonable fallback. - GURL extension_url = extension->GetFullLaunchURL(); - if (!extension_url.is_valid()) { - extension_url = extension->options_url(); - if (!extension_url.is_valid()) - extension_url = GURL(std::string(chrome::kChromeUISettingsURL) + - chrome::kExtensionsSubPage); - } - + GURL extension_url = UrlForExtension(extension, override_url); // TODO(erikkay): START_PAGE doesn't seem like the right transition in all // cases. browser::NavigateParams params(browser, extension_url, @@ -744,7 +757,7 @@ TabContents* Browser::OpenApplicationTab(Profile* profile, TabStripModel* model = browser->tabstrip_model(); int tab_index = model->GetWrapperIndex(existing_tab); - existing_tab->OpenURL(extension->GetFullLaunchURL(), existing_tab->GetURL(), + existing_tab->OpenURL(extension_url, existing_tab->GetURL(), disposition, content::PAGE_TRANSITION_LINK); if (params.tabstrip_add_types & TabStripModel::ADD_PINNED) { model->SetTabPinned(tab_index, true); @@ -764,8 +777,9 @@ TabContents* Browser::OpenApplicationTab(Profile* profile, // Today we open the tab, but stay in full screen mode. Should we leave // full screen mode in this case? if (launch_type == ExtensionPrefs::LAUNCH_FULLSCREEN && - !browser->window()->IsFullscreen()) + !browser->window()->IsFullscreen()) { browser->ToggleFullscreenMode(false); + } return contents; } diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h index 6479821..3b32062 100644 --- a/chrome/browser/ui/browser.h +++ b/chrome/browser/ui/browser.h @@ -263,11 +263,13 @@ class Browser : public TabHandlerDelegate, static void OpenURLOffTheRecord(Profile* profile, const GURL& url); // Open |extension| in |container|, using |disposition| if container type is - // TAB. Returns the TabContents* that was created or NULL. + // TAB. Returns the TabContents* that was created or NULL. If non-empty, + // |override_url| is used in place of the app launch url. static TabContents* OpenApplication( Profile* profile, const Extension* extension, extension_misc::LaunchContainer container, + const GURL& override_url, WindowOpenDisposition disposition); // Opens a new application window for the specified url. If |as_panel| @@ -295,9 +297,11 @@ class Browser : public TabHandlerDelegate, bool update_shortcut); // Open an application for |extension| using |disposition|. Returns NULL if - // there are no appropriate existing browser windows for |profile|. + // there are no appropriate existing browser windows for |profile|. If + // non-empty, |override_url| is used in place of the app launch url. static TabContents* OpenApplicationTab(Profile* profile, const Extension* extension, + const GURL& override_url, WindowOpenDisposition disposition); // Opens a new window and opens the bookmark manager. diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc index 44e1c50..0619f17 100644 --- a/chrome/browser/ui/browser_browsertest.cc +++ b/chrome/browser/ui/browser_browsertest.cc @@ -1063,6 +1063,7 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, OpenAppWindowLikeNtp) { Browser::OpenApplication(browser()->profile(), extension_app, extension_misc::LAUNCH_WINDOW, + GURL(), NEW_WINDOW); ASSERT_TRUE(app_window); diff --git a/chrome/browser/ui/browser_init.cc b/chrome/browser/ui/browser_init.cc index 1760d46..a20c607 100644 --- a/chrome/browser/ui/browser_init.cc +++ b/chrome/browser/ui/browser_init.cc @@ -813,7 +813,7 @@ bool BrowserInit::LaunchWithProfile::OpenApplicationTab(Profile* profile) { RecordCmdLineAppHistogram(); - TabContents* app_tab = Browser::OpenApplicationTab(profile, extension, + TabContents* app_tab = Browser::OpenApplicationTab(profile, extension, GURL(), NEW_FOREGROUND_TAB); return (app_tab != NULL); } @@ -842,7 +842,7 @@ bool BrowserInit::LaunchWithProfile::OpenApplicationWindow(Profile* profile) { RecordCmdLineAppHistogram(); TabContents* tab_in_app_window = Browser::OpenApplication( - profile, extension, launch_container, NEW_WINDOW); + profile, extension, launch_container, GURL(), NEW_WINDOW); return (tab_in_app_window != NULL); } diff --git a/chrome/browser/ui/panels/panel_app_browsertest.cc b/chrome/browser/ui/panels/panel_app_browsertest.cc index 0f6fdde..84ace96 100644 --- a/chrome/browser/ui/panels/panel_app_browsertest.cc +++ b/chrome/browser/ui/panels/panel_app_browsertest.cc @@ -53,6 +53,7 @@ class PanelAppBrowserTest : public ExtensionBrowserTest { extension, // Overriding manifest to open in a panel. extension_misc::LAUNCH_PANEL, + GURL(), NEW_WINDOW); // Now we have a new browser instance. diff --git a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc index f262926..e79381b 100644 --- a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc +++ b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc @@ -53,12 +53,6 @@ namespace { -// The URL prefixes used by the NTP to signal when the web store or an app -// has launched so we can record the proper histogram. -const char* kPingLaunchAppByID = "record-app-launch-by-id"; -const char* kPingLaunchWebStore = "record-webstore-launch"; -const char* kPingLaunchAppByURL = "record-app-launch-by-url"; - const UnescapeRule::Type kUnescapeRules = UnescapeRule::NORMAL | UnescapeRule::URL_SPECIAL_CHARS; @@ -76,7 +70,6 @@ extension_misc::AppLaunchBucket ParseLaunchSource( AppLauncherHandler::AppLauncherHandler(ExtensionService* extension_service) : extension_service_(extension_service), - promo_active_(false), ignore_changes_(false), attempted_bookmark_app_install_(false), has_loaded_apps_(false) { @@ -190,49 +183,6 @@ void AppLauncherHandler::CreateAppInfo(const Extension* extension, value->SetInteger("page_index", page_index); } -// TODO(estade): remove this. We record app launches via js calls rather than -// pings for ntp4. -// static -bool AppLauncherHandler::HandlePing(Profile* profile, const std::string& path) { - std::vector<std::string> params; - base::SplitString(path, '+', ¶ms); - - // Check if the user launched an app from the most visited or recently - // closed sections. - if (kPingLaunchAppByURL == params.at(0)) { - CHECK(params.size() == 3); - RecordAppLaunchByURL( - profile, params.at(1), ParseLaunchSource(params.at(2))); - return true; - } - - bool is_web_store_ping = kPingLaunchWebStore == params.at(0); - bool is_app_launch_ping = kPingLaunchAppByID == params.at(0); - - if (!is_web_store_ping && !is_app_launch_ping) - return false; - - CHECK(params.size() >= 2); - - bool is_promo_active = params.at(1) == "true"; - - // At this point, the user must have used the app launcher, so we hide the - // promo if its still displayed. - if (is_promo_active) { - DCHECK(profile->GetExtensionService()); - profile->GetExtensionService()->apps_promo()->ExpireDefaultApps(); - } - - if (is_web_store_ping) { - RecordWebStoreLaunch(is_promo_active); - } else { - CHECK(params.size() == 3); - RecordAppLaunchByID(is_promo_active, ParseLaunchSource(params.at(2))); - } - - return true; -} - WebUIMessageHandler* AppLauncherHandler::Attach(WebUI* web_ui) { registrar_.Add(this, chrome::NOTIFICATION_APP_INSTALLED_TO_NTP, content::Source<TabContents>(web_ui->tab_contents())); @@ -514,10 +464,8 @@ void AppLauncherHandler::HandleGetApps(const ListValue* args) { &apps_promo_just_expired)) { dictionary.SetBoolean("showPromo", true); FillPromoDictionary(&dictionary); - promo_active_ = true; } else { dictionary.SetBoolean("showPromo", false); - promo_active_ = false; } // If the default apps have just expired (user viewed them too many times with @@ -562,6 +510,7 @@ void AppLauncherHandler::HandleGetApps(const ListValue* args) { void AppLauncherHandler::HandleLaunchApp(const ListValue* args) { std::string extension_id; double source = -1.0; + std::string url; bool alt_key = false; bool ctrl_key = false; bool meta_key = false; @@ -570,12 +519,14 @@ void AppLauncherHandler::HandleLaunchApp(const ListValue* args) { CHECK(args->GetString(0, &extension_id)); CHECK(args->GetDouble(1, &source)); - if (args->GetSize() > 2) { - CHECK(args->GetBoolean(2, &alt_key)); - CHECK(args->GetBoolean(3, &ctrl_key)); - CHECK(args->GetBoolean(4, &meta_key)); - CHECK(args->GetBoolean(5, &shift_key)); - CHECK(args->GetDouble(6, &button)); + if (args->GetSize() > 2) + CHECK(args->GetString(2, &url)); + if (args->GetSize() > 3) { + CHECK(args->GetBoolean(3, &alt_key)); + CHECK(args->GetBoolean(4, &ctrl_key)); + CHECK(args->GetBoolean(5, &meta_key)); + CHECK(args->GetBoolean(6, &shift_key)); + CHECK(args->GetDouble(7, &button)); } extension_misc::AppLaunchBucket launch_bucket = @@ -603,20 +554,21 @@ void AppLauncherHandler::HandleLaunchApp(const ListValue* args) { ctrl_key, meta_key, shift_key); if (extension_id != extension_misc::kWebStoreAppId) { - RecordAppLaunchByID(promo_active_, launch_bucket); + RecordAppLaunchByID(launch_bucket); extension_service_->apps_promo()->ExpireDefaultApps(); } else if (NewTabUI::NTP4Enabled()) { - RecordWebStoreLaunch(promo_active_); + RecordWebStoreLaunch(url.find("chrome-ntp-promo") != std::string::npos); } if (disposition == NEW_FOREGROUND_TAB || disposition == NEW_BACKGROUND_TAB) { // TODO(jamescook): Proper support for background tabs. Browser::OpenApplication( - profile, extension, extension_misc::LAUNCH_TAB, disposition); + profile, extension, extension_misc::LAUNCH_TAB, GURL(url), disposition); } else if (disposition == NEW_WINDOW) { // Force a new window open. Browser::OpenApplication( - profile, extension, extension_misc::LAUNCH_WINDOW, disposition); + profile, extension, extension_misc::LAUNCH_WINDOW, GURL(url), + disposition); } else { // Look at preference to find the right launch container. If no preference // is set, launch as a regular tab. @@ -632,7 +584,7 @@ void AppLauncherHandler::HandleLaunchApp(const ListValue* args) { old_contents = browser->GetSelectedTabContents(); TabContents* new_contents = Browser::OpenApplication( - profile, extension, launch_container, + profile, extension, launch_container, GURL(url), old_contents ? CURRENT_TAB : NEW_FOREGROUND_TAB); // This will also destroy the handler, so do not perform any actions after. @@ -910,17 +862,11 @@ void AppLauncherHandler::RecordWebStoreLaunch(bool promo_active) { // static void AppLauncherHandler::RecordAppLaunchByID( - bool promo_active, extension_misc::AppLaunchBucket bucket) { + extension_misc::AppLaunchBucket bucket) { CHECK(bucket != extension_misc::APP_LAUNCH_BUCKET_INVALID); UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram, bucket, extension_misc::APP_LAUNCH_BUCKET_BOUNDARY); - - if (!promo_active) return; - - UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram, - extension_misc::PROMO_LAUNCH_APP, - extension_misc::PROMO_BUCKET_BOUNDARY); } // static diff --git a/chrome/browser/ui/webui/ntp/app_launcher_handler.h b/chrome/browser/ui/webui/ntp/app_launcher_handler.h index da8ac07..82b55fb 100644 --- a/chrome/browser/ui/webui/ntp/app_launcher_handler.h +++ b/chrome/browser/ui/webui/ntp/app_launcher_handler.h @@ -45,9 +45,6 @@ class AppLauncherHandler : public WebUIMessageHandler, ExtensionService* service, base::DictionaryValue* value); - // Callback for pings related to launching apps on the NTP. - static bool HandlePing(Profile* profile, const std::string& path); - // WebUIMessageHandler implementation. virtual WebUIMessageHandler* Attach(WebUI* web_ui) OVERRIDE; virtual void RegisterMessages() OVERRIDE; @@ -126,8 +123,7 @@ class AppLauncherHandler : public WebUIMessageHandler, // Records an app launch in the corresponding |bucket| of the app launch // histogram. |promo_active| specifies if the web store promotion was active. - static void RecordAppLaunchByID(bool promo_active, - extension_misc::AppLaunchBucket bucket); + static void RecordAppLaunchByID(extension_misc::AppLaunchBucket bucket); // Records an app launch in the corresponding |bucket| of the app launch // histogram if the |escaped_url| corresponds to an installed app. @@ -184,9 +180,6 @@ class AppLauncherHandler : public WebUIMessageHandler, // The id of the extension we are prompting the user about. std::string extension_id_prompting_; - // Whether the promo is currently being shown. - bool promo_active_; - // When true, we ignore changes to the underlying data rather than immediately // refreshing. This is useful when making many batch updates to avoid flicker. bool ignore_changes_; diff --git a/chrome/browser/ui/webui/ntp/new_tab_ui.cc b/chrome/browser/ui/webui/ntp/new_tab_ui.cc index f8639e9..b3a8dc8 100644 --- a/chrome/browser/ui/webui/ntp/new_tab_ui.cc +++ b/chrome/browser/ui/webui/ntp/new_tab_ui.cc @@ -295,9 +295,7 @@ void NewTabUI::NewTabHTMLSource::StartDataRequest(const std::string& path, int request_id) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - if (AppLauncherHandler::HandlePing(profile_, path)) { - return; - } else if (!path.empty() && path[0] != '#') { + if (!path.empty() && path[0] != '#') { // A path under new-tab was requested; it's likely a bad relative // URL from the new tab page, but in any case it's an error. NOTREACHED() << path << " should not have been requested on the NTP"; |