0

WebUI: convert SetJsonPath("strings.js") to UseStringsJs()

rbpotter@ noticed that the only value SetJsonPath() is ever called with
is "strings.js" (or a constant with that content). So just changed to
UseStringsJs() instead and look for that constant in WebUIDataSource.

Also, add loadTimeData import to strings file when using JS modules.

The autogenerated strings file references loadTimeData.data without
actually importing loadTimeData from load_time_data.m.js, because it
does not expect to be imported as a module. Autogenerate the import if
"strings.m.js" is requested so that UIs using JS modules can import the
strings without needing to add a preceding load_time_data import.

Based on https://crrev.com/c/1756607 by Rebekah Potter <rbpotter@chromium.org>

BUG=965770

Change-Id: I1080cd5a07f6a72d9e8950bd9c4e547d10e6c8ab
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1758840
Reviewed-by: Rebekah Potter <rbpotter@chromium.org>
Reviewed-by: Ted Choc <tedchoc@chromium.org>
Commit-Queue: Rebekah Potter <rbpotter@chromium.org>
Commit-Queue: Dan Beam <dbeam@chromium.org>
Auto-Submit: Dan Beam <dbeam@chromium.org>
Cr-Commit-Position: refs/heads/master@{#687911}
This commit is contained in:
Dan Beam
2019-08-17 00:59:10 +00:00
committed by Commit Bot
parent 7aa449740a
commit e9f4007f07
90 changed files with 144 additions and 124 deletions
chrome/browser
accessibility
ui
webui
app_management
bookmarks
browser_switch
cast
certificate_viewer_ui.cc
chromeos
components_ui.cccrashes_ui.ccdevice_log_ui.cc
download_internals
downloads
extensions
gcm_internals_ui.cchistory_ui.cc
local_discovery
management_ui.cc
media
nacl_ui.ccnet_export_ui.cc
net_internals
offline
omnibox
policy_ui_handler.cc
print_preview
quota_internals
sandbox_internals_ui.cc
settings
signin
signin_internals_ui.cc
sync_file_system_internals
sync_internals_ui.ccsystem_info_ui.cc
translate_internals
version_ui.ccwebapks_ui.cc
welcome
components
dom_distiller
security_interstitials
content
docs
ios
ui/base/webui

@ -256,7 +256,7 @@ AccessibilityUI::AccessibilityUI(content::WebUI* web_ui)
content::WebUIDataSource::Create(chrome::kChromeUIAccessibilityHost);
// Add required resources.
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
html_source->AddResourcePath("accessibility.css", IDR_ACCESSIBILITY_CSS);
html_source->AddResourcePath("accessibility.js", IDR_ACCESSIBILITY_JS);
html_source->SetDefaultResource(IDR_ACCESSIBILITY_HTML);

@ -176,7 +176,7 @@ content::WebUIDataSource* CreateAppManagementUIHTMLSource(Profile* profile) {
source->AddResourcePath("util.js", IDR_APP_MANAGEMENT_UTIL_JS);
source->SetDefaultResource(IDR_APP_MANAGEMENT_INDEX_HTML);
source->SetJsonPath("strings.js");
source->UseStringsJs();
return source;
}

@ -167,7 +167,7 @@ content::WebUIDataSource* CreateBookmarksUIHTMLSource(Profile* profile) {
source->SetDefaultResource(IDR_BOOKMARKS_BOOKMARKS_HTML);
#endif
source->SetJsonPath("strings.js");
source->UseStringsJs();
return source;
}

@ -148,7 +148,7 @@ content::WebUIDataSource* CreateBrowserSwitchUIHTMLSource(
source->AddResourcePath("internals/", IDR_BROWSER_SWITCH_INTERNALS_HTML);
source->AddResourcePath("internals", IDR_BROWSER_SWITCH_INTERNALS_HTML);
source->SetJsonPath("strings.js");
source->UseStringsJs();
return source;
}

@ -30,7 +30,7 @@ CastUI::CastUI(content::WebUI* web_ui)
html_source->AddResourcePath("cast.js", IDR_CAST_JS);
html_source->AddString("extensionId", extension_id);
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
html_source->SetDefaultResource(IDR_CAST_HTML);
content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source);

@ -46,7 +46,7 @@ content::WebUIDataSource* GetWebUIDataSource(const std::string& host) {
};
AddLocalizedStringsBulk(html_source, kStrings, base::size(kStrings));
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
// Add required resources.
html_source->AddResourcePath("certificate_viewer.js",

@ -27,7 +27,7 @@ AccountManagerWelcomeUI::AccountManagerWelcomeUI(content::WebUI* web_ui)
"closeDialog", base::BindRepeating(&WebDialogUI::CloseDialog,
weak_factory_.GetWeakPtr()));
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
// Add localized strings.
html_source->AddLocalizedString("welcomeTitle",

@ -76,7 +76,7 @@ AccountMigrationWelcomeUI::AccountMigrationWelcomeUI(content::WebUI* web_ui)
content::WebUIDataSource* html_source = content::WebUIDataSource::Create(
chrome::kChromeUIAccountMigrationWelcomeHost);
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
// Add localized strings.
html_source->AddLocalizedString("welcomePageTitle",

@ -188,7 +188,7 @@ void AddSupervisionUI::SetupResources() {
"add_supervision.mojom-lite.js",
IDR_ADD_SUPERVISION_MOJOM_LITE_JS);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_ADD_SUPERVISION_HTML);
source->AddString("webviewUrl", supervision_url_.spec());
source->AddString("eventOriginFilter", supervision_url_.GetOrigin().spec());

@ -25,7 +25,7 @@ constexpr char kArcGraphicsTracingCssPath[] = "arc_graphics_tracing.css";
content::WebUIDataSource* CreateDataSource() {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIArcGraphicsTracingHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_ARC_GRAPHICS_TRACING_HTML);
source->AddResourcePath(kArcGraphicsTracingJsPath,
IDR_ARC_GRAPHICS_TRACING_JS);

@ -77,7 +77,7 @@ AssistantOptInUI::AssistantOptInUI(content::WebUI* web_ui)
base::DictionaryValue localized_strings;
assistant_handler_ptr_->GetLocalizedStrings(&localized_strings);
source->AddLocalizedStrings(localized_strings);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("assistant_optin.js", IDR_ASSISTANT_OPTIN_JS);
source->AddResourcePath("assistant_logo.png", IDR_ASSISTANT_LOGO_PNG);
source->AddBoolean("hotwordDspAvailable", chromeos::IsHotwordDspAvailable());

@ -103,7 +103,7 @@ BluetoothPairingDialogUI::BluetoothPairingDialogUI(content::WebUI* web_ui)
AddBluetoothStrings(source);
source->AddLocalizedString("title", IDS_SETTINGS_BLUETOOTH_PAIR_DEVICE_TITLE);
source->SetJsonPath("strings.js");
source->UseStringsJs();
#if BUILDFLAG(OPTIMIZE_WEBUI)
source->SetDefaultResource(IDR_BLUETOOTH_PAIRING_DIALOG_VULCANIZED_HTML);
source->AddResourcePath("crisper.js",

@ -53,7 +53,7 @@ content::WebUIDataSource* CreateCameraUIHTMLSource() {
// Add System Web App resources.
source->AddResourcePath("pwa.html", IDR_PWA_HTML);
source->SetJsonPath("strings.js");
source->UseStringsJs();
return source;
}

@ -111,7 +111,7 @@ CellularSetupDialogUI::CellularSetupDialogUI(content::WebUI* web_ui)
content::WebUIDataSource::Create(chrome::kChromeUICellularSetupHost);
chromeos::cellular_setup::AddLocalizedStrings(source);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_CELLULAR_SETUP_CELLULAR_SETUP_DIALOG_HTML);
// Note: The |kCellularSetupResourcesSize| and |kCellularSetupResources|

@ -55,7 +55,7 @@ CertificateManagerDialogUI::CertificateManagerDialogUI(content::WebUI* web_ui)
user_manager::UserManager::Get()->IsLoggedInAsKioskApp() ||
user_manager::UserManager::Get()->IsLoggedInAsArcKioskApp());
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_CERT_MANAGER_DIALOG_HTML);
source->DisableContentSecurityPolicy();

@ -86,7 +86,7 @@ void SetLocalizedStrings(Profile* profile,
content::WebUIDataSource* CreateDataSource(Profile* profile) {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIFirstRunHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_FIRST_RUN_HTML);
source->AddResourcePath(kFirstRunJSPath, IDR_FIRST_RUN_JS);
base::DictionaryValue localized_strings;

@ -89,7 +89,7 @@ PasswordChangeUI::PasswordChangeUI(content::WebUI* web_ui)
std::make_unique<PasswordChangeHandler>(password_change_url));
source->AddString("hostedHeader", GetHostedHeaderText(password_change_url));
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_PASSWORD_CHANGE_HTML);
@ -134,7 +134,7 @@ ConfirmPasswordChangeUI::ConfirmPasswordChangeUI(content::WebUI* web_ui)
AddSize(source, "New", ConfirmPasswordChangeDialog::GetSize(false, true));
AddSize(source, "OldNew", ConfirmPasswordChangeDialog::GetSize(true, true));
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_CONFIRM_PASSWORD_CHANGE_HTML);
source->AddResourcePath("confirm_password_change.js",
IDR_CONFIRM_PASSWORD_CHANGE_JS);
@ -172,7 +172,7 @@ UrgentPasswordExpiryNotificationUI::UrgentPasswordExpiryNotificationUI(
AddLocalizedStringsBulk(source, kLocalizedStrings,
base::size(kLocalizedStrings));
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_URGENT_PASSWORD_EXPIRY_NOTIFICATION_HTML);
source->AddResourcePath("urgent_password_expiry_notification.js",
IDR_URGENT_PASSWORD_EXPIRY_NOTIFICATION_JS);

@ -142,7 +142,7 @@ InternetConfigDialogUI::InternetConfigDialogUI(content::WebUI* web_ui)
AddInternetStrings(source);
source->AddLocalizedString("title", IDS_SETTINGS_INTERNET_CONFIG);
source->SetJsonPath("strings.js");
source->UseStringsJs();
#if BUILDFLAG(OPTIMIZE_WEBUI)
source->SetDefaultResource(IDR_INTERNET_CONFIG_DIALOG_VULCANIZED_HTML);
source->AddResourcePath("crisper.js", IDR_INTERNET_CONFIG_DIALOG_CRISPER_JS);

@ -141,7 +141,7 @@ InternetDetailDialogUI::InternetDetailDialogUI(content::WebUI* web_ui)
!ash::features::IsSeparateNetworkIconsEnabled());
AddInternetStrings(source);
source->AddLocalizedString("title", IDS_SETTINGS_INTERNET_DETAIL);
source->SetJsonPath("strings.js");
source->UseStringsJs();
#if BUILDFLAG(OPTIMIZE_WEBUI)
source->SetDefaultResource(IDR_INTERNET_DETAIL_DIALOG_VULCANIZED_HTML);
source->AddResourcePath("crisper.js", IDR_INTERNET_DETAIL_DIALOG_CRISPER_JS);

@ -134,7 +134,6 @@ constexpr char kOobeJSPath[] = "oobe.js";
constexpr char kProductLogoPath[] = "product-logo.png";
constexpr char kRecommendAppListViewHTMLPath[] = "recommend_app_list_view.html";
constexpr char kRecommendAppListViewJSPath[] = "recommend_app_list_view.js";
constexpr char kStringsJSPath[] = "strings.js";
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
constexpr char kLogo24PX1XSvgPath[] = "logo_24px-1x.svg";
@ -236,7 +235,7 @@ content::WebUIDataSource* CreateOobeUIDataSource(
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIOobeHost);
source->AddLocalizedStrings(localized_strings);
source->SetJsonPath(kStringsJSPath);
source->UseStringsJs();
// First, configure default and non-shared resources for the current display
// type.

@ -91,7 +91,7 @@ MultiDeviceSetupDialogUI::MultiDeviceSetupDialogUI(content::WebUI* web_ui)
content::WebUIDataSource::Create(chrome::kChromeUIMultiDeviceSetupHost);
chromeos::multidevice_setup::AddLocalizedStrings(source);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(
IDR_MULTIDEVICE_SETUP_MULTIDEVICE_SETUP_DIALOG_HTML);

@ -362,7 +362,7 @@ NetworkUI::NetworkUI(content::WebUI* web_ui)
network_element::AddLocalizedStrings(html);
html->SetJsonPath("strings.js");
html->UseStringsJs();
html->AddResourcePath("network_ui.css", IDR_NETWORK_UI_CSS);
html->AddResourcePath("network_ui.js", IDR_NETWORK_UI_JS);
html->SetDefaultResource(IDR_NETWORK_UI_HTML);

@ -33,8 +33,6 @@ namespace chromeos {
namespace {
const char kStringsJsFile[] = "strings.js";
const char kRequestBatteryChargeDataCallback[] = "requestBatteryChargeData";
const char kOnRequestBatteryChargeDataFunction[] =
"powerUI.showBatteryChargeData";
@ -260,7 +258,7 @@ PowerUI::PowerUI(content::WebUI* web_ui) : content::WebUIController(web_ui) {
};
AddLocalizedStringsBulk(html, kStrings, base::size(kStrings));
html->SetJsonPath(kStringsJsFile);
html->UseStringsJs();
html->AddResourcePath("power.css", IDR_ABOUT_POWER_CSS);
html->AddResourcePath("power.js", IDR_ABOUT_POWER_JS);

@ -195,7 +195,7 @@ SetTimeUI::SetTimeUI(content::WebUI* web_ui) : WebDialogUI(web_ui) {
values.SetDouble("buildTime", base::GetBuildTime().ToJsTime());
source->AddLocalizedStrings(values);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("set_time_browser_proxy.html",
IDR_SET_TIME_BROWSER_PROXY_HTML);

@ -87,7 +87,7 @@ SmbCredentialsDialogUI::SmbCredentialsDialogUI(content::WebUI* web_ui)
AddSmbCredentialsDialogStrings(source);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_SMB_CREDENTIALS_DIALOG_CONTAINER_HTML);
source->AddResourcePath("smb_credentials_dialog.html",
IDR_SMB_CREDENTIALS_DIALOG_HTML);

@ -70,7 +70,7 @@ SmbShareDialogUI::SmbShareDialogUI(content::WebUI* web_ui)
source->AddBoolean("isActiveDirectoryUser",
user && user->IsActiveDirectoryUser());
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_SMB_SHARES_DIALOG_CONTAINER_HTML);
source->AddResourcePath("smb_share_dialog.html", IDR_SMB_SHARES_DIALOG_HTML);
source->AddResourcePath("smb_share_dialog.js", IDR_SMB_SHARES_DIALOG_JS);

@ -67,7 +67,7 @@ content::WebUIDataSource* CreateComponentsUIHTMLSource(Profile* profile) {
profile->IsOffTheRecord()
#endif
);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("components.js", IDR_COMPONENTS_JS);
source->SetDefaultResource(IDR_COMPONENTS_HTML);
return source;

@ -54,7 +54,7 @@ content::WebUIDataSource* CreateCrashesUIHTMLSource() {
source->AddLocalizedString(crash_reporter::kCrashesUIShortProductName,
IDS_SHORT_PRODUCT_NAME);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath(crash_reporter::kCrashesUICrashesJS,
IDR_CRASH_CRASHES_JS);
source->SetDefaultResource(IDR_CRASH_CRASHES_HTML);

@ -91,7 +91,7 @@ DeviceLogUI::DeviceLogUI(content::WebUI* web_ui)
};
AddLocalizedStringsBulk(html, kStrings, base::size(kStrings));
html->SetJsonPath("strings.js");
html->UseStringsJs();
html->AddResourcePath("device_log_ui.css", IDR_DEVICE_LOG_UI_CSS);
html->AddResourcePath("device_log_ui.js", IDR_DEVICE_LOG_UI_JS);
html->SetDefaultResource(IDR_DEVICE_LOG_UI_HTML);

@ -23,7 +23,7 @@ DownloadInternalsUI::DownloadInternalsUI(content::WebUI* web_ui)
"script-src chrome://resources 'self' 'unsafe-eval';");
// Required resources.
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
html_source->AddResourcePath("download_internals.css",
IDR_DOWNLOAD_INTERNALS_CSS);
html_source->AddResourcePath("download_internals.js",

@ -149,7 +149,7 @@ content::WebUIDataSource* CreateDownloadsUIHTMLSource(Profile* profile) {
source->SetDefaultResource(IDR_DOWNLOADS_DOWNLOADS_HTML);
#endif
source->SetJsonPath("strings.js");
source->UseStringsJs();
return source;
}

@ -59,7 +59,7 @@ content::WebUIDataSource* CreateMdExtensionsSource(Profile* profile,
bool in_dev_mode) {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIExtensionsHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
static constexpr LocalizedString kLocalizedStrings[] = {
// Add common strings.

@ -160,7 +160,7 @@ GCMInternalsUI::GCMInternalsUI(content::WebUI* web_ui)
content::WebUIDataSource* html_source =
content::WebUIDataSource::Create(chrome::kChromeUIGCMInternalsHost);
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
// Add required resources.
html_source->AddResourcePath(gcm_driver::kGcmInternalsCSS,

@ -167,7 +167,7 @@ content::WebUIDataSource* CreateHistoryUIHTMLSource(Profile* profile) {
#endif
source->SetDefaultResource(IDR_HISTORY_HISTORY_HTML);
source->SetJsonPath("strings.js");
source->UseStringsJs();
return source;
}

@ -81,7 +81,7 @@ content::WebUIDataSource* CreateLocalDiscoveryHTMLSource() {
};
AddLocalizedStringsBulk(source, kStrings, base::size(kStrings));
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->DisableDenyXFrameOptions();

@ -102,7 +102,7 @@ content::WebUIDataSource* CreateManagementUIHtmlSource(Profile* profile) {
chrome::kManagedUiLearnMoreUrl);
#endif // defined(OS_CHROMEOS)
source->SetJsonPath("strings.js");
source->UseStringsJs();
// Add required resources.
source->AddResourcePath("management_browser_proxy.html",
IDR_MANAGEMENT_BROWSER_PROXY_HTML);

@ -75,7 +75,7 @@ content::WebUIDataSource* CreateWebRtcLogsUIHTMLSource() {
};
AddLocalizedStringsBulk(source, kStrings, base::size(kStrings));
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("webrtc_logs.js", IDR_WEBRTC_LOGS_JS);
source->SetDefaultResource(IDR_WEBRTC_LOGS_HTML);
return source;

@ -63,7 +63,7 @@ content::WebUIDataSource* CreateNaClUIHTMLSource() {
content::WebUIDataSource::Create(chrome::kChromeUINaClHost);
source->OverrideContentSecurityPolicyScriptSrc(
"script-src chrome://resources 'self' 'unsafe-eval';");
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("about_nacl.css", IDR_ABOUT_NACL_CSS);
source->AddResourcePath("about_nacl.js", IDR_ABOUT_NACL_JS);
source->SetDefaultResource(IDR_ABOUT_NACL_HTML);

@ -61,7 +61,7 @@ content::WebUIDataSource* CreateNetExportHTMLSource() {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUINetExportHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath(net_log::kNetExportUIJS, IDR_NET_LOG_NET_EXPORT_JS);
source->SetDefaultResource(IDR_NET_LOG_NET_EXPORT_HTML);
return source;

@ -62,7 +62,7 @@ content::WebUIDataSource* CreateNetInternalsHTMLSource() {
source->SetDefaultResource(IDR_NET_INTERNALS_INDEX_HTML);
source->AddResourcePath("index.js", IDR_NET_INTERNALS_INDEX_JS);
source->SetJsonPath("strings.js");
source->UseStringsJs();
return source;
}

@ -22,7 +22,7 @@ OfflineInternalsUI::OfflineInternalsUI(content::WebUI* web_ui)
content::WebUIDataSource::Create(chrome::kChromeUIOfflineInternalsHost);
// Required resources.
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
html_source->AddResourcePath("offline_internals.css",
IDR_OFFLINE_INTERNALS_CSS);
html_source->AddResourcePath("offline_internals.js",

@ -25,7 +25,7 @@ OmniboxUI::OmniboxUI(content::WebUI* web_ui)
// Expose version information to client because it is useful in output.
VersionUI::AddVersionDetailStrings(source);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("omnibox.css", IDR_OMNIBOX_CSS);
source->AddResourcePath("omnibox_input.css", IDR_OMNIBOX_INPUT_CSS);

@ -739,7 +739,7 @@ void PolicyUIHandler::AddCommonLocalizedStringsToSource(
};
AddLocalizedStringsBulk(source, kStrings, base::size(kStrings));
source->SetJsonPath("strings.js");
source->UseStringsJs();
}
void PolicyUIHandler::RegisterMessages() {

@ -432,7 +432,7 @@ content::WebUIDataSource* CreatePrintPreviewUISource(Profile* profile) {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIPrintHost);
AddPrintPreviewStrings(source);
source->SetJsonPath("strings.js");
source->UseStringsJs();
#if BUILDFLAG(OPTIMIZE_WEBUI)
source->AddResourcePath("crisper.js", IDR_PRINT_PREVIEW_CRISPER_JS);
source->SetDefaultResource(IDR_PRINT_PREVIEW_VULCANIZED_HTML);

@ -23,7 +23,7 @@ content::WebUIDataSource* CreateQuotaInternalsHTMLSource() {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIQuotaInternalsHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath(
"event_handler.js", IDR_QUOTA_INTERNALS_EVENT_HANDLER_JS);
source->AddResourcePath(

@ -69,7 +69,7 @@ content::WebUIDataSource* CreateDataSource() {
#if defined(OS_LINUX)
SetSandboxStatusData(source);
source->SetJsonPath("strings.js");
source->UseStringsJs();
#endif
return source;

@ -119,10 +119,6 @@
namespace settings {
namespace {
// Note that settings.html contains a <script> tag which imports a script of
// the following name. These names must be kept in sync.
constexpr char kLocalizedStringsFile[] = "strings.js";
#if defined(OS_CHROMEOS)
// Generates a Google Help URL which includes a "board type" parameter. Some
// help pages need to be adjusted depending on the type of CrOS device that is
@ -3345,7 +3341,7 @@ void AddLocalizedStrings(content::WebUIDataSource* html_source,
policy_indicator::AddLocalizedStrings(html_source);
AddSecurityKeysStrings(html_source);
html_source->SetJsonPath(kLocalizedStringsFile);
html_source->UseStringsJs();
}
} // namespace settings

@ -37,7 +37,7 @@ content::WebUIDataSource* CreateWebUIDataSource() {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIChromeSigninHost);
source->OverrideContentSecurityPolicyObjectSrc("object-src chrome:;");
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_INLINE_LOGIN_HTML);

@ -23,7 +23,7 @@ SigninEmailConfirmationUI::SigninEmailConfirmationUI(content::WebUI* web_ui)
content::WebUIDataSource* source = content::WebUIDataSource::Create(
chrome::kChromeUISigninEmailConfirmationHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_SIGNIN_EMAIL_CONFIRMATION_HTML);
source->AddResourcePath("signin_email_confirmation.js",
IDR_SIGNIN_EMAIL_CONFIRMATION_JS);

@ -66,7 +66,7 @@ void SigninErrorUI::Initialize(Browser* browser, bool is_system_profile) {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUISigninErrorHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_SIGNIN_ERROR_HTML);
source->AddResourcePath("signin_error.js", IDR_SIGNIN_ERROR_JS);
source->AddResourcePath("signin_shared_css.html", IDR_SIGNIN_SHARED_CSS_HTML);

@ -33,7 +33,7 @@ SyncConfirmationUI::SyncConfirmationUI(content::WebUI* web_ui)
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUISyncConfirmationHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("signin_shared_css.html", IDR_SIGNIN_SHARED_CSS_HTML);
if (is_sync_allowed) {

@ -61,7 +61,7 @@ content::WebUIDataSource* UserManagerUI::CreateUIDataSource(
source->AddBoolean("isForceSigninEnabled",
signin_util::IsForceSigninEnabled());
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("control_bar.html", IDR_CONTROL_BAR_HTML);
source->AddResourcePath("control_bar.js", IDR_CONTROL_BAR_JS);

@ -27,7 +27,7 @@ content::WebUIDataSource* CreateSignInInternalsHTMLSource() {
source->OverrideContentSecurityPolicyScriptSrc(
"script-src chrome://resources 'self' 'unsafe-eval';");
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("signin_internals.js", IDR_SIGNIN_INTERNALS_INDEX_JS);
source->SetDefaultResource(IDR_SIGNIN_INTERNALS_INDEX_HTML);
return source;

@ -22,7 +22,7 @@ content::WebUIDataSource* CreateSyncFileSystemInternalsHTMLSource() {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(
chrome::kChromeUISyncFileSystemInternalsHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath(
"utils.js",
IDR_SYNC_FILE_SYSTEM_INTERNALS_UTILS_JS);

@ -22,7 +22,7 @@ content::WebUIDataSource* CreateSyncInternalsHTMLSource() {
source->OverrideContentSecurityPolicyScriptSrc(
"script-src chrome://resources 'self' 'unsafe-eval';");
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath(syncer::sync_ui_util::kSyncIndexJS,
IDR_SYNC_DRIVER_SYNC_INTERNALS_INDEX_JS);
source->AddResourcePath(syncer::sync_ui_util::kChromeSyncJS,

@ -66,7 +66,7 @@ content::WebUIDataSource* CreateSystemInfoUIDataSource() {
html_source->AddResourcePath("about_sys.js", IDR_ABOUT_SYS_JS);
html_source->AddResourcePath("about_sys.css", IDR_ABOUT_SYS_CSS);
html_source->SetDefaultResource(IDR_ABOUT_SYS_HTML);
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
return html_source;
}

@ -29,7 +29,7 @@ content::WebUIDataSource* CreateTranslateInternalsHTMLSource() {
content::WebUIDataSource::Create(chrome::kChromeUITranslateInternalsHost);
source->SetDefaultResource(IDR_TRANSLATE_INTERNALS_HTML);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("translate_internals.js", IDR_TRANSLATE_INTERNALS_JS);
base::DictionaryValue langs;

@ -83,7 +83,7 @@ WebUIDataSource* CreateVersionUIDataSource() {
VersionUI::AddVersionDetailStrings(html_source);
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
html_source->AddResourcePath(version_ui::kVersionJS, IDR_VERSION_UI_JS);
html_source->AddResourcePath(version_ui::kAboutVersionCSS,
IDR_VERSION_UI_CSS);

@ -21,7 +21,7 @@ namespace {
WebUIDataSource* CreateWebApksUIDataSource() {
WebUIDataSource* html_source =
WebUIDataSource::Create(chrome::kChromeUIWebApksHost);
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
html_source->AddResourcePath("webapks.js", IDR_WEBAPKS_UI_JS);
html_source->AddResourcePath("about_webapks.css", IDR_WEBAPKS_UI_CSS);
html_source->SetDefaultResource(IDR_WEBAPKS_UI_HTML);

@ -201,7 +201,7 @@ WelcomeUI::WelcomeUI(content::WebUI* web_ui, const GURL& url)
weak_ptr_factory_.GetWeakPtr()),
base::BindRepeating(&HandleRequestCallback,
weak_ptr_factory_.GetWeakPtr()));
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
content::WebUIDataSource::Add(profile, html_source);
}

@ -50,7 +50,7 @@ DomDistillerUi::DomDistillerUi(content::WebUI* web_ui,
content::BrowserContext* browser_context =
web_ui->GetWebContents()->GetBrowserContext();
content::WebUIDataSource::Add(browser_context, source);
source->SetJsonPath("strings.js");
source->UseStringsJs();
// Add message handler.
web_ui->AddMessageHandler(

@ -73,7 +73,7 @@ ConnectionHelpUI::ConnectionHelpUI(content::WebUI* web_ui)
html_source->AddLocalizedString("connectionHelpShowLess",
IDS_CONNECTION_HELP_SHOW_LESS);
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
html_source->AddResourcePath("interstitial_core.css",
IDR_SECURITY_INTERSTITIAL_CORE_CSS);

@ -357,7 +357,7 @@ AppCacheInternalsUI::AppCacheInternalsUI(WebUI* web_ui)
source->OverrideContentSecurityPolicyScriptSrc(
"script-src chrome://resources 'self' 'unsafe-eval';");
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("appcache_internals.js", IDR_APPCACHE_INTERNALS_JS);
source->AddResourcePath("appcache_internals.css", IDR_APPCACHE_INTERNALS_CSS);
source->SetDefaultResource(IDR_APPCACHE_INTERNALS_HTML);

@ -70,7 +70,7 @@ WebUIDataSource* CreateGpuHTMLSource() {
source->OverrideContentSecurityPolicyScriptSrc(
"script-src chrome://resources 'self' 'unsafe-eval';");
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("gpu_internals.js", IDR_GPU_INTERNALS_JS);
source->SetDefaultResource(IDR_GPU_INTERNALS_HTML);
return source;

@ -72,7 +72,7 @@ IndexedDBInternalsUI::IndexedDBInternalsUI(WebUI* web_ui)
WebUIDataSource::Create(kChromeUIIndexedDBInternalsHost);
source->OverrideContentSecurityPolicyScriptSrc(
"script-src chrome://resources 'self' 'unsafe-eval';");
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("indexeddb_internals.js",
IDR_INDEXED_DB_INTERNALS_JS);
source->AddResourcePath("indexeddb_internals.css",

@ -20,7 +20,7 @@ WebUIDataSource* CreateMediaInternalsHTMLSource() {
WebUIDataSource* source =
WebUIDataSource::Create(kChromeUIMediaInternalsHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("media_internals.js", IDR_MEDIA_INTERNALS_JS);
source->SetDefaultResource(IDR_MEDIA_INTERNALS_HTML);

@ -83,7 +83,7 @@ NetworkErrorsListingUI::NetworkErrorsListingUI(WebUI* web_ui)
WebUIDataSource::Create(kChromeUINetworkErrorsListingHost);
// Add required resources.
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
html_source->AddResourcePath("network_errors_listing.css",
IDR_NETWORK_ERROR_LISTING_CSS);
html_source->AddResourcePath("network_errors_listing.js",

@ -320,7 +320,7 @@ ServiceWorkerInternalsUI::ServiceWorkerInternalsUI(WebUI* web_ui)
WebUIDataSource::Create(kChromeUIServiceWorkerInternalsHost);
source->OverrideContentSecurityPolicyScriptSrc(
"script-src chrome://resources 'self' 'unsafe-eval';");
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("serviceworker_internals.js",
IDR_SERVICE_WORKER_INTERNALS_JS);
source->AddResourcePath("serviceworker_internals.css",

@ -176,7 +176,7 @@ TracingUI::TracingUI(WebUI* web_ui)
web_ui->GetWebContents()->GetBrowserContext();
WebUIDataSource* source = WebUIDataSource::Create(kChromeUITracingHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->SetDefaultResource(IDR_TRACING_HTML);
source->AddResourcePath("tracing.js", IDR_TRACING_JS);
source->SetRequestFilter(base::BindRepeating(OnShouldHandleRequest),

@ -18,7 +18,7 @@ WebUIDataSource* CreateWebRTCInternalsHTMLSource() {
WebUIDataSource* source =
WebUIDataSource::Create(kChromeUIWebRTCInternalsHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("webrtc_internals.js", IDR_WEBRTC_INTERNALS_JS);
source->SetDefaultResource(IDR_WEBRTC_INTERNALS_HTML);
return source;

@ -162,11 +162,8 @@ void WebUIDataSourceImpl::AddInteger(base::StringPiece name, int32_t value) {
localized_strings_.SetInteger(name, value);
}
void WebUIDataSourceImpl::SetJsonPath(base::StringPiece path) {
DCHECK(json_path_.empty());
DCHECK(!path.empty());
json_path_ = path.as_string();
void WebUIDataSourceImpl::UseStringsJs() {
use_strings_js_ = true;
}
void WebUIDataSourceImpl::AddResourcePath(base::StringPiece path,
@ -282,9 +279,12 @@ void WebUIDataSourceImpl::StartDataRequest(
EnsureLoadTimeDataDefaultsAdded();
if (!json_path_.empty() && path == json_path_) {
SendLocalizedStringsAsJSON(callback);
return;
if (use_strings_js_) {
bool from_js_module = path == "strings.m.js";
if (from_js_module || path == "strings.js") {
SendLocalizedStringsAsJSON(callback, from_js_module);
return;
}
}
int resource_id = PathToIdrOrDefault(CleanUpPath(path));
@ -295,9 +295,10 @@ void WebUIDataSourceImpl::StartDataRequest(
}
void WebUIDataSourceImpl::SendLocalizedStringsAsJSON(
const URLDataSource::GotDataCallback& callback) {
const URLDataSource::GotDataCallback& callback,
bool from_js_module) {
std::string template_data;
webui::AppendJsonJS(&localized_strings_, &template_data);
webui::AppendJsonJS(&localized_strings_, &template_data, from_js_module);
callback.Run(base::RefCountedString::TakeString(&template_data));
}

@ -37,7 +37,7 @@ class CONTENT_EXPORT WebUIDataSourceImpl : public URLDataSourceImpl,
const base::DictionaryValue& localized_strings) override;
void AddBoolean(base::StringPiece name, bool value) override;
void AddInteger(base::StringPiece name, int32_t value) override;
void SetJsonPath(base::StringPiece path) override;
void UseStringsJs() override;
void AddResourcePath(base::StringPiece path, int resource_id) override;
void SetDefaultResource(int resource_id) override;
void SetRequestFilter(const WebUIDataSource::ShouldHandleRequestCallback&
@ -67,7 +67,8 @@ class CONTENT_EXPORT WebUIDataSourceImpl : public URLDataSourceImpl,
// Completes a request by sending our dictionary of localized strings.
void SendLocalizedStringsAsJSON(
const URLDataSource::GotDataCallback& callback);
const URLDataSource::GotDataCallback& callback,
bool from_js_module);
// Protected for testing.
virtual const base::DictionaryValue* GetLocalizedStrings() const;
@ -99,7 +100,7 @@ class CONTENT_EXPORT WebUIDataSourceImpl : public URLDataSourceImpl,
// specific resources like "favicon/34" getting sent to this source.
std::string source_name_;
int default_resource_;
std::string json_path_;
bool use_strings_js_ = false;
std::map<std::string, int> path_to_idr_map_;
// The replacements are initiallized in the main thread and then used in the
// IO thread. The map is safe to read from multiple threads as long as no

@ -88,15 +88,23 @@ class WebUIDataSourceTest : public testing::Test {
scoped_refptr<WebUIDataSourceImpl> source_;
};
void EmptyStringsCallback(scoped_refptr<base::RefCountedMemory> data) {
void EmptyStringsCallback(bool from_js_module,
scoped_refptr<base::RefCountedMemory> data) {
std::string result(data->front_as<char>(), data->size());
EXPECT_NE(result.find("loadTimeData.data = {"), std::string::npos);
EXPECT_NE(result.find("};"), std::string::npos);
bool has_import = result.find("import {loadTimeData}") != std::string::npos;
EXPECT_EQ(from_js_module, has_import);
}
TEST_F(WebUIDataSourceTest, EmptyStrings) {
source()->SetJsonPath("strings.js");
StartDataRequest("strings.js", base::Bind(&EmptyStringsCallback));
source()->UseStringsJs();
StartDataRequest("strings.js", base::Bind(&EmptyStringsCallback, false));
}
TEST_F(WebUIDataSourceTest, EmptyModuleStrings) {
source()->UseStringsJs();
StartDataRequest("strings.m.js", base::Bind(&EmptyStringsCallback, true));
}
void SomeValuesCallback(scoped_refptr<base::RefCountedMemory> data) {
@ -109,7 +117,7 @@ void SomeValuesCallback(scoped_refptr<base::RefCountedMemory> data) {
}
TEST_F(WebUIDataSourceTest, SomeValues) {
source()->SetJsonPath("strings.js");
source()->UseStringsJs();
source()->AddBoolean("flag", true);
source()->AddInteger("counter", 10);
source()->AddInteger("debt", -456);

@ -67,8 +67,9 @@ class WebUIDataSource {
// MAX_SAFE_INTEGER in /v8/src/globals.h.
virtual void AddInteger(base::StringPiece name, int32_t value) = 0;
// Sets the path which will return the JSON strings.
virtual void SetJsonPath(base::StringPiece path) = 0;
// Call this to enable a virtual "strings.js" (or "strings.m.js" for modules)
// URL that provides translations and dynamic data when requested.
virtual void UseStringsJs() = 0;
// Adds a mapping between a path name and a resource to return.
virtual void AddResourcePath(base::StringPiece path, int resource_id) = 0;

@ -169,7 +169,7 @@ HelloWorldUI::HelloWorldUI(content::WebUI* web_ui)
// As a demonstration of passing a variable for JS to use we pass in the name "Bob".
html_source->AddString("userName", "Bob");
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
// Add required resources.
html_source->AddResourcePath("hello_world.css", IDR_HELLO_WORLD_CSS);

@ -43,7 +43,7 @@ web::WebUIIOSDataSource* CreateCrashesUIHTMLSource() {
source->AddLocalizedString(crash_reporter::kCrashesUIShortProductName,
IDS_IOS_SHORT_PRODUCT_NAME);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath(crash_reporter::kCrashesUICrashesJS,
IDR_CRASH_CRASHES_JS);
source->SetDefaultResource(IDR_CRASH_CRASHES_HTML);

@ -44,7 +44,7 @@ web::WebUIIOSDataSource* CreateFlagsUIHTMLSource() {
IDS_FLAGS_UI_RELAUNCH_NOTICE);
source->AddString(flags_ui::kVersion, version_info::GetVersionNumber());
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath(flags_ui::kFlagsJS, IDR_FLAGS_UI_FLAGS_JS);
source->SetDefaultResource(IDR_FLAGS_UI_FLAGS_HTML);
return source;

@ -162,7 +162,7 @@ GCMInternalsUI::GCMInternalsUI(web::WebUIIOS* web_ui)
web::WebUIIOSDataSource* html_source =
web::WebUIIOSDataSource::Create(kChromeUIGCMInternalsHost);
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
// Add required resources.
html_source->AddResourcePath(gcm_driver::kGcmInternalsCSS,

@ -61,7 +61,7 @@ web::WebUIIOSDataSource* CreateInspectUIHTMLSource() {
IDS_IOS_INSPECT_UI_CONSOLE_START_LOGGING);
source->AddLocalizedString("inspectConsoleStopLogging",
IDS_IOS_INSPECT_UI_CONSOLE_STOP_LOGGING);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("inspect.js", IDR_IOS_INSPECT_JS);
source->SetDefaultResource(IDR_IOS_INSPECT_HTML);
return source;

@ -40,7 +40,7 @@ web::WebUIIOSDataSource* CreateNetExportHTMLSource() {
web::WebUIIOSDataSource* source =
web::WebUIIOSDataSource::Create(kChromeUINetExportHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath(net_log::kNetExportUIJS, IDR_NET_LOG_NET_EXPORT_JS);
source->SetDefaultResource(IDR_NET_LOG_NET_EXPORT_HTML);
return source;

@ -25,7 +25,7 @@ web::WebUIIOSDataSource* CreateOmahaUIHTMLSource() {
web::WebUIIOSDataSource* source =
web::WebUIIOSDataSource::Create(kChromeUIOmahaHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("omaha.js", IDR_IOS_OMAHA_JS);
source->SetDefaultResource(IDR_IOS_OMAHA_HTML);
return source;

@ -21,7 +21,7 @@ web::WebUIIOSDataSource* CreateSignInInternalsHTMLSource() {
web::WebUIIOSDataSource* source =
web::WebUIIOSDataSource::Create(kChromeUISignInInternalsHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("signin_internals.js", IDR_SIGNIN_INTERNALS_INDEX_JS);
source->SetDefaultResource(IDR_SIGNIN_INTERNALS_INDEX_HTML);

@ -20,7 +20,7 @@ web::WebUIIOSDataSource* CreateSyncInternalsHTMLSource() {
web::WebUIIOSDataSource* source =
web::WebUIIOSDataSource::Create(kChromeUISyncInternalsHost);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath(syncer::sync_ui_util::kSyncIndexJS,
IDR_SYNC_DRIVER_SYNC_INTERNALS_INDEX_JS);
source->AddResourcePath(syncer::sync_ui_util::kChromeSyncJS,

@ -28,7 +28,7 @@ web::WebUIIOSDataSource* CreateTranslateInternalsHTMLSource() {
web::WebUIIOSDataSource::Create(kChromeUITranslateInternalsHost);
source->SetDefaultResource(IDR_IOS_TRANSLATE_INTERNALS_HTML);
source->SetJsonPath("strings.js");
source->UseStringsJs();
source->AddResourcePath("translate_internals.js",
IDR_IOS_TRANSLATE_INTERNALS_JS);

@ -102,7 +102,7 @@ web::WebUIIOSDataSource* CreateVersionUIDataSource() {
html_source->AddString(version_ui::kCompiler, "LLVM clang");
#endif
html_source->SetJsonPath("strings.js");
html_source->UseStringsJs();
html_source->AddResourcePath(version_ui::kVersionJS, IDR_VERSION_UI_JS);
html_source->AddResourcePath(version_ui::kAboutVersionCSS,
IDR_VERSION_UI_CSS);

@ -44,8 +44,9 @@ class WebUIIOSDataSource : public base::SupportsUserData {
// Adds a boolean keyed to its name to our dictionary.
virtual void AddBoolean(const std::string& name, bool value) = 0;
// Sets the path which will return the JSON strings.
virtual void SetJsonPath(const std::string& path) = 0;
// Call this to enable a virtual "strings.js" (or "strings.m.js" for modules)
// URL that provides translations and dynamic data when requested.
virtual void UseStringsJs() = 0;
// Adds a mapping between a path name and a resource to return.
virtual void AddResourcePath(const std::string& path, int resource_id) = 0;

@ -30,7 +30,7 @@ class WebUIIOSDataSourceImpl : public URLDataSourceIOSImpl,
void AddLocalizedStrings(
const base::DictionaryValue& localized_strings) override;
void AddBoolean(const std::string& name, bool value) override;
void SetJsonPath(const std::string& path) override;
void UseStringsJs() override;
void AddResourcePath(const std::string& path, int resource_id) override;
void SetDefaultResource(int resource_id) override;
void DisableDenyXFrameOptions() override;
@ -41,7 +41,8 @@ class WebUIIOSDataSourceImpl : public URLDataSourceIOSImpl,
// Completes a request by sending our dictionary of localized strings.
void SendLocalizedStringsAsJSON(
const URLDataSourceIOS::GotDataCallback& callback);
const URLDataSourceIOS::GotDataCallback& callback,
bool from_js_module);
private:
class InternalDataSource;
@ -68,7 +69,7 @@ class WebUIIOSDataSourceImpl : public URLDataSourceIOSImpl,
// specific resources like "favicon/34" getting sent to this source.
std::string source_name_;
int default_resource_;
std::string json_path_;
bool use_strings_js_ = false;
std::map<std::string, int> path_to_idr_map_;
// The replacements are initiallized in the main thread and then used in the
// IO thread. The map is safe to read from multiple threads as long as no

@ -101,8 +101,8 @@ void WebUIIOSDataSourceImpl::AddBoolean(const std::string& name, bool value) {
localized_strings_.SetBoolean(name, value);
}
void WebUIIOSDataSourceImpl::SetJsonPath(const std::string& path) {
json_path_ = path;
void WebUIIOSDataSourceImpl::UseStringsJs() {
use_strings_js_ = true;
}
void WebUIIOSDataSourceImpl::AddResourcePath(const std::string& path,
@ -162,9 +162,12 @@ void WebUIIOSDataSourceImpl::StartDataRequest(
const URLDataSourceIOS::GotDataCallback& callback) {
EnsureLoadTimeDataDefaultsAdded();
if (!json_path_.empty() && path == json_path_) {
SendLocalizedStringsAsJSON(callback);
return;
if (use_strings_js_) {
bool from_js_module = path == "strings.m.js";
if (from_js_module || path == "strings.js") {
SendLocalizedStringsAsJSON(callback, from_js_module);
return;
}
}
int resource_id = PathToIdrOrDefault(path);
@ -175,9 +178,10 @@ void WebUIIOSDataSourceImpl::StartDataRequest(
}
void WebUIIOSDataSourceImpl::SendLocalizedStringsAsJSON(
const URLDataSourceIOS::GotDataCallback& callback) {
const URLDataSourceIOS::GotDataCallback& callback,
bool from_js_module) {
std::string template_data;
webui::AppendJsonJS(&localized_strings_, &template_data);
webui::AppendJsonJS(&localized_strings_, &template_data, from_js_module);
callback.Run(base::RefCountedString::TakeString(&template_data));
}

@ -24,7 +24,7 @@ namespace {
// assigned to it.
void AppendJsonHtml(const base::DictionaryValue* json, std::string* output) {
std::string javascript_string;
AppendJsonJS(json, &javascript_string);
AppendJsonJS(json, &javascript_string, /*from_js_module=*/false);
// </ confuses the HTML parser because it could be a </script> tag. So we
// replace </ with <\/. The extra \ will be ignored by the JS engine.
@ -112,10 +112,19 @@ std::string GetTemplatesHtml(const base::StringPiece& html_template,
return output;
}
void AppendJsonJS(const base::DictionaryValue* json, std::string* output) {
void AppendJsonJS(const base::DictionaryValue* json,
std::string* output,
bool from_js_module) {
// Convert the template data to a json string.
DCHECK(json) << "must include json data structure";
if (from_js_module) {
// If the script is being imported as a module, import |loadTimeData| in
// order to allow assigning the localized strings to loadTimeData.data.
output->append("import {loadTimeData} from ");
output->append("'chrome://resources/js/load_time_data.m.js';\n");
}
std::string jstext;
JSONStringValueSerializer serializer(&jstext);
serializer.Serialize(*json);

@ -41,7 +41,8 @@ UI_BASE_EXPORT std::string GetTemplatesHtml(
// Assigns the given json data into |loadTimeData|, without a <script> tag.
UI_BASE_EXPORT void AppendJsonJS(const base::DictionaryValue* json,
std::string* output);
std::string* output,
bool from_js_module);
} // namespace webui