summaryrefslogtreecommitdiffstats
path: root/chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2022-05-17 17:24:03 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2022-06-22 07:51:41 +0000
commit774f54339e5db91f785733232d3950366db65d07 (patch)
tree068e1b47bd1af94d77094ed12b604a6b83d9c22a /chromium/chrome/browser/extensions/api/omnibox/omnibox_api.cc
parentf7eaed5286974984ba5f9e3189d8f49d03e99f81 (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.cc84
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());
}