Commit b8043c79 authored by Wei Lee's avatar Wei Lee Committed by Commit Bot

[CCA WebUI] Populates data on load time

We can pouplate the following data on load time:
1. I18N strings
2. Chrome specific data
  * Such as board name, CrOS version, etc

Bug: 980846
Test: Check chrome://camera-app/strings.js
Change-Id: Ieb46d4007ca93ca4d9e7a23bcd8005da65617ef8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2245986
Commit-Queue: Wei Lee <wtlee@chromium.org>
Commit-Queue: Shik Chen <shik@chromium.org>
Auto-Submit: Wei Lee <wtlee@chromium.org>
Reviewed-by: default avatarShik Chen <shik@chromium.org>
Reviewed-by: default avatarAlexei Svitkine <asvitkine@chromium.org>
Reviewed-by: default avatarRobert Sesek <rsesek@chromium.org>
Reviewed-by: default avatarBrian White <bcwhite@chromium.org>
Cr-Commit-Position: refs/heads/master@{#796786}
parent 6ab8f6f2
...@@ -5,10 +5,13 @@ ...@@ -5,10 +5,13 @@
#include "chrome/browser/chromeos/web_applications/chrome_camera_app_ui_delegate.h" #include "chrome/browser/chromeos/web_applications/chrome_camera_app_ui_delegate.h"
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/system/sys_info.h"
#include "chrome/browser/chromeos/file_manager/path_util.h" #include "chrome/browser/chromeos/file_manager/path_util.h"
#include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/web_applications/web_app_tab_helper.h" #include "chrome/browser/web_applications/web_app_tab_helper.h"
#include "chrome/browser/web_launch/web_launch_files_helper.h" #include "chrome/browser/web_launch/web_launch_files_helper.h"
#include "content/public/browser/web_ui_data_source.h"
ChromeCameraAppUIDelegate::ChromeCameraAppUIDelegate(content::WebUI* web_ui) ChromeCameraAppUIDelegate::ChromeCameraAppUIDelegate(content::WebUI* web_ui)
: web_ui_(web_ui) {} : web_ui_(web_ui) {}
...@@ -29,3 +32,16 @@ void ChromeCameraAppUIDelegate::SetLaunchDirectory() { ...@@ -29,3 +32,16 @@ void ChromeCameraAppUIDelegate::SetLaunchDirectory() {
std::vector<base::FilePath>{empty_file_path}); std::vector<base::FilePath>{empty_file_path});
web_app::WebAppTabHelper::CreateForWebContents(web_contents); web_app::WebAppTabHelper::CreateForWebContents(web_contents);
} }
void ChromeCameraAppUIDelegate::PopulateLoadTimeData(
content::WebUIDataSource* source) {
// Add strings that can be pulled in.
source->AddString("board_name", base::SysInfo::GetLsbReleaseBoard());
}
bool ChromeCameraAppUIDelegate::IsMetricsAndCrashReportingEnabled() {
// It is exposed for recording Google Analytics metrics.
// TODO(crbug.com/1113567): Remove the method once the metrics is migrated to
// UMA.
return ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled();
}
...@@ -22,6 +22,8 @@ class ChromeCameraAppUIDelegate : public CameraAppUIDelegate { ...@@ -22,6 +22,8 @@ class ChromeCameraAppUIDelegate : public CameraAppUIDelegate {
// CameraAppUIDelegate // CameraAppUIDelegate
void SetLaunchDirectory() override; void SetLaunchDirectory() override;
void PopulateLoadTimeData(content::WebUIDataSource* source) override;
bool IsMetricsAndCrashReportingEnabled() override;
private: private:
content::WebUI* web_ui_; // Owns |this|. content::WebUI* web_ui_; // Owns |this|.
......
...@@ -28,6 +28,10 @@ class CrashesDOMHandler; ...@@ -28,6 +28,10 @@ class CrashesDOMHandler;
class FlashDOMHandler; class FlashDOMHandler;
} }
#if defined(OS_CHROMEOS)
class ChromeCameraAppUIDelegate;
#endif // defined(OS_CHROMEOS)
namespace domain_reliability { namespace domain_reliability {
class DomainReliabilityServiceFactory; class DomainReliabilityServiceFactory;
} }
...@@ -117,6 +121,10 @@ class ChromeMetricsServiceAccessor : public metrics::MetricsServiceAccessor { ...@@ -117,6 +121,10 @@ class ChromeMetricsServiceAccessor : public metrics::MetricsServiceAccessor {
friend class ChromeBrowserMainExtraPartsGpu; friend class ChromeBrowserMainExtraPartsGpu;
friend class Browser; friend class Browser;
#if defined(OS_CHROMEOS)
friend class ChromeCameraAppUIDelegate;
#endif // defined(OS_CHROMEOS)
// Testing related friends. // Testing related friends.
friend class first_run::FirstRunMasterPrefsVariationsSeedTest; friend class first_run::FirstRunMasterPrefsVariationsSeedTest;
friend class ForceFieldTrialsBrowserTest; friend class ForceFieldTrialsBrowserTest;
......
...@@ -67,6 +67,7 @@ template("chrome_repack_locales") { ...@@ -67,6 +67,7 @@ template("chrome_repack_locales") {
source_patterns += [ source_patterns += [
"${root_gen_dir}/ash/shortcut_viewer/strings/shortcut_viewer_strings_", "${root_gen_dir}/ash/shortcut_viewer/strings/shortcut_viewer_strings_",
"${root_gen_dir}/ash/strings/ash_strings_", "${root_gen_dir}/ash/strings/ash_strings_",
"${root_gen_dir}/chromeos/components/camera_app_ui/resources/src/strings/chromeos_camera_app_strings_",
"${root_gen_dir}/chromeos/strings/chromeos_strings_", "${root_gen_dir}/chromeos/strings/chromeos_strings_",
"${root_gen_dir}/remoting/resources/", "${root_gen_dir}/remoting/resources/",
"${root_gen_dir}/ui/chromeos/strings/ui_chromeos_strings_", "${root_gen_dir}/ui/chromeos/strings/ui_chromeos_strings_",
...@@ -74,6 +75,7 @@ template("chrome_repack_locales") { ...@@ -74,6 +75,7 @@ template("chrome_repack_locales") {
deps += [ deps += [
"//ash/shortcut_viewer/strings", "//ash/shortcut_viewer/strings",
"//ash/strings", "//ash/strings",
"//chromeos/components/camera_app_ui/resources/src/strings",
"//chromeos/strings", "//chromeos/strings",
"//remoting/resources", "//remoting/resources",
"//ui/chromeos/strings", "//ui/chromeos/strings",
......
...@@ -14,6 +14,7 @@ static_library("camera_app_ui") { ...@@ -14,6 +14,7 @@ static_library("camera_app_ui") {
"camera_app_ui.cc", "camera_app_ui.cc",
"camera_app_ui.h", "camera_app_ui.h",
"camera_app_ui_delegate.h", "camera_app_ui_delegate.h",
"resources.h",
"url_constants.cc", "url_constants.cc",
"url_constants.h", "url_constants.h",
] ]
...@@ -21,6 +22,7 @@ static_library("camera_app_ui") { ...@@ -21,6 +22,7 @@ static_library("camera_app_ui") {
deps = [ deps = [
":mojo_bindings", ":mojo_bindings",
":mojo_bindings_js", ":mojo_bindings_js",
"resources/src/strings",
"//ash/public/cpp", "//ash/public/cpp",
"//chromeos/components/web_applications", "//chromeos/components/web_applications",
"//chromeos/constants", "//chromeos/constants",
......
...@@ -61,4 +61,8 @@ interface CameraAppHelper { ...@@ -61,4 +61,8 @@ interface CameraAppHelper {
// state. Calling the Update() whenever the screen state changes. // state. Calling the Update() whenever the screen state changes.
SetScreenStateMonitor(pending_remote<ScreenStateMonitor> monitor) SetScreenStateMonitor(pending_remote<ScreenStateMonitor> monitor)
=> (ScreenState initial_state); => (ScreenState initial_state);
// Checks if the logging consent option is enabled. It is only usable for SWA
// version. For platform app version, we use Chrome MetricsPrivate API.
IsMetricsAndCrashReportingEnabled() => (bool is_enabled);
}; };
...@@ -30,9 +30,11 @@ mojom::ScreenState ToMojoScreenState(ash::ScreenState s) { ...@@ -30,9 +30,11 @@ mojom::ScreenState ToMojoScreenState(ash::ScreenState s) {
} // namespace } // namespace
CameraAppHelperImpl::CameraAppHelperImpl( CameraAppHelperImpl::CameraAppHelperImpl(
chromeos::CameraAppUI* camera_app_ui,
CameraResultCallback camera_result_callback, CameraResultCallback camera_result_callback,
aura::Window* window) aura::Window* window)
: camera_result_callback_(std::move(camera_result_callback)) { : camera_app_ui_(camera_app_ui),
camera_result_callback_(std::move(camera_result_callback)) {
DCHECK(window); DCHECK(window);
window->SetProperty(ash::kCanConsumeSystemKeysKey, true); window->SetProperty(ash::kCanConsumeSystemKeysKey, true);
ash::TabletMode::Get()->AddObserver(this); ash::TabletMode::Get()->AddObserver(this);
...@@ -86,6 +88,13 @@ void CameraAppHelperImpl::SetScreenStateMonitor( ...@@ -86,6 +88,13 @@ void CameraAppHelperImpl::SetScreenStateMonitor(
std::move(callback).Run(mojo_state); std::move(callback).Run(mojo_state);
} }
void CameraAppHelperImpl::IsMetricsAndCrashReportingEnabled(
IsMetricsAndCrashReportingEnabledCallback callback) {
DCHECK_NE(camera_app_ui_, nullptr);
std::move(callback).Run(
camera_app_ui_->delegate()->IsMetricsAndCrashReportingEnabled());
}
void CameraAppHelperImpl::OnTabletModeStarted() { void CameraAppHelperImpl::OnTabletModeStarted() {
if (tablet_monitor_.is_bound()) if (tablet_monitor_.is_bound())
tablet_monitor_->Update(true); tablet_monitor_->Update(true);
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "ash/public/cpp/tablet_mode_observer.h" #include "ash/public/cpp/tablet_mode_observer.h"
#include "base/macros.h" #include "base/macros.h"
#include "chromeos/components/camera_app_ui/camera_app_helper.mojom.h" #include "chromeos/components/camera_app_ui/camera_app_helper.mojom.h"
#include "chromeos/components/camera_app_ui/camera_app_ui.h"
#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/remote.h"
namespace aura { namespace aura {
...@@ -31,7 +32,8 @@ class CameraAppHelperImpl : public ash::TabletModeObserver, ...@@ -31,7 +32,8 @@ class CameraAppHelperImpl : public ash::TabletModeObserver,
using TabletModeMonitor = mojom::TabletModeMonitor; using TabletModeMonitor = mojom::TabletModeMonitor;
using ScreenStateMonitor = mojom::ScreenStateMonitor; using ScreenStateMonitor = mojom::ScreenStateMonitor;
CameraAppHelperImpl(CameraResultCallback camera_result_callback, CameraAppHelperImpl(chromeos::CameraAppUI* camera_app_ui,
CameraResultCallback camera_result_callback,
aura::Window* window); aura::Window* window);
~CameraAppHelperImpl() override; ~CameraAppHelperImpl() override;
void Bind(mojo::PendingReceiver<mojom::CameraAppHelper> receiver); void Bind(mojo::PendingReceiver<mojom::CameraAppHelper> receiver);
...@@ -48,6 +50,8 @@ class CameraAppHelperImpl : public ash::TabletModeObserver, ...@@ -48,6 +50,8 @@ class CameraAppHelperImpl : public ash::TabletModeObserver,
SetTabletMonitorCallback callback) override; SetTabletMonitorCallback callback) override;
void SetScreenStateMonitor(mojo::PendingRemote<ScreenStateMonitor> monitor, void SetScreenStateMonitor(mojo::PendingRemote<ScreenStateMonitor> monitor,
SetScreenStateMonitorCallback callback) override; SetScreenStateMonitorCallback callback) override;
void IsMetricsAndCrashReportingEnabled(
IsMetricsAndCrashReportingEnabledCallback callback) override;
private: private:
// ash::TabletModeObserver overrides; // ash::TabletModeObserver overrides;
...@@ -57,6 +61,12 @@ class CameraAppHelperImpl : public ash::TabletModeObserver, ...@@ -57,6 +61,12 @@ class CameraAppHelperImpl : public ash::TabletModeObserver,
// ash::ScreenBacklightObserver overrides; // ash::ScreenBacklightObserver overrides;
void OnScreenStateChanged(ash::ScreenState screen_state) override; void OnScreenStateChanged(ash::ScreenState screen_state) override;
// For platform app, we set |camera_app_ui_| to nullptr and should not use
// it. For SWA, since CameraAppUI owns CameraAppHelperImpl, it is safe to
// assume that the |camera_app_ui_| is always valid during the whole lifetime
// of CameraAppHelperImpl.
chromeos::CameraAppUI* camera_app_ui_;
CameraResultCallback camera_result_callback_; CameraResultCallback camera_result_callback_;
mojo::Remote<TabletModeMonitor> tablet_monitor_; mojo::Remote<TabletModeMonitor> tablet_monitor_;
......
...@@ -7,9 +7,8 @@ ...@@ -7,9 +7,8 @@
#include "ash/public/cpp/window_properties.h" #include "ash/public/cpp/window_properties.h"
#include "base/bind.h" #include "base/bind.h"
#include "chromeos/components/camera_app_ui/camera_app_helper_impl.h" #include "chromeos/components/camera_app_ui/camera_app_helper_impl.h"
#include "chromeos/components/camera_app_ui/resources.h"
#include "chromeos/components/camera_app_ui/url_constants.h" #include "chromeos/components/camera_app_ui/url_constants.h"
#include "chromeos/grit/chromeos_camera_app_resources.h"
#include "chromeos/grit/chromeos_camera_app_resources_map.h"
#include "components/arc/intent_helper/arc_intent_helper_bridge.h" #include "components/arc/intent_helper/arc_intent_helper_bridge.h"
#include "components/content_settings/core/common/content_settings_types.h" #include "components/content_settings/core/common/content_settings_types.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
...@@ -23,7 +22,6 @@ ...@@ -23,7 +22,6 @@
#include "media/capture/video/chromeos/mojom/camera_app.mojom.h" #include "media/capture/video/chromeos/mojom/camera_app.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "mojo/public/js/grit/mojo_bindings_resources.h"
#include "services/network/public/mojom/content_security_policy.mojom.h" #include "services/network/public/mojom/content_security_policy.mojom.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/webui/webui_allowlist.h" #include "ui/webui/webui_allowlist.h"
...@@ -32,37 +30,8 @@ namespace chromeos { ...@@ -32,37 +30,8 @@ namespace chromeos {
namespace { namespace {
const struct { content::WebUIDataSource* CreateCameraAppUIHTMLSource(
const char* path; CameraAppUIDelegate* delegate) {
int id;
} kGritResourceMap[] = {
{"src/js/browser_proxy/browser_proxy.js",
IDR_CAMERA_WEBUI_BROWSER_PROXY_JS},
{"src/js/mojo/camera_intent.mojom-lite.js",
IDR_CAMERA_CAMERA_INTENT_MOJOM_LITE_JS},
{"src/js/mojo/image_capture.mojom-lite.js",
IDR_CAMERA_IMAGE_CAPTURE_MOJOM_LITE_JS},
{"src/js/mojo/camera_common.mojom-lite.js",
IDR_CAMERA_CAMERA_COMMON_MOJOM_LITE_JS},
{"src/js/mojo/camera_metadata.mojom-lite.js",
IDR_CAMERA_CAMERA_METADATA_MOJOM_LITE_JS},
{"src/js/mojo/camera_metadata_tags.mojom-lite.js",
IDR_CAMERA_CAMERA_METADATA_TAGS_MOJOM_LITE_JS},
{"src/js/mojo/camera_app.mojom-lite.js",
IDR_CAMERA_CAMERA_APP_MOJOM_LITE_JS},
{"src/js/mojo/mojo_bindings_lite.js", IDR_MOJO_MOJO_BINDINGS_LITE_JS},
{"src/js/mojo/camera_app_helper.mojom-lite.js",
IDR_CAMERA_CAMERA_APP_HELPER_MOJOM_LITE_JS},
{"src/js/mojo/time.mojom-lite.js", IDR_CAMERA_TIME_MOJOM_LITE_JS},
{"src/js/mojo/idle_manager.mojom-lite.js",
IDR_CAMERA_IDLE_MANAGER_MOJOM_LITE_JS},
{"src/js/mojo/camera_app.mojom-lite.js",
IDR_CAMERA_CAMERA_APP_MOJOM_LITE_JS},
{"src/js/mojo/geometry.mojom-lite.js", IDR_CAMERA_GEOMETRY_MOJOM_LITE_JS},
{"src/js/mojo/range.mojom-lite.js", IDR_CAMERA_RANGE_MOJOM_LITE_JS},
};
content::WebUIDataSource* CreateCameraAppUIHTMLSource() {
content::WebUIDataSource* source = content::WebUIDataSource* source =
content::WebUIDataSource::Create(kChromeUICameraAppHost); content::WebUIDataSource::Create(kChromeUICameraAppHost);
...@@ -78,6 +47,12 @@ content::WebUIDataSource* CreateCameraAppUIHTMLSource() { ...@@ -78,6 +47,12 @@ content::WebUIDataSource* CreateCameraAppUIHTMLSource() {
source->AddResourcePath(res.path, res.id); source->AddResourcePath(res.path, res.id);
} }
delegate->PopulateLoadTimeData(source);
for (const auto& str : kStringResourceMap) {
source->AddLocalizedString(str.name, str.id);
}
source->UseStringsJs(); source->UseStringsJs();
source->OverrideContentSecurityPolicy( source->OverrideContentSecurityPolicy(
...@@ -141,6 +116,7 @@ CreateCameraAppDeviceProvider(const url::Origin& security_origin, ...@@ -141,6 +116,7 @@ CreateCameraAppDeviceProvider(const url::Origin& security_origin,
} }
std::unique_ptr<chromeos_camera::CameraAppHelperImpl> CreateCameraAppHelper( std::unique_ptr<chromeos_camera::CameraAppHelperImpl> CreateCameraAppHelper(
CameraAppUI* camera_app_ui,
content::BrowserContext* browser_context, content::BrowserContext* browser_context,
aura::Window* window) { aura::Window* window) {
DCHECK_NE(window, nullptr); DCHECK_NE(window, nullptr);
...@@ -148,7 +124,7 @@ std::unique_ptr<chromeos_camera::CameraAppHelperImpl> CreateCameraAppHelper( ...@@ -148,7 +124,7 @@ std::unique_ptr<chromeos_camera::CameraAppHelperImpl> CreateCameraAppHelper(
base::BindRepeating(&HandleCameraResult, browser_context); base::BindRepeating(&HandleCameraResult, browser_context);
return std::make_unique<chromeos_camera::CameraAppHelperImpl>( return std::make_unique<chromeos_camera::CameraAppHelperImpl>(
std::move(handle_result_callback), window); camera_app_ui, std::move(handle_result_callback), window);
} }
} // namespace } // namespace
...@@ -174,8 +150,9 @@ void CameraAppUI::ConnectToCameraAppHelper( ...@@ -174,8 +150,9 @@ void CameraAppUI::ConnectToCameraAppHelper(
content::RenderFrameHost* source, content::RenderFrameHost* source,
mojo::PendingReceiver<chromeos_camera::mojom::CameraAppHelper> receiver) { mojo::PendingReceiver<chromeos_camera::mojom::CameraAppHelper> receiver) {
auto* window = source->GetNativeView()->GetToplevelWindow(); auto* window = source->GetNativeView()->GetToplevelWindow();
auto helper = auto helper = CreateCameraAppHelper(
CreateCameraAppHelper(source->GetProcess()->GetBrowserContext(), window); /*camera_app_ui=*/nullptr, source->GetProcess()->GetBrowserContext(),
window);
mojo::MakeSelfOwnedReceiver(std::move(helper), std::move(receiver)); mojo::MakeSelfOwnedReceiver(std::move(helper), std::move(receiver));
} }
...@@ -207,7 +184,8 @@ CameraAppUI::CameraAppUI(content::WebUI* web_ui, ...@@ -207,7 +184,8 @@ CameraAppUI::CameraAppUI(content::WebUI* web_ui,
delegate_->SetLaunchDirectory(); delegate_->SetLaunchDirectory();
// Set up the data source. // Set up the data source.
content::WebUIDataSource* source = CreateCameraAppUIHTMLSource(); content::WebUIDataSource* source =
CreateCameraAppUIHTMLSource(delegate_.get());
content::WebUIDataSource::Add(browser_context, source); content::WebUIDataSource::Add(browser_context, source);
} }
...@@ -224,7 +202,7 @@ void CameraAppUI::BindInterface( ...@@ -224,7 +202,7 @@ void CameraAppUI::BindInterface(
void CameraAppUI::BindInterface( void CameraAppUI::BindInterface(
mojo::PendingReceiver<chromeos_camera::mojom::CameraAppHelper> receiver) { mojo::PendingReceiver<chromeos_camera::mojom::CameraAppHelper> receiver) {
helper_ = CreateCameraAppHelper( helper_ = CreateCameraAppHelper(
web_ui()->GetWebContents()->GetBrowserContext(), window()); this, web_ui()->GetWebContents()->GetBrowserContext(), window());
helper_->Bind(std::move(receiver)); helper_->Bind(std::move(receiver));
} }
......
declare_args() {
# The directory where the platform app version of CCA lives.
out_camera_app_dir = "$root_out_dir/resources/chromeos/camera"
# The directory where to store generated resource files for strings. It is
# used by SWA version of CCA.
gen_camera_app_dir =
"$root_gen_dir/chromeos/components/camera_app_ui/resources/src"
}
...@@ -5,6 +5,10 @@ ...@@ -5,6 +5,10 @@
#ifndef CHROMEOS_COMPONENTS_CAMERA_APP_UI_CAMERA_APP_UI_DELEGATE_H_ #ifndef CHROMEOS_COMPONENTS_CAMERA_APP_UI_CAMERA_APP_UI_DELEGATE_H_
#define CHROMEOS_COMPONENTS_CAMERA_APP_UI_CAMERA_APP_UI_DELEGATE_H_ #define CHROMEOS_COMPONENTS_CAMERA_APP_UI_CAMERA_APP_UI_DELEGATE_H_
namespace content {
class WebUIDataSource;
}
// A delegate which exposes browser functionality from //chrome to the camera // A delegate which exposes browser functionality from //chrome to the camera
// app ui page handler. // app ui page handler.
class CameraAppUIDelegate { class CameraAppUIDelegate {
...@@ -14,6 +18,13 @@ class CameraAppUIDelegate { ...@@ -14,6 +18,13 @@ class CameraAppUIDelegate {
// Sets Downloads folder as launch directory by File Handling API so that we // Sets Downloads folder as launch directory by File Handling API so that we
// can get the handle on the app side. // can get the handle on the app side.
virtual void SetLaunchDirectory() = 0; virtual void SetLaunchDirectory() = 0;
// Takes a WebUIDataSource, and adds load time data into it.
virtual void PopulateLoadTimeData(content::WebUIDataSource* source) = 0;
// TODO(crbug.com/1113567): Remove this method once we migrate to use UMA to
// collect metrics. Checks if the logging consent option is enabled.
virtual bool IsMetricsAndCrashReportingEnabled() = 0;
}; };
#endif // CHROMEOS_COMPONENTS_CAMERA_APP_UI_CAMERA_APP_UI_DELEGATE_H_ #endif // CHROMEOS_COMPONENTS_CAMERA_APP_UI_CAMERA_APP_UI_DELEGATE_H_
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_COMPONENTS_CAMERA_APP_UI_RESOURCES_H_
#define CHROMEOS_COMPONENTS_CAMERA_APP_UI_RESOURCES_H_
#include "chromeos/components/camera_app_ui/resources/src/strings/grit/chromeos_camera_app_strings.h"
#include "chromeos/grit/chromeos_camera_app_resources.h"
#include "chromeos/grit/chromeos_camera_app_resources_map.h"
#include "mojo/public/js/grit/mojo_bindings_resources.h"
namespace chromeos {
// TODO(crbug.com/980846): Use camelCase for name instead after totally
// migrating to SWA.
const struct {
const char* name;
int id;
} kStringResourceMap[] = {
{"label_timer_10s", IDS_LABEL_TIMER_10S},
{"help_button", IDS_HELP_BUTTON},
{"dialog_cancel_button", IDS_DIALOG_CANCEL_BUTTON},
{"print_button", IDS_PRINT_BUTTON},
{"gallery_button", IDS_GALLERY_BUTTON},
{"error_msg_save_file_failed", IDS_ERROR_MSG_SAVE_FILE_FAILED},
{"export_button", IDS_EXPORT_BUTTON},
{"toggle_timer_button", IDS_TOGGLE_TIMER_BUTTON},
{"migrate_pictures_msg", IDS_MIGRATE_PICTURES_MSG},
{"aria_grid_3x3", IDS_ARIA_GRID_3X3},
{"record_video_start_button", IDS_RECORD_VIDEO_START_BUTTON},
{"record_video_stop_button", IDS_RECORD_VIDEO_STOP_BUTTON},
{"switch_camera_button", IDS_SWITCH_CAMERA_BUTTON},
{"timer_duration_button", IDS_TIMER_DURATION_BUTTON},
{"label_timer_3s", IDS_LABEL_TIMER_3S},
{"status_msg_recording_stopped", IDS_STATUS_MSG_RECORDING_STOPPED},
{"aria_grid_4x4", IDS_ARIA_GRID_4X4},
{"label_grid_4x4", IDS_LABEL_GRID_4X4},
{"camera_resolution_button", IDS_CAMERA_RESOLUTION_BUTTON},
{"photo_resolution_button", IDS_PHOTO_RESOLUTION_BUTTON},
{"video_resolution_button", IDS_VIDEO_RESOLUTION_BUTTON},
{"label_front_camera", IDS_LABEL_FRONT_CAMERA},
{"label_back_camera", IDS_LABEL_BACK_CAMERA},
{"label_external_camera", IDS_LABEL_EXTERNAL_CAMERA},
{"label_photo_resolution", IDS_LABEL_PHOTO_RESOLUTION},
{"label_detail_photo_resolution", IDS_LABEL_DETAIL_PHOTO_RESOLUTION},
{"label_video_resolution", IDS_LABEL_VIDEO_RESOLUTION},
{"delete_confirmation_msg", IDS_DELETE_CONFIRMATION_MSG},
{"switch_take_photo_button", IDS_SWITCH_TAKE_PHOTO_BUTTON},
{"label_switch_take_photo_button", IDS_LABEL_SWITCH_TAKE_PHOTO_BUTTON},
{"toggle_grid_button", IDS_TOGGLE_GRID_BUTTON},
{"take_photo_button", IDS_TAKE_PHOTO_BUTTON},
{"error_msg_no_camera", IDS_ERROR_MSG_NO_CAMERA},
{"error_msg_record_start_failed", IDS_ERROR_MSG_RECORD_START_FAILED},
{"toggle_mic_button", IDS_TOGGLE_MIC_BUTTON},
{"expert_mode_button", IDS_EXPERT_MODE_BUTTON},
{"expert_preview_metadata", IDS_EXPERT_PREVIEW_METADATA},
{"expert_save_metadata", IDS_EXPERT_SAVE_METADATA},
{"expert_print_performance_logs", IDS_EXPERT_PRINT_PERFORMANCE_LOGS},
{"error_msg_expert_mode_not_supported",
IDS_ERROR_MSG_EXPERT_MODE_NOT_SUPPORTED},
{"feedback_button", IDS_FEEDBACK_BUTTON},
{"error_msg_take_photo_failed", IDS_ERROR_MSG_TAKE_PHOTO_FAILED},
{"error_msg_take_portrait_photo_failed",
IDS_ERROR_MSG_TAKE_PORTRAIT_PHOTO_FAILED},
{"description", IDS_DESCRIPTION},
{"label_grid_3x3", IDS_LABEL_GRID_3X3},
{"take_photo_cancel_button", IDS_TAKE_PHOTO_CANCEL_BUTTON},
{"delete_button", IDS_DELETE_BUTTON},
{"error_msg_empty_recording", IDS_ERROR_MSG_EMPTY_RECORDING},
{"delete_multi_confirmation_msg", IDS_DELETE_MULTI_CONFIRMATION_MSG},
{"gallery_images", IDS_GALLERY_IMAGES},
{"error_msg_gallery_export_failed", IDS_ERROR_MSG_GALLERY_EXPORT_FAILED},
{"status_msg_camera_switched", IDS_STATUS_MSG_CAMERA_SWITCHED},
{"name", IDS_NAME},
{"error_msg_file_system_failed", IDS_ERROR_MSG_FILE_SYSTEM_FAILED},
{"settings_button", IDS_SETTINGS_BUTTON},
{"dialog_ok_button", IDS_DIALOG_OK_BUTTON},
{"label_grid_golden", IDS_LABEL_GRID_GOLDEN},
{"switch_record_video_button", IDS_SWITCH_RECORD_VIDEO_BUTTON},
{"label_switch_record_video_button", IDS_LABEL_SWITCH_RECORD_VIDEO_BUTTON},
{"toggle_mirror_button", IDS_TOGGLE_MIRROR_BUTTON},
{"grid_type_button", IDS_GRID_TYPE_BUTTON},
{"label_30fps", IDS_LABEL_30FPS},
{"label_60fps", IDS_LABEL_60FPS},
{"toggle_60fps_button", IDS_TOGGLE_60FPS_BUTTON},
{"back_button", IDS_BACK_BUTTON},
{"switch_take_square_photo_button", IDS_SWITCH_TAKE_SQUARE_PHOTO_BUTTON},
{"label_switch_take_square_photo_button",
IDS_LABEL_SWITCH_TAKE_SQUARE_PHOTO_BUTTON},
{"switch_take_portrait_photo_button",
IDS_SWITCH_TAKE_PORTRAIT_PHOTO_BUTTON},
{"label_switch_take_portrait_photo_button",
IDS_LABEL_SWITCH_TAKE_PORTRAIT_PHOTO_BUTTON},
{"confirm_review_button", IDS_CONFIRM_REVIEW_BUTTON},
{"cancel_review_button", IDS_CANCEL_REVIEW_BUTTON},
{"play_result_video_button", IDS_PLAY_RESULT_VIDEO_BUTTON},
{"record_video_paused_msg", IDS_RECORD_VIDEO_PAUSED_MSG},
{"take_video_snapshot_button", IDS_TAKE_VIDEO_SNAPSHOT_BUTTON},
{"record_video_pause_button", IDS_RECORD_VIDEO_PAUSE_BUTTON},
{"record_video_resume_button", IDS_RECORD_VIDEO_RESUME_BUTTON},
};
const struct {
const char* path;
int id;
} kGritResourceMap[] = {
{"src/js/browser_proxy/browser_proxy.js",
IDR_CAMERA_WEBUI_BROWSER_PROXY_JS},
{"src/js/mojo/camera_intent.mojom-lite.js",
IDR_CAMERA_CAMERA_INTENT_MOJOM_LITE_JS},
{"src/js/mojo/image_capture.mojom-lite.js",
IDR_CAMERA_IMAGE_CAPTURE_MOJOM_LITE_JS},
{"src/js/mojo/camera_common.mojom-lite.js",
IDR_CAMERA_CAMERA_COMMON_MOJOM_LITE_JS},
{"src/js/mojo/camera_metadata.mojom-lite.js",
IDR_CAMERA_CAMERA_METADATA_MOJOM_LITE_JS},
{"src/js/mojo/camera_metadata_tags.mojom-lite.js",
IDR_CAMERA_CAMERA_METADATA_TAGS_MOJOM_LITE_JS},
{"src/js/mojo/camera_app.mojom-lite.js",
IDR_CAMERA_CAMERA_APP_MOJOM_LITE_JS},
{"src/js/mojo/mojo_bindings_lite.js", IDR_MOJO_MOJO_BINDINGS_LITE_JS},
{"src/js/mojo/camera_app_helper.mojom-lite.js",
IDR_CAMERA_CAMERA_APP_HELPER_MOJOM_LITE_JS},
{"src/js/mojo/time.mojom-lite.js", IDR_CAMERA_TIME_MOJOM_LITE_JS},
{"src/js/mojo/idle_manager.mojom-lite.js",
IDR_CAMERA_IDLE_MANAGER_MOJOM_LITE_JS},
{"src/js/mojo/camera_app.mojom-lite.js",
IDR_CAMERA_CAMERA_APP_MOJOM_LITE_JS},
{"src/js/mojo/geometry.mojom-lite.js", IDR_CAMERA_GEOMETRY_MOJOM_LITE_JS},
{"src/js/mojo/range.mojom-lite.js", IDR_CAMERA_RANGE_MOJOM_LITE_JS},
};
} // namespace chromeos
#endif // CHROMEOS_COMPONENTS_CAMERA_APP_UI_RESOURCES_H_
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be # Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file. # found in the LICENSE file.
chrome_camera_app_dir = "$root_out_dir/resources/chromeos/camera" import("//chromeos/components/camera_app_ui/camera_app_ui.gni")
group("closure_compile") { group("closure_compile") {
deps = [ "src/js:closure_compile" ] deps = [ "src/js:closure_compile" ]
...@@ -12,7 +12,7 @@ group("chrome_camera_app") { ...@@ -12,7 +12,7 @@ group("chrome_camera_app") {
# According to crbug.com/855747, we should list all the files we want to copy # According to crbug.com/855747, we should list all the files we want to copy
# rather than list only the folders to avoid potential building issue and ease # rather than list only the folders to avoid potential building issue and ease
# the difficulty to diagnose. # the difficulty to diagnose.
deps = [ "src/strings:camera_strings" ] deps = [ "src/strings" ]
data_deps = [ data_deps = [
":chrome_camera_app_base", ":chrome_camera_app_base",
...@@ -35,13 +35,13 @@ group("chrome_camera_app") { ...@@ -35,13 +35,13 @@ group("chrome_camera_app") {
copy("chrome_camera_app_base") { copy("chrome_camera_app_base") {
sources = [ "src/manifest.json" ] sources = [ "src/manifest.json" ]
outputs = [ "$chrome_camera_app_dir/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/{{source_file_part}}" ]
} }
copy("chrome_camera_app_css") { copy("chrome_camera_app_css") {
sources = [ "src/css/main.css" ] sources = [ "src/css/main.css" ]
outputs = [ "$chrome_camera_app_dir/css/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/css/{{source_file_part}}" ]
} }
copy("chrome_camera_app_images") { copy("chrome_camera_app_images") {
...@@ -87,7 +87,7 @@ copy("chrome_camera_app_images") { ...@@ -87,7 +87,7 @@ copy("chrome_camera_app_images") {
"src/images/spinner.svg", "src/images/spinner.svg",
] ]
outputs = [ "$chrome_camera_app_dir/images/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/images/{{source_file_part}}" ]
} }
copy("chrome_camera_app_js") { copy("chrome_camera_app_js") {
...@@ -112,7 +112,7 @@ copy("chrome_camera_app_js") { ...@@ -112,7 +112,7 @@ copy("chrome_camera_app_js") {
"src/js/waitable_event.js", "src/js/waitable_event.js",
] ]
outputs = [ "$chrome_camera_app_dir/js/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/js/{{source_file_part}}" ]
} }
copy("chrome_camera_app_js_browser_proxy") { copy("chrome_camera_app_js_browser_proxy") {
...@@ -122,7 +122,7 @@ copy("chrome_camera_app_js_browser_proxy") { ...@@ -122,7 +122,7 @@ copy("chrome_camera_app_js_browser_proxy") {
"src/js/browser_proxy/browser_proxy_interface.js", "src/js/browser_proxy/browser_proxy_interface.js",
] ]
outputs = [ "$chrome_camera_app_dir/js/browser_proxy/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/js/browser_proxy/{{source_file_part}}" ]
} }
copy("chrome_camera_app_js_device") { copy("chrome_camera_app_js_device") {
...@@ -133,7 +133,7 @@ copy("chrome_camera_app_js_device") { ...@@ -133,7 +133,7 @@ copy("chrome_camera_app_js_device") {
"src/js/device/error.js", "src/js/device/error.js",
] ]
outputs = [ "$chrome_camera_app_dir/js/device/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/js/device/{{source_file_part}}" ]
} }
copy("chrome_camera_app_js_lib") { copy("chrome_camera_app_js_lib") {
...@@ -144,7 +144,7 @@ copy("chrome_camera_app_js_lib") { ...@@ -144,7 +144,7 @@ copy("chrome_camera_app_js_lib") {
"src/js/lib/ffmpeg.wasm", "src/js/lib/ffmpeg.wasm",
] ]
outputs = [ "$chrome_camera_app_dir/js/lib/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/js/lib/{{source_file_part}}" ]
} }
copy("chrome_camera_app_js_models") { copy("chrome_camera_app_js_models") {
...@@ -161,7 +161,7 @@ copy("chrome_camera_app_js_models") { ...@@ -161,7 +161,7 @@ copy("chrome_camera_app_js_models") {
"src/js/models/video_saver.js", "src/js/models/video_saver.js",
] ]
outputs = [ "$chrome_camera_app_dir/js/models/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/js/models/{{source_file_part}}" ]
} }
copy("chrome_camera_app_js_mojo") { copy("chrome_camera_app_js_mojo") {
...@@ -171,7 +171,7 @@ copy("chrome_camera_app_js_mojo") { ...@@ -171,7 +171,7 @@ copy("chrome_camera_app_js_mojo") {
"src/js/mojo/image_capture.js", "src/js/mojo/image_capture.js",
] ]
outputs = [ "$chrome_camera_app_dir/js/mojo/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/js/mojo/{{source_file_part}}" ]
} }
copy("chrome_camera_app_js_views") { copy("chrome_camera_app_js_views") {
...@@ -184,7 +184,7 @@ copy("chrome_camera_app_js_views") { ...@@ -184,7 +184,7 @@ copy("chrome_camera_app_js_views") {
"src/js/views/warning.js", "src/js/views/warning.js",
] ]
outputs = [ "$chrome_camera_app_dir/js/views/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/js/views/{{source_file_part}}" ]
} }
copy("chrome_camera_app_js_views_camera") { copy("chrome_camera_app_js_views_camera") {
...@@ -198,7 +198,7 @@ copy("chrome_camera_app_js_views_camera") { ...@@ -198,7 +198,7 @@ copy("chrome_camera_app_js_views_camera") {
"src/js/views/camera/timertick.js", "src/js/views/camera/timertick.js",
] ]
outputs = [ "$chrome_camera_app_dir/js/views/camera/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/js/views/camera/{{source_file_part}}" ]
} }
copy("chrome_camera_app_sounds") { copy("chrome_camera_app_sounds") {
...@@ -212,7 +212,7 @@ copy("chrome_camera_app_sounds") { ...@@ -212,7 +212,7 @@ copy("chrome_camera_app_sounds") {
"src/sounds/tick_start.ogg", "src/sounds/tick_start.ogg",
] ]
outputs = [ "$chrome_camera_app_dir/sounds/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/sounds/{{source_file_part}}" ]
} }
copy("chrome_camera_app_views") { copy("chrome_camera_app_views") {
...@@ -221,7 +221,7 @@ copy("chrome_camera_app_views") { ...@@ -221,7 +221,7 @@ copy("chrome_camera_app_views") {
"src/views/main.html", "src/views/main.html",
] ]
outputs = [ "$chrome_camera_app_dir/views/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/views/{{source_file_part}}" ]
} }
copy("chrome_camera_app_mojo_generated") { copy("chrome_camera_app_mojo_generated") {
...@@ -247,5 +247,5 @@ copy("chrome_camera_app_mojo_generated") { ...@@ -247,5 +247,5 @@ copy("chrome_camera_app_mojo_generated") {
"//third_party/blink/public/mojom:mojom_platform_js", "//third_party/blink/public/mojom:mojom_platform_js",
] ]
outputs = [ "$chrome_camera_app_dir/js/mojo/{{source_file_part}}" ] outputs = [ "$out_camera_app_dir/js/mojo/{{source_file_part}}" ]
} }
...@@ -74,9 +74,10 @@ js_library("compile_resources") { ...@@ -74,9 +74,10 @@ js_library("compile_resources") {
"//third_party/blink/public/mojom:mojom_platform_js_library_for_compile", "//third_party/blink/public/mojom:mojom_platform_js_library_for_compile",
] ]
externs_list = [ externs_list = [
"externs/chrome.js",
"externs/swa.js",
"externs/universal_analytics_api.js", "externs/universal_analytics_api.js",
"externs/w3c_api.js", "externs/w3c_api.js",
"externs/chrome.js",
"$externs_path/chrome_extensions.js", "$externs_path/chrome_extensions.js",
"$externs_path/file_manager_private.js", "$externs_path/file_manager_private.js",
"$externs_path/file_system_provider.js", "$externs_path/file_system_provider.js",
......
...@@ -98,12 +98,12 @@ class ChromeAppBrowserProxy { ...@@ -98,12 +98,12 @@ class ChromeAppBrowserProxy {
} }
/** @override */ /** @override */
getI18nMessage(name, substitutions = undefined) { getI18nMessage(name, ...substitutions) {
return chrome.i18n.getMessage(name, substitutions); return chrome.i18n.getMessage(name, substitutions);
} }
/** @override */ /** @override */
isCrashReportingEnabled() { isMetricsAndCrashReportingEnabled() {
return promisify(chrome.metricsPrivate.getIsCrashReportingEnabled)(); return promisify(chrome.metricsPrivate.getIsCrashReportingEnabled)();
} }
......
...@@ -56,17 +56,17 @@ export class BrowserProxy { ...@@ -56,17 +56,17 @@ export class BrowserProxy {
/** /**
* @param {string} name * @param {string} name
* @param {!Array<string>|string=} substitutions * @param {...(string|number)} substitutions
* @return {string} * @return {string}
* @abstract * @abstract
*/ */
getI18nMessage(name, substitutions = undefined) {} getI18nMessage(name, ...substitutions) {}
/** /**
* @return {!Promise<boolean>} * @return {!Promise<boolean>}
* @abstract * @abstract
*/ */
async isCrashReportingEnabled() {} async isMetricsAndCrashReportingEnabled() {}
/** /**
* @param {!AbstractFileEntry} file * @param {!AbstractFileEntry} file
......
...@@ -2,12 +2,22 @@ ...@@ -2,12 +2,22 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
/**
* @fileoverview
* strings.m.js is generated when we enable it via UseStringsJs() in webUI
* controller. When loading it, it will populate data such as localized strings
* into |window.loadTimeData|.
* @suppress {moduleLoad}
*/
import '/strings.m.js';
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import {BackgroundOps} from '../background_ops.js'; import {BackgroundOps} from '../background_ops.js';
import {assert} from '../chrome_util.js'; import {assert} from '../chrome_util.js';
import {NotImplementedError} from '../error.js'; import {NotImplementedError} from '../error.js';
import {Intent} from '../intent.js'; import {Intent} from '../intent.js';
import {NativeDirectoryEntry} from '../models/native_file_system_entry.js'; import {NativeDirectoryEntry} from '../models/native_file_system_entry.js';
import {ChromeHelper} from '../mojo/chrome_helper.js';
import {PerfLogger} from '../perf.js'; import {PerfLogger} from '../perf.js';
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
...@@ -90,17 +100,17 @@ class WebUIBrowserProxy { ...@@ -90,17 +100,17 @@ class WebUIBrowserProxy {
/** @override */ /** @override */
async getBoard() { async getBoard() {
throw new NotImplementedError(); return window.loadTimeData.getString('board_name');
} }
/** @override */ /** @override */
getI18nMessage(name, substitutions = undefined) { getI18nMessage(name, ...substitutions) {
throw new NotImplementedError(); return window.loadTimeData.getStringF(name, ...substitutions);
} }
/** @override */ /** @override */
async isCrashReportingEnabled() { async isMetricsAndCrashReportingEnabled() {
throw new NotImplementedError(); return ChromeHelper.getInstance().isMetricsAndCrashReportingEnabled();
} }
/** @override */ /** @override */
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @typedef {{
* getString: function(string): string,
* getStringF: function(string, ...(string|number)): string,
* }}
*/
window.loadTimeData;
...@@ -30,6 +30,22 @@ let baseDimen = null; ...@@ -30,6 +30,22 @@ let baseDimen = null;
*/ */
let ready = null; let ready = null;
/**
* @type {boolean}
*/
let isMetricsEnabled = false;
/**
* Disable metrics sending if either the logging consent option is disabled or
* metrics is disabled for current session. (e.g. Running tests)
* @return {!Promise}
*/
async function disableMetricsIfNotAllowed() {
// This value reflects the logging constent option in OS settings.
const canSendMetrics = await browserProxy.isMetricsAndCrashReportingEnabled();
window[`ga-disable-${GA_ID}`] = !isMetricsEnabled || !canSendMetrics;
}
/** /**
* Send the event to GA backend. * Send the event to GA backend.
* @param {!ga.Fields} event The event to send. * @param {!ga.Fields} event The event to send.
...@@ -40,6 +56,7 @@ async function sendEvent(event, dimen = null) { ...@@ -40,6 +56,7 @@ async function sendEvent(event, dimen = null) {
assert(window.ga !== null); assert(window.ga !== null);
assert(ready !== null); assert(ready !== null);
await ready; await ready;
await disableMetricsIfNotAllowed();
const assignDimension = (e, d) => { const assignDimension = (e, d) => {
d.forEach((value, key) => e[`dimension${key}`] = value); d.forEach((value, key) => e[`dimension${key}`] = value);
...@@ -60,12 +77,7 @@ async function sendEvent(event, dimen = null) { ...@@ -60,12 +77,7 @@ async function sendEvent(event, dimen = null) {
*/ */
export function setMetricsEnabled(enabled) { export function setMetricsEnabled(enabled) {
assert(ready !== null); assert(ready !== null);
isMetricsEnabled = enabled;
ready.then(async () => {
// This value reflects the logging constent option in OS settings.
const canSendMetrics = await browserProxy.isCrashReportingEnabled();
window[`ga-disable-${GA_ID}`] = !enabled || !canSendMetrics;
});
} }
/** /**
......
...@@ -178,6 +178,15 @@ export class ChromeHelper { ...@@ -178,6 +178,15 @@ export class ChromeHelper {
callback(state.screen === blink.mojom.ScreenIdleState.kLocked); callback(state.screen === blink.mojom.ScreenIdleState.kLocked);
} }
/**
* Checks if the logging consent option is enabled.
* @return {!Promise<boolean>}
*/
async isMetricsAndCrashReportingEnabled() {
const {isEnabled} = await this.remote_.isMetricsAndCrashReportingEnabled();
return isEnabled;
}
/** /**
* Creates a new instance of ChromeHelper if it is not set. Returns the * Creates a new instance of ChromeHelper if it is not set. Returns the
* exist instance. * exist instance.
......
...@@ -181,7 +181,7 @@ export function onKeyPressed(event) { ...@@ -181,7 +181,7 @@ export function onKeyPressed(event) {
chrome.app.window.current().minimize(); chrome.app.window.current().minimize();
break; break;
case 'Ctrl-V': case 'Ctrl-V':
toast.show(browserProxy.getAppVersion()); toast.showDebugMessage(browserProxy.getAppVersion());
break; break;
case 'Ctrl-Shift-I': case 'Ctrl-Shift-I':
browserProxy.openInspector('normal'); browserProxy.openInspector('normal');
......
...@@ -18,24 +18,36 @@ function update(message, spoken) { ...@@ -18,24 +18,36 @@ function update(message, spoken) {
assertInstanceof(document.querySelector('#toast'), HTMLElement); assertInstanceof(document.querySelector('#toast'), HTMLElement);
util.animateCancel(element); // Cancel the active toast if any. util.animateCancel(element); // Cancel the active toast if any.
element.textContent = ''; // Force to reiterate repeated messages. element.textContent = ''; // Force to reiterate repeated messages.
element.textContent = browserProxy.getI18nMessage(message) || message; element.textContent = message;
element.classList.toggle('spoken', spoken); element.classList.toggle('spoken', spoken);
util.animateOnce(element, () => element.textContent = ''); util.animateOnce(element, () => element.textContent = '');
} }
/** /**
* Shows a toast message. * Shows a toast with given message which doesn't need i18n.
* @param {string} message Message to be shown. * @param {string} message Message to be shown.
*/ */
export function show(message) { export function showDebugMessage(message) {
update(message, false); update(message, false);
} }
/**
* Shows a toast message.
* @param {string} label The label of the message to show.
* @param {...string} substitutions The substitutions needed for the given
* label.
*/
export function show(label, ...substitutions) {
update(browserProxy.getI18nMessage(label, ...substitutions), false);
}
/** /**
* Speaks a toast message. * Speaks a toast message.
* @param {string} message Message to be spoken. * @param {string} label The label of the message to show.
* @param {...string} substitutions The substitutions needed for the given
* label.
*/ */
export function speak(message) { export function speak(label, ...substitutions) {
update(message, true); update(browserProxy.getI18nMessage(label, ...substitutions), true);
} }
...@@ -422,7 +422,7 @@ export class Camera extends View { ...@@ -422,7 +422,7 @@ export class Camera extends View {
*/ */
handlingKey(key) { handlingKey(key) {
if (key === 'Ctrl-R') { if (key === 'Ctrl-R') {
toast.show(this.preview_.toString()); toast.showDebugMessage(this.preview_.toString());
return true; return true;
} }
if ((key === 'AudioVolumeUp' || key === 'AudioVolumeDown') && if ((key === 'AudioVolumeUp' || key === 'AudioVolumeDown') &&
...@@ -561,8 +561,7 @@ export class Camera extends View { ...@@ -561,8 +561,7 @@ export class Camera extends View {
this.activeDeviceId_ = currentId; this.activeDeviceId_ = currentId;
const info = await this.infoUpdater_.getDeviceInfo(currentId); const info = await this.infoUpdater_.getDeviceInfo(currentId);
if (info !== null) { if (info !== null) {
toast.speak(browserProxy.getI18nMessage( toast.speak('status_msg_camera_switched', info.label);
'status_msg_camera_switched', info.label));
} }
return; return;
} }
......
...@@ -378,12 +378,11 @@ export class ResolutionSettings extends BaseSettings { ...@@ -378,12 +378,11 @@ export class ResolutionSettings extends BaseSettings {
(findR) => !findR.equals(r) && r.aspectRatioEquals(findR) && (findR) => !findR.equals(r) && r.aspectRatioEquals(findR) &&
toMegapixel(r) === toMegapixel(findR))) { toMegapixel(r) === toMegapixel(findR))) {
return browserProxy.getI18nMessage( return browserProxy.getI18nMessage(
'label_detail_photo_resolution', 'label_detail_photo_resolution', r.width / d, r.height / d, r.width,
[r.width / d, r.height / d, r.width, r.height, toMegapixel(r)]); r.height, toMegapixel(r));
} else { } else {
return browserProxy.getI18nMessage( return browserProxy.getI18nMessage(
'label_photo_resolution', 'label_photo_resolution', r.width / d, r.height / d, toMegapixel(r));
[r.width / d, r.height / d, toMegapixel(r)]);
} }
} }
...@@ -395,7 +394,7 @@ export class ResolutionSettings extends BaseSettings { ...@@ -395,7 +394,7 @@ export class ResolutionSettings extends BaseSettings {
*/ */
videoOptTextTempl_(r) { videoOptTextTempl_(r) {
return browserProxy.getI18nMessage( return browserProxy.getI18nMessage(
'label_video_resolution', [r.height, r.width].map(String)); 'label_video_resolution', r.height, r.width);
} }
/** /**
......
...@@ -3,69 +3,132 @@ ...@@ -3,69 +3,132 @@
# found in the LICENSE file. # found in the LICENSE file.
import("//chrome/common/features.gni") import("//chrome/common/features.gni")
import("//chromeos/components/camera_app_ui/camera_app_ui.gni")
import("//tools/grit/grit_rule.gni") import("//tools/grit/grit_rule.gni")
chrome_camera_app_dir = "$root_out_dir/resources/chromeos/camera" grit("strings") {
grit("camera_strings") {
source = "camera_strings.grd" source = "camera_strings.grd"
defines = chrome_grit_defines defines = chrome_grit_defines
outputs = [ outputs = [
"_locales/am/messages.json", # Platform app usage
"_locales/ar/messages.json", "$out_camera_app_dir/_locales/am/messages.json",
"_locales/bg/messages.json", "$out_camera_app_dir/_locales/ar/messages.json",
"_locales/bn/messages.json", "$out_camera_app_dir/_locales/bg/messages.json",
"_locales/ca/messages.json", "$out_camera_app_dir/_locales/bn/messages.json",
"_locales/cs/messages.json", "$out_camera_app_dir/_locales/ca/messages.json",
"_locales/da/messages.json", "$out_camera_app_dir/_locales/cs/messages.json",
"_locales/de/messages.json", "$out_camera_app_dir/_locales/da/messages.json",
"_locales/el/messages.json", "$out_camera_app_dir/_locales/de/messages.json",
"_locales/en_GB/messages.json", "$out_camera_app_dir/_locales/el/messages.json",
"_locales/en/messages.json", "$out_camera_app_dir/_locales/en_GB/messages.json",
"_locales/es/messages.json", "$out_camera_app_dir/_locales/en/messages.json",
"_locales/es_419/messages.json", "$out_camera_app_dir/_locales/es/messages.json",
"_locales/et/messages.json", "$out_camera_app_dir/_locales/es_419/messages.json",
"_locales/fa/messages.json", "$out_camera_app_dir/_locales/et/messages.json",
"_locales/fi/messages.json", "$out_camera_app_dir/_locales/fa/messages.json",
"_locales/fil/messages.json", "$out_camera_app_dir/_locales/fi/messages.json",
"_locales/fr/messages.json", "$out_camera_app_dir/_locales/fil/messages.json",
"_locales/gu/messages.json", "$out_camera_app_dir/_locales/fr/messages.json",
"_locales/he/messages.json", "$out_camera_app_dir/_locales/gu/messages.json",
"_locales/hi/messages.json", "$out_camera_app_dir/_locales/he/messages.json",
"_locales/hr/messages.json", "$out_camera_app_dir/_locales/hi/messages.json",
"_locales/hu/messages.json", "$out_camera_app_dir/_locales/hr/messages.json",
"_locales/id/messages.json", "$out_camera_app_dir/_locales/hu/messages.json",
"_locales/it/messages.json", "$out_camera_app_dir/_locales/id/messages.json",
"_locales/ja/messages.json", "$out_camera_app_dir/_locales/it/messages.json",
"_locales/kn/messages.json", "$out_camera_app_dir/_locales/ja/messages.json",
"_locales/ko/messages.json", "$out_camera_app_dir/_locales/kn/messages.json",
"_locales/lt/messages.json", "$out_camera_app_dir/_locales/ko/messages.json",
"_locales/lv/messages.json", "$out_camera_app_dir/_locales/lt/messages.json",
"_locales/ml/messages.json", "$out_camera_app_dir/_locales/lv/messages.json",
"_locales/mr/messages.json", "$out_camera_app_dir/_locales/ml/messages.json",
"_locales/ms/messages.json", "$out_camera_app_dir/_locales/mr/messages.json",
"_locales/nl/messages.json", "$out_camera_app_dir/_locales/ms/messages.json",
"_locales/nb/messages.json", "$out_camera_app_dir/_locales/nl/messages.json",
"_locales/pl/messages.json", "$out_camera_app_dir/_locales/nb/messages.json",
"_locales/pt_BR/messages.json", "$out_camera_app_dir/_locales/pl/messages.json",
"_locales/pt_PT/messages.json", "$out_camera_app_dir/_locales/pt_BR/messages.json",
"_locales/ro/messages.json", "$out_camera_app_dir/_locales/pt_PT/messages.json",
"_locales/ru/messages.json", "$out_camera_app_dir/_locales/ro/messages.json",
"_locales/sk/messages.json", "$out_camera_app_dir/_locales/ru/messages.json",
"_locales/sl/messages.json", "$out_camera_app_dir/_locales/sk/messages.json",
"_locales/sr/messages.json", "$out_camera_app_dir/_locales/sl/messages.json",
"_locales/sv/messages.json", "$out_camera_app_dir/_locales/sr/messages.json",
"_locales/sw/messages.json", "$out_camera_app_dir/_locales/sv/messages.json",
"_locales/ta/messages.json", "$out_camera_app_dir/_locales/sw/messages.json",
"_locales/te/messages.json", "$out_camera_app_dir/_locales/ta/messages.json",
"_locales/th/messages.json", "$out_camera_app_dir/_locales/te/messages.json",
"_locales/tr/messages.json", "$out_camera_app_dir/_locales/th/messages.json",
"_locales/uk/messages.json", "$out_camera_app_dir/_locales/tr/messages.json",
"_locales/vi/messages.json", "$out_camera_app_dir/_locales/uk/messages.json",
"_locales/zh_CN/messages.json", "$out_camera_app_dir/_locales/vi/messages.json",
"_locales/zh_TW/messages.json", "$out_camera_app_dir/_locales/zh_CN/messages.json",
"$out_camera_app_dir/_locales/zh_TW/messages.json",
# SWA usage
"$gen_camera_app_dir/strings/grit/chromeos_camera_app_strings.h",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_am.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_ar.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_bg.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_bn.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_ca.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_cs.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_da.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_de.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_el.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_en-GB.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_en-US.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_es.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_es-419.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_et.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_fa.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_fake-bidi.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_fi.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_fil.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_fr.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_gu.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_he.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_hi.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_hr.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_hu.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_id.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_it.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_ja.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_kn.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_ko.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_lt.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_lv.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_ml.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_mr.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_ms.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_nl.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_nb.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_pl.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_pt-BR.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_pt-PT.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_ro.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_ru.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_sk.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_sl.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_sr.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_sv.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_sw.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_ta.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_te.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_th.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_tr.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_uk.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_vi.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_zh-CN.pak",
"$gen_camera_app_dir/strings/chromeos_camera_app_strings_zh-TW.pak",
] ]
output_dir = chrome_camera_app_dir
resource_ids = "" output_dir = root_out_dir
grit_flags = [
"-E",
"out_camera_app_dir=" + rebase_path(out_camera_app_dir, root_build_dir),
"-E",
"gen_camera_app_dir=" + rebase_path(gen_camera_app_dir, root_build_dir),
]
} }
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