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