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 #include <utility>
6
7 #include "base/bind.h"
8 #include "base/callback_helpers.h"
9 #include "base/macros.h"
10 #include "base/run_loop.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "content/browser/browser_interface_binders.h"
13 #include "content/public/browser/render_frame_host.h"
14 #include "content/public/browser/web_contents.h"
15 #include "content/public/test/browser_test.h"
16 #include "content/public/test/browser_test_utils.h"
17 #include "content/public/test/content_browser_test.h"
18 #include "content/public/test/content_browser_test_utils.h"
19 #include "content/shell/browser/shell.h"
20 #include "mojo/public/cpp/bindings/receiver.h"
21 #include "services/device/public/mojom/vibration_manager.mojom.h"
22
23 namespace content {
24
25 namespace {
26
27 class VibrationTest : public ContentBrowserTest,
28 public device::mojom::VibrationManager {
29 public:
VibrationTest()30 VibrationTest() {
31 OverrideVibrationManagerBinderForTesting(base::BindRepeating(
32 &VibrationTest::BindVibrationManager, base::Unretained(this)));
33 }
34
~VibrationTest()35 ~VibrationTest() override {
36 OverrideVibrationManagerBinderForTesting(base::NullCallback());
37 }
38
BindVibrationManager(mojo::PendingReceiver<device::mojom::VibrationManager> receiver)39 void BindVibrationManager(
40 mojo::PendingReceiver<device::mojom::VibrationManager> receiver) {
41 receiver_.Bind(std::move(receiver));
42 }
43
44 protected:
TriggerVibrate(int duration,base::OnceClosure vibrate_done)45 bool TriggerVibrate(int duration, base::OnceClosure vibrate_done) {
46 vibrate_done_ = std::move(vibrate_done);
47
48 bool result;
49 RenderFrameHost* frame = shell()->web_contents()->GetMainFrame();
50 std::string script = "domAutomationController.send(navigator.vibrate(" +
51 base::NumberToString(duration) + "))";
52 EXPECT_TRUE(ExecuteScriptAndExtractBool(frame, script, &result));
53 return result;
54 }
55
vibrate_milliseconds()56 int64_t vibrate_milliseconds() { return vibrate_milliseconds_; }
57
58 private:
59 // device::mojom::VibrationManager:
Vibrate(int64_t milliseconds,VibrateCallback callback)60 void Vibrate(int64_t milliseconds, VibrateCallback callback) override {
61 vibrate_milliseconds_ = milliseconds;
62 std::move(callback).Run();
63 std::move(vibrate_done_).Run();
64 }
Cancel(CancelCallback callback)65 void Cancel(CancelCallback callback) override { std::move(callback).Run(); }
66
67 int64_t vibrate_milliseconds_ = -1;
68 base::OnceClosure vibrate_done_;
69 mojo::Receiver<device::mojom::VibrationManager> receiver_{this};
70
71 DISALLOW_COPY_AND_ASSIGN(VibrationTest);
72 };
73
IN_PROC_BROWSER_TEST_F(VibrationTest,Vibrate)74 IN_PROC_BROWSER_TEST_F(VibrationTest, Vibrate) {
75 ASSERT_EQ(-1, vibrate_milliseconds());
76
77 ASSERT_TRUE(NavigateToURL(shell(), GetTestUrl(".", "simple_page.html")));
78 base::RunLoop run_loop;
79 ASSERT_TRUE(TriggerVibrate(1234, run_loop.QuitClosure()));
80 run_loop.Run();
81
82 ASSERT_EQ(1234, vibrate_milliseconds());
83 }
84
85 } // namespace
86
87 } // namespace content
88