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

Side by Side Diff: services/ui/public/cpp/in_flight_change.h

Issue 2651593002: mus: Remove the old client lib. (Closed)
Patch Set: restore test Created 3 years, 11 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 unified diff | Download patch
« no previous file with comments | « services/ui/public/cpp/BUILD.gn ('k') | services/ui/public/cpp/in_flight_change.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2015 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 SERVICES_UI_PUBLIC_CPP_IN_FLIGHT_CHANGE_H_
6 #define SERVICES_UI_PUBLIC_CPP_IN_FLIGHT_CHANGE_H_
7
8 #include <stdint.h>
9
10 #include <memory>
11 #include <string>
12 #include <vector>
13
14 #include "base/macros.h"
15 #include "base/memory/ptr_util.h"
16 #include "services/ui/public/cpp/window_observer.h"
17 #include "ui/gfx/geometry/rect.h"
18
19 namespace ui {
20
21 namespace mojom {
22 enum class Cursor : int32_t;
23 }
24
25 class Window;
26 class WindowTreeClient;
27
28 enum class ChangeType {
29 ADD_CHILD,
30 ADD_TRANSIENT_WINDOW,
31 BOUNDS,
32 CAPTURE,
33 DELETE_WINDOW,
34 DRAG_LOOP,
35 FOCUS,
36 MOVE_LOOP,
37 NEW_TOP_LEVEL_WINDOW,
38 NEW_WINDOW,
39 OPACITY,
40 PREDEFINED_CURSOR,
41 PROPERTY,
42 REMOVE_CHILD,
43 REMOVE_TRANSIENT_WINDOW_FROM_PARENT,
44 REORDER,
45 SET_MODAL,
46 VISIBLE,
47 };
48
49 // InFlightChange is used to track function calls to the server and take the
50 // appropriate action when the call fails, or the same property changes while
51 // waiting for the response. When a function is called on the server an
52 // InFlightChange is created. The function call is complete when
53 // OnChangeCompleted() is received from the server. The following may occur
54 // while waiting for a response:
55 // . A new value is encountered from the server. For example, the bounds of
56 // a window is locally changed and while waiting for the ack
57 // OnWindowBoundsChanged() is received.
58 // When this happens SetRevertValueFrom() is invoked on the InFlightChange.
59 // The expectation is SetRevertValueFrom() takes the value to revert from the
60 // supplied change.
61 // . While waiting for the ack the property is again modified locally. When
62 // this happens a new InFlightChange is created. Once the ack for the first
63 // call is received, and the server rejected the change ChangeFailed() is
64 // invoked on the first change followed by SetRevertValueFrom() on the second
65 // InFlightChange. This allows the new change to update the value to revert
66 // should the second call fail.
67 // . If the server responds that the call failed and there is not another
68 // InFlightChange for the same window outstanding, then ChangeFailed() is
69 // invoked followed by Revert(). The expectation is Revert() sets the
70 // appropriate value back on the Window.
71 //
72 // In general there are two classes of changes:
73 // 1. We are the only side allowed to make the change.
74 // 2. The change can also be applied by another client. For example, the
75 // window manager may change the bounds as well as the local client.
76 //
77 // For (1) use CrashInFlightChange. As the name implies this change CHECKs that
78 // the change succeeded. Use the following pattern for this. This code goes
79 // where the change is sent to the server (in WindowTreeClient):
80 // const uint32_t change_id =
81 // ScheduleInFlightChange(base::WrapUnique(new CrashInFlightChange(
82 // window, ChangeType::REORDER)));
83 //
84 // For (2) use the same pattern as (1), but in the on change callback from the
85 // server (e.g. OnWindowBoundsChanged()) add the following:
86 // // value_from_server is the value supplied from the server. It corresponds
87 // // to the value of the property at the time the server processed the
88 // // change. If the local change fails, this is the value reverted to.
89 // InFlightBoundsChange new_change(window, value_from_server);
90 // if (ApplyServerChangeToExistingInFlightChange(new_change)) {
91 // // There was an in flight change for the same property. The in flight
92 // // change takes the value to revert from |new_change|.
93 // return;
94 // }
95 //
96 // // else case is no flight in change and the new value can be applied
97 // // immediately.
98 // WindowPrivate(window).LocalSetValue(new_value_from_server);
99 //
100 class InFlightChange {
101 public:
102 InFlightChange(Window* window, ChangeType type);
103 virtual ~InFlightChange();
104
105 // NOTE: for properties not associated with any window window is null.
106 Window* window() { return window_; }
107 const Window* window() const { return window_; }
108 ChangeType change_type() const { return change_type_; }
109
110 // Returns true if the two changes are considered the same. This is only
111 // invoked if the window id and ChangeType match.
112 virtual bool Matches(const InFlightChange& change) const;
113
114 // Called in two cases:
115 // . When the corresponding property on the server changes. In this case
116 // |change| corresponds to the value from the server.
117 // . When |change| unsuccesfully completes.
118 virtual void SetRevertValueFrom(const InFlightChange& change) = 0;
119
120 // The change failed. Normally you need not take any action here as Revert()
121 // is called as appropriate.
122 virtual void ChangeFailed();
123
124 // The change failed and there is no pending change of the same type
125 // outstanding, revert the value.
126 virtual void Revert() = 0;
127
128 private:
129 Window* window_;
130 const ChangeType change_type_;
131 };
132
133 class InFlightBoundsChange : public InFlightChange {
134 public:
135 InFlightBoundsChange(Window* window, const gfx::Rect& revert_bounds);
136
137 // InFlightChange:
138 void SetRevertValueFrom(const InFlightChange& change) override;
139 void Revert() override;
140
141 private:
142 gfx::Rect revert_bounds_;
143
144 DISALLOW_COPY_AND_ASSIGN(InFlightBoundsChange);
145 };
146
147 class InFlightDragChange : public InFlightChange {
148 public:
149 InFlightDragChange(Window* window, ChangeType type);
150
151 // InFlightChange:
152 void SetRevertValueFrom(const InFlightChange& change) override;
153 void Revert() override;
154
155 private:
156 DISALLOW_COPY_AND_ASSIGN(InFlightDragChange);
157 };
158
159 // Inflight change that crashes on failure. This is useful for changes that are
160 // expected to always complete.
161 class CrashInFlightChange : public InFlightChange {
162 public:
163 CrashInFlightChange(Window* window, ChangeType type);
164 ~CrashInFlightChange() override;
165
166 // InFlightChange:
167 void SetRevertValueFrom(const InFlightChange& change) override;
168 void ChangeFailed() override;
169 void Revert() override;
170
171 private:
172 DISALLOW_COPY_AND_ASSIGN(CrashInFlightChange);
173 };
174
175 // Use this class for properties that are specific to the client, and not a
176 // particular window. For example, only a single window can have focus, so focus
177 // is specific to the client.
178 //
179 // This does not implement InFlightChange::Revert, subclasses must implement
180 // that to update the WindowTreeClient.
181 class InFlightWindowTreeClientChange : public InFlightChange,
182 public WindowObserver {
183 public:
184 InFlightWindowTreeClientChange(WindowTreeClient* client,
185 Window* revert_value,
186 ChangeType type);
187 ~InFlightWindowTreeClientChange() override;
188
189 // InFlightChange:
190 void SetRevertValueFrom(const InFlightChange& change) override;
191
192 protected:
193 WindowTreeClient* client() { return client_; }
194 Window* revert_window() { return revert_window_; }
195
196 private:
197 void SetRevertWindow(Window* window);
198
199 // WindowObserver:
200 void OnWindowDestroying(Window* window) override;
201
202 WindowTreeClient* client_;
203 Window* revert_window_;
204
205 DISALLOW_COPY_AND_ASSIGN(InFlightWindowTreeClientChange);
206 };
207
208 class InFlightCaptureChange : public InFlightWindowTreeClientChange {
209 public:
210 InFlightCaptureChange(WindowTreeClient* client, Window* revert_value);
211 ~InFlightCaptureChange() override;
212
213 // InFlightChange:
214 void Revert() override;
215
216 private:
217 DISALLOW_COPY_AND_ASSIGN(InFlightCaptureChange);
218 };
219
220 class InFlightFocusChange : public InFlightWindowTreeClientChange {
221 public:
222 InFlightFocusChange(WindowTreeClient* client, Window* revert_value);
223 ~InFlightFocusChange() override;
224
225 // InFlightChange:
226 void Revert() override;
227
228 private:
229 DISALLOW_COPY_AND_ASSIGN(InFlightFocusChange);
230 };
231
232 class InFlightPropertyChange : public InFlightChange {
233 public:
234 InFlightPropertyChange(
235 Window* window,
236 const std::string& property_name,
237 const base::Optional<std::vector<uint8_t>>& revert_value);
238 ~InFlightPropertyChange() override;
239
240 // InFlightChange:
241 bool Matches(const InFlightChange& change) const override;
242 void SetRevertValueFrom(const InFlightChange& change) override;
243 void Revert() override;
244
245 private:
246 const std::string property_name_;
247 base::Optional<std::vector<uint8_t>> revert_value_;
248
249 DISALLOW_COPY_AND_ASSIGN(InFlightPropertyChange);
250 };
251
252 class InFlightPredefinedCursorChange : public InFlightChange {
253 public:
254 InFlightPredefinedCursorChange(Window* window, mojom::Cursor revert_value);
255 ~InFlightPredefinedCursorChange() override;
256
257 // InFlightChange:
258 void SetRevertValueFrom(const InFlightChange& change) override;
259 void Revert() override;
260
261 private:
262 mojom::Cursor revert_cursor_;
263
264 DISALLOW_COPY_AND_ASSIGN(InFlightPredefinedCursorChange);
265 };
266
267 class InFlightVisibleChange : public InFlightChange {
268 public:
269 InFlightVisibleChange(Window* window, const bool revert_value);
270 ~InFlightVisibleChange() override;
271
272 // InFlightChange:
273 void SetRevertValueFrom(const InFlightChange& change) override;
274 void Revert() override;
275
276 private:
277 bool revert_visible_;
278
279 DISALLOW_COPY_AND_ASSIGN(InFlightVisibleChange);
280 };
281
282 class InFlightOpacityChange : public InFlightChange {
283 public:
284 InFlightOpacityChange(Window* window, float revert_value);
285 ~InFlightOpacityChange() override;
286
287 // InFlightChange:
288 void SetRevertValueFrom(const InFlightChange& change) override;
289 void Revert() override;
290
291 private:
292 float revert_opacity_;
293
294 DISALLOW_COPY_AND_ASSIGN(InFlightOpacityChange);
295 };
296
297 class InFlightSetModalChange : public InFlightChange {
298 public:
299 explicit InFlightSetModalChange(Window* window);
300 ~InFlightSetModalChange() override;
301
302 // InFlightChange:
303 void SetRevertValueFrom(const InFlightChange& change) override;
304 void Revert() override;
305
306 private:
307 DISALLOW_COPY_AND_ASSIGN(InFlightSetModalChange);
308 };
309
310 } // namespace ui
311
312 #endif // SERVICES_UI_PUBLIC_CPP_IN_FLIGHT_CHANGE_H_
OLDNEW
« no previous file with comments | « services/ui/public/cpp/BUILD.gn ('k') | services/ui/public/cpp/in_flight_change.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698