Index: chrome/browser/services/gcm/push_messaging_browsertest.cc |
diff --git a/chrome/browser/services/gcm/push_messaging_browsertest.cc b/chrome/browser/services/gcm/push_messaging_browsertest.cc |
deleted file mode 100644 |
index 2baa4893d79d91f680f0e1ae37f06504c77f9740..0000000000000000000000000000000000000000 |
--- a/chrome/browser/services/gcm/push_messaging_browsertest.cc |
+++ /dev/null |
@@ -1,1013 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <map> |
-#include <string> |
- |
-#include "base/bind.h" |
-#include "base/command_line.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "chrome/browser/infobars/infobar_service.h" |
-#include "chrome/browser/notifications/notification_test_util.h" |
-#include "chrome/browser/notifications/platform_notification_service_impl.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/services/gcm/fake_gcm_profile_service.h" |
-#include "chrome/browser/services/gcm/gcm_profile_service_factory.h" |
-#include "chrome/browser/services/gcm/push_messaging_application_id.h" |
-#include "chrome/browser/services/gcm/push_messaging_constants.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/tabs/tab_strip_model.h" |
-#include "chrome/test/base/in_process_browser_test.h" |
-#include "chrome/test/base/ui_test_utils.h" |
-#include "components/content_settings/core/browser/host_content_settings_map.h" |
-#include "components/content_settings/core/common/content_settings.h" |
-#include "components/content_settings/core/common/content_settings_types.h" |
-#include "components/gcm_driver/gcm_client.h" |
-#include "components/infobars/core/confirm_infobar_delegate.h" |
-#include "components/infobars/core/infobar.h" |
-#include "components/infobars/core/infobar_manager.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/common/content_switches.h" |
-#include "content/public/test/browser_test_utils.h" |
-#include "ui/base/window_open_disposition.h" |
- |
-#if defined(OS_ANDROID) |
-#include "base/android/build_info.h" |
-#endif |
- |
-namespace gcm { |
- |
-namespace { |
-// Responds to a confirm infobar by accepting or cancelling it. Responds to at |
-// most one infobar. |
-class InfoBarResponder : public infobars::InfoBarManager::Observer { |
- public: |
- InfoBarResponder(Browser* browser, bool accept) |
- : infobar_service_(InfoBarService::FromWebContents( |
- browser->tab_strip_model()->GetActiveWebContents())), |
- accept_(accept), |
- has_observed_(false) { |
- infobar_service_->AddObserver(this); |
- } |
- |
- ~InfoBarResponder() override { infobar_service_->RemoveObserver(this); } |
- |
- // infobars::InfoBarManager::Observer |
- void OnInfoBarAdded(infobars::InfoBar* infobar) override { |
- if (has_observed_) |
- return; |
- has_observed_ = true; |
- ConfirmInfoBarDelegate* delegate = |
- infobar->delegate()->AsConfirmInfoBarDelegate(); |
- DCHECK(delegate); |
- |
- // Respond to the infobar asynchronously, like a person. |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind( |
- &InfoBarResponder::Respond, base::Unretained(this), delegate)); |
- } |
- |
- private: |
- void Respond(ConfirmInfoBarDelegate* delegate) { |
- if (accept_) { |
- delegate->Accept(); |
- } else { |
- delegate->Cancel(); |
- } |
- } |
- |
- InfoBarService* infobar_service_; |
- bool accept_; |
- bool has_observed_; |
-}; |
- |
-// Class to instantiate on the stack that is meant to be used with |
-// FakeGCMProfileService. The ::Run() method follows the signature of |
-// FakeGCMProfileService::UnregisterCallback. |
-class UnregistrationCallback { |
- public: |
- UnregistrationCallback() : done_(false), waiting_(false) {} |
- |
- void Run(const std::string& app_id) { |
- app_id_ = app_id; |
- done_ = true; |
- if (waiting_) |
- base::MessageLoop::current()->Quit(); |
- } |
- |
- void WaitUntilSatisfied() { |
- if (done_) |
- return; |
- |
- waiting_ = true; |
- while (!done_) |
- content::RunMessageLoop(); |
- } |
- |
- const std::string& app_id() { |
- return app_id_; |
- } |
- |
- private: |
- bool done_; |
- bool waiting_; |
- std::string app_id_; |
-}; |
- |
-// Class to instantiate on the stack that is meant to be used with |
-// StubNotificationUIManager::SetNotificationAddedCallback. Mind that Run() |
-// might be invoked prior to WaitUntilSatisfied() being called. |
-class NotificationAddedCallback { |
- public: |
- NotificationAddedCallback() : done_(false), waiting_(false) {} |
- |
- void Run() { |
- done_ = true; |
- if (waiting_) |
- base::MessageLoop::current()->Quit(); |
- } |
- |
- void WaitUntilSatisfied() { |
- if (done_) |
- return; |
- |
- waiting_ = true; |
- while (!done_) |
- content::RunMessageLoop(); |
- } |
- |
- private: |
- bool done_; |
- bool waiting_; |
-}; |
- |
-// The Push API depends on Web Notifications, which is only available on Android |
-// Jelly Bean and later. |
-bool IsPushSupported() { |
-#if defined(OS_ANDROID) |
- if (base::android::BuildInfo::GetInstance()->sdk_int() < |
- base::android::SDK_VERSION_JELLY_BEAN) { |
- DVLOG(0) << "The Push API is only supported in Android 4.1 and later."; |
- return false; |
- } |
-#endif |
- return true; |
-} |
- |
-} // namespace |
- |
-class PushMessagingBrowserTest : public InProcessBrowserTest { |
- public: |
- PushMessagingBrowserTest() : gcm_service_(nullptr) {} |
- ~PushMessagingBrowserTest() override {} |
- |
- // InProcessBrowserTest: |
- void SetUpCommandLine(base::CommandLine* command_line) override { |
- command_line->AppendSwitch(switches::kEnablePushMessagePayload); |
- command_line->AppendSwitch(switches::kEnablePushMessagingHasPermission); |
- |
- InProcessBrowserTest::SetUpCommandLine(command_line); |
- } |
- |
- // InProcessBrowserTest: |
- void SetUp() override { |
- https_server_.reset(new net::SpawnedTestServer( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::BaseTestServer::SSLOptions( |
- net::BaseTestServer::SSLOptions::CERT_OK), |
- base::FilePath(FILE_PATH_LITERAL("chrome/test/data/")))); |
- ASSERT_TRUE(https_server_->Start()); |
- |
-#if defined(ENABLE_NOTIFICATIONS) |
- notification_manager_.reset(new StubNotificationUIManager); |
- notification_service()->SetNotificationUIManagerForTesting( |
- notification_manager()); |
-#endif |
- |
- InProcessBrowserTest::SetUp(); |
- } |
- |
- // InProcessBrowserTest: |
- void SetUpOnMainThread() override { |
- gcm_service_ = static_cast<FakeGCMProfileService*>( |
- GCMProfileServiceFactory::GetInstance()->SetTestingFactoryAndUse( |
- browser()->profile(), &FakeGCMProfileService::Build)); |
- gcm_service_->set_collect(true); |
- |
- LoadTestPage(); |
- |
- InProcessBrowserTest::SetUpOnMainThread(); |
- } |
- |
- // InProcessBrowserTest: |
- void TearDown() override { |
-#if defined(ENABLE_NOTIFICATIONS) |
- notification_service()->SetNotificationUIManagerForTesting(nullptr); |
-#endif |
- |
- InProcessBrowserTest::TearDown(); |
- } |
- |
- void LoadTestPage(const std::string& path) { |
- ui_test_utils::NavigateToURL(browser(), https_server_->GetURL(path)); |
- } |
- |
- void LoadTestPage() { |
- LoadTestPage(GetTestURL()); |
- } |
- |
- bool RunScript(const std::string& script, std::string* result) { |
- return RunScript(script, result, nullptr); |
- } |
- |
- bool RunScript(const std::string& script, std::string* result, |
- content::WebContents* web_contents) { |
- if (!web_contents) |
- web_contents = browser()->tab_strip_model()->GetActiveWebContents(); |
- return content::ExecuteScriptAndExtractString(web_contents->GetMainFrame(), |
- script, |
- result); |
- } |
- |
- void TryToRegisterSuccessfully( |
- const std::string& expected_push_registration_id); |
- |
- PushMessagingApplicationId GetServiceWorkerAppId( |
- int64 service_worker_registration_id); |
- |
- net::SpawnedTestServer* https_server() const { return https_server_.get(); } |
- |
- FakeGCMProfileService* gcm_service() const { return gcm_service_; } |
- |
-#if defined(ENABLE_NOTIFICATIONS) |
- StubNotificationUIManager* notification_manager() const { |
- return notification_manager_.get(); |
- } |
- |
- PlatformNotificationServiceImpl* notification_service() const { |
- return PlatformNotificationServiceImpl::GetInstance(); |
- } |
-#endif |
- |
- PushMessagingServiceImpl* push_service() { |
- return static_cast<PushMessagingServiceImpl*>( |
- gcm_service_->push_messaging_service()); |
- } |
- |
- protected: |
- virtual std::string GetTestURL() { |
- return "files/push_messaging/test.html"; |
- } |
- |
- private: |
- scoped_ptr<net::SpawnedTestServer> https_server_; |
- FakeGCMProfileService* gcm_service_; |
- scoped_ptr<StubNotificationUIManager> notification_manager_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PushMessagingBrowserTest); |
-}; |
- |
-class PushMessagingBadManifestBrowserTest : public PushMessagingBrowserTest { |
- std::string GetTestURL() override { |
- return "files/push_messaging/test_bad_manifest.html"; |
- } |
-}; |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBadManifestBrowserTest, |
- RegisterFailsNotVisibleMessages) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- ASSERT_TRUE(RunScript("registerServiceWorker()", &script_result)); |
- ASSERT_EQ("ok - service worker registered", script_result); |
- ASSERT_TRUE(RunScript("registerPush()", &script_result)); |
- EXPECT_EQ("AbortError - Registration failed - permission denied", |
- script_result); |
-} |
- |
-void PushMessagingBrowserTest::TryToRegisterSuccessfully( |
- const std::string& expected_push_registration_id) { |
- std::string script_result; |
- |
- EXPECT_TRUE(RunScript("registerServiceWorker()", &script_result)); |
- EXPECT_EQ("ok - service worker registered", script_result); |
- |
- InfoBarResponder accepting_responder(browser(), true); |
- EXPECT_TRUE(RunScript("requestNotificationPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
- |
- EXPECT_TRUE(RunScript("registerPush()", &script_result)); |
- EXPECT_EQ(std::string(kPushMessagingEndpoint) + " - " |
- + expected_push_registration_id, script_result); |
-} |
- |
-PushMessagingApplicationId PushMessagingBrowserTest::GetServiceWorkerAppId( |
- int64 service_worker_registration_id) { |
- GURL origin = https_server()->GetURL(std::string()).GetOrigin(); |
- PushMessagingApplicationId application_id = PushMessagingApplicationId::Get( |
- browser()->profile(), origin, service_worker_registration_id); |
- EXPECT_TRUE(application_id.IsValid()); |
- return application_id; |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- RegisterSuccessNotificationsGranted) { |
- if (!IsPushSupported()) |
- return; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- PushMessagingApplicationId app_id = GetServiceWorkerAppId(0LL); |
- EXPECT_EQ(app_id.app_id_guid(), gcm_service()->last_registered_app_id()); |
- EXPECT_EQ("1234567890", gcm_service()->last_registered_sender_ids()[0]); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- RegisterSuccessNotificationsPrompt) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- ASSERT_TRUE(RunScript("registerServiceWorker()", &script_result)); |
- ASSERT_EQ("ok - service worker registered", script_result); |
- |
- InfoBarResponder accepting_responder(browser(), true); |
- ASSERT_TRUE(RunScript("registerPush()", &script_result)); |
- EXPECT_EQ(std::string(kPushMessagingEndpoint) + " - 1-0", script_result); |
- |
- PushMessagingApplicationId app_id = GetServiceWorkerAppId(0LL); |
- EXPECT_EQ(app_id.app_id_guid(), gcm_service()->last_registered_app_id()); |
- EXPECT_EQ("1234567890", gcm_service()->last_registered_sender_ids()[0]); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- RegisterFailureNotificationsBlocked) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- ASSERT_TRUE(RunScript("registerServiceWorker()", &script_result)); |
- ASSERT_EQ("ok - service worker registered", script_result); |
- |
- InfoBarResponder cancelling_responder(browser(), false); |
- ASSERT_TRUE(RunScript("requestNotificationPermission();", &script_result)); |
- ASSERT_EQ("permission status - denied", script_result); |
- |
- ASSERT_TRUE(RunScript("registerPush()", &script_result)); |
- EXPECT_EQ("AbortError - Registration failed - permission denied", |
- script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, RegisterFailureNoManifest) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- ASSERT_TRUE(RunScript("registerServiceWorker()", &script_result)); |
- ASSERT_EQ("ok - service worker registered", script_result); |
- |
- InfoBarResponder accepting_responder(browser(), true); |
- ASSERT_TRUE(RunScript("requestNotificationPermission();", &script_result)); |
- ASSERT_EQ("permission status - granted", script_result); |
- |
- ASSERT_TRUE(RunScript("removeManifest()", &script_result)); |
- ASSERT_EQ("manifest removed", script_result); |
- |
- ASSERT_TRUE(RunScript("registerPush()", &script_result)); |
- EXPECT_EQ("AbortError - Registration failed - no sender id provided", |
- script_result); |
-} |
- |
-// TODO(johnme): Test registering from a worker - see https://crbug.com/437298. |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, RegisterPersisted) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- // First, test that Service Worker registration IDs are assigned in order of |
- // registering the Service Workers, and the (fake) push registration ids are |
- // assigned in order of push registration (even when these orders are |
- // different). |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- PushMessagingApplicationId app_id_sw0 = GetServiceWorkerAppId(0LL); |
- EXPECT_EQ(app_id_sw0.app_id_guid(), gcm_service()->last_registered_app_id()); |
- |
- LoadTestPage("files/push_messaging/subscope1/test.html"); |
- ASSERT_TRUE(RunScript("registerServiceWorker()", &script_result)); |
- ASSERT_EQ("ok - service worker registered", script_result); |
- |
- LoadTestPage("files/push_messaging/subscope2/test.html"); |
- ASSERT_TRUE(RunScript("registerServiceWorker()", &script_result)); |
- ASSERT_EQ("ok - service worker registered", script_result); |
- |
- // Note that we need to reload the page after registering, otherwise |
- // navigator.serviceWorker.ready is going to be resolved with the parent |
- // Service Worker which still controls the page. |
- LoadTestPage("files/push_messaging/subscope2/test.html"); |
- TryToRegisterSuccessfully("1-1" /* expected_push_registration_id */); |
- PushMessagingApplicationId app_id_sw2 = GetServiceWorkerAppId(2LL); |
- EXPECT_EQ(app_id_sw2.app_id_guid(), gcm_service()->last_registered_app_id()); |
- |
- LoadTestPage("files/push_messaging/subscope1/test.html"); |
- TryToRegisterSuccessfully("1-2" /* expected_push_registration_id */); |
- PushMessagingApplicationId app_id_sw1 = GetServiceWorkerAppId(1LL); |
- EXPECT_EQ(app_id_sw1.app_id_guid(), gcm_service()->last_registered_app_id()); |
- |
- // Now test that the Service Worker registration IDs and push registration IDs |
- // generated above were persisted to SW storage, by checking that they are |
- // unchanged despite requesting them in a different order. |
- // TODO(johnme): Ideally we would restart the browser at this point to check |
- // they were persisted to disk, but that's not currently possible since the |
- // test server uses random port numbers for each test (even PRE_Foo and Foo), |
- // so we wouldn't be able to load the test pages with the same origin. |
- |
- LoadTestPage("files/push_messaging/subscope1/test.html"); |
- TryToRegisterSuccessfully("1-2" /* expected_push_registration_id */); |
- EXPECT_EQ(app_id_sw1.app_id_guid(), gcm_service()->last_registered_app_id()); |
- |
- LoadTestPage("files/push_messaging/subscope2/test.html"); |
- TryToRegisterSuccessfully("1-1" /* expected_push_registration_id */); |
- EXPECT_EQ(app_id_sw1.app_id_guid(), gcm_service()->last_registered_app_id()); |
- |
- LoadTestPage(); |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- EXPECT_EQ(app_id_sw1.app_id_guid(), gcm_service()->last_registered_app_id()); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PushEventSuccess) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- PushMessagingApplicationId app_id = GetServiceWorkerAppId(0LL); |
- EXPECT_EQ(app_id.app_id_guid(), gcm_service()->last_registered_app_id()); |
- EXPECT_EQ("1234567890", gcm_service()->last_registered_sender_ids()[0]); |
- |
- ASSERT_TRUE(RunScript("isControlled()", &script_result)); |
- ASSERT_EQ("false - is not controlled", script_result); |
- |
- LoadTestPage(); // Reload to become controlled. |
- |
- ASSERT_TRUE(RunScript("isControlled()", &script_result)); |
- ASSERT_EQ("true - is controlled", script_result); |
- |
- GCMClient::IncomingMessage message; |
- message.sender_id = "1234567890"; |
- message.data["data"] = "testdata"; |
- push_service()->OnMessage(app_id.app_id_guid(), message); |
- ASSERT_TRUE(RunScript("resultQueue.pop()", &script_result)); |
- EXPECT_EQ("testdata", script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PushEventNoServiceWorker) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- PushMessagingApplicationId app_id = GetServiceWorkerAppId(0LL); |
- EXPECT_EQ(app_id.app_id_guid(), gcm_service()->last_registered_app_id()); |
- EXPECT_EQ("1234567890", gcm_service()->last_registered_sender_ids()[0]); |
- |
- ASSERT_TRUE(RunScript("isControlled()", &script_result)); |
- ASSERT_EQ("false - is not controlled", script_result); |
- |
- LoadTestPage(); // Reload to become controlled. |
- |
- ASSERT_TRUE(RunScript("isControlled()", &script_result)); |
- ASSERT_EQ("true - is controlled", script_result); |
- |
- // Unregister service worker. Sending a message should now fail. |
- ASSERT_TRUE(RunScript("unregisterServiceWorker()", &script_result)); |
- ASSERT_EQ("service worker unregistration status: true", script_result); |
- |
- // When the push service will receive it next message, given that there is no |
- // SW available, it should unregister |app_id|. |
- UnregistrationCallback callback; |
- gcm_service()->SetUnregisterCallback(base::Bind(&UnregistrationCallback::Run, |
- base::Unretained(&callback))); |
- |
- GCMClient::IncomingMessage message; |
- message.sender_id = "1234567890"; |
- message.data["data"] = "testdata"; |
- push_service()->OnMessage(app_id.app_id_guid(), message); |
- |
- callback.WaitUntilSatisfied(); |
- EXPECT_EQ(app_id.app_id_guid(), callback.app_id()); |
- |
- // No push data should have been received. |
- ASSERT_TRUE(RunScript("resultQueue.popImmediately()", &script_result)); |
- EXPECT_EQ("null", script_result); |
-} |
- |
-#if defined(ENABLE_NOTIFICATIONS) |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- PushEventEnforcesUserVisibleNotification) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- PushMessagingApplicationId app_id = GetServiceWorkerAppId(0LL); |
- EXPECT_EQ(app_id.app_id_guid(), gcm_service()->last_registered_app_id()); |
- EXPECT_EQ("1234567890", gcm_service()->last_registered_sender_ids()[0]); |
- |
- ASSERT_TRUE(RunScript("isControlled()", &script_result)); |
- ASSERT_EQ("false - is not controlled", script_result); |
- |
- LoadTestPage(); // Reload to become controlled. |
- |
- ASSERT_TRUE(RunScript("isControlled()", &script_result)); |
- ASSERT_EQ("true - is controlled", script_result); |
- |
- notification_manager()->CancelAll(); |
- ASSERT_EQ(0u, notification_manager()->GetNotificationCount()); |
- |
- // We'll need to specify the web_contents in which to eval script, since we're |
- // going to run script in a background tab. |
- content::WebContents* web_contents = |
- browser()->tab_strip_model()->GetActiveWebContents(); |
- |
- // If the site is visible in an active tab, we should not force a notification |
- // to be shown. Try it twice, since we allow one mistake per 10 push events. |
- GCMClient::IncomingMessage message; |
- message.sender_id = "1234567890"; |
- for (int n = 0; n < 2; n++) { |
- message.data["data"] = "testdata"; |
- push_service()->OnMessage(app_id.app_id_guid(), message); |
- ASSERT_TRUE(RunScript("resultQueue.pop()", &script_result)); |
- EXPECT_EQ("testdata", script_result); |
- EXPECT_EQ(0u, notification_manager()->GetNotificationCount()); |
- } |
- |
- // Open a blank foreground tab so site is no longer visible. |
- ui_test_utils::NavigateToURLWithDisposition( |
- browser(), GURL("about:blank"), NEW_FOREGROUND_TAB, |
- ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); |
- |
- // If the Service Worker push event handler does not show a notification, we |
- // should show a forced one, but only on the 2nd occurrence since we allow one |
- // mistake per 10 push events. |
- message.data["data"] = "testdata"; |
- push_service()->OnMessage(app_id.app_id_guid(), message); |
- ASSERT_TRUE(RunScript("resultQueue.pop()", &script_result, web_contents)); |
- EXPECT_EQ("testdata", script_result); |
- EXPECT_EQ(0u, notification_manager()->GetNotificationCount()); |
- message.data["data"] = "testdata"; |
- push_service()->OnMessage(app_id.app_id_guid(), message); |
- ASSERT_TRUE(RunScript("resultQueue.pop()", &script_result, web_contents)); |
- EXPECT_EQ("testdata", script_result); |
- EXPECT_EQ(1u, notification_manager()->GetNotificationCount()); |
- EXPECT_EQ(base::ASCIIToUTF16(kPushMessagingForcedNotificationTag), |
- notification_manager()->GetNotificationAt(0).replace_id()); |
- |
- // Currently, this notification will stick around until the user or webapp |
- // explicitly dismisses it (though we may change this later). |
- message.data["data"] = "shownotification"; |
- push_service()->OnMessage(app_id.app_id_guid(), message); |
- ASSERT_TRUE(RunScript("resultQueue.pop()", &script_result, web_contents)); |
- EXPECT_EQ("shownotification", script_result); |
- EXPECT_EQ(2u, notification_manager()->GetNotificationCount()); |
- |
- notification_manager()->CancelAll(); |
- EXPECT_EQ(0u, notification_manager()->GetNotificationCount()); |
- |
- // However if the Service Worker push event handler shows a notification, we |
- // should not show a forced one. |
- message.data["data"] = "shownotification"; |
- for (int n = 0; n < 9; n++) { |
- push_service()->OnMessage(app_id.app_id_guid(), message); |
- ASSERT_TRUE(RunScript("resultQueue.pop()", &script_result, web_contents)); |
- EXPECT_EQ("shownotification", script_result); |
- EXPECT_EQ(1u, notification_manager()->GetNotificationCount()); |
- EXPECT_EQ(base::ASCIIToUTF16("push_test_tag"), |
- notification_manager()->GetNotificationAt(0).replace_id()); |
- notification_manager()->CancelAll(); |
- } |
- |
- // Now that 10 push messages in a row have shown notifications, we should |
- // allow the next one to mistakenly not show a notification. |
- message.data["data"] = "testdata"; |
- push_service()->OnMessage(app_id.app_id_guid(), message); |
- ASSERT_TRUE(RunScript("resultQueue.pop()", &script_result, web_contents)); |
- EXPECT_EQ("testdata", script_result); |
- EXPECT_EQ(0u, notification_manager()->GetNotificationCount()); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- PushEventNotificationWithoutEventWaitUntil) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- content::WebContents* web_contents = |
- browser()->tab_strip_model()->GetActiveWebContents(); |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- PushMessagingApplicationId app_id = GetServiceWorkerAppId(0LL); |
- EXPECT_EQ(app_id.app_id_guid(), gcm_service()->last_registered_app_id()); |
- EXPECT_EQ("1234567890", gcm_service()->last_registered_sender_ids()[0]); |
- |
- ASSERT_TRUE(RunScript("isControlled()", &script_result)); |
- ASSERT_EQ("false - is not controlled", script_result); |
- |
- LoadTestPage(); // Reload to become controlled. |
- |
- ASSERT_TRUE(RunScript("isControlled()", &script_result)); |
- ASSERT_EQ("true - is controlled", script_result); |
- |
- NotificationAddedCallback callback; |
- notification_manager()->SetNotificationAddedCallback( |
- base::Bind(&NotificationAddedCallback::Run, base::Unretained(&callback))); |
- |
- GCMClient::IncomingMessage message; |
- message.sender_id = "1234567890"; |
- message.data["data"] = "shownotification-without-waituntil"; |
- push_service()->OnMessage(app_id.app_id_guid(), message); |
- ASSERT_TRUE(RunScript("resultQueue.pop()", &script_result, web_contents)); |
- EXPECT_EQ("immediate:shownotification-without-waituntil", script_result); |
- |
- callback.WaitUntilSatisfied(); |
- |
- ASSERT_EQ(1u, notification_manager()->GetNotificationCount()); |
- EXPECT_EQ(base::ASCIIToUTF16("push_test_tag"), |
- notification_manager()->GetNotificationAt(0).replace_id()); |
- |
- // Verify that the renderer process hasn't crashed. |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
-} |
-#endif |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, HasPermissionSaysDefault) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- ASSERT_TRUE(RunScript("registerServiceWorker()", &script_result)); |
- ASSERT_EQ("ok - service worker registered", script_result); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- ASSERT_EQ("permission status - default", script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, HasPermissionSaysGranted) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- ASSERT_TRUE(RunScript("registerServiceWorker()", &script_result)); |
- ASSERT_EQ("ok - service worker registered", script_result); |
- |
- InfoBarResponder accepting_responder(browser(), true); |
- ASSERT_TRUE(RunScript("requestNotificationPermission();", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
- |
- ASSERT_TRUE(RunScript("registerPush()", &script_result)); |
- EXPECT_EQ(std::string(kPushMessagingEndpoint) + " - 1-0", script_result); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, HasPermissionSaysDenied) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- ASSERT_TRUE(RunScript("registerServiceWorker()", &script_result)); |
- ASSERT_EQ("ok - service worker registered", script_result); |
- |
- InfoBarResponder cancelling_responder(browser(), false); |
- ASSERT_TRUE(RunScript("requestNotificationPermission();", &script_result)); |
- EXPECT_EQ("permission status - denied", script_result); |
- |
- ASSERT_TRUE(RunScript("registerPush()", &script_result)); |
- EXPECT_EQ("AbortError - Registration failed - permission denied", |
- script_result); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - denied", script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, UnregisterSuccess) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- gcm_service()->AddExpectedUnregisterResponse(GCMClient::SUCCESS); |
- |
- ASSERT_TRUE(RunScript("unregister()", &script_result)); |
- EXPECT_EQ("unregister result: true", script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, UnregisterNetworkError) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- gcm_service()->AddExpectedUnregisterResponse(GCMClient::NETWORK_ERROR); |
- |
- ASSERT_TRUE(RunScript("unregister()", &script_result)); |
- EXPECT_EQ("unregister error: NetworkError: " |
- "Unregistration failed - could not connect to push server", |
- script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, UnregisterAbortError) { |
- if (!IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- gcm_service()->AddExpectedUnregisterResponse(GCMClient::UNKNOWN_ERROR); |
- |
- ASSERT_TRUE(RunScript("unregister()", &script_result)); |
- EXPECT_EQ("unregister error: " |
- "AbortError: Unregistration failed - push service error", |
- script_result); |
-} |
- |
-#if defined(OS_ANDROID) |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PushUnavailableOnAndroidICS) { |
- // This test should only run on Android ICS to confirm that the Push API |
- // is not available on that version of Android. |
- if (IsPushSupported()) |
- return; |
- |
- std::string script_result; |
- ASSERT_TRUE(RunScript("window.PushManager", &script_result)); |
- EXPECT_EQ("undefined", script_result); |
-} |
-#endif |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- GlobalResetPushPermissionUnregisters) { |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("true - registered", script_result); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
- |
- browser()->profile()->GetHostContentSettingsMap()-> |
- ClearSettingsForOneType(CONTENT_SETTINGS_TYPE_PUSH_MESSAGING); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - default", script_result); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("false - not registered", script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- LocalResetPushPermissionUnregisters) { |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("true - registered", script_result); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
- |
- GURL origin = https_server()->GetURL(std::string()).GetOrigin(); |
- browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( |
- ContentSettingsPattern::FromURLNoWildcard(origin), |
- ContentSettingsPattern::FromURLNoWildcard(origin), |
- CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, |
- std::string(), |
- CONTENT_SETTING_DEFAULT); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - default", script_result); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("false - not registered", script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- DenyPushPermissionUnregisters) { |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("true - registered", script_result); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
- |
- GURL origin = https_server()->GetURL(std::string()).GetOrigin(); |
- browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( |
- ContentSettingsPattern::FromURLNoWildcard(origin), |
- ContentSettingsPattern::FromURLNoWildcard(origin), |
- CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, |
- std::string(), |
- CONTENT_SETTING_BLOCK); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - denied", script_result); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("false - not registered", script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- GlobalResetNotificationsPermissionUnregisters) { |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("true - registered", script_result); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
- |
- browser()->profile()->GetHostContentSettingsMap()-> |
- ClearSettingsForOneType(CONTENT_SETTINGS_TYPE_NOTIFICATIONS); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - default", script_result); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("false - not registered", script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- LocalResetNotificationsPermissionUnregisters) { |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("true - registered", script_result); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
- |
- GURL origin = https_server()->GetURL(std::string()).GetOrigin(); |
- browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( |
- ContentSettingsPattern::FromURLNoWildcard(origin), |
- ContentSettingsPattern::Wildcard(), |
- CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
- std::string(), |
- CONTENT_SETTING_DEFAULT); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - default", script_result); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("false - not registered", script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- DenyNotificationsPermissionUnregisters) { |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("true - registered", script_result); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
- |
- GURL origin = https_server()->GetURL(std::string()).GetOrigin(); |
- browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( |
- ContentSettingsPattern::FromURLNoWildcard(origin), |
- ContentSettingsPattern::Wildcard(), |
- CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
- std::string(), |
- CONTENT_SETTING_BLOCK); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - denied", script_result); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("false - not registered", script_result); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- GrantAlreadyGrantedPermissionDoesNotUnregister) { |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("true - registered", script_result); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
- |
- GURL origin = https_server()->GetURL(std::string()).GetOrigin(); |
- browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( |
- ContentSettingsPattern::FromURLNoWildcard(origin), |
- ContentSettingsPattern::Wildcard(), |
- CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
- std::string(), |
- CONTENT_SETTING_ALLOW); |
- browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( |
- ContentSettingsPattern::FromURLNoWildcard(origin), |
- ContentSettingsPattern::FromURLNoWildcard(origin), |
- CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, |
- std::string(), |
- CONTENT_SETTING_ALLOW); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("true - registered", script_result); |
-} |
- |
-// This test is testing some non-trivial content settings rules and make sure |
-// that they are respected with regards to automatic unregistration. In other |
-// words, it checks that the push service does not end up unregistering origins |
-// that have push permission with some non-common rules. |
-IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, |
- AutomaticUnregistrationFollowsContentSettingRules) { |
- std::string script_result; |
- |
- TryToRegisterSuccessfully("1-0" /* expected_push_registration_id */); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("true - registered", script_result); |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
- |
- GURL origin = https_server()->GetURL(std::string()).GetOrigin(); |
- browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( |
- ContentSettingsPattern::Wildcard(), |
- ContentSettingsPattern::Wildcard(), |
- CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
- std::string(), |
- CONTENT_SETTING_ALLOW); |
- browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( |
- ContentSettingsPattern::FromString("https://*"), |
- ContentSettingsPattern::FromString("https://*"), |
- CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, |
- std::string(), |
- CONTENT_SETTING_ALLOW); |
- browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( |
- ContentSettingsPattern::FromURLNoWildcard(origin), |
- ContentSettingsPattern::Wildcard(), |
- CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
- std::string(), |
- CONTENT_SETTING_DEFAULT); |
- browser()->profile()->GetHostContentSettingsMap()->SetContentSetting( |
- ContentSettingsPattern::FromURLNoWildcard(origin), |
- ContentSettingsPattern::FromURLNoWildcard(origin), |
- CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, |
- std::string(), |
- CONTENT_SETTING_DEFAULT); |
- |
- // The two first rules should give |origin| the permission to use Push even |
- // if the rules it used to have have been reset. |
- // The Push service should not unsubcribe |origin| because at no point it was |
- // left without permission to use Push. |
- |
- ASSERT_TRUE(RunScript("hasPermission()", &script_result)); |
- EXPECT_EQ("permission status - granted", script_result); |
- |
- ASSERT_TRUE(RunScript("hasRegistration()", &script_result)); |
- EXPECT_EQ("true - registered", script_result); |
-} |
- |
-} // namespace gcm |