Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6948)

Unified Diff: chrome/browser/ui/webui/chromeos/login/oobe_ui.h

Issue 2697063004: Fix of "login is not defined" error in OOBE (Closed)
Patch Set: Move CallJSOrDefer to OobeUI Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/webui/chromeos/login/oobe_ui.h
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
index 80e080728fd97959a31b3233af3867d83fb7c671..1ee84627722512816778d71306c340b966ea1c7d 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
@@ -16,6 +16,7 @@
#include "base/observer_list.h"
#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/browser/chromeos/settings/shutdown_policy_handler.h"
+#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h"
#include "content/public/browser/web_ui_controller.h"
@@ -32,7 +33,6 @@ class AppLaunchSplashScreenActor;
class ArcKioskSplashScreenActor;
class ArcTermsOfServiceScreenActor;
class AutoEnrollmentCheckScreenActor;
-class BaseScreenHandler;
class ControllerPairingScreenActor;
class CoreOobeActor;
class DeviceDisabledScreenActor;
@@ -166,7 +166,44 @@ class OobeUI : public content::WebUIController,
// changed).
void UpdateLocalizedStringsIfNeeded();
+ // Executes javascript calls that were deferred while the instance was not
+ // initialized yet.
+ void ExecuteDeferredJSCalls();
+
+ // Calls javascript method if the instance is already initialized, or defers
+ // the call until it gets initialized.
+ template <typename... Args>
+ void CallJSOrDefer(const std::string& function_name,
+ BaseScreenHandler* screen_handler,
+ const Args&... args) {
+ if (is_initialized_) {
+ screen_handler->CallJS(function_name, args...);
+ } else {
+ // Note that std::conditional is used here in order to obtain a sequence
+ // of base::Value types with the length equal to sizeof...(Args); the C++
+ // template parameter pack expansion rules require that the name of the
+ // parameter pack appears in the pattern, even though the elements of the
+ // Args pack are not actually in this code.
+ deferred_js_calls_.push_back(base::Bind(
+ &OobeUI::ExecuteDeferredJSCall<
+ typename std::conditional<true, base::Value, Args>::type...>,
+ base::Unretained(this), function_name, screen_handler,
+ base::Passed(::login::MakeValue(args).CreateDeepCopy())...));
+ }
+ }
+
private:
+ // Calls javascript method.
+ //
+ // Note that the Args template parameter pack should consist of types
+ // convertible to base::Value.
+ template <typename... Args>
+ void ExecuteDeferredJSCall(const std::string& function_name,
+ BaseScreenHandler* screen_handler,
+ std::unique_ptr<Args>... args) {
+ screen_handler->CallJS(function_name, *args...);
+ }
+
void AddScreenHandler(std::unique_ptr<BaseScreenHandler> handler);
// CoreOobeHandler::Delegate implementation:
@@ -258,6 +295,16 @@ class OobeUI : public content::WebUIController,
std::unique_ptr<ash::ScreenDimmer> screen_dimmer_;
+ // Whether the instance is initialized.
+ //
+ // The instance becomes initialized after the corresponding message is
+ // received from javascript side.
+ bool is_initialized_ = false;
+
+ // Javascript calls that have been deferred while the instance was not
+ // initialized yet.
+ std::vector<base::Closure> deferred_js_calls_;
+
DISALLOW_COPY_AND_ASSIGN(OobeUI);
};

Powered by Google App Engine
This is Rietveld 408576698