OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "bindings/core/v8/NodeOrString.h" | 5 #include "bindings/core/v8/NodeOrString.h" |
6 #include "core/dom/ClientRect.h" | 6 #include "core/dom/ClientRect.h" |
7 #include "core/frame/BrowserControls.h" | 7 #include "core/frame/BrowserControls.h" |
8 #include "core/frame/FrameView.h" | 8 #include "core/frame/FrameView.h" |
9 #include "core/frame/RootFrameViewport.h" | 9 #include "core/frame/RootFrameViewport.h" |
10 #include "core/frame/VisualViewport.h" | 10 #include "core/frame/VisualViewport.h" |
11 #include "core/html/HTMLFrameOwnerElement.h" | 11 #include "core/html/HTMLFrameOwnerElement.h" |
12 #include "core/layout/LayoutBox.h" | 12 #include "core/layout/LayoutBox.h" |
13 #include "core/layout/api/LayoutViewItem.h" | 13 #include "core/layout/api/LayoutViewItem.h" |
14 #include "core/layout/compositing/CompositedLayerMapping.h" | 14 #include "core/layout/compositing/CompositedLayerMapping.h" |
15 #include "core/layout/compositing/PaintLayerCompositor.h" | 15 #include "core/layout/compositing/PaintLayerCompositor.h" |
16 #include "core/page/Page.h" | 16 #include "core/page/Page.h" |
17 #include "core/page/scrolling/RootScrollerController.h" | 17 #include "core/page/scrolling/RootScrollerController.h" |
18 #include "core/page/scrolling/TopDocumentRootScrollerController.h" | 18 #include "core/page/scrolling/TopDocumentRootScrollerController.h" |
19 #include "core/paint/PaintLayer.h" | 19 #include "core/paint/PaintLayer.h" |
20 #include "core/paint/PaintLayerScrollableArea.h" | 20 #include "core/paint/PaintLayerScrollableArea.h" |
21 #include "platform/testing/URLTestHelpers.h" | 21 #include "platform/testing/URLTestHelpers.h" |
22 #include "platform/testing/UnitTestHelpers.h" | 22 #include "platform/testing/UnitTestHelpers.h" |
23 #include "platform/wtf/Vector.h" | 23 #include "platform/wtf/Vector.h" |
24 #include "public/platform/Platform.h" | 24 #include "public/platform/Platform.h" |
| 25 #include "public/platform/WebCoalescedInputEvent.h" |
25 #include "public/platform/WebURLLoaderMockFactory.h" | 26 #include "public/platform/WebURLLoaderMockFactory.h" |
26 #include "public/web/WebConsoleMessage.h" | 27 #include "public/web/WebConsoleMessage.h" |
27 #include "public/web/WebRemoteFrame.h" | 28 #include "public/web/WebRemoteFrame.h" |
28 #include "public/web/WebScriptSource.h" | 29 #include "public/web/WebScriptSource.h" |
29 #include "public/web/WebSettings.h" | 30 #include "public/web/WebSettings.h" |
30 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
31 #include "web/WebLocalFrameImpl.h" | 32 #include "web/WebLocalFrameImpl.h" |
32 #include "web/WebRemoteFrameImpl.h" | 33 #include "web/WebRemoteFrameImpl.h" |
33 #include "web/tests/FrameTestHelpers.h" | 34 #include "web/tests/FrameTestHelpers.h" |
34 | 35 |
(...skipping 14 matching lines...) Expand all Loading... |
49 RegisterMockedHttpURLLoad("root-scroller-child.html"); | 50 RegisterMockedHttpURLLoad("root-scroller-child.html"); |
50 } | 51 } |
51 | 52 |
52 ~RootScrollerTest() override { | 53 ~RootScrollerTest() override { |
53 features_backup_.restore(); | 54 features_backup_.restore(); |
54 Platform::Current() | 55 Platform::Current() |
55 ->GetURLLoaderMockFactory() | 56 ->GetURLLoaderMockFactory() |
56 ->UnregisterAllURLsAndClearMemoryCache(); | 57 ->UnregisterAllURLsAndClearMemoryCache(); |
57 } | 58 } |
58 | 59 |
59 WebViewImpl* Initialize(const std::string& page_name, | 60 WebViewBase* Initialize(const std::string& page_name, |
60 FrameTestHelpers::TestWebViewClient* client) { | 61 FrameTestHelpers::TestWebViewClient* client) { |
61 return InitializeInternal(base_url_ + page_name, client); | 62 return InitializeInternal(base_url_ + page_name, client); |
62 } | 63 } |
63 | 64 |
64 WebViewImpl* Initialize(const std::string& page_name) { | 65 WebViewBase* Initialize(const std::string& page_name) { |
65 return InitializeInternal(base_url_ + page_name, &client_); | 66 return InitializeInternal(base_url_ + page_name, &client_); |
66 } | 67 } |
67 | 68 |
68 WebViewImpl* Initialize() { | 69 WebViewBase* Initialize() { |
69 return InitializeInternal("about:blank", &client_); | 70 return InitializeInternal("about:blank", &client_); |
70 } | 71 } |
71 | 72 |
72 static void ConfigureSettings(WebSettings* settings) { | 73 static void ConfigureSettings(WebSettings* settings) { |
73 settings->SetJavaScriptEnabled(true); | 74 settings->SetJavaScriptEnabled(true); |
74 settings->SetAcceleratedCompositingEnabled(true); | 75 settings->SetAcceleratedCompositingEnabled(true); |
75 settings->SetPreferCompositingToLCDTextEnabled(true); | 76 settings->SetPreferCompositingToLCDTextEnabled(true); |
76 // Android settings. | 77 // Android settings. |
77 settings->SetViewportEnabled(true); | 78 settings->SetViewportEnabled(true); |
78 settings->SetViewportMetaEnabled(true); | 79 settings->SetViewportMetaEnabled(true); |
(...skipping 10 matching lines...) Expand all Loading... |
89 void ExecuteScript(const WebString& code) { | 90 void ExecuteScript(const WebString& code) { |
90 ExecuteScript(code, *MainWebFrame()); | 91 ExecuteScript(code, *MainWebFrame()); |
91 } | 92 } |
92 | 93 |
93 void ExecuteScript(const WebString& code, WebLocalFrame& frame) { | 94 void ExecuteScript(const WebString& code, WebLocalFrame& frame) { |
94 frame.ExecuteScript(WebScriptSource(code)); | 95 frame.ExecuteScript(WebScriptSource(code)); |
95 frame.View()->UpdateAllLifecyclePhases(); | 96 frame.View()->UpdateAllLifecyclePhases(); |
96 RunPendingTasks(); | 97 RunPendingTasks(); |
97 } | 98 } |
98 | 99 |
99 WebViewImpl* GetWebViewImpl() const { return helper_.WebView(); } | 100 WebViewBase* GetWebView() const { return helper_.WebView(); } |
100 | 101 |
101 Page& GetPage() const { return *helper_.WebView()->GetPage(); } | 102 Page& GetPage() const { return *helper_.WebView()->GetPage(); } |
102 | 103 |
103 LocalFrame* MainFrame() const { | 104 LocalFrame* MainFrame() const { |
104 return GetWebViewImpl()->MainFrameImpl()->GetFrame(); | 105 return GetWebView()->MainFrameImpl()->GetFrame(); |
105 } | 106 } |
106 | 107 |
107 WebLocalFrame* MainWebFrame() const { | 108 WebLocalFrame* MainWebFrame() const { return GetWebView()->MainFrameImpl(); } |
108 return GetWebViewImpl()->MainFrameImpl(); | |
109 } | |
110 | 109 |
111 FrameView* MainFrameView() const { | 110 FrameView* MainFrameView() const { |
112 return GetWebViewImpl()->MainFrameImpl()->GetFrame()->View(); | 111 return GetWebView()->MainFrameImpl()->GetFrame()->View(); |
113 } | 112 } |
114 | 113 |
115 VisualViewport& GetVisualViewport() const { | 114 VisualViewport& GetVisualViewport() const { |
116 return GetPage().GetVisualViewport(); | 115 return GetPage().GetVisualViewport(); |
117 } | 116 } |
118 | 117 |
119 BrowserControls& GetBrowserControls() const { | 118 BrowserControls& GetBrowserControls() const { |
120 return GetPage().GetBrowserControls(); | 119 return GetPage().GetBrowserControls(); |
121 } | 120 } |
122 | 121 |
(...skipping 25 matching lines...) Expand all Loading... |
148 event.source_device = device; | 147 event.source_device = device; |
149 event.x = 100; | 148 event.x = 100; |
150 event.y = 100; | 149 event.y = 100; |
151 if (type == WebInputEvent::kGestureScrollUpdate) { | 150 if (type == WebInputEvent::kGestureScrollUpdate) { |
152 event.data.scroll_update.delta_x = delta_x; | 151 event.data.scroll_update.delta_x = delta_x; |
153 event.data.scroll_update.delta_y = delta_y; | 152 event.data.scroll_update.delta_y = delta_y; |
154 } | 153 } |
155 return WebCoalescedInputEvent(event); | 154 return WebCoalescedInputEvent(event); |
156 } | 155 } |
157 | 156 |
158 WebViewImpl* InitializeInternal(const std::string& url, | 157 WebViewBase* InitializeInternal(const std::string& url, |
159 FrameTestHelpers::TestWebViewClient* client) { | 158 FrameTestHelpers::TestWebViewClient* client) { |
160 RuntimeEnabledFeatures::setSetRootScrollerEnabled(true); | 159 RuntimeEnabledFeatures::setSetRootScrollerEnabled(true); |
161 | 160 |
162 helper_.InitializeAndLoad(url, true, nullptr, client, nullptr, | 161 helper_.InitializeAndLoad(url, true, nullptr, client, nullptr, |
163 &ConfigureSettings); | 162 &ConfigureSettings); |
164 | 163 |
165 // Initialize browser controls to be shown. | 164 // Initialize browser controls to be shown. |
166 GetWebViewImpl()->ResizeWithBrowserControls(IntSize(400, 400), 50, true); | 165 GetWebView()->ResizeWithBrowserControls(IntSize(400, 400), 50, true); |
167 GetWebViewImpl()->GetBrowserControls().SetShownRatio(1); | 166 GetWebView()->GetBrowserControls().SetShownRatio(1); |
168 | 167 |
169 MainFrameView()->UpdateAllLifecyclePhases(); | 168 MainFrameView()->UpdateAllLifecyclePhases(); |
170 | 169 |
171 return GetWebViewImpl(); | 170 return GetWebView(); |
172 } | 171 } |
173 | 172 |
174 std::string base_url_; | 173 std::string base_url_; |
175 FrameTestHelpers::TestWebViewClient client_; | 174 FrameTestHelpers::TestWebViewClient client_; |
176 FrameTestHelpers::WebViewHelper helper_; | 175 FrameTestHelpers::WebViewHelper helper_; |
177 RuntimeEnabledFeatures::Backup features_backup_; | 176 RuntimeEnabledFeatures::Backup features_backup_; |
178 }; | 177 }; |
179 | 178 |
180 // Test that no root scroller element is set if setRootScroller isn't called on | 179 // Test that no root scroller element is set if setRootScroller isn't called on |
181 // any elements. The document Node should be the default effective root | 180 // any elements. The document Node should be the default effective root |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 Initialize("root-scroller.html", &client); | 234 Initialize("root-scroller.html", &client); |
236 | 235 |
237 Element* container = MainFrame()->GetDocument()->getElementById("container"); | 236 Element* container = MainFrame()->GetDocument()->getElementById("container"); |
238 MainFrame()->GetDocument()->setRootScroller(container); | 237 MainFrame()->GetDocument()->setRootScroller(container); |
239 ASSERT_EQ(container, MainFrame()->GetDocument()->rootScroller()); | 238 ASSERT_EQ(container, MainFrame()->GetDocument()->rootScroller()); |
240 | 239 |
241 // Content is 1000x1000, WebView size is 400x400 but hiding the top controls | 240 // Content is 1000x1000, WebView size is 400x400 but hiding the top controls |
242 // makes it 400x450 so max scroll is 550px. | 241 // makes it 400x450 so max scroll is 550px. |
243 double maximum_scroll = 550; | 242 double maximum_scroll = 550; |
244 | 243 |
245 GetWebViewImpl()->HandleInputEvent( | 244 GetWebView()->HandleInputEvent( |
246 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollBegin)); | 245 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollBegin)); |
247 | 246 |
248 { | 247 { |
249 // Scrolling over the #container DIV should cause the browser controls to | 248 // Scrolling over the #container DIV should cause the browser controls to |
250 // hide. | 249 // hide. |
251 EXPECT_FLOAT_EQ(1, GetBrowserControls().ShownRatio()); | 250 EXPECT_FLOAT_EQ(1, GetBrowserControls().ShownRatio()); |
252 GetWebViewImpl()->HandleInputEvent( | 251 GetWebView()->HandleInputEvent( |
253 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollUpdate, 0, | 252 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollUpdate, 0, |
254 -GetBrowserControls().Height())); | 253 -GetBrowserControls().Height())); |
255 EXPECT_FLOAT_EQ(0, GetBrowserControls().ShownRatio()); | 254 EXPECT_FLOAT_EQ(0, GetBrowserControls().ShownRatio()); |
256 } | 255 } |
257 | 256 |
258 { | 257 { |
259 // Make sure we're actually scrolling the DIV and not the FrameView. | 258 // Make sure we're actually scrolling the DIV and not the FrameView. |
260 GetWebViewImpl()->HandleInputEvent(GenerateTouchGestureEvent( | 259 GetWebView()->HandleInputEvent(GenerateTouchGestureEvent( |
261 WebInputEvent::kGestureScrollUpdate, 0, -100)); | 260 WebInputEvent::kGestureScrollUpdate, 0, -100)); |
262 EXPECT_FLOAT_EQ(100, container->scrollTop()); | 261 EXPECT_FLOAT_EQ(100, container->scrollTop()); |
263 EXPECT_FLOAT_EQ(0, MainFrameView()->GetScrollOffset().Height()); | 262 EXPECT_FLOAT_EQ(0, MainFrameView()->GetScrollOffset().Height()); |
264 } | 263 } |
265 | 264 |
266 { | 265 { |
267 // Scroll 50 pixels past the end. Ensure we report the 50 pixels as | 266 // Scroll 50 pixels past the end. Ensure we report the 50 pixels as |
268 // overscroll. | 267 // overscroll. |
269 EXPECT_CALL(client, DidOverscroll(WebFloatSize(0, 50), WebFloatSize(0, 50), | 268 EXPECT_CALL(client, DidOverscroll(WebFloatSize(0, 50), WebFloatSize(0, 50), |
270 WebFloatPoint(100, 100), WebFloatSize())); | 269 WebFloatPoint(100, 100), WebFloatSize())); |
271 GetWebViewImpl()->HandleInputEvent(GenerateTouchGestureEvent( | 270 GetWebView()->HandleInputEvent(GenerateTouchGestureEvent( |
272 WebInputEvent::kGestureScrollUpdate, 0, -500)); | 271 WebInputEvent::kGestureScrollUpdate, 0, -500)); |
273 EXPECT_FLOAT_EQ(maximum_scroll, container->scrollTop()); | 272 EXPECT_FLOAT_EQ(maximum_scroll, container->scrollTop()); |
274 EXPECT_FLOAT_EQ(0, MainFrameView()->GetScrollOffset().Height()); | 273 EXPECT_FLOAT_EQ(0, MainFrameView()->GetScrollOffset().Height()); |
275 Mock::VerifyAndClearExpectations(&client); | 274 Mock::VerifyAndClearExpectations(&client); |
276 } | 275 } |
277 | 276 |
278 { | 277 { |
279 // Continue the gesture overscroll. | 278 // Continue the gesture overscroll. |
280 EXPECT_CALL(client, DidOverscroll(WebFloatSize(0, 20), WebFloatSize(0, 70), | 279 EXPECT_CALL(client, DidOverscroll(WebFloatSize(0, 20), WebFloatSize(0, 70), |
281 WebFloatPoint(100, 100), WebFloatSize())); | 280 WebFloatPoint(100, 100), WebFloatSize())); |
282 GetWebViewImpl()->HandleInputEvent( | 281 GetWebView()->HandleInputEvent( |
283 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollUpdate, 0, -20)); | 282 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollUpdate, 0, -20)); |
284 EXPECT_FLOAT_EQ(maximum_scroll, container->scrollTop()); | 283 EXPECT_FLOAT_EQ(maximum_scroll, container->scrollTop()); |
285 EXPECT_FLOAT_EQ(0, MainFrameView()->GetScrollOffset().Height()); | 284 EXPECT_FLOAT_EQ(0, MainFrameView()->GetScrollOffset().Height()); |
286 Mock::VerifyAndClearExpectations(&client); | 285 Mock::VerifyAndClearExpectations(&client); |
287 } | 286 } |
288 | 287 |
289 GetWebViewImpl()->HandleInputEvent( | 288 GetWebView()->HandleInputEvent( |
290 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollEnd)); | 289 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollEnd)); |
291 | 290 |
292 { | 291 { |
293 // Make sure a new gesture scroll still won't scroll the frameview and | 292 // Make sure a new gesture scroll still won't scroll the frameview and |
294 // overscrolls. | 293 // overscrolls. |
295 GetWebViewImpl()->HandleInputEvent( | 294 GetWebView()->HandleInputEvent( |
296 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollBegin)); | 295 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollBegin)); |
297 | 296 |
298 EXPECT_CALL(client, DidOverscroll(WebFloatSize(0, 30), WebFloatSize(0, 30), | 297 EXPECT_CALL(client, DidOverscroll(WebFloatSize(0, 30), WebFloatSize(0, 30), |
299 WebFloatPoint(100, 100), WebFloatSize())); | 298 WebFloatPoint(100, 100), WebFloatSize())); |
300 GetWebViewImpl()->HandleInputEvent( | 299 GetWebView()->HandleInputEvent( |
301 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollUpdate, 0, -30)); | 300 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollUpdate, 0, -30)); |
302 EXPECT_FLOAT_EQ(maximum_scroll, container->scrollTop()); | 301 EXPECT_FLOAT_EQ(maximum_scroll, container->scrollTop()); |
303 EXPECT_FLOAT_EQ(0, MainFrameView()->GetScrollOffset().Height()); | 302 EXPECT_FLOAT_EQ(0, MainFrameView()->GetScrollOffset().Height()); |
304 Mock::VerifyAndClearExpectations(&client); | 303 Mock::VerifyAndClearExpectations(&client); |
305 | 304 |
306 GetWebViewImpl()->HandleInputEvent( | 305 GetWebView()->HandleInputEvent( |
307 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollEnd)); | 306 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollEnd)); |
308 } | 307 } |
309 | 308 |
310 { | 309 { |
311 // Scrolling up should show the browser controls. | 310 // Scrolling up should show the browser controls. |
312 GetWebViewImpl()->HandleInputEvent( | 311 GetWebView()->HandleInputEvent( |
313 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollBegin)); | 312 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollBegin)); |
314 | 313 |
315 EXPECT_FLOAT_EQ(0, GetBrowserControls().ShownRatio()); | 314 EXPECT_FLOAT_EQ(0, GetBrowserControls().ShownRatio()); |
316 GetWebViewImpl()->HandleInputEvent( | 315 GetWebView()->HandleInputEvent( |
317 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollUpdate, 0, 30)); | 316 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollUpdate, 0, 30)); |
318 EXPECT_FLOAT_EQ(0.6, GetBrowserControls().ShownRatio()); | 317 EXPECT_FLOAT_EQ(0.6, GetBrowserControls().ShownRatio()); |
319 | 318 |
320 GetWebViewImpl()->HandleInputEvent( | 319 GetWebView()->HandleInputEvent( |
321 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollEnd)); | 320 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollEnd)); |
322 } | 321 } |
323 | 322 |
324 // Reset manually to avoid lifetime issues with custom WebViewClient. | 323 // Reset manually to avoid lifetime issues with custom WebViewClient. |
325 helper_.Reset(); | 324 helper_.Reset(); |
326 } | 325 } |
327 | 326 |
328 // Tests that removing the element that is the root scroller from the DOM tree | 327 // Tests that removing the element that is the root scroller from the DOM tree |
329 // doesn't remove it as the root scroller but it does change the effective root | 328 // doesn't remove it as the root scroller but it does change the effective root |
330 // scroller. | 329 // scroller. |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 FrameTestHelpers::TestWebRemoteFrameClient remote_client; | 676 FrameTestHelpers::TestWebRemoteFrameClient remote_client; |
678 FrameTestHelpers::TestWebWidgetClient web_widget_client; | 677 FrameTestHelpers::TestWebWidgetClient web_widget_client; |
679 WebFrameWidget* widget; | 678 WebFrameWidget* widget; |
680 WebLocalFrameImpl* local_frame; | 679 WebLocalFrameImpl* local_frame; |
681 | 680 |
682 Initialize("root-scroller-iframe.html"); | 681 Initialize("root-scroller-iframe.html"); |
683 | 682 |
684 // Initialization: Set the main frame to be a RemoteFrame and add a local | 683 // Initialization: Set the main frame to be a RemoteFrame and add a local |
685 // child. | 684 // child. |
686 { | 685 { |
687 GetWebViewImpl()->SetMainFrame(remote_client.GetFrame()); | 686 GetWebView()->SetMainFrame(remote_client.GetFrame()); |
688 WebRemoteFrame* root = GetWebViewImpl()->MainFrame()->ToWebRemoteFrame(); | 687 WebRemoteFrame* root = GetWebView()->MainFrame()->ToWebRemoteFrame(); |
689 root->SetReplicatedOrigin(SecurityOrigin::CreateUnique()); | 688 root->SetReplicatedOrigin(SecurityOrigin::CreateUnique()); |
690 WebFrameOwnerProperties properties; | 689 WebFrameOwnerProperties properties; |
691 local_frame = FrameTestHelpers::CreateLocalChild( | 690 local_frame = FrameTestHelpers::CreateLocalChild( |
692 root, "frameName", nullptr, nullptr, nullptr, properties); | 691 root, "frameName", nullptr, nullptr, nullptr, properties); |
693 | 692 |
694 FrameTestHelpers::LoadFrame(local_frame, | 693 FrameTestHelpers::LoadFrame(local_frame, |
695 base_url_ + "root-scroller-child.html"); | 694 base_url_ + "root-scroller-child.html"); |
696 widget = local_frame->FrameWidget(); | 695 widget = local_frame->FrameWidget(); |
697 widget->Resize(WebSize(400, 400)); | 696 widget->Resize(WebSize(400, 400)); |
698 } | 697 } |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
838 EXPECT_FALSE(container_scroller->HorizontalScrollbar()); | 837 EXPECT_FALSE(container_scroller->HorizontalScrollbar()); |
839 EXPECT_FALSE(container_scroller->VerticalScrollbar()); | 838 EXPECT_FALSE(container_scroller->VerticalScrollbar()); |
840 EXPECT_GT(container_scroller->MaximumScrollOffset().Width(), 0); | 839 EXPECT_GT(container_scroller->MaximumScrollOffset().Width(), 0); |
841 EXPECT_GT(container_scroller->MaximumScrollOffset().Height(), 0); | 840 EXPECT_GT(container_scroller->MaximumScrollOffset().Height(), 0); |
842 } | 841 } |
843 | 842 |
844 TEST_F(RootScrollerTest, TopControlsAdjustmentAppliedToRootScroller) { | 843 TEST_F(RootScrollerTest, TopControlsAdjustmentAppliedToRootScroller) { |
845 Initialize(); | 844 Initialize(); |
846 | 845 |
847 WebURL base_url = URLTestHelpers::ToKURL("http://www.test.com/"); | 846 WebURL base_url = URLTestHelpers::ToKURL("http://www.test.com/"); |
848 FrameTestHelpers::LoadHTMLString(GetWebViewImpl()->MainFrame(), | 847 FrameTestHelpers::LoadHTMLString(GetWebView()->MainFrame(), |
849 "<!DOCTYPE html>" | 848 "<!DOCTYPE html>" |
850 "<style>" | 849 "<style>" |
851 " body, html {" | 850 " body, html {" |
852 " width: 100%;" | 851 " width: 100%;" |
853 " height: 100%;" | 852 " height: 100%;" |
854 " margin: 0px;" | 853 " margin: 0px;" |
855 " }" | 854 " }" |
856 " #container {" | 855 " #container {" |
857 " width: 100%;" | 856 " width: 100%;" |
858 " height: 100%;" | 857 " height: 100%;" |
859 " overflow: auto;" | 858 " overflow: auto;" |
860 " }" | 859 " }" |
861 "</style>" | 860 "</style>" |
862 "<div id='container'>" | 861 "<div id='container'>" |
863 " <div style='height:1000px'>test</div>" | 862 " <div style='height:1000px'>test</div>" |
864 "</div>", | 863 "</div>", |
865 base_url); | 864 base_url); |
866 | 865 |
867 GetWebViewImpl()->ResizeWithBrowserControls(IntSize(400, 400), 50, true); | 866 GetWebView()->ResizeWithBrowserControls(IntSize(400, 400), 50, true); |
868 MainFrameView()->UpdateAllLifecyclePhases(); | 867 MainFrameView()->UpdateAllLifecyclePhases(); |
869 | 868 |
870 Element* container = MainFrame()->GetDocument()->getElementById("container"); | 869 Element* container = MainFrame()->GetDocument()->getElementById("container"); |
871 MainFrame()->GetDocument()->setRootScroller(container, ASSERT_NO_EXCEPTION); | 870 MainFrame()->GetDocument()->setRootScroller(container, ASSERT_NO_EXCEPTION); |
872 | 871 |
873 ScrollableArea* container_scroller = | 872 ScrollableArea* container_scroller = |
874 static_cast<PaintInvalidationCapableScrollableArea*>( | 873 static_cast<PaintInvalidationCapableScrollableArea*>( |
875 ToLayoutBox(container->GetLayoutObject())->GetScrollableArea()); | 874 ToLayoutBox(container->GetLayoutObject())->GetScrollableArea()); |
876 | 875 |
877 // Hide the top controls and scroll down maximally. We should account for the | 876 // Hide the top controls and scroll down maximally. We should account for the |
878 // change in maximum scroll offset due to the top controls hiding. That is, | 877 // change in maximum scroll offset due to the top controls hiding. That is, |
879 // since the controls are hidden, the "content area" is taller so the maximum | 878 // since the controls are hidden, the "content area" is taller so the maximum |
880 // scroll offset should shrink. | 879 // scroll offset should shrink. |
881 ASSERT_EQ(1000 - 400, container_scroller->MaximumScrollOffset().Height()); | 880 ASSERT_EQ(1000 - 400, container_scroller->MaximumScrollOffset().Height()); |
882 | 881 |
883 GetWebViewImpl()->HandleInputEvent( | 882 GetWebView()->HandleInputEvent( |
884 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollBegin)); | 883 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollBegin)); |
885 ASSERT_EQ(1, GetBrowserControls().ShownRatio()); | 884 ASSERT_EQ(1, GetBrowserControls().ShownRatio()); |
886 GetWebViewImpl()->HandleInputEvent(GenerateTouchGestureEvent( | 885 GetWebView()->HandleInputEvent(GenerateTouchGestureEvent( |
887 WebInputEvent::kGestureScrollUpdate, 0, -GetBrowserControls().Height())); | 886 WebInputEvent::kGestureScrollUpdate, 0, -GetBrowserControls().Height())); |
888 ASSERT_EQ(0, GetBrowserControls().ShownRatio()); | 887 ASSERT_EQ(0, GetBrowserControls().ShownRatio()); |
889 EXPECT_EQ(1000 - 450, container_scroller->MaximumScrollOffset().Height()); | 888 EXPECT_EQ(1000 - 450, container_scroller->MaximumScrollOffset().Height()); |
890 | 889 |
891 GetWebViewImpl()->HandleInputEvent( | 890 GetWebView()->HandleInputEvent( |
892 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollUpdate, 0, -3000)); | 891 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollUpdate, 0, -3000)); |
893 EXPECT_EQ(1000 - 450, container_scroller->GetScrollOffset().Height()); | 892 EXPECT_EQ(1000 - 450, container_scroller->GetScrollOffset().Height()); |
894 | 893 |
895 GetWebViewImpl()->HandleInputEvent( | 894 GetWebView()->HandleInputEvent( |
896 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollEnd)); | 895 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollEnd)); |
897 GetWebViewImpl()->ResizeWithBrowserControls(IntSize(400, 450), 50, false); | 896 GetWebView()->ResizeWithBrowserControls(IntSize(400, 450), 50, false); |
898 EXPECT_EQ(1000 - 450, container_scroller->MaximumScrollOffset().Height()); | 897 EXPECT_EQ(1000 - 450, container_scroller->MaximumScrollOffset().Height()); |
899 } | 898 } |
900 | 899 |
901 TEST_F(RootScrollerTest, RotationAnchoring) { | 900 TEST_F(RootScrollerTest, RotationAnchoring) { |
902 Initialize("root-scroller-rotation.html"); | 901 Initialize("root-scroller-rotation.html"); |
903 | 902 |
904 ScrollableArea* container_scroller; | 903 ScrollableArea* container_scroller; |
905 | 904 |
906 { | 905 { |
907 GetWebViewImpl()->ResizeWithBrowserControls(IntSize(250, 1000), 0, true); | 906 GetWebView()->ResizeWithBrowserControls(IntSize(250, 1000), 0, true); |
908 MainFrameView()->UpdateAllLifecyclePhases(); | 907 MainFrameView()->UpdateAllLifecyclePhases(); |
909 | 908 |
910 Element* container = | 909 Element* container = |
911 MainFrame()->GetDocument()->getElementById("container"); | 910 MainFrame()->GetDocument()->getElementById("container"); |
912 NonThrowableExceptionState non_throw; | 911 NonThrowableExceptionState non_throw; |
913 MainFrame()->GetDocument()->setRootScroller(container, non_throw); | 912 MainFrame()->GetDocument()->setRootScroller(container, non_throw); |
914 MainFrameView()->UpdateAllLifecyclePhases(); | 913 MainFrameView()->UpdateAllLifecyclePhases(); |
915 | 914 |
916 container_scroller = static_cast<PaintInvalidationCapableScrollableArea*>( | 915 container_scroller = static_cast<PaintInvalidationCapableScrollableArea*>( |
917 ToLayoutBox(container->GetLayoutObject())->GetScrollableArea()); | 916 ToLayoutBox(container->GetLayoutObject())->GetScrollableArea()); |
918 } | 917 } |
919 | 918 |
920 Element* target = MainFrame()->GetDocument()->getElementById("target"); | 919 Element* target = MainFrame()->GetDocument()->getElementById("target"); |
921 | 920 |
922 // Zoom in and scroll the viewport so that the target is fully in the | 921 // Zoom in and scroll the viewport so that the target is fully in the |
923 // viewport and the visual viewport is fully scrolled within the layout | 922 // viewport and the visual viewport is fully scrolled within the layout |
924 // viepwort. | 923 // viepwort. |
925 { | 924 { |
926 int scroll_x = 250 * 4; | 925 int scroll_x = 250 * 4; |
927 int scroll_y = 1000 * 4; | 926 int scroll_y = 1000 * 4; |
928 | 927 |
929 GetWebViewImpl()->SetPageScaleFactor(2); | 928 GetWebView()->SetPageScaleFactor(2); |
930 GetWebViewImpl()->HandleInputEvent( | 929 GetWebView()->HandleInputEvent( |
931 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollBegin)); | 930 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollBegin)); |
932 GetWebViewImpl()->HandleInputEvent(GenerateTouchGestureEvent( | 931 GetWebView()->HandleInputEvent(GenerateTouchGestureEvent( |
933 WebInputEvent::kGestureScrollUpdate, -scroll_x, -scroll_y)); | 932 WebInputEvent::kGestureScrollUpdate, -scroll_x, -scroll_y)); |
934 GetWebViewImpl()->HandleInputEvent( | 933 GetWebView()->HandleInputEvent( |
935 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollEnd)); | 934 GenerateTouchGestureEvent(WebInputEvent::kGestureScrollEnd)); |
936 | 935 |
937 // The visual viewport should be 1.5 screens scrolled so that the target | 936 // The visual viewport should be 1.5 screens scrolled so that the target |
938 // occupies the bottom quadrant of the layout viewport. | 937 // occupies the bottom quadrant of the layout viewport. |
939 ASSERT_EQ((250 * 3) / 2, container_scroller->GetScrollOffset().Width()); | 938 ASSERT_EQ((250 * 3) / 2, container_scroller->GetScrollOffset().Width()); |
940 ASSERT_EQ((1000 * 3) / 2, container_scroller->GetScrollOffset().Height()); | 939 ASSERT_EQ((1000 * 3) / 2, container_scroller->GetScrollOffset().Height()); |
941 | 940 |
942 // The visual viewport should have scrolled the last half layout viewport. | 941 // The visual viewport should have scrolled the last half layout viewport. |
943 ASSERT_EQ((250) / 2, GetVisualViewport().GetScrollOffset().Width()); | 942 ASSERT_EQ((250) / 2, GetVisualViewport().GetScrollOffset().Width()); |
944 ASSERT_EQ((1000) / 2, GetVisualViewport().GetScrollOffset().Height()); | 943 ASSERT_EQ((1000) / 2, GetVisualViewport().GetScrollOffset().Height()); |
945 } | 944 } |
946 | 945 |
947 // Now do a rotation resize. | 946 // Now do a rotation resize. |
948 GetWebViewImpl()->ResizeWithBrowserControls(IntSize(1000, 250), 50, false); | 947 GetWebView()->ResizeWithBrowserControls(IntSize(1000, 250), 50, false); |
949 MainFrameView()->UpdateAllLifecyclePhases(); | 948 MainFrameView()->UpdateAllLifecyclePhases(); |
950 | 949 |
951 // The visual viewport should remain fully filled by the target. | 950 // The visual viewport should remain fully filled by the target. |
952 ClientRect* rect = target->getBoundingClientRect(); | 951 ClientRect* rect = target->getBoundingClientRect(); |
953 EXPECT_EQ(rect->left(), GetVisualViewport().GetScrollOffset().Width()); | 952 EXPECT_EQ(rect->left(), GetVisualViewport().GetScrollOffset().Width()); |
954 EXPECT_EQ(rect->top(), GetVisualViewport().GetScrollOffset().Height()); | 953 EXPECT_EQ(rect->top(), GetVisualViewport().GetScrollOffset().Height()); |
955 } | 954 } |
956 | 955 |
957 // Tests that we don't crash if the default documentElement isn't a valid root | 956 // Tests that we don't crash if the default documentElement isn't a valid root |
958 // scroller. This can happen in some edge cases where documentElement isn't | 957 // scroller. This can happen in some edge cases where documentElement isn't |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
998 // FrameView without a layout. | 997 // FrameView without a layout. |
999 iframe->remove(); | 998 iframe->remove(); |
1000 | 999 |
1001 EXPECT_EQ(MainFrameView()->LayoutViewportScrollableArea(), | 1000 EXPECT_EQ(MainFrameView()->LayoutViewportScrollableArea(), |
1002 &MainFrameView()->GetRootFrameViewport()->LayoutViewport()); | 1001 &MainFrameView()->GetRootFrameViewport()->LayoutViewport()); |
1003 } | 1002 } |
1004 | 1003 |
1005 } // namespace | 1004 } // namespace |
1006 | 1005 |
1007 } // namespace blink | 1006 } // namespace blink |
OLD | NEW |