OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/web_contents/web_contents_view_aura.h" | 5 #include "content/browser/web_contents/web_contents_view_aura.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "base/test/test_timeouts.h" | 10 #include "base/test/test_timeouts.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 FROM_HERE, | 50 FROM_HERE, |
51 run_loop.QuitClosure(), | 51 run_loop.QuitClosure(), |
52 base::TimeDelta::FromMillisecondsD(10)); | 52 base::TimeDelta::FromMillisecondsD(10)); |
53 run_loop.Run(); | 53 run_loop.Run(); |
54 } | 54 } |
55 | 55 |
56 // WebContentsDelegate which tracks vertical overscroll updates. | 56 // WebContentsDelegate which tracks vertical overscroll updates. |
57 class VerticalOverscrollTracker : public content::WebContentsDelegate { | 57 class VerticalOverscrollTracker : public content::WebContentsDelegate { |
58 public: | 58 public: |
59 VerticalOverscrollTracker() : count_(0), completed_(false) {} | 59 VerticalOverscrollTracker() : count_(0), completed_(false) {} |
60 virtual ~VerticalOverscrollTracker() {} | 60 ~VerticalOverscrollTracker() override {} |
61 | 61 |
62 int num_overscroll_updates() const { | 62 int num_overscroll_updates() const { |
63 return count_; | 63 return count_; |
64 } | 64 } |
65 | 65 |
66 bool overscroll_completed() const { | 66 bool overscroll_completed() const { |
67 return completed_; | 67 return completed_; |
68 } | 68 } |
69 | 69 |
70 void Reset() { | 70 void Reset() { |
71 count_ = 0; | 71 count_ = 0; |
72 completed_ = false; | 72 completed_ = false; |
73 } | 73 } |
74 | 74 |
75 private: | 75 private: |
76 virtual bool CanOverscrollContent() const override { | 76 bool CanOverscrollContent() const override { return true; } |
77 return true; | |
78 } | |
79 | 77 |
80 virtual void OverscrollUpdate(float delta_y) override { | 78 void OverscrollUpdate(float delta_y) override { ++count_; } |
81 ++count_; | |
82 } | |
83 | 79 |
84 virtual void OverscrollComplete() override { | 80 void OverscrollComplete() override { completed_ = true; } |
85 completed_ = true; | |
86 } | |
87 | 81 |
88 int count_; | 82 int count_; |
89 bool completed_; | 83 bool completed_; |
90 | 84 |
91 DISALLOW_COPY_AND_ASSIGN(VerticalOverscrollTracker); | 85 DISALLOW_COPY_AND_ASSIGN(VerticalOverscrollTracker); |
92 }; | 86 }; |
93 | 87 |
94 } //namespace | 88 } //namespace |
95 | 89 |
96 | 90 |
97 namespace content { | 91 namespace content { |
98 | 92 |
99 // This class keeps track of the RenderViewHost whose screenshot was captured. | 93 // This class keeps track of the RenderViewHost whose screenshot was captured. |
100 class ScreenshotTracker : public NavigationEntryScreenshotManager { | 94 class ScreenshotTracker : public NavigationEntryScreenshotManager { |
101 public: | 95 public: |
102 explicit ScreenshotTracker(NavigationControllerImpl* controller) | 96 explicit ScreenshotTracker(NavigationControllerImpl* controller) |
103 : NavigationEntryScreenshotManager(controller), | 97 : NavigationEntryScreenshotManager(controller), |
104 screenshot_taken_for_(NULL), | 98 screenshot_taken_for_(NULL), |
105 waiting_for_screenshots_(0) { | 99 waiting_for_screenshots_(0) { |
106 } | 100 } |
107 | 101 |
108 virtual ~ScreenshotTracker() { | 102 ~ScreenshotTracker() override {} |
109 } | |
110 | 103 |
111 RenderViewHost* screenshot_taken_for() { return screenshot_taken_for_; } | 104 RenderViewHost* screenshot_taken_for() { return screenshot_taken_for_; } |
112 | 105 |
113 void Reset() { | 106 void Reset() { |
114 screenshot_taken_for_ = NULL; | 107 screenshot_taken_for_ = NULL; |
115 screenshot_set_.clear(); | 108 screenshot_set_.clear(); |
116 } | 109 } |
117 | 110 |
118 void SetScreenshotInterval(int interval_ms) { | 111 void SetScreenshotInterval(int interval_ms) { |
119 SetMinScreenshotIntervalMS(interval_ms); | 112 SetMinScreenshotIntervalMS(interval_ms); |
120 } | 113 } |
121 | 114 |
122 void WaitUntilScreenshotIsReady() { | 115 void WaitUntilScreenshotIsReady() { |
123 if (!waiting_for_screenshots_) | 116 if (!waiting_for_screenshots_) |
124 return; | 117 return; |
125 message_loop_runner_ = new content::MessageLoopRunner; | 118 message_loop_runner_ = new content::MessageLoopRunner; |
126 message_loop_runner_->Run(); | 119 message_loop_runner_->Run(); |
127 } | 120 } |
128 | 121 |
129 bool ScreenshotSetForEntry(NavigationEntryImpl* entry) const { | 122 bool ScreenshotSetForEntry(NavigationEntryImpl* entry) const { |
130 return screenshot_set_.count(entry) > 0; | 123 return screenshot_set_.count(entry) > 0; |
131 } | 124 } |
132 | 125 |
133 private: | 126 private: |
134 // Overridden from NavigationEntryScreenshotManager: | 127 // Overridden from NavigationEntryScreenshotManager: |
135 virtual void TakeScreenshotImpl(RenderViewHost* host, | 128 void TakeScreenshotImpl(RenderViewHost* host, |
136 NavigationEntryImpl* entry) override { | 129 NavigationEntryImpl* entry) override { |
137 ++waiting_for_screenshots_; | 130 ++waiting_for_screenshots_; |
138 screenshot_taken_for_ = host; | 131 screenshot_taken_for_ = host; |
139 NavigationEntryScreenshotManager::TakeScreenshotImpl(host, entry); | 132 NavigationEntryScreenshotManager::TakeScreenshotImpl(host, entry); |
140 } | 133 } |
141 | 134 |
142 virtual void OnScreenshotSet(NavigationEntryImpl* entry) override { | 135 void OnScreenshotSet(NavigationEntryImpl* entry) override { |
143 --waiting_for_screenshots_; | 136 --waiting_for_screenshots_; |
144 screenshot_set_[entry] = true; | 137 screenshot_set_[entry] = true; |
145 NavigationEntryScreenshotManager::OnScreenshotSet(entry); | 138 NavigationEntryScreenshotManager::OnScreenshotSet(entry); |
146 if (waiting_for_screenshots_ == 0 && message_loop_runner_.get()) | 139 if (waiting_for_screenshots_ == 0 && message_loop_runner_.get()) |
147 message_loop_runner_->Quit(); | 140 message_loop_runner_->Quit(); |
148 } | 141 } |
149 | 142 |
150 RenderViewHost* screenshot_taken_for_; | 143 RenderViewHost* screenshot_taken_for_; |
151 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; | 144 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
152 int waiting_for_screenshots_; | 145 int waiting_for_screenshots_; |
153 std::map<NavigationEntryImpl*, bool> screenshot_set_; | 146 std::map<NavigationEntryImpl*, bool> screenshot_set_; |
154 | 147 |
155 DISALLOW_COPY_AND_ASSIGN(ScreenshotTracker); | 148 DISALLOW_COPY_AND_ASSIGN(ScreenshotTracker); |
156 }; | 149 }; |
157 | 150 |
158 class NavigationWatcher : public WebContentsObserver { | 151 class NavigationWatcher : public WebContentsObserver { |
159 public: | 152 public: |
160 explicit NavigationWatcher(WebContents* contents) | 153 explicit NavigationWatcher(WebContents* contents) |
161 : WebContentsObserver(contents), | 154 : WebContentsObserver(contents), |
162 navigated_(false), | 155 navigated_(false), |
163 should_quit_loop_(false) { | 156 should_quit_loop_(false) { |
164 } | 157 } |
165 | 158 |
166 virtual ~NavigationWatcher() {} | 159 ~NavigationWatcher() override {} |
167 | 160 |
168 void WaitUntilNavigationStarts() { | 161 void WaitUntilNavigationStarts() { |
169 if (navigated_) | 162 if (navigated_) |
170 return; | 163 return; |
171 should_quit_loop_ = true; | 164 should_quit_loop_ = true; |
172 base::MessageLoop::current()->Run(); | 165 base::MessageLoop::current()->Run(); |
173 } | 166 } |
174 | 167 |
175 private: | 168 private: |
176 // Overridden from WebContentsObserver: | 169 // Overridden from WebContentsObserver: |
177 virtual void AboutToNavigateRenderView(RenderViewHost* host) override { | 170 void AboutToNavigateRenderView(RenderViewHost* host) override { |
178 navigated_ = true; | 171 navigated_ = true; |
179 if (should_quit_loop_) | 172 if (should_quit_loop_) |
180 base::MessageLoop::current()->Quit(); | 173 base::MessageLoop::current()->Quit(); |
181 } | 174 } |
182 | 175 |
183 bool navigated_; | 176 bool navigated_; |
184 bool should_quit_loop_; | 177 bool should_quit_loop_; |
185 | 178 |
186 DISALLOW_COPY_AND_ASSIGN(NavigationWatcher); | 179 DISALLOW_COPY_AND_ASSIGN(NavigationWatcher); |
187 }; | 180 }; |
188 | 181 |
189 class InputEventMessageFilterWaitsForAcks : public BrowserMessageFilter { | 182 class InputEventMessageFilterWaitsForAcks : public BrowserMessageFilter { |
190 public: | 183 public: |
191 InputEventMessageFilterWaitsForAcks() | 184 InputEventMessageFilterWaitsForAcks() |
192 : BrowserMessageFilter(InputMsgStart), | 185 : BrowserMessageFilter(InputMsgStart), |
193 type_(blink::WebInputEvent::Undefined), | 186 type_(blink::WebInputEvent::Undefined), |
194 state_(INPUT_EVENT_ACK_STATE_UNKNOWN) {} | 187 state_(INPUT_EVENT_ACK_STATE_UNKNOWN) {} |
195 | 188 |
196 void WaitForAck(blink::WebInputEvent::Type type) { | 189 void WaitForAck(blink::WebInputEvent::Type type) { |
197 base::RunLoop run_loop; | 190 base::RunLoop run_loop; |
198 base::AutoReset<base::Closure> reset_quit(&quit_, run_loop.QuitClosure()); | 191 base::AutoReset<base::Closure> reset_quit(&quit_, run_loop.QuitClosure()); |
199 base::AutoReset<blink::WebInputEvent::Type> reset_type(&type_, type); | 192 base::AutoReset<blink::WebInputEvent::Type> reset_type(&type_, type); |
200 run_loop.Run(); | 193 run_loop.Run(); |
201 } | 194 } |
202 | 195 |
203 InputEventAckState last_ack_state() const { return state_; } | 196 InputEventAckState last_ack_state() const { return state_; } |
204 | 197 |
205 protected: | 198 protected: |
206 virtual ~InputEventMessageFilterWaitsForAcks() {} | 199 ~InputEventMessageFilterWaitsForAcks() override {} |
207 | 200 |
208 private: | 201 private: |
209 void ReceivedEventAck(blink::WebInputEvent::Type type, | 202 void ReceivedEventAck(blink::WebInputEvent::Type type, |
210 InputEventAckState state) { | 203 InputEventAckState state) { |
211 if (type_ == type) { | 204 if (type_ == type) { |
212 state_ = state; | 205 state_ = state; |
213 quit_.Run(); | 206 quit_.Run(); |
214 } | 207 } |
215 } | 208 } |
216 | 209 |
217 // BrowserMessageFilter: | 210 // BrowserMessageFilter: |
218 virtual bool OnMessageReceived(const IPC::Message& message) override { | 211 bool OnMessageReceived(const IPC::Message& message) override { |
219 if (message.type() == InputHostMsg_HandleInputEvent_ACK::ID) { | 212 if (message.type() == InputHostMsg_HandleInputEvent_ACK::ID) { |
220 InputHostMsg_HandleInputEvent_ACK::Param params; | 213 InputHostMsg_HandleInputEvent_ACK::Param params; |
221 InputHostMsg_HandleInputEvent_ACK::Read(&message, ¶ms); | 214 InputHostMsg_HandleInputEvent_ACK::Read(&message, ¶ms); |
222 blink::WebInputEvent::Type type = params.a.type; | 215 blink::WebInputEvent::Type type = params.a.type; |
223 InputEventAckState ack = params.a.state; | 216 InputEventAckState ack = params.a.state; |
224 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 217 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
225 base::Bind(&InputEventMessageFilterWaitsForAcks::ReceivedEventAck, | 218 base::Bind(&InputEventMessageFilterWaitsForAcks::ReceivedEventAck, |
226 this, type, ack)); | 219 this, type, ack)); |
227 } | 220 } |
228 return false; | 221 return false; |
(...skipping 28 matching lines...) Expand all Loading... |
257 NavigateToURL(shell(), test_url); | 250 NavigateToURL(shell(), test_url); |
258 | 251 |
259 WebContentsImpl* web_contents = | 252 WebContentsImpl* web_contents = |
260 static_cast<WebContentsImpl*>(shell()->web_contents()); | 253 static_cast<WebContentsImpl*>(shell()->web_contents()); |
261 NavigationControllerImpl* controller = &web_contents->GetController(); | 254 NavigationControllerImpl* controller = &web_contents->GetController(); |
262 | 255 |
263 screenshot_manager_ = new ScreenshotTracker(controller); | 256 screenshot_manager_ = new ScreenshotTracker(controller); |
264 controller->SetScreenshotManager(screenshot_manager_); | 257 controller->SetScreenshotManager(screenshot_manager_); |
265 } | 258 } |
266 | 259 |
267 virtual void SetUpCommandLine(CommandLine* cmd) override { | 260 void SetUpCommandLine(CommandLine* cmd) override { |
268 cmd->AppendSwitchASCII(switches::kTouchEvents, | 261 cmd->AppendSwitchASCII(switches::kTouchEvents, |
269 switches::kTouchEventsEnabled); | 262 switches::kTouchEventsEnabled); |
270 } | 263 } |
271 | 264 |
272 void TestOverscrollNavigation(bool touch_handler) { | 265 void TestOverscrollNavigation(bool touch_handler) { |
273 ASSERT_NO_FATAL_FAILURE( | 266 ASSERT_NO_FATAL_FAILURE( |
274 StartTestWithPage("files/overscroll_navigation.html")); | 267 StartTestWithPage("files/overscroll_navigation.html")); |
275 WebContentsImpl* web_contents = | 268 WebContentsImpl* web_contents = |
276 static_cast<WebContentsImpl*>(shell()->web_contents()); | 269 static_cast<WebContentsImpl*>(shell()->web_contents()); |
277 NavigationController& controller = web_contents->GetController(); | 270 NavigationController& controller = web_contents->GetController(); |
(...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1148 details = dispatcher->OnEventFromSource(&release); | 1141 details = dispatcher->OnEventFromSource(&release); |
1149 ASSERT_FALSE(details.dispatcher_destroyed); | 1142 ASSERT_FALSE(details.dispatcher_destroyed); |
1150 WaitAFrame(); | 1143 WaitAFrame(); |
1151 | 1144 |
1152 EXPECT_LT(0, tracker.num_overscroll_updates()); | 1145 EXPECT_LT(0, tracker.num_overscroll_updates()); |
1153 EXPECT_FALSE(tracker.overscroll_completed()); | 1146 EXPECT_FALSE(tracker.overscroll_completed()); |
1154 } | 1147 } |
1155 } | 1148 } |
1156 | 1149 |
1157 } // namespace content | 1150 } // namespace content |
OLD | NEW |