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

Side by Side Diff: ios/clean/chrome/browser/ui/overlays/overlay_scheduler.mm

Issue 2921833002: [iOS Clean] Created OverlayService.
Patch Set: Cancel overlays on queue deallocation Created 3 years, 6 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
OLDNEW
(Empty)
1 // Copyright 2017 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 #import "ios/clean/chrome/browser/ui/overlays/overlay_scheduler.h"
6
7 #include <list>
8
9 #include "base/logging.h"
10 #import "ios/chrome/browser/web_state_list/web_state_list.h"
11 #import "ios/clean/chrome/browser/ui/commands/tab_grid_commands.h"
12 #import "ios/clean/chrome/browser/ui/overlays/overlay_queue.h"
13 #import "ios/web/public/web_state/web_state.h"
14
15 #if !defined(__has_feature) || !__has_feature(objc_arc)
16 #error "This file requires ARC support."
17 #endif
18
19 @interface OverlayScheduler () {
20 // Backing object for property of the same name.
21 WebStateList* _webStateList;
22 // The WebStates that have queued overlays.
23 std::list<web::WebState*> _webStates;
marq (ping after 24h) 2017/06/14 10:02:32 Several places below make assertions about what's
kkhorimoto 2017/06/15 08:26:28 Done.
24 }
25
26 // The WebStateList passed on initialization.
27 @property(nonatomic, readonly, assign) WebStateList& webStateList;
28
29 // The dispatcher passed on initialization.
30 @property(nonatomic, readonly, weak)
31 id<TabGridCommands, OverlayPresentationCommands>
32 dispatcher;
33
34 // Attempts to show the next queued overlay.
35 - (void)tryToStartNextOverlay;
36
37 @end
38
39 @implementation OverlayScheduler
40
41 @synthesize dispatcher = _dispatcher;
42
43 - (instancetype)initWithWebStateList:(WebStateList*)webStateList
44 dispatcher:
45 (id<TabGridCommands, OverlayPresentationCommands>)
46 dispatcher {
47 DCHECK(webStateList);
48 DCHECK(dispatcher);
49 if ((self = [super init])) {
50 _webStateList = webStateList;
51 _dispatcher = dispatcher;
52 }
53 return self;
54 }
55
56 #pragma mark - Accessors
57
58 - (WebStateList&)webStateList {
59 return *_webStateList;
60 }
61
62 #pragma mark - OverlaySchedulerCommands
63
64 - (void)scheduleOverlayForWebState:(web::WebState*)webState {
65 DCHECK(webState);
66 _webStates.push_back(webState);
67 [self tryToStartNextOverlay];
68 }
69
70 - (void)visibleOverlayWasReplacedForWebState:(web::WebState*)webState {
71 DCHECK(webState);
72 DCHECK_EQ(_webStates.front(), webState);
marq (ping after 24h) 2017/06/14 10:02:32 This makes me slightly nervous, because it makes t
kkhorimoto 2017/06/15 08:26:29 It's been converted to an observer pattern now. T
73 DCHECK(OverlayQueue::FromWebState(webState)->IsShowingOverlay());
74 _webStates.push_front(webState);
75 }
76
77 - (void)overlayWasStoppedForWebState:(web::WebState*)webState {
78 DCHECK(!_webStates.empty());
79 DCHECK_EQ(_webStates.front(), webState);
80 _webStates.pop_front();
81 [self tryToStartNextOverlay];
82 }
83
84 - (void)cancelOverlaysForWebState:(web::WebState*)webState {
85 DCHECK(webState);
86 // Remove all scheduled instances of |webState| from the queue.
87 auto i = _webStates.begin();
88 while (i != _webStates.end()) {
89 if (*i == webState)
90 _webStates.erase(i);
91 }
92 // Remove all overlays from |webState|'s queue.
93 OverlayQueue::FromWebState(webState)->CancelOverlays();
94 [self tryToStartNextOverlay];
95 }
96
97 #pragma mark -
98
99 - (void)tryToStartNextOverlay {
100 // Early return if there are no overlays to show.
101 if (_webStates.empty())
102 return;
103 // Also early return if the front queue is already presenting an overlay.
104 web::WebState* webState = _webStates.front();
105 OverlayQueue* queue = OverlayQueue::FromWebState(webState);
106 if (queue->IsShowingOverlay())
107 return;
108 // Show the next WebState's content view and start its overlay.
109 int newActiveIndex = self.webStateList.GetIndexOfWebState(webState);
110 DCHECK_NE(newActiveIndex, WebStateList::kInvalidIndex);
111 self.webStateList.ActivateWebStateAt(newActiveIndex);
112 [self.dispatcher showTabGridTabForActiveWebState];
113 [self.dispatcher startNextOverlayForWebState:webState];
114 }
115
116 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698