diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-05-17 17:24:03 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-06-22 07:51:41 +0000 |
commit | 774f54339e5db91f785733232d3950366db65d07 (patch) | |
tree | 068e1b47bd1af94d77094ed12b604a6b83d9c22a /chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc | |
parent | f7eaed5286974984ba5f9e3189d8f49d03e99f81 (diff) |
BASELINE: Update Chromium to 102.0.5005.57
Change-Id: I885f714bb40ee724c28f94ca6bd8dbdb39915158
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc')
-rw-r--r-- | chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc | 84 |
1 files changed, 70 insertions, 14 deletions
diff --git a/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc b/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc index 5b27df51242..86ddc82c1dd 100644 --- a/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc +++ b/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc @@ -16,7 +16,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "build/build_config.h" -#include "chrome/browser/extensions/api/omnibox/suggestion_parser.h" #include "chrome/browser/extensions/tab_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search_engines/template_url_service_factory.h" @@ -272,17 +271,73 @@ void BrowserContextKeyedAPIFactory<OmniboxAPI>::DeclareFactoryDependencies() { DependsOn(TemplateURLServiceFactory::GetInstance()); } +OmniboxSendSuggestionsFunction::OmniboxSendSuggestionsFunction() = default; +OmniboxSendSuggestionsFunction::~OmniboxSendSuggestionsFunction() = default; + ExtensionFunction::ResponseAction OmniboxSendSuggestionsFunction::Run() { - std::unique_ptr<SendSuggestions::Params> params( - SendSuggestions::Params::Create(args())); - EXTENSION_FUNCTION_VALIDATE(params); + params_ = SendSuggestions::Params::Create(args()); + EXTENSION_FUNCTION_VALIDATE(params_); + + if (is_from_service_worker()) { + std::vector<base::StringPiece> inputs; + inputs.reserve(params_->suggest_results.size()); + for (const auto& suggestion : params_->suggest_results) + inputs.push_back(suggestion.description); + + ParseDescriptionsAndStyles( + inputs, + base::BindOnce( + &OmniboxSendSuggestionsFunction::OnParsedDescriptionsAndStyles, + this)); + return RespondLater(); + } + + NotifySuggestionsReady(); + return RespondNow(NoArguments()); +} + +void OmniboxSendSuggestionsFunction::OnParsedDescriptionsAndStyles( + DescriptionAndStylesResult result) { + DCHECK(params_); + // Since the XML parsing happens asynchronously, the browser context can be + // torn down in the interim. If this happens, early-out. + if (!browser_context()) { + return; + } + if (!result.error.empty()) { + Respond(Error(std::move(result.error))); + return; + } + + if (result.descriptions_and_styles.size() != + params_->suggest_results.size()) { + // This can technically happen if the extension provided input that mucked + // with our XML parsing (see suggestion_parser_unittest.cc). This isn't a + // security concern, but would mean that our mapping to record the other + // fields in the suggestion are mismatched. Abort. Since there's no + // legitimate case for this happening, just emit a generic error message. + Respond(Error("Invalid input.")); + return; + } + + for (size_t i = 0; i < params_->suggest_results.size(); ++i) { + params_->suggest_results[i].description = + base::UTF16ToUTF8(result.descriptions_and_styles[i].description); + params_->suggest_results[i].description_styles = + std::make_unique<std::vector<api::omnibox::MatchClassification>>( + std::move(result.descriptions_and_styles[i].styles)); + } + + NotifySuggestionsReady(); + Respond(NoArguments()); +} + +void OmniboxSendSuggestionsFunction::NotifySuggestionsReady() { Profile* profile = Profile::FromBrowserContext(browser_context())->GetOriginalProfile(); OmniboxSuggestionsWatcher::GetForBrowserContext(profile) - ->NotifySuggestionsReady(params.get()); - - return RespondNow(NoArguments()); + ->NotifySuggestionsReady(params_.get()); } ExtensionFunction::ResponseAction OmniboxSetDefaultSuggestionFunction::Run() { @@ -304,19 +359,20 @@ ExtensionFunction::ResponseAction OmniboxSetDefaultSuggestionFunction::Run() { } void OmniboxSetDefaultSuggestionFunction::OnParsedDescriptionAndStyles( - std::unique_ptr<DescriptionAndStyles> description_and_styles) { - if (!description_and_styles) { - // TODO(devlin): Provide a more descriptive error. - Respond(Error("Failed to parse suggestion.")); + DescriptionAndStylesResult result) { + if (!result.error.empty()) { + Respond(Error(std::move(result.error))); return; } + DCHECK_EQ(1u, result.descriptions_and_styles.size()); + DescriptionAndStyles& single_result = result.descriptions_and_styles[0]; + omnibox::DefaultSuggestResult default_suggestion; - default_suggestion.description = - base::UTF16ToUTF8(description_and_styles->description); + default_suggestion.description = base::UTF16ToUTF8(single_result.description); default_suggestion.description_styles = std::make_unique<std::vector<api::omnibox::MatchClassification>>(); - default_suggestion.description_styles->swap(description_and_styles->styles); + default_suggestion.description_styles->swap(single_result.styles); SetDefaultSuggestion(default_suggestion); Respond(NoArguments()); } |