Commit 504b4aab authored by Sylvain Defresne's avatar Sylvain Defresne Committed by Commit Bot

Convert IOSPaymentInstrumentFinder to new JSONReader API

Update the implementation of IOSPaymentInstrumentFinder to
use JSONReader::Read instead of JSONReader::ReadDeprecated.

Bug: 925165
Change-Id: I2b9a55055175574027088f45aba9ff1f9ef2cae5
Reviewed-on: https://chromium-review.googlesource.com/c/1477681Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Reviewed-by: default avatarMoe Ahmadi <mahmadi@chromium.org>
Commit-Queue: Moe Ahmadi <mahmadi@chromium.org>
Auto-Submit: Sylvain Defresne <sdefresne@chromium.org>
Cr-Commit-Position: refs/heads/master@{#634375}
parent 3ab6bfb3
......@@ -163,38 +163,36 @@ bool IOSPaymentInstrumentFinder::GetWebAppManifestURLsFromPaymentManifest(
std::set<GURL> web_app_manifest_urls;
std::unique_ptr<base::Value> value = base::JSONReader::ReadDeprecated(input);
if (!value) {
base::Optional<base::Value> value = base::JSONReader::Read(input);
if (!value.has_value()) {
LOG(ERROR) << "Payment method manifest must be in JSON format.";
return false;
}
std::unique_ptr<base::DictionaryValue> dict =
base::DictionaryValue::From(std::move(value));
if (!dict) {
if (!value.value().is_dict()) {
LOG(ERROR) << "Payment method manifest must be a JSON dictionary.";
return false;
}
base::ListValue* list = nullptr;
if (!dict->GetList(kDefaultApplications, &list)) {
const base::Value* list = value.value().FindKeyOfType(
kDefaultApplications, base::Value::Type::LIST);
if (!list) {
LOG(ERROR) << "\"" << kDefaultApplications << "\" must be a list.";
return false;
}
size_t apps_number = list->GetSize();
if (apps_number > kMaximumNumberOfWebAppManifests) {
const base::Value::ListStorage& apps = list->GetList();
if (apps.size() > kMaximumNumberOfWebAppManifests) {
LOG(ERROR) << "\"" << kDefaultApplications << "\" must contain at most "
<< kMaximumNumberOfWebAppManifests << " entries.";
return false;
}
std::string item;
for (size_t i = 0; i < apps_number; ++i) {
if (!list->GetString(i, &item) || item.empty())
for (const base::Value& app : apps) {
if (!app.is_string() || app.GetString().empty())
continue;
GURL url(item);
GURL url(app.GetString());
if (!url.is_valid() || !url.SchemeIs(url::kHttpsScheme))
continue;
......@@ -240,55 +238,53 @@ bool IOSPaymentInstrumentFinder::GetPaymentAppDetailsFromWebAppManifest(
std::string* out_app_name,
GURL* out_app_icon_url,
GURL* out_universal_link) {
std::unique_ptr<base::Value> value = base::JSONReader::ReadDeprecated(input);
if (!value) {
base::Optional<base::Value> value = base::JSONReader::Read(input);
if (!value.has_value()) {
LOG(ERROR) << "Web app manifest must be in JSON format.";
return false;
}
std::unique_ptr<base::DictionaryValue> dict =
base::DictionaryValue::From(std::move(value));
if (!dict) {
if (!value.value().is_dict()) {
LOG(ERROR) << "Web app manifest must be a JSON dictionary.";
return false;
}
if (!dict->GetString(kShortName, out_app_name) || out_app_name->empty()) {
const std::string* short_name = value.value().FindStringKey(kShortName);
if (!short_name || short_name->empty()) {
LOG(ERROR) << "\"" << kShortName << "\" must be a non-empty ASCII string.";
return false;
}
*out_app_name = *short_name;
base::ListValue* icons = nullptr;
if (!dict->GetList(kIcons, &icons)) {
const base::Value* list =
value.value().FindKeyOfType(kIcons, base::Value::Type::LIST);
if (!list) {
LOG(ERROR) << "\"" << kIcons << "\" must be a list.";
return false;
}
size_t icons_size = icons->GetSize();
for (size_t i = 0; i < icons_size; ++i) {
base::DictionaryValue* icon = nullptr;
if (!icons->GetDictionary(i, &icon))
for (const base::Value& icon : list->GetList()) {
if (!icon.is_dict())
continue;
std::string icon_sizes;
const std::string* icon_sizes = icon.FindStringKey(kIconsSizes);
// TODO(crbug.com/752546): Determine acceptable sizes for payment app icon.
if (!icon->GetString(kIconsSizes, &icon_sizes) ||
icon_sizes != kIconSizes32)
if (!icon_sizes || *icon_sizes != kIconSizes32)
continue;
std::string icon_string;
if (!icon->GetString(kIconsSource, &icon_string) || icon_string.empty())
const std::string* icon_string = icon.FindStringKey(kIconsSource);
if (!icon_string || icon_string->empty())
continue;
// The parsed value at "src" may be a relative path such that the base URL
// is the path to the manifest. If so we check that here.
GURL complete_url = web_app_manifest_url.Resolve(icon_string);
GURL complete_url = web_app_manifest_url.Resolve(*icon_string);
if (complete_url.is_valid() && complete_url.SchemeIs(url::kHttpsScheme)) {
*out_app_icon_url = complete_url;
break;
}
GURL icon_url(icon_string);
GURL icon_url(*icon_string);
if (icon_url.is_valid() && icon_url.SchemeIs(url::kHttpsScheme))
*out_app_icon_url = icon_url;
}
......@@ -296,29 +292,26 @@ bool IOSPaymentInstrumentFinder::GetPaymentAppDetailsFromWebAppManifest(
if (out_app_icon_url->is_empty())
return false;
base::ListValue* apps = nullptr;
if (!dict->GetList(kRelatedApplications, &apps)) {
list = value.value().FindKeyOfType(kRelatedApplications,
base::Value::Type::LIST);
if (!list) {
LOG(ERROR) << "\"" << kRelatedApplications << "\" must be a list.";
return false;
}
size_t related_applications_size = apps->GetSize();
for (size_t i = 0; i < related_applications_size; ++i) {
base::DictionaryValue* related_application = nullptr;
if (!apps->GetDictionary(i, &related_application))
for (const base::Value& app : list->GetList()) {
if (!app.is_dict())
continue;
std::string platform;
if (!related_application->GetString(kPlatform, &platform) ||
platform != kPlatformItunes)
const std::string* platform = app.FindStringKey(kPlatform);
if (!platform || *platform != kPlatformItunes)
continue;
std::string link;
if (!related_application->GetString(kRelatedApplicationsUrl, &link) ||
link.empty())
const std::string* link = app.FindStringKey(kRelatedApplicationsUrl);
if (!link || link->empty())
continue;
GURL url(link);
GURL url(*link);
if (!url.is_valid() || !url.SchemeIs(url::kHttpsScheme))
continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment