OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/safe_browsing/permission_reporter.h" | |
6 | |
7 #include "base/command_line.h" | |
8 #include "base/memory/ptr_util.h" | |
9 #include "base/memory/ref_counted.h" | |
10 #include "base/test/simple_test_clock.h" | |
11 #include "chrome/browser/browser_process.h" | |
12 #include "chrome/browser/safe_browsing/ping_manager.h" | |
13 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | |
14 #include "chrome/browser/ui/browser.h" | |
15 #include "chrome/common/chrome_switches.h" | |
16 #include "chrome/common/safe_browsing/permission_report.pb.h" | |
17 #include "chrome/test/base/in_process_browser_test.h" | |
18 #include "chrome/test/base/ui_test_utils.h" | |
19 #include "content/public/browser/browser_thread.h" | |
20 #include "net/url_request/report_sender.h" | |
21 | |
22 #if !defined(OS_ANDROID) | |
kcarattini
2016/07/20 03:59:22
With all these directives it might make sense to h
stefanocs
2016/07/20 04:47:26
I think there would be too much intersecting code
| |
23 #include "chrome/browser/permissions/permission_request_manager.h" | |
24 #include "chrome/browser/ui/tabs/tab_strip_model.h" | |
25 #include "chrome/browser/ui/website_settings/mock_permission_bubble_factory.h" | |
26 #endif | |
27 | |
28 #if !defined(OS_CHROMEOS) | |
29 #include "chrome/browser/signin/signin_manager_factory.h" | |
30 #include "components/signin/core/browser/signin_manager.h" | |
31 #endif | |
32 | |
33 namespace safe_browsing { | |
34 | |
35 namespace { | |
36 #if !defined(OS_CHROMEOS) | |
37 constexpr char kTestingGaiaId[] = "gaia_id"; | |
38 constexpr char kTestingUsername[] = "fake_username"; | |
raymes
2016/07/25 04:31:40
nit: just move these down to the place where they
stefanocs
2016/07/25 12:44:05
Done.
| |
39 #endif | |
40 | |
41 // A mock ReportSender that keeps track of the last report sent. | |
42 class MockReportSender : public net::ReportSender { | |
raymes
2016/07/25 04:31:40
Can we factor this out into a separate file? It lo
stefanocs
2016/07/25 12:44:05
Where would be an appropriate place for this? net/
raymes
2016/07/26 00:45:02
chrome/browser/safe_browsing/ should be fine
stefanocs
2016/07/26 01:48:58
Done.
| |
43 public: | |
44 MockReportSender() : net::ReportSender(nullptr, DO_NOT_SEND_COOKIES) { | |
45 number_of_reports_sent_ = 0; | |
46 } | |
47 | |
48 ~MockReportSender() override {} | |
49 | |
50 void Send(const GURL& report_uri, const std::string& report) override { | |
51 number_of_reports_sent_++; | |
52 latest_report_uri_ = report_uri; | |
53 latest_report_ = report; | |
54 } | |
55 | |
56 int number_of_reports_sent() { return number_of_reports_sent_; } | |
57 | |
58 const GURL& latest_report_uri() { return latest_report_uri_; } | |
59 | |
60 const std::string& latest_report() { return latest_report_; } | |
61 | |
62 private: | |
63 int number_of_reports_sent_; | |
64 GURL latest_report_uri_; | |
65 std::string latest_report_; | |
66 | |
67 DISALLOW_COPY_AND_ASSIGN(MockReportSender); | |
68 }; | |
69 | |
70 } // namespace | |
71 | |
72 class PermissionReporterBrowserTest : public InProcessBrowserTest { | |
raymes
2016/07/25 04:31:40
Can we have a base class PermissionReporterBrowser
stefanocs
2016/07/25 12:44:05
Done.
| |
73 protected: | |
74 PermissionReporterBrowserTest() = default; | |
75 ~PermissionReporterBrowserTest() override = default; | |
raymes
2016/07/25 04:31:40
nit: are these actually needed?
stefanocs
2016/07/25 12:44:05
Done.
| |
76 | |
77 void SetUpOnMainThread() override { | |
78 InProcessBrowserTest::SetUpOnMainThread(); | |
79 | |
80 mock_report_sender_ = new MockReportSender; | |
raymes
2016/07/25 04:31:40
nit: perhaps create this in AttachMockReportSender
stefanocs
2016/07/25 12:44:05
Done.
| |
81 | |
82 base::RunLoop run_loop; | |
83 content::BrowserThread::PostTaskAndReply( | |
84 content::BrowserThread::IO, FROM_HERE, | |
85 base::Bind( | |
86 &PermissionReporterBrowserTest::AttachMockReportSenderOnIOThread, | |
87 this, | |
88 make_scoped_refptr(g_browser_process->safe_browsing_service())), | |
89 run_loop.QuitClosure()); | |
90 run_loop.Run(); | |
91 | |
92 #if !defined(OS_ANDROID) | |
93 PermissionRequestManager* manager = GetPermissionRequestManager(); | |
94 mock_permission_bubble_factory_.reset( | |
95 new MockPermissionBubbleFactory(manager)); | |
96 manager->DisplayPendingRequests(); | |
97 #else | |
98 InfoBarService::CreateForWebContents( | |
99 browser()->tab_strip_model()->GetActiveWebContents()); | |
raymes
2016/07/25 04:31:40
Is this actually needed? I see it only in unittest
stefanocs
2016/07/25 12:44:05
I'm not sure. Actually I haven't tested this on An
| |
100 #endif | |
101 | |
102 #if !defined(OS_CHROMEOS) | |
103 SigninManager* signin_manager = | |
104 SigninManagerFactory::GetForProfile(browser()->profile()); | |
105 signin_manager->SetAuthenticatedAccountInfo(kTestingGaiaId, | |
106 kTestingUsername); | |
107 #endif | |
108 } | |
109 | |
110 void TearDownOnMainThread() override { | |
111 InProcessBrowserTest::TearDownOnMainThread(); | |
112 #if !defined(OS_ANDROID) | |
113 mock_permission_bubble_factory_.reset(); | |
114 #endif | |
115 } | |
116 | |
117 void AttachMockReportSenderOnIOThread( | |
118 scoped_refptr<SafeBrowsingService> safe_browsing_service) { | |
119 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | |
120 | |
121 safe_browsing_service->ping_manager()->permission_reporter_.reset( | |
122 new PermissionReporter(base::WrapUnique(mock_report_sender_), | |
123 base::WrapUnique(new base::SimpleTestClock))); | |
124 } | |
125 | |
126 void SetUpCommandLine(base::CommandLine* command_line) override { | |
raymes
2016/07/25 04:31:40
nit: move this up closer to TearDown
stefanocs
2016/07/25 12:44:05
Done.
| |
127 command_line->AppendSwitch(switches::kEnablePermissionActionReporting); | |
128 } | |
129 | |
130 #if !defined(OS_ANDROID) | |
131 PermissionRequestManager* GetPermissionRequestManager() { | |
132 return PermissionRequestManager::FromWebContents( | |
133 browser()->tab_strip_model()->GetActiveWebContents()); | |
134 } | |
135 | |
136 MockPermissionBubbleFactory* bubble_factory() { | |
137 return mock_permission_bubble_factory_.get(); | |
138 } | |
139 #else | |
140 InfoBarService* GetInfobarService() { | |
141 return InfoBarService::FromWebContents( | |
142 browser()->tab_strip_model()->GetActiveWebContents()); | |
143 } | |
144 #endif | |
145 | |
146 void AcceptRequest() { | |
147 #if !defined(OS_ANDROID) | |
148 GetPermissionRequestManager()->Accept(); | |
149 #else | |
150 infobars::InfoBar* infobar = GetInfobarService()->infobar_at( | |
151 GetInfobarService()->GetActiveEntryID()); | |
152 ConfirmInfoBarDelegate* infobar_delegate = | |
153 infobar->delegate()->AsConfirmInfoBarDelegate(); | |
154 infobar_delegate->Accept(); | |
155 #endif | |
156 } | |
157 | |
158 MockReportSender* mock_report_sender() { return mock_report_sender_; } | |
159 | |
160 private: | |
161 #if !defined(OS_ANDROID) | |
162 std::unique_ptr<MockPermissionBubbleFactory> mock_permission_bubble_factory_; | |
163 #endif | |
164 | |
165 // Owned by permission reporter. | |
166 MockReportSender* mock_report_sender_; | |
167 }; | |
168 | |
169 // Test that permission action report will be sent if the user is opted into it. | |
170 IN_PROC_BROWSER_TEST_F(PermissionReporterBrowserTest, | |
171 PermissionActionReporting) { | |
raymes
2016/07/25 04:31:40
We can have separate tests for android/desktop. A
stefanocs
2016/07/25 12:44:05
Done.
| |
172 ASSERT_TRUE(embedded_test_server()->Start()); | |
173 | |
174 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | |
175 browser(), embedded_test_server()->GetURL("/permissions/request.html"), | |
176 1); | |
177 | |
178 #if !defined(OS_ANDROID) | |
179 bubble_factory()->WaitForPermissionBubble(); | |
180 EXPECT_TRUE(bubble_factory()->is_visible()); | |
181 #else | |
182 EXPECT_EQ(1U, GetInfobarService()->infobar_count()); | |
183 #endif | |
184 | |
185 AcceptRequest(); | |
186 | |
187 #if !defined(OS_ANDROID) | |
188 EXPECT_FALSE(bubble_factory()->is_visible()); | |
189 #else | |
190 EXPECT_EQ(0U, GetInfobarService()->infobar_count()); | |
191 #endif | |
192 | |
193 EXPECT_EQ(1, mock_report_sender()->number_of_reports_sent()); | |
194 | |
195 PermissionReport permission_report; | |
196 ASSERT_TRUE( | |
197 permission_report.ParseFromString(mock_report_sender()->latest_report())); | |
198 EXPECT_EQ(PermissionReport::GEOLOCATION, permission_report.permission()); | |
199 EXPECT_EQ(PermissionReport::GRANTED, permission_report.action()); | |
200 EXPECT_EQ(embedded_test_server()->base_url().spec(), | |
201 permission_report.origin()); | |
202 #if defined(OS_ANDROID) | |
203 EXPECT_EQ(PermissionReport::ANDROID_PLATFORM, | |
204 permission_report.platform_type()); | |
205 #elif defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_CHROMEOS) || \ | |
206 defined(OS_LINUX) | |
207 EXPECT_EQ(PermissionReport::DESKTOP_PLATFORM, | |
208 permission_report.platform_type()); | |
209 #endif | |
210 } | |
211 | |
212 } // namespace safe_browsing | |
OLD | NEW |