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

Side by Side Diff: chrome/browser/apps/guest_view/web_view_browsertest.cc

Issue 1308273003: Resend unconsumed scroll update from guest back to embedder (WebView Scroll Bubble). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Refactor to avoid changing RenderWidgetHostImpl's interface. Created 5 years, 3 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
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 <queue> 5 #include <queue>
6 6
7 #include "base/location.h" 7 #include "base/location.h"
8 #include "base/path_service.h" 8 #include "base/path_service.h"
9 #include "base/process/process.h" 9 #include "base/process/process.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
(...skipping 20 matching lines...) Expand all
31 #include "components/content_settings/core/browser/host_content_settings_map.h" 31 #include "components/content_settings/core/browser/host_content_settings_map.h"
32 #include "components/guest_view/browser/guest_view_manager.h" 32 #include "components/guest_view/browser/guest_view_manager.h"
33 #include "components/guest_view/browser/guest_view_manager_delegate.h" 33 #include "components/guest_view/browser/guest_view_manager_delegate.h"
34 #include "components/guest_view/browser/guest_view_manager_factory.h" 34 #include "components/guest_view/browser/guest_view_manager_factory.h"
35 #include "components/guest_view/browser/test_guest_view_manager.h" 35 #include "components/guest_view/browser/test_guest_view_manager.h"
36 #include "content/public/browser/gpu_data_manager.h" 36 #include "content/public/browser/gpu_data_manager.h"
37 #include "content/public/browser/interstitial_page.h" 37 #include "content/public/browser/interstitial_page.h"
38 #include "content/public/browser/interstitial_page_delegate.h" 38 #include "content/public/browser/interstitial_page_delegate.h"
39 #include "content/public/browser/notification_service.h" 39 #include "content/public/browser/notification_service.h"
40 #include "content/public/browser/render_process_host.h" 40 #include "content/public/browser/render_process_host.h"
41 #include "content/public/browser/render_widget_host_view.h"
41 #include "content/public/browser/web_contents_delegate.h" 42 #include "content/public/browser/web_contents_delegate.h"
42 #include "content/public/common/child_process_host.h" 43 #include "content/public/common/child_process_host.h"
43 #include "content/public/common/content_switches.h" 44 #include "content/public/common/content_switches.h"
44 #include "content/public/test/browser_test_utils.h" 45 #include "content/public/test/browser_test_utils.h"
45 #include "content/public/test/fake_speech_recognition_manager.h" 46 #include "content/public/test/fake_speech_recognition_manager.h"
46 #include "content/public/test/test_renderer_host.h" 47 #include "content/public/test/test_renderer_host.h"
47 #include "extensions/browser/api/declarative/rules_registry.h" 48 #include "extensions/browser/api/declarative/rules_registry.h"
48 #include "extensions/browser/api/declarative/rules_registry_service.h" 49 #include "extensions/browser/api/declarative/rules_registry_service.h"
49 #include "extensions/browser/api/declarative/test_rules_registry.h" 50 #include "extensions/browser/api/declarative/test_rules_registry.h"
50 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" 51 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h"
51 #include "extensions/browser/api/extensions_api_client.h" 52 #include "extensions/browser/api/extensions_api_client.h"
52 #include "extensions/browser/app_window/native_app_window.h" 53 #include "extensions/browser/app_window/native_app_window.h"
53 #include "extensions/browser/guest_view/web_view/web_view_guest.h" 54 #include "extensions/browser/guest_view/web_view/web_view_guest.h"
54 #include "extensions/common/extension.h" 55 #include "extensions/common/extension.h"
55 #include "extensions/common/extensions_client.h" 56 #include "extensions/common/extensions_client.h"
56 #include "extensions/test/extension_test_message_listener.h" 57 #include "extensions/test/extension_test_message_listener.h"
57 #include "media/base/media_switches.h" 58 #include "media/base/media_switches.h"
58 #include "net/test/embedded_test_server/embedded_test_server.h" 59 #include "net/test/embedded_test_server/embedded_test_server.h"
59 #include "net/test/embedded_test_server/http_request.h" 60 #include "net/test/embedded_test_server/http_request.h"
60 #include "net/test/embedded_test_server/http_response.h" 61 #include "net/test/embedded_test_server/http_response.h"
61 #include "ui/aura/window.h" 62 #include "ui/aura/window.h"
62 #include "ui/base/l10n/l10n_util.h" 63 #include "ui/base/l10n/l10n_util.h"
63 #include "ui/compositor/compositor.h" 64 #include "ui/compositor/compositor.h"
64 #include "ui/compositor/compositor_observer.h" 65 #include "ui/compositor/compositor_observer.h"
65 #include "ui/events/event_switches.h" 66 #include "ui/events/event_switches.h"
67 #include "ui/events/gesture_detection/gesture_provider_config_helper.h"
68 #include "ui/events/test/event_generator.h"
66 #include "ui/gfx/switches.h" 69 #include "ui/gfx/switches.h"
67 #include "ui/gl/gl_switches.h" 70 #include "ui/gl/gl_switches.h"
68 #include "ui/views/view.h" 71 #include "ui/views/view.h"
69 #include "ui/views/widget/widget.h" 72 #include "ui/views/widget/widget.h"
70 73
71 #if defined(ENABLE_PLUGINS) 74 #if defined(ENABLE_PLUGINS)
72 #include "content/public/browser/plugin_service.h" 75 #include "content/public/browser/plugin_service.h"
73 #include "content/public/common/webplugininfo.h" 76 #include "content/public/common/webplugininfo.h"
74 #include "content/public/test/ppapi_test_utils.h" 77 #include "content/public/test/ppapi_test_utils.h"
75 #endif 78 #endif
(...skipping 2440 matching lines...) Expand 10 before | Expand all | Expand 10 after
2516 "web_view/shim", NEEDS_TEST_SERVER); 2519 "web_view/shim", NEEDS_TEST_SERVER);
2517 } 2520 }
2518 2521
2519 // Tests that a WebView accessible resource can actually be loaded from a 2522 // Tests that a WebView accessible resource can actually be loaded from a
2520 // webpage in a WebView. 2523 // webpage in a WebView.
2521 IN_PROC_BROWSER_TEST_F(WebViewTest, LoadWebviewAccessibleResource) { 2524 IN_PROC_BROWSER_TEST_F(WebViewTest, LoadWebviewAccessibleResource) {
2522 TestHelper("testLoadWebviewAccessibleResource", 2525 TestHelper("testLoadWebviewAccessibleResource",
2523 "web_view/load_webview_accessible_resource", NEEDS_TEST_SERVER); 2526 "web_view/load_webview_accessible_resource", NEEDS_TEST_SERVER);
2524 } 2527 }
2525 2528
2529 class WebViewTouchTest : public WebViewTest {
2530 protected:
2531 void SetUpCommandLine(base::CommandLine* command_line) override {
2532 command_line->AppendSwitchASCII(switches::kTouchEvents,
2533 switches::kTouchEventsEnabled);
2534
2535 WebViewTest::SetUpCommandLine(command_line);
2536 }
2537 };
2538
2539 namespace {
2540
2541 class ScrollWaiter {
2542 public:
2543 explicit ScrollWaiter(content::RenderWidgetHostView* host_view)
2544 : host_view_(host_view),
2545 current_offset_(host_view_->GetLastScrollOffset()) {}
2546 ~ScrollWaiter() {}
2547
2548 void WaitForScrollChange() {
2549 while (current_offset_ == host_view_->GetLastScrollOffset())
2550 base::MessageLoop::current()->RunUntilIdle();
2551 }
2552
2553 private:
2554 content::RenderWidgetHostView* host_view_;
2555 gfx::Vector2dF current_offset_;
2556 };
2557
2558 } // namespace
2559
2560 // Tests that scrolls bubble from guest to embedder.
2561 IN_PROC_BROWSER_TEST_F(WebViewTest, TestGuestWheelScrollsBubble) {
2562 LoadAppWithGuest("web_view/scrollable_embedder_and_guest");
2563
2564 content::WebContents* embedder_contents = GetEmbedderWebContents();
2565
2566 std::vector<content::WebContents*> guest_web_contents_list;
2567 GetGuestViewManager()->WaitForNumGuestsCreated(1u);
2568 GetGuestViewManager()->GetGuestWebContentsList(&guest_web_contents_list);
2569 ASSERT_EQ(1u, guest_web_contents_list.size());
2570
2571 content::WebContents* guest_contents = guest_web_contents_list[0];
2572
2573
2574 // Send scroll gesture to embedder & verify.
2575 content::RenderWidgetHostView* embedder_host_view =
2576 embedder_contents->GetRenderWidgetHostView();
2577 EXPECT_EQ(gfx::Vector2dF(), embedder_host_view->GetLastScrollOffset());
2578
2579 float scroll_magnitude = 15.f;
2580
2581 {
2582 gfx::Point embedder_scroll_start(200, 40 + scroll_magnitude);
2583 gfx::Point embedder_scroll_end(200, 40);
2584 gfx::Vector2dF expected_offset(0.f, scroll_magnitude);
2585
2586 ScrollWaiter waiter(embedder_host_view);
2587
2588 ui::test::EventGenerator generator(
2589 embedder_contents->GetTopLevelNativeWindow(), embedder_scroll_start);
2590 generator.MoveMouseToInHost(embedder_scroll_start);
2591 generator.MoveMouseWheel(0, -scroll_magnitude);
2592 waiter.WaitForScrollChange();
2593 EXPECT_EQ(expected_offset, embedder_host_view->GetLastScrollOffset());
2594 }
2595
2596 content::RenderWidgetHostView* guest_host_view =
2597 guest_contents->GetRenderWidgetHostView();
2598 EXPECT_EQ(gfx::Vector2dF(), guest_host_view->GetLastScrollOffset());
2599
2600 // Send scroll gesture to guest and verify embedder scrolls.
2601 // Perform a scroll gesture of the same magnitude, but in the opposite
2602 // direction and centered over the GuestView this time.
2603 {
2604 gfx::Point guest_scroll_start(200, 120);
2605 gfx::Point guest_scroll_end(200, 120 + scroll_magnitude);
2606 ScrollWaiter waiter(embedder_host_view);
2607
2608 ui::test::EventGenerator generator(
2609 embedder_contents->GetTopLevelNativeWindow(), guest_scroll_start);
2610 generator.MoveMouseToInHost(guest_scroll_start);
2611 generator.MoveMouseWheel(0, scroll_magnitude);
2612
2613 waiter.WaitForScrollChange();
2614 EXPECT_EQ(gfx::Vector2dF(), embedder_host_view->GetLastScrollOffset());
2615 }
2616 }
2617
2618 IN_PROC_BROWSER_TEST_F(WebViewTouchTest, TestGuestGestureScrollsBubble) {
2619 LoadAppWithGuest("web_view/scrollable_embedder_and_guest");
2620
2621 content::WebContents* embedder_contents = GetEmbedderWebContents();
2622
2623 std::vector<content::WebContents*> guest_web_contents_list;
2624 GetGuestViewManager()->WaitForNumGuestsCreated(1u);
2625 GetGuestViewManager()->GetGuestWebContentsList(&guest_web_contents_list);
2626 ASSERT_EQ(1u, guest_web_contents_list.size());
2627
2628 content::WebContents* guest_contents = guest_web_contents_list[0];
2629
2630 // Send scroll gesture to embedder & verify.
2631 content::RenderWidgetHostView* embedder_host_view =
2632 embedder_contents->GetRenderWidgetHostView();
2633 EXPECT_EQ(gfx::Vector2dF(), embedder_host_view->GetLastScrollOffset());
2634
2635 float touch_slop = ui::GetGestureProviderConfig(
2636 ui::GestureProviderConfigType::CURRENT_PLATFORM)
2637 .gesture_detector_config.touch_slop;
2638 float scroll_magnitude = 15.f;
2639 float gesture_distance = scroll_magnitude + touch_slop;
2640
2641 {
2642 gfx::Point embedder_scroll_start(200, 40 + gesture_distance);
2643 gfx::Point embedder_scroll_end(200, 40);
2644 gfx::Vector2dF expected_offset(0.f, scroll_magnitude);
2645
2646 ScrollWaiter waiter(embedder_host_view);
2647
2648 ui::test::EventGenerator generator(
2649 embedder_contents->GetTopLevelNativeWindow(), embedder_scroll_start);
2650 generator.GestureScrollSequence(embedder_scroll_start, embedder_scroll_end,
2651 base::TimeDelta::FromMilliseconds(100), 1);
2652 waiter.WaitForScrollChange();
2653 EXPECT_EQ(expected_offset, embedder_host_view->GetLastScrollOffset());
2654 }
2655
2656 content::RenderWidgetHostView* guest_host_view =
2657 guest_contents->GetRenderWidgetHostView();
2658 EXPECT_EQ(gfx::Vector2dF(), guest_host_view->GetLastScrollOffset());
2659
2660 // Send scroll gesture to guest and verify embedder scrolls.
2661 // Perform a scroll gesture of the same magnitude, but in the opposite
2662 // direction and centered over the GuestView this time.
2663 {
2664 gfx::Point guest_scroll_start(200, 120);
2665 gfx::Point guest_scroll_end(200, 120 + gesture_distance);
2666 ScrollWaiter waiter(embedder_host_view);
2667
2668 ui::test::EventGenerator generator(
2669 embedder_contents->GetTopLevelNativeWindow(), guest_scroll_start);
2670 generator.GestureScrollSequence(guest_scroll_start, guest_scroll_end,
2671 base::TimeDelta::FromMilliseconds(100), 1);
2672
2673 waiter.WaitForScrollChange();
2674 EXPECT_EQ(gfx::Vector2dF(), embedder_host_view->GetLastScrollOffset());
2675 }
2676 }
2677
2526 #if defined(USE_AURA) 2678 #if defined(USE_AURA)
2527 // TODO(wjmaclean): when WebViewTest is re-enabled on the site-isolation 2679 // TODO(wjmaclean): when WebViewTest is re-enabled on the site-isolation
2528 // bots, then re-enable this test class as well. 2680 // bots, then re-enable this test class as well.
2529 // https://crbug.com/503751 2681 // https://crbug.com/503751
2530 class WebViewFocusTest : public WebViewTest { 2682 class WebViewFocusTest : public WebViewTest {
2531 public: 2683 public:
2532 ~WebViewFocusTest() override {} 2684 ~WebViewFocusTest() override {}
2533 2685
2534 void SetUpCommandLine(base::CommandLine* command_line) override { 2686 void SetUpCommandLine(base::CommandLine* command_line) override {
2535 WebViewTest::SetUpCommandLine(command_line); 2687 WebViewTest::SetUpCommandLine(command_line);
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
2742 const task_management::Task* task = task_manager.tasks().back(); 2894 const task_management::Task* task = task_manager.tasks().back();
2743 EXPECT_EQ(task_management::Task::GUEST, task->GetType()); 2895 EXPECT_EQ(task_management::Task::GUEST, task->GetType());
2744 const base::string16 title = task->title(); 2896 const base::string16 title = task->title();
2745 const base::string16 expected_prefix = GetExpectedPrefix(guest_contents); 2897 const base::string16 expected_prefix = GetExpectedPrefix(guest_contents);
2746 EXPECT_TRUE(base::StartsWith(title, 2898 EXPECT_TRUE(base::StartsWith(title,
2747 expected_prefix, 2899 expected_prefix,
2748 base::CompareCase::INSENSITIVE_ASCII)); 2900 base::CompareCase::INSENSITIVE_ASCII));
2749 } 2901 }
2750 2902
2751 #endif // defined(ENABLE_TASK_MANAGER) 2903 #endif // defined(ENABLE_TASK_MANAGER)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698