diff options
18 files changed, 189 insertions, 36 deletions
diff --git a/chrome/browser/autocomplete/autocomplete_provider_unittest.cc b/chrome/browser/autocomplete/autocomplete_provider_unittest.cc index dc58fce..08a4852 100644 --- a/chrome/browser/autocomplete/autocomplete_provider_unittest.cc +++ b/chrome/browser/autocomplete/autocomplete_provider_unittest.cc @@ -22,10 +22,10 @@ #include "chrome/browser/search_engines/template_url.h" #include "chrome/browser/search_engines/template_url_service.h" #include "chrome/browser/search_engines/template_url_service_factory.h" -#include "chrome/common/chrome_switches.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "components/metrics/proto/omnibox_event.pb.h" +#include "components/search_engines/search_engines_switches.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_source.h" diff --git a/chrome/browser/autocomplete/history_url_provider.cc b/chrome/browser/autocomplete/history_url_provider.cc index be8d744..e1320f6 100644 --- a/chrome/browser/autocomplete/history_url_provider.cc +++ b/chrome/browser/autocomplete/history_url_provider.cc @@ -284,14 +284,28 @@ class SearchTermsDataSnapshot : public SearchTermsData { virtual base::string16 GetRlzParameterValue( bool from_app_list) const OVERRIDE; virtual std::string GetSearchClient() const OVERRIDE; + virtual bool EnableAnswersInSuggest() const OVERRIDE; + virtual bool IsShowingSearchTermsOnSearchResultsPages() const OVERRIDE; + virtual std::string InstantExtendedEnabledParam( + bool for_search) const OVERRIDE; + virtual std::string ForceInstantResultsParam( + bool for_prerender) const OVERRIDE; virtual std::string NTPIsThemedParam() const OVERRIDE; + virtual std::string GoogleImageSearchSource() const OVERRIDE; private: std::string google_base_url_value_; std::string application_locale_; base::string16 rlz_parameter_value_; std::string search_client_; + bool enable_answers_in_suggest_; + bool is_showing_search_terms_on_search_results_pages_; + std::string instant_extended_enabled_param_; + std::string instant_extended_enabled_param_for_search_; + std::string force_instant_results_param_; + std::string force_instant_results_param_for_prerender_; std::string ntp_is_themed_param_; + std::string google_image_search_source_; DISALLOW_COPY_AND_ASSIGN(SearchTermsDataSnapshot); }; @@ -302,7 +316,20 @@ SearchTermsDataSnapshot::SearchTermsDataSnapshot( application_locale_(search_terms_data.GetApplicationLocale()), rlz_parameter_value_(search_terms_data.GetRlzParameterValue(false)), search_client_(search_terms_data.GetSearchClient()), - ntp_is_themed_param_(search_terms_data.NTPIsThemedParam()) {} + enable_answers_in_suggest_(search_terms_data.EnableAnswersInSuggest()), + is_showing_search_terms_on_search_results_pages_( + search_terms_data.IsShowingSearchTermsOnSearchResultsPages()), + instant_extended_enabled_param_( + search_terms_data.InstantExtendedEnabledParam(false)), + instant_extended_enabled_param_for_search_( + search_terms_data.InstantExtendedEnabledParam(true)), + force_instant_results_param_( + search_terms_data.ForceInstantResultsParam(false)), + force_instant_results_param_for_prerender_( + search_terms_data.ForceInstantResultsParam(true)), + ntp_is_themed_param_(search_terms_data.NTPIsThemedParam()), + google_image_search_source_(search_terms_data.GoogleImageSearchSource()) { +} SearchTermsDataSnapshot::~SearchTermsDataSnapshot() { } @@ -324,10 +351,34 @@ std::string SearchTermsDataSnapshot::GetSearchClient() const { return search_client_; } +bool SearchTermsDataSnapshot::EnableAnswersInSuggest() const { + return enable_answers_in_suggest_; +} + +bool SearchTermsDataSnapshot::IsShowingSearchTermsOnSearchResultsPages() const { + return is_showing_search_terms_on_search_results_pages_; +} + +std::string SearchTermsDataSnapshot::InstantExtendedEnabledParam( + bool for_search) const { + return for_search ? instant_extended_enabled_param_ : + instant_extended_enabled_param_for_search_; +} + +std::string SearchTermsDataSnapshot::ForceInstantResultsParam( + bool for_prerender) const { + return for_prerender ? force_instant_results_param_ : + force_instant_results_param_for_prerender_; +} + std::string SearchTermsDataSnapshot::NTPIsThemedParam() const { return ntp_is_themed_param_; } +std::string SearchTermsDataSnapshot::GoogleImageSearchSource() const { + return google_image_search_source_; +} + // ----------------------------------------------------------------- // HistoryURLProvider diff --git a/chrome/browser/autocomplete/keyword_provider_unittest.cc b/chrome/browser/autocomplete/keyword_provider_unittest.cc index 4f396cf..7aa2f39 100644 --- a/chrome/browser/autocomplete/keyword_provider_unittest.cc +++ b/chrome/browser/autocomplete/keyword_provider_unittest.cc @@ -9,9 +9,9 @@ #include "chrome/browser/autocomplete/keyword_provider.h" #include "chrome/browser/search_engines/template_url.h" #include "chrome/browser/search_engines/template_url_service.h" -#include "chrome/common/chrome_switches.h" #include "chrome/test/base/testing_browser_process.h" #include "components/metrics/proto/omnibox_event.pb.h" +#include "components/search_engines/search_engines_switches.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc index 667f794..e80e6e7 100644 --- a/chrome/browser/autocomplete/search_provider_unittest.cc +++ b/chrome/browser/autocomplete/search_provider_unittest.cc @@ -39,6 +39,7 @@ #include "components/google/core/browser/google_switches.h" #include "components/metrics/proto/omnibox_event.pb.h" #include "components/search_engines/search_engine_type.h" +#include "components/search_engines/search_engines_switches.h" #include "components/signin/core/browser/signin_manager.h" #include "components/sync_driver/pref_names.h" #include "components/variations/entropy_provider.h" diff --git a/chrome/browser/search/search_unittest.cc b/chrome/browser/search/search_unittest.cc index be690d3..80ee842 100644 --- a/chrome/browser/search/search_unittest.cc +++ b/chrome/browser/search/search_unittest.cc @@ -25,6 +25,7 @@ #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/google/core/browser/google_switches.h" +#include "components/search_engines/search_engines_switches.h" #include "components/variations/entropy_provider.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" diff --git a/chrome/browser/search_engines/DEPS b/chrome/browser/search_engines/DEPS new file mode 100644 index 0000000..c09cfcd --- /dev/null +++ b/chrome/browser/search_engines/DEPS @@ -0,0 +1,7 @@ +specific_include_rules = { + "template_url(_unittest)?\.": [ + "-chrome", + "-content", + "+chrome/browser/search_engines/template_url.h", + ], +}
\ No newline at end of file diff --git a/chrome/browser/search_engines/template_url.cc b/chrome/browser/search_engines/template_url.cc index 1bc9fae..5977a2d 100644 --- a/chrome/browser/search_engines/template_url.cc +++ b/chrome/browser/search_engines/template_url.cc @@ -20,11 +20,9 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/browser/omnibox/omnibox_field_trial.h" -#include "chrome/browser/search/search.h" -#include "chrome/common/chrome_switches.h" #include "components/google/core/browser/google_util.h" #include "components/metrics/proto/omnibox_input_type.pb.h" +#include "components/search_engines/search_engines_switches.h" #include "components/search_engines/search_terms_data.h" #include "extensions/common/constants.h" #include "google_apis/google_api_keys.h" @@ -173,11 +171,6 @@ bool IsTemplateParameterString(const std::string& param) { (*(param.rbegin()) == kEndParameter); } -bool ShowingSearchTermsOnSRP() { - return chrome::IsInstantExtendedAPIEnabled() && - chrome::IsQueryExtractionEnabled(); -} - } // namespace @@ -240,8 +233,7 @@ TemplateURLRef::TemplateURLRef(TemplateURL* owner, Type type) valid_(false), supports_replacements_(false), search_term_key_location_(url::Parsed::QUERY), - prepopulated_(false), - showing_search_terms_(ShowingSearchTermsOnSRP()) { + prepopulated_(false) { DCHECK(owner_); DCHECK_NE(INDEXED, type_); } @@ -254,8 +246,7 @@ TemplateURLRef::TemplateURLRef(TemplateURL* owner, size_t index_in_owner) valid_(false), supports_replacements_(false), search_term_key_location_(url::Parsed::QUERY), - prepopulated_(false), - showing_search_terms_(ShowingSearchTermsOnSRP()) { + prepopulated_(false) { DCHECK(owner_); DCHECK_LT(index_in_owner_, owner_->URLCount()); } @@ -613,8 +604,7 @@ bool TemplateURLRef::ParseParameter(size_t start, } else if (parameter == kGoogleSearchFieldtrialParameter) { replacements->push_back(Replacement(GOOGLE_SEARCH_FIELDTRIAL_GROUP, start)); } else if (parameter == kGoogleSearchVersion) { - if (OmniboxFieldTrial::EnableAnswersInSuggest()) - url->insert(start, "gs_rn=42&"); + replacements->push_back(Replacement(GOOGLE_SEARCH_VERSION, start)); } else if (parameter == kGoogleSessionToken) { replacements->push_back(Replacement(GOOGLE_SESSION_TOKEN, start)); } else if (parameter == kGoogleSourceIdParameter) { @@ -867,7 +857,7 @@ std::string TemplateURLRef::HandleReplacements( break; case GOOGLE_BOOKMARK_BAR_PINNED: - if (showing_search_terms_) { + if (search_terms_data.IsShowingSearchTermsOnSearchResultsPages()) { // Log whether the bookmark bar is pinned when the user is seeing // InstantExtended on the SRP. DCHECK(!i->is_post_param); @@ -900,7 +890,7 @@ std::string TemplateURLRef::HandleReplacements( case GOOGLE_FORCE_INSTANT_RESULTS: DCHECK(!i->is_post_param); HandleReplacement(std::string(), - chrome::ForceInstantResultsParam( + search_terms_data.ForceInstantResultsParam( search_terms_args.force_instant_results), *i, &url); @@ -915,7 +905,8 @@ std::string TemplateURLRef::HandleReplacements( case GOOGLE_INSTANT_EXTENDED_ENABLED: DCHECK(!i->is_post_param); HandleReplacement(std::string(), - chrome::InstantExtendedEnabledParam(type_ == SEARCH), + search_terms_data.InstantExtendedEnabledParam( + type_ == SEARCH), *i, &url); break; @@ -1028,6 +1019,11 @@ std::string TemplateURLRef::HandleReplacements( // url.insert(i->index, used_www ? "gcx=w&" : "gcx=c&"); break; + case GOOGLE_SEARCH_VERSION: + if (search_terms_data.EnableAnswersInSuggest()) + HandleReplacement("gs_rn", "42", *i, &url); + break; + case GOOGLE_SESSION_TOKEN: { std::string token = search_terms_args.session_token; if (!token.empty()) diff --git a/chrome/browser/search_engines/template_url.h b/chrome/browser/search_engines/template_url.h index 12084ab..8d909c9 100644 --- a/chrome/browser/search_engines/template_url.h +++ b/chrome/browser/search_engines/template_url.h @@ -303,6 +303,7 @@ class TemplateURLRef { GOOGLE_RLZ, GOOGLE_SEARCH_CLIENT, GOOGLE_SEARCH_FIELDTRIAL_GROUP, + GOOGLE_SEARCH_VERSION, GOOGLE_SESSION_TOKEN, GOOGLE_SUGGEST_CLIENT, GOOGLE_SUGGEST_REQUEST_ID, @@ -431,10 +432,6 @@ class TemplateURLRef { // Whether the contained URL is a pre-populated URL. bool prepopulated_; - // Whether search terms are shown in the omnibox on search results pages. - // This is kept as a member so it can be overridden by tests. - bool showing_search_terms_; - DISALLOW_COPY_AND_ASSIGN(TemplateURLRef); }; diff --git a/chrome/browser/search_engines/template_url_unittest.cc b/chrome/browser/search_engines/template_url_unittest.cc index 7f3abd1..0a9a343 100644 --- a/chrome/browser/search_engines/template_url_unittest.cc +++ b/chrome/browser/search_engines/template_url_unittest.cc @@ -8,9 +8,9 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/search_engines/template_url.h" -#include "chrome/common/chrome_switches.h" #include "components/metrics/proto/omnibox_event.pb.h" #include "components/metrics/proto/omnibox_input_type.pb.h" +#include "components/search_engines/search_engines_switches.h" #include "components/search_engines/search_terms_data.h" #include "testing/gtest/include/gtest/gtest.h" @@ -28,6 +28,8 @@ class TestSearchTermsData : public SearchTermsData { bool from_app_list) const OVERRIDE; virtual std::string GetSearchClient() const OVERRIDE; virtual std::string GoogleImageSearchSource() const OVERRIDE; + virtual bool EnableAnswersInSuggest() const OVERRIDE; + virtual bool IsShowingSearchTermsOnSearchResultsPages() const OVERRIDE; void set_google_base_url(const std::string& google_base_url) { google_base_url_ = google_base_url; @@ -35,16 +37,26 @@ class TestSearchTermsData : public SearchTermsData { void set_search_client(const std::string& search_client) { search_client_ = search_client; } + void set_enable_answers_in_suggest(bool enable_answers_in_suggest) { + enable_answers_in_suggest_ = enable_answers_in_suggest; + } + void set_is_showing_search_terms_on_search_results_pages(bool value) { + is_showing_search_terms_on_search_results_pages_ = value; + } private: std::string google_base_url_; std::string search_client_; + bool enable_answers_in_suggest_; + bool is_showing_search_terms_on_search_results_pages_; DISALLOW_COPY_AND_ASSIGN(TestSearchTermsData); }; TestSearchTermsData::TestSearchTermsData(const std::string& google_base_url) - : google_base_url_(google_base_url) { + : google_base_url_(google_base_url), + enable_answers_in_suggest_(false), + is_showing_search_terms_on_search_results_pages_(false) { } std::string TestSearchTermsData::GoogleBaseURLValue() const { @@ -65,6 +77,14 @@ std::string TestSearchTermsData::GoogleImageSearchSource() const { return "google_image_search_source"; } +bool TestSearchTermsData::EnableAnswersInSuggest() const { + return enable_answers_in_suggest_; +} + +bool TestSearchTermsData::IsShowingSearchTermsOnSearchResultsPages() const { + return is_showing_search_terms_on_search_results_pages_; +} + // TemplateURLTest ------------------------------------------------------------ class TemplateURLTest : public testing::Test { @@ -1375,19 +1395,19 @@ TEST_F(TemplateURLTest, ReflectsBookmarkBarPinned) { TemplateURLRef::SearchTermsArgs search_terms_args(ASCIIToUTF16("foo")); // Do not add the param when InstantExtended is suppressed on SRPs. - url.url_ref_.showing_search_terms_ = false; + search_terms_data_.set_is_showing_search_terms_on_search_results_pages(false); std::string result = url.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_); EXPECT_EQ("http://www.google.com/?q=foo", result); // Add the param when InstantExtended is not suppressed on SRPs. - url.url_ref_.showing_search_terms_ = true; + search_terms_data_.set_is_showing_search_terms_on_search_results_pages(true); search_terms_args.bookmark_bar_pinned = false; result = url.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_); EXPECT_EQ("http://www.google.com/?bmbp=0&q=foo", result); - url.url_ref_.showing_search_terms_ = true; + search_terms_data_.set_is_showing_search_terms_on_search_results_pages(true); search_terms_args.bookmark_bar_pinned = true; result = url.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_); @@ -1405,8 +1425,7 @@ TEST_F(TemplateURLTest, AnswersHasVersion) { search_terms_data_); EXPECT_EQ("http://bar/search?q=foo&xssi=t", result); - CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableAnswersInSuggest); + search_terms_data_.set_enable_answers_in_suggest(true); TemplateURL url2(data); result = url2.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_); diff --git a/chrome/browser/search_engines/ui_thread_search_terms_data.cc b/chrome/browser/search_engines/ui_thread_search_terms_data.cc index 248774d..5d6a81d 100644 --- a/chrome/browser/search_engines/ui_thread_search_terms_data.cc +++ b/chrome/browser/search_engines/ui_thread_search_terms_data.cc @@ -125,6 +125,25 @@ std::string UIThreadSearchTermsData::GetSuggestRequestIdentifier() const { #endif } +bool UIThreadSearchTermsData::EnableAnswersInSuggest() const { + return OmniboxFieldTrial::EnableAnswersInSuggest(); +} + +bool UIThreadSearchTermsData::IsShowingSearchTermsOnSearchResultsPages() const { + return chrome::IsInstantExtendedAPIEnabled() && + chrome::IsQueryExtractionEnabled(); +} + +std::string UIThreadSearchTermsData::InstantExtendedEnabledParam( + bool for_search) const { + return chrome::InstantExtendedEnabledParam(for_search); +} + +std::string UIThreadSearchTermsData::ForceInstantResultsParam( + bool for_prerender) const { + return chrome::ForceInstantResultsParam(for_prerender); +} + std::string UIThreadSearchTermsData::NTPIsThemedParam() const { DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) || BrowserThread::CurrentlyOn(BrowserThread::UI)); diff --git a/chrome/browser/search_engines/ui_thread_search_terms_data.h b/chrome/browser/search_engines/ui_thread_search_terms_data.h index 7547bde..d407b12 100644 --- a/chrome/browser/search_engines/ui_thread_search_terms_data.h +++ b/chrome/browser/search_engines/ui_thread_search_terms_data.h @@ -28,6 +28,12 @@ class UIThreadSearchTermsData : public SearchTermsData { virtual std::string GetSearchClient() const OVERRIDE; virtual std::string GetSuggestClient() const OVERRIDE; virtual std::string GetSuggestRequestIdentifier() const OVERRIDE; + virtual bool EnableAnswersInSuggest() const OVERRIDE; + virtual bool IsShowingSearchTermsOnSearchResultsPages() const OVERRIDE; + virtual std::string InstantExtendedEnabledParam( + bool for_search) const OVERRIDE; + virtual std::string ForceInstantResultsParam( + bool for_prerender) const OVERRIDE; virtual std::string NTPIsThemedParam() const OVERRIDE; virtual std::string GoogleImageSearchSource() const OVERRIDE; diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 516847f..33a57a0 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc @@ -686,10 +686,6 @@ const char kExtensionsNotWebstore[] = "extensions-not-webstore"; // Frequency in seconds for Extensions auto-update. const char kExtensionsUpdateFrequency[] = "extensions-update-frequency"; -// Additional query params to insert in the search and instant URLs. Useful for -// testing. -const char kExtraSearchQueryParams[] = "extra-search-query-params"; - // Fakes the channel of the browser for purposes of Variations filtering. This // is to be used for testing only. Possible values are "stable", "beta", "dev" // and "canary". Note that this only applies if the browser's reported channel diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index 83410ba..9d5b0e3 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h @@ -200,7 +200,6 @@ extern const char kExtensionContentVerification[]; extern const char kExtensionsInstallVerification[]; extern const char kExtensionsNotWebstore[]; extern const char kExtensionsUpdateFrequency[]; -extern const char kExtraSearchQueryParams[]; extern const char kFakeVariationsChannel[]; extern const char kFastStart[]; extern const char kFlagSwitchesBegin[]; diff --git a/components/search_engines.gypi b/components/search_engines.gypi index 5d6e409..4226f94 100644 --- a/components/search_engines.gypi +++ b/components/search_engines.gypi @@ -19,6 +19,8 @@ 'search_engines/search_engine_type.h', 'search_engines/search_engines_pref_names.cc', 'search_engines/search_engines_pref_names.h', + 'search_engines/search_engines_switches.cc', + 'search_engines/search_engines_switches.h', 'search_engines/search_terms_data.cc', 'search_engines/search_terms_data.h', 'search_engines/template_url_data.cc', diff --git a/components/search_engines/search_engines_switches.cc b/components/search_engines/search_engines_switches.cc new file mode 100644 index 0000000..190662c --- /dev/null +++ b/components/search_engines/search_engines_switches.cc @@ -0,0 +1,13 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/search_engines/search_engines_switches.h" + +namespace switches { + +// Additional query params to insert in the search and instant URLs. Useful for +// testing. +const char kExtraSearchQueryParams[] = "extra-search-query-params"; + +} // namespace switches diff --git a/components/search_engines/search_engines_switches.h b/components/search_engines/search_engines_switches.h new file mode 100644 index 0000000..42b9253 --- /dev/null +++ b/components/search_engines/search_engines_switches.h @@ -0,0 +1,14 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SEARCH_ENGINES_SEARCH_ENGINES_SWITCHES_H_ +#define COMPONENTS_SEARCH_ENGINES_SEARCH_ENGINES_SWITCHES_H_ + +namespace switches { + +extern const char kExtraSearchQueryParams[]; + +} // namespace switches + +#endif // COMPONENTS_SEARCH_ENGINES_SEARCH_ENGINES_SWITCHES_H_ diff --git a/components/search_engines/search_terms_data.cc b/components/search_engines/search_terms_data.cc index c6c72ba..79daac0e 100644 --- a/components/search_engines/search_terms_data.cc +++ b/components/search_engines/search_terms_data.cc @@ -58,6 +58,24 @@ std::string SearchTermsData::GetSuggestRequestIdentifier() const { return std::string(); } +bool SearchTermsData::EnableAnswersInSuggest() const { + return false; +} + +bool SearchTermsData::IsShowingSearchTermsOnSearchResultsPages() const { + return false; +} + +std::string SearchTermsData::InstantExtendedEnabledParam( + bool for_search) const { + return std::string(); +} + +std::string SearchTermsData::ForceInstantResultsParam( + bool for_prerender) const { + return std::string(); +} + std::string SearchTermsData::NTPIsThemedParam() const { return std::string(); } diff --git a/components/search_engines/search_terms_data.h b/components/search_engines/search_terms_data.h index a2ff8ed..1b70a10 100644 --- a/components/search_engines/search_terms_data.h +++ b/components/search_engines/search_terms_data.h @@ -49,6 +49,20 @@ class SearchTermsData { // This implementation returns the empty string. virtual std::string GetSuggestRequestIdentifier() const; + // Returns true if the AnswersInSuggest feature should be enabled. + virtual bool EnableAnswersInSuggest() const; + + // Returns true if search terms are shown in the omnibox on search results + // pages. + virtual bool IsShowingSearchTermsOnSearchResultsPages() const; + + // Returns a string indicating whether InstantExtended is enabled. + virtual std::string InstantExtendedEnabledParam(bool for_search) const; + + // Returns a string that will cause the search results page to update + // incrementally. + virtual std::string ForceInstantResultsParam(bool for_prerender) const; + // Returns a string indicating whether a non-default theme is active, // suitable for adding as a query string param to the homepage. This only // applies if Instant Extended is enabled. Returns an empty string otherwise. |