| 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 |