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