// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "components/commerce/ios/browser/web_extractor_impl.h"
#import "base/strings/utf_string_conversions.h"
#import "components/grit/components_resources.h"
#import "ui/base/resource/resource_bundle.h"
namespace commerce {
WebExtractorImpl::WebExtractorImpl() = default;
WebExtractorImpl::~WebExtractorImpl() = default;
void WebExtractorImpl::ExtractMetaInfo(
WebWrapper* web_wrapper,
base::OnceCallback<void(base::Value)> callback) {
std::string script =
ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
IDR_QUERY_SHOPPING_META_JS);
web_wrapper->RunJavascript(
base::UTF8ToUTF16(script),
base::BindOnce(&WebExtractorImpl::OnExtractionMetaInfo,
weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
}
void WebExtractorImpl::OnExtractionMetaInfo(
base::OnceCallback<void(base::Value)> callback,
base::Value result) {
if (!result.is_string()) {
std::move(callback).Run(base::Value());
return;
}
data_decoder::DataDecoder::ParseJsonIsolated(
result.GetString(),
base::BindOnce(&WebExtractorImpl::OnProductInfoJsonSanitizationCompleted,
weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
}
void WebExtractorImpl::OnProductInfoJsonSanitizationCompleted(
base::OnceCallback<void(base::Value)> callback,
data_decoder::DataDecoder::ValueOrError result) {
if (!result.has_value() || !result.value().is_dict()) {
std::move(callback).Run(base::Value());
return;
}
std::move(callback).Run(std::move(result.value()));
}
} // namespace commerce