1 // Copyright 2019 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_JS_CALLS_CONTAINER_H_ 6 #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_JS_CALLS_CONTAINER_H_ 7 8 #include <string> 9 10 #include "base/macros.h" 11 #include "base/values.h" 12 13 namespace content { 14 class WebUI; 15 } 16 17 namespace chromeos { 18 19 // A helper class to store deferred Javascript calls, shared by subclasses of 20 // BaseWebUIHandler. 21 class JSCallsContainer { 22 public: 23 // An event is a message/JS call to or from WebUI. 24 struct Event { 25 enum class Type { 26 // This event was sent from C++ to JS. 27 kOutgoing, 28 // This event was sent from JS to C++. 29 kIncoming, 30 }; 31 32 Event(Type type, 33 const std::string& function_name, 34 std::vector<base::Value>&& arguments); 35 ~Event(); 36 Event(Event&&); 37 Event(const Event&) = delete; 38 Event& operator=(const Event&) = delete; 39 40 Type type; 41 std::string function_name; 42 std::vector<base::Value> arguments; 43 }; 44 45 JSCallsContainer(); 46 ~JSCallsContainer(); 47 JSCallsContainer(const JSCallsContainer&) = delete; 48 JSCallsContainer& operator=(const JSCallsContainer&) = delete; 49 50 // Used to decide whether the JS call should be deferred. is_initialized()51 bool is_initialized() const { return is_initialized_; } 52 53 // Enable event recording. set_record_all_events_for_test()54 void set_record_all_events_for_test() { record_all_events_for_test_ = true; } 55 56 // If true then all JS calls should be recorded. record_all_events_for_test()57 bool record_all_events_for_test() const { 58 return record_all_events_for_test_; 59 } 60 61 // Recorded events. This is mutable and can be modified. events()62 std::vector<Event>* events() { return &events_; } 63 64 // Executes Javascript calls that were deferred while the instance was not 65 // initialized yet. 66 void ExecuteDeferredJSCalls(content::WebUI* web_ui); 67 68 private: 69 // Whether the instance is initialized. 70 // 71 // The instance becomes initialized after the corresponding message is 72 // received from Javascript side. 73 bool is_initialized_ = false; 74 75 // Decide if incoming and outgoing JS calls should be recorded. Recording 76 // should only be used for tests. 77 bool record_all_events_for_test_ = false; 78 79 std::vector<Event> events_; 80 }; 81 82 } // namespace chromeos 83 84 #endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_JS_CALLS_CONTAINER_H_ 85