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( ...@@ -163,38 +163,36 @@ bool IOSPaymentInstrumentFinder::GetWebAppManifestURLsFromPaymentManifest(
std::set<GURL> web_app_manifest_urls; std::set<GURL> web_app_manifest_urls;
std::unique_ptr<base::Value> value = base::JSONReader::ReadDeprecated(input); base::Optional<base::Value> value = base::JSONReader::Read(input);
if (!value) { if (!value.has_value()) {
LOG(ERROR) << "Payment method manifest must be in JSON format."; LOG(ERROR) << "Payment method manifest must be in JSON format.";
return false; return false;
} }
std::unique_ptr<base::DictionaryValue> dict = if (!value.value().is_dict()) {
base::DictionaryValue::From(std::move(value));
if (!dict) {
LOG(ERROR) << "Payment method manifest must be a JSON dictionary."; LOG(ERROR) << "Payment method manifest must be a JSON dictionary.";
return false; return false;
} }
base::ListValue* list = nullptr; const base::Value* list = value.value().FindKeyOfType(
if (!dict->GetList(kDefaultApplications, &list)) { kDefaultApplications, base::Value::Type::LIST);
if (!list) {
LOG(ERROR) << "\"" << kDefaultApplications << "\" must be a list."; LOG(ERROR) << "\"" << kDefaultApplications << "\" must be a list.";
return false; return false;
} }
size_t apps_number = list->GetSize(); const base::Value::ListStorage& apps = list->GetList();
if (apps_number > kMaximumNumberOfWebAppManifests) { if (apps.size() > kMaximumNumberOfWebAppManifests) {
LOG(ERROR) << "\"" << kDefaultApplications << "\" must contain at most " LOG(ERROR) << "\"" << kDefaultApplications << "\" must contain at most "
<< kMaximumNumberOfWebAppManifests << " entries."; << kMaximumNumberOfWebAppManifests << " entries.";
return false; return false;
} }
std::string item; for (const base::Value& app : apps) {
for (size_t i = 0; i < apps_number; ++i) { if (!app.is_string() || app.GetString().empty())
if (!list->GetString(i, &item) || item.empty())
continue; continue;
GURL url(item); GURL url(app.GetString());
if (!url.is_valid() || !url.SchemeIs(url::kHttpsScheme)) if (!url.is_valid() || !url.SchemeIs(url::kHttpsScheme))
continue; continue;
...@@ -240,55 +238,53 @@ bool IOSPaymentInstrumentFinder::GetPaymentAppDetailsFromWebAppManifest( ...@@ -240,55 +238,53 @@ bool IOSPaymentInstrumentFinder::GetPaymentAppDetailsFromWebAppManifest(
std::string* out_app_name, std::string* out_app_name,
GURL* out_app_icon_url, GURL* out_app_icon_url,
GURL* out_universal_link) { GURL* out_universal_link) {
std::unique_ptr<base::Value> value = base::JSONReader::ReadDeprecated(input); base::Optional<base::Value> value = base::JSONReader::Read(input);
if (!value) { if (!value.has_value()) {
LOG(ERROR) << "Web app manifest must be in JSON format."; LOG(ERROR) << "Web app manifest must be in JSON format.";
return false; return false;
} }
std::unique_ptr<base::DictionaryValue> dict = if (!value.value().is_dict()) {
base::DictionaryValue::From(std::move(value));
if (!dict) {
LOG(ERROR) << "Web app manifest must be a JSON dictionary."; LOG(ERROR) << "Web app manifest must be a JSON dictionary.";
return false; 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."; LOG(ERROR) << "\"" << kShortName << "\" must be a non-empty ASCII string.";
return false; return false;
} }
*out_app_name = *short_name;
base::ListValue* icons = nullptr; const base::Value* list =
if (!dict->GetList(kIcons, &icons)) { value.value().FindKeyOfType(kIcons, base::Value::Type::LIST);
if (!list) {
LOG(ERROR) << "\"" << kIcons << "\" must be a list."; LOG(ERROR) << "\"" << kIcons << "\" must be a list.";
return false; return false;
} }
size_t icons_size = icons->GetSize(); for (const base::Value& icon : list->GetList()) {
for (size_t i = 0; i < icons_size; ++i) { if (!icon.is_dict())
base::DictionaryValue* icon = nullptr;
if (!icons->GetDictionary(i, &icon))
continue; continue;
std::string icon_sizes; const std::string* icon_sizes = icon.FindStringKey(kIconsSizes);
// TODO(crbug.com/752546): Determine acceptable sizes for payment app icon. // TODO(crbug.com/752546): Determine acceptable sizes for payment app icon.
if (!icon->GetString(kIconsSizes, &icon_sizes) || if (!icon_sizes || *icon_sizes != kIconSizes32)
icon_sizes != kIconSizes32)
continue; continue;
std::string icon_string; const std::string* icon_string = icon.FindStringKey(kIconsSource);
if (!icon->GetString(kIconsSource, &icon_string) || icon_string.empty()) if (!icon_string || icon_string->empty())
continue; continue;
// The parsed value at "src" may be a relative path such that the base URL // 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. // 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)) { if (complete_url.is_valid() && complete_url.SchemeIs(url::kHttpsScheme)) {
*out_app_icon_url = complete_url; *out_app_icon_url = complete_url;
break; break;
} }
GURL icon_url(icon_string); GURL icon_url(*icon_string);
if (icon_url.is_valid() && icon_url.SchemeIs(url::kHttpsScheme)) if (icon_url.is_valid() && icon_url.SchemeIs(url::kHttpsScheme))
*out_app_icon_url = icon_url; *out_app_icon_url = icon_url;
} }
...@@ -296,29 +292,26 @@ bool IOSPaymentInstrumentFinder::GetPaymentAppDetailsFromWebAppManifest( ...@@ -296,29 +292,26 @@ bool IOSPaymentInstrumentFinder::GetPaymentAppDetailsFromWebAppManifest(
if (out_app_icon_url->is_empty()) if (out_app_icon_url->is_empty())
return false; return false;
base::ListValue* apps = nullptr; list = value.value().FindKeyOfType(kRelatedApplications,
if (!dict->GetList(kRelatedApplications, &apps)) { base::Value::Type::LIST);
if (!list) {
LOG(ERROR) << "\"" << kRelatedApplications << "\" must be a list."; LOG(ERROR) << "\"" << kRelatedApplications << "\" must be a list.";
return false; return false;
} }
size_t related_applications_size = apps->GetSize(); for (const base::Value& app : list->GetList()) {
for (size_t i = 0; i < related_applications_size; ++i) { if (!app.is_dict())
base::DictionaryValue* related_application = nullptr;
if (!apps->GetDictionary(i, &related_application))
continue; continue;
std::string platform; const std::string* platform = app.FindStringKey(kPlatform);
if (!related_application->GetString(kPlatform, &platform) || if (!platform || *platform != kPlatformItunes)
platform != kPlatformItunes)
continue; continue;
std::string link; const std::string* link = app.FindStringKey(kRelatedApplicationsUrl);
if (!related_application->GetString(kRelatedApplicationsUrl, &link) || if (!link || link->empty())
link.empty())
continue; continue;
GURL url(link); GURL url(*link);
if (!url.is_valid() || !url.SchemeIs(url::kHttpsScheme)) if (!url.is_valid() || !url.SchemeIs(url::kHttpsScheme))
continue; 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