| 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 <memory> | 5 #include <memory> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 | 27 |
| 28 constexpr char kTargetName[] = "Share Target"; | 28 constexpr char kTargetName[] = "Share Target"; |
| 29 constexpr char kUrlTemplate[] = "share?title={title}&text={text}&url={url}"; | 29 constexpr char kUrlTemplate[] = "share?title={title}&text={text}&url={url}"; |
| 30 constexpr char kManifestUrlHigh[] = | 30 constexpr char kManifestUrlHigh[] = |
| 31 "https://www.example-high.com/target/manifest.json"; | 31 "https://www.example-high.com/target/manifest.json"; |
| 32 constexpr char kManifestUrlLow[] = | 32 constexpr char kManifestUrlLow[] = |
| 33 "https://www.example-low.com/target/manifest.json"; | 33 "https://www.example-low.com/target/manifest.json"; |
| 34 constexpr char kManifestUrlMin[] = | 34 constexpr char kManifestUrlMin[] = |
| 35 "https://www.example-min.com/target/manifest.json"; | 35 "https://www.example-min.com/target/manifest.json"; |
| 36 | 36 |
| 37 void DidShare(const base::Optional<std::string>& expected_error, | 37 void DidShare(blink::mojom::ShareError expected_error, |
| 38 const base::Optional<std::string>& error) { | 38 blink::mojom::ShareError error) { |
| 39 EXPECT_EQ(expected_error, error); | 39 EXPECT_EQ(expected_error, error); |
| 40 } | 40 } |
| 41 | 41 |
| 42 class ShareServiceTestImpl : public ShareServiceImpl { | 42 class ShareServiceTestImpl : public ShareServiceImpl { |
| 43 public: | 43 public: |
| 44 explicit ShareServiceTestImpl(blink::mojom::ShareServiceRequest request) | 44 explicit ShareServiceTestImpl(blink::mojom::ShareServiceRequest request) |
| 45 : binding_(this) { | 45 : binding_(this) { |
| 46 binding_.Bind(std::move(request)); | 46 binding_.Bind(std::move(request)); |
| 47 | 47 |
| 48 pref_service_.reset(new TestingPrefServiceSimple()); | 48 pref_service_.reset(new TestingPrefServiceSimple()); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 } // namespace | 168 } // namespace |
| 169 | 169 |
| 170 // Basic test to check the Share method calls the callback with the expected | 170 // Basic test to check the Share method calls the callback with the expected |
| 171 // parameters. | 171 // parameters. |
| 172 TEST_F(ShareServiceImplUnittest, ShareCallbackParams) { | 172 TEST_F(ShareServiceImplUnittest, ShareCallbackParams) { |
| 173 share_service_helper()->AddShareTargetToPrefs(kManifestUrlLow, kTargetName, | 173 share_service_helper()->AddShareTargetToPrefs(kManifestUrlLow, kTargetName, |
| 174 kUrlTemplate); | 174 kUrlTemplate); |
| 175 share_service_helper()->AddShareTargetToPrefs(kManifestUrlHigh, kTargetName, | 175 share_service_helper()->AddShareTargetToPrefs(kManifestUrlHigh, kTargetName, |
| 176 kUrlTemplate); | 176 kUrlTemplate); |
| 177 | 177 |
| 178 base::Callback<void(const base::Optional<std::string>&)> callback = | 178 base::Callback<void(blink::mojom::ShareError)> callback = |
| 179 base::Bind(&DidShare, base::Optional<std::string>()); | 179 base::Bind(&DidShare, blink::mojom::ShareError::OK); |
| 180 | 180 |
| 181 base::RunLoop run_loop; | 181 base::RunLoop run_loop; |
| 182 share_service_helper()->set_run_loop(&run_loop); | 182 share_service_helper()->set_run_loop(&run_loop); |
| 183 | 183 |
| 184 const GURL url(kUrlSpec); | 184 const GURL url(kUrlSpec); |
| 185 share_service()->Share(kTitle, kText, url, callback); | 185 share_service()->Share(kTitle, kText, url, callback); |
| 186 | 186 |
| 187 run_loop.Run(); | 187 run_loop.Run(); |
| 188 | 188 |
| 189 const std::vector<std::pair<base::string16, GURL>> kExpectedTargets{ | 189 const std::vector<std::pair<base::string16, GURL>> kExpectedTargets{ |
| 190 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlHigh)), | 190 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlHigh)), |
| 191 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlLow))}; | 191 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlLow))}; |
| 192 EXPECT_EQ(kExpectedTargets, share_service_helper()->GetTargetsInPicker()); | 192 EXPECT_EQ(kExpectedTargets, share_service_helper()->GetTargetsInPicker()); |
| 193 | 193 |
| 194 // Pick example-low.com. | 194 // Pick example-low.com. |
| 195 share_service_helper()->picker_callback().Run( | 195 share_service_helper()->picker_callback().Run( |
| 196 base::Optional<std::string>(kManifestUrlLow)); | 196 base::Optional<std::string>(kManifestUrlLow)); |
| 197 | 197 |
| 198 const char kExpectedURL[] = | 198 const char kExpectedURL[] = |
| 199 "https://www.example-low.com/target/" | 199 "https://www.example-low.com/target/" |
| 200 "share?title=My%20title&text=My%20text&url=https%3A%2F%2Fwww." | 200 "share?title=My%20title&text=My%20text&url=https%3A%2F%2Fwww." |
| 201 "google.com%2F"; | 201 "google.com%2F"; |
| 202 EXPECT_EQ(kExpectedURL, share_service_helper()->GetLastUsedTargetURL()); | 202 EXPECT_EQ(kExpectedURL, share_service_helper()->GetLastUsedTargetURL()); |
| 203 } | 203 } |
| 204 | 204 |
| 205 // Tests the result of cancelling the share in the picker UI, that doesn't have | 205 // Tests the result of cancelling the share in the picker UI, that doesn't have |
| 206 // any targets. | 206 // any targets. |
| 207 TEST_F(ShareServiceImplUnittest, ShareCancelNoTargets) { | 207 TEST_F(ShareServiceImplUnittest, ShareCancelNoTargets) { |
| 208 // Expect an error message in response. | 208 // Expect an error message in response. |
| 209 base::Callback<void(const base::Optional<std::string>&)> callback = | 209 base::Callback<void(blink::mojom::ShareError)> callback = |
| 210 base::Bind(&DidShare, base::Optional<std::string>("Share was cancelled")); | 210 base::Bind(&DidShare, blink::mojom::ShareError::CANCELED); |
| 211 | 211 |
| 212 base::RunLoop run_loop; | 212 base::RunLoop run_loop; |
| 213 share_service_helper()->set_run_loop(&run_loop); | 213 share_service_helper()->set_run_loop(&run_loop); |
| 214 | 214 |
| 215 const GURL url(kUrlSpec); | 215 const GURL url(kUrlSpec); |
| 216 share_service()->Share(kTitle, kText, url, callback); | 216 share_service()->Share(kTitle, kText, url, callback); |
| 217 | 217 |
| 218 run_loop.Run(); | 218 run_loop.Run(); |
| 219 | 219 |
| 220 EXPECT_TRUE(share_service_helper()->GetTargetsInPicker().empty()); | 220 EXPECT_TRUE(share_service_helper()->GetTargetsInPicker().empty()); |
| 221 | 221 |
| 222 // Cancel the dialog. | 222 // Cancel the dialog. |
| 223 share_service_helper()->picker_callback().Run(base::nullopt); | 223 share_service_helper()->picker_callback().Run(base::nullopt); |
| 224 | 224 |
| 225 EXPECT_TRUE(share_service_helper()->GetLastUsedTargetURL().empty()); | 225 EXPECT_TRUE(share_service_helper()->GetLastUsedTargetURL().empty()); |
| 226 } | 226 } |
| 227 | 227 |
| 228 // Tests the result of cancelling the share in the picker UI, that has targets. | 228 // Tests the result of cancelling the share in the picker UI, that has targets. |
| 229 TEST_F(ShareServiceImplUnittest, ShareCancelWithTargets) { | 229 TEST_F(ShareServiceImplUnittest, ShareCancelWithTargets) { |
| 230 share_service_helper()->AddShareTargetToPrefs(kManifestUrlHigh, kTargetName, | 230 share_service_helper()->AddShareTargetToPrefs(kManifestUrlHigh, kTargetName, |
| 231 kUrlTemplate); | 231 kUrlTemplate); |
| 232 share_service_helper()->AddShareTargetToPrefs(kManifestUrlLow, kTargetName, | 232 share_service_helper()->AddShareTargetToPrefs(kManifestUrlLow, kTargetName, |
| 233 kUrlTemplate); | 233 kUrlTemplate); |
| 234 | 234 |
| 235 // Expect an error message in response. | 235 // Expect an error message in response. |
| 236 base::Callback<void(const base::Optional<std::string>&)> callback = | 236 base::Callback<void(blink::mojom::ShareError)> callback = |
| 237 base::Bind(&DidShare, base::Optional<std::string>("Share was cancelled")); | 237 base::Bind(&DidShare, blink::mojom::ShareError::CANCELED); |
| 238 | 238 |
| 239 base::RunLoop run_loop; | 239 base::RunLoop run_loop; |
| 240 share_service_helper()->set_run_loop(&run_loop); | 240 share_service_helper()->set_run_loop(&run_loop); |
| 241 | 241 |
| 242 const GURL url(kUrlSpec); | 242 const GURL url(kUrlSpec); |
| 243 share_service()->Share(kTitle, kText, url, callback); | 243 share_service()->Share(kTitle, kText, url, callback); |
| 244 | 244 |
| 245 run_loop.Run(); | 245 run_loop.Run(); |
| 246 | 246 |
| 247 const std::vector<std::pair<base::string16, GURL>> kExpectedTargets{ | 247 const std::vector<std::pair<base::string16, GURL>> kExpectedTargets{ |
| 248 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlHigh)), | 248 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlHigh)), |
| 249 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlLow))}; | 249 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlLow))}; |
| 250 EXPECT_EQ(kExpectedTargets, share_service_helper()->GetTargetsInPicker()); | 250 EXPECT_EQ(kExpectedTargets, share_service_helper()->GetTargetsInPicker()); |
| 251 | 251 |
| 252 // Cancel the dialog. | 252 // Cancel the dialog. |
| 253 share_service_helper()->picker_callback().Run(base::nullopt); | 253 share_service_helper()->picker_callback().Run(base::nullopt); |
| 254 | 254 |
| 255 EXPECT_TRUE(share_service_helper()->GetLastUsedTargetURL().empty()); | 255 EXPECT_TRUE(share_service_helper()->GetLastUsedTargetURL().empty()); |
| 256 } | 256 } |
| 257 | 257 |
| 258 // Tests a target with a broken URL template (ReplacePlaceholders failure). | 258 // Tests a target with a broken URL template (ReplacePlaceholders failure). |
| 259 TEST_F(ShareServiceImplUnittest, ShareBrokenUrl) { | 259 TEST_F(ShareServiceImplUnittest, ShareBrokenUrl) { |
| 260 // Invalid placeholders. Detailed tests for broken templates are in the | 260 // Invalid placeholders. Detailed tests for broken templates are in the |
| 261 // ReplacePlaceholders test; this just tests the share response. | 261 // ReplacePlaceholders test; this just tests the share response. |
| 262 constexpr char kBrokenUrlTemplate[] = "share?title={title"; | 262 constexpr char kBrokenUrlTemplate[] = "share?title={title"; |
| 263 share_service_helper()->AddShareTargetToPrefs(kManifestUrlHigh, kTargetName, | 263 share_service_helper()->AddShareTargetToPrefs(kManifestUrlHigh, kTargetName, |
| 264 kBrokenUrlTemplate); | 264 kBrokenUrlTemplate); |
| 265 | 265 |
| 266 // Expect an error message in response. | 266 // Expect an error message in response. |
| 267 base::Callback<void(const base::Optional<std::string>&)> callback = | 267 base::Callback<void(blink::mojom::ShareError)> callback = |
| 268 base::Bind(&DidShare, | 268 base::Bind(&DidShare, blink::mojom::ShareError::INTERNAL_ERROR); |
| 269 base::Optional<std::string>( | |
| 270 "Error: unable to replace placeholders in url template")); | |
| 271 | 269 |
| 272 base::RunLoop run_loop; | 270 base::RunLoop run_loop; |
| 273 share_service_helper()->set_run_loop(&run_loop); | 271 share_service_helper()->set_run_loop(&run_loop); |
| 274 | 272 |
| 275 const GURL url(kUrlSpec); | 273 const GURL url(kUrlSpec); |
| 276 share_service()->Share(kTitle, kText, url, callback); | 274 share_service()->Share(kTitle, kText, url, callback); |
| 277 | 275 |
| 278 run_loop.Run(); | 276 run_loop.Run(); |
| 279 | 277 |
| 280 const std::vector<std::pair<base::string16, GURL>> kExpectedTargets{ | 278 const std::vector<std::pair<base::string16, GURL>> kExpectedTargets{ |
| 281 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlHigh))}; | 279 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlHigh))}; |
| 282 EXPECT_EQ(kExpectedTargets, share_service_helper()->GetTargetsInPicker()); | 280 EXPECT_EQ(kExpectedTargets, share_service_helper()->GetTargetsInPicker()); |
| 283 | 281 |
| 284 // Pick example-high.com. | 282 // Pick example-high.com. |
| 285 share_service_helper()->picker_callback().Run( | 283 share_service_helper()->picker_callback().Run( |
| 286 base::Optional<std::string>(kManifestUrlHigh)); | 284 base::Optional<std::string>(kManifestUrlHigh)); |
| 287 | 285 |
| 288 EXPECT_TRUE(share_service_helper()->GetLastUsedTargetURL().empty()); | 286 EXPECT_TRUE(share_service_helper()->GetLastUsedTargetURL().empty()); |
| 289 } | 287 } |
| 290 | 288 |
| 291 // Test to check that only targets with enough engagement were in picker. | 289 // Test to check that only targets with enough engagement were in picker. |
| 292 TEST_F(ShareServiceImplUnittest, ShareWithSomeInsufficientlyEngagedTargets) { | 290 TEST_F(ShareServiceImplUnittest, ShareWithSomeInsufficientlyEngagedTargets) { |
| 293 share_service_helper()->AddShareTargetToPrefs(kManifestUrlMin, kTargetName, | 291 share_service_helper()->AddShareTargetToPrefs(kManifestUrlMin, kTargetName, |
| 294 kUrlTemplate); | 292 kUrlTemplate); |
| 295 share_service_helper()->AddShareTargetToPrefs(kManifestUrlLow, kTargetName, | 293 share_service_helper()->AddShareTargetToPrefs(kManifestUrlLow, kTargetName, |
| 296 kUrlTemplate); | 294 kUrlTemplate); |
| 297 | 295 |
| 298 base::Callback<void(const base::Optional<std::string>&)> callback = | 296 base::Callback<void(blink::mojom::ShareError)> callback = |
| 299 base::Bind(&DidShare, base::Optional<std::string>()); | 297 base::Bind(&DidShare, blink::mojom::ShareError::OK); |
| 300 | 298 |
| 301 base::RunLoop run_loop; | 299 base::RunLoop run_loop; |
| 302 share_service_helper()->set_run_loop(&run_loop); | 300 share_service_helper()->set_run_loop(&run_loop); |
| 303 | 301 |
| 304 const GURL url(kUrlSpec); | 302 const GURL url(kUrlSpec); |
| 305 share_service()->Share(kTitle, kText, url, callback); | 303 share_service()->Share(kTitle, kText, url, callback); |
| 306 | 304 |
| 307 run_loop.Run(); | 305 run_loop.Run(); |
| 308 | 306 |
| 309 const std::vector<std::pair<base::string16, GURL>> kExpectedTargets{ | 307 const std::vector<std::pair<base::string16, GURL>> kExpectedTargets{ |
| (...skipping 18 matching lines...) Expand all Loading... |
| 328 kUrlTemplate); | 326 kUrlTemplate); |
| 329 | 327 |
| 330 base::RunLoop run_loop; | 328 base::RunLoop run_loop; |
| 331 share_service_helper()->set_run_loop(&run_loop); | 329 share_service_helper()->set_run_loop(&run_loop); |
| 332 | 330 |
| 333 const GURL url(kUrlSpec); | 331 const GURL url(kUrlSpec); |
| 334 // Expect the callback to never be called (since the share service is | 332 // Expect the callback to never be called (since the share service is |
| 335 // destroyed before the picker is closed). | 333 // destroyed before the picker is closed). |
| 336 // TODO(mgiuca): This probably should still complete the share, if not | 334 // TODO(mgiuca): This probably should still complete the share, if not |
| 337 // cancelled, even if the underlying tab is closed. | 335 // cancelled, even if the underlying tab is closed. |
| 338 base::Callback<void(const base::Optional<std::string>&)> callback = | 336 base::Callback<void(blink::mojom::ShareError)> callback = |
| 339 base::Bind([](const base::Optional<std::string>& error) { FAIL(); }); | 337 base::Bind([](blink::mojom::ShareError error) { FAIL(); }); |
| 340 share_service()->Share(kTitle, kText, url, callback); | 338 share_service()->Share(kTitle, kText, url, callback); |
| 341 | 339 |
| 342 run_loop.Run(); | 340 run_loop.Run(); |
| 343 | 341 |
| 344 const std::vector<std::pair<base::string16, GURL>> kExpectedTargets{ | 342 const std::vector<std::pair<base::string16, GURL>> kExpectedTargets{ |
| 345 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlLow))}; | 343 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlLow))}; |
| 346 EXPECT_EQ(kExpectedTargets, share_service_helper()->GetTargetsInPicker()); | 344 EXPECT_EQ(kExpectedTargets, share_service_helper()->GetTargetsInPicker()); |
| 347 | 345 |
| 348 const base::Callback<void(base::Optional<std::string>)> picker_callback = | 346 const base::Callback<void(base::Optional<std::string>)> picker_callback = |
| 349 share_service_helper()->picker_callback(); | 347 share_service_helper()->picker_callback(); |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 EXPECT_TRUE(succeeded); | 548 EXPECT_TRUE(succeeded); |
| 551 EXPECT_EQ("%C3%A9", url_template_filled); | 549 EXPECT_EQ("%C3%A9", url_template_filled); |
| 552 | 550 |
| 553 // U+1F4A9 | 551 // U+1F4A9 |
| 554 url_template = "{title}"; | 552 url_template = "{title}"; |
| 555 succeeded = ShareServiceImpl::ReplacePlaceholders( | 553 succeeded = ShareServiceImpl::ReplacePlaceholders( |
| 556 url_template, "\xf0\x9f\x92\xa9", kText, url, &url_template_filled); | 554 url_template, "\xf0\x9f\x92\xa9", kText, url, &url_template_filled); |
| 557 EXPECT_TRUE(succeeded); | 555 EXPECT_TRUE(succeeded); |
| 558 EXPECT_EQ("%F0%9F%92%A9", url_template_filled); | 556 EXPECT_EQ("%F0%9F%92%A9", url_template_filled); |
| 559 } | 557 } |
| OLD | NEW |