Commit c03ef37c authored by miguelg's avatar miguelg Committed by Commit bot

Reject the permissionState promise with NotSupported Exception if userVisibleOnly is false (2/3)

This change starts using the new onError flow and checks if user visible is
supported. It does that by introducing a new method to the PushMessagingService that can be overriden by other vendors if they need to.

1) https://codereview.chromium.org/1130233003/
2) This CL
3) Cleanup CL where the empty onError method is removed and two new Layout tests
   are added so the exception is actually tested

BUG=479246

Review URL: https://codereview.chromium.org/1133083002

Cr-Commit-Position: refs/heads/master@{#329655}
parent 4e9c2774
......@@ -370,8 +370,13 @@ IN_PROC_BROWSER_TEST_F(PushMessagingManifestUserVisibleOnlyTrueTest,
ASSERT_TRUE(RunScript("subscribePush()", &script_result));
EXPECT_EQ(GetEndpointForSubscriptionId("1-0"), script_result);
// permissionState has been introduced later so it does not
// respect the manifest key.
ASSERT_TRUE(RunScript("permissionState()", &script_result));
EXPECT_EQ("permission status - granted", script_result);
EXPECT_EQ(
"NotSupportedError - Push subscriptions that don't enable"
" userVisibleOnly are not supported.",
script_result);
}
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, SubscribePersisted) {
......
......@@ -404,6 +404,10 @@ blink::WebPushPermissionStatus PushMessagingServiceImpl::GetPermissionStatus(
requesting_origin, embedding_origin));
}
bool PushMessagingServiceImpl::SupportNonVisibleMessages() {
return false;
}
void PushMessagingServiceImpl::RegisterEnd(
const content::PushMessagingService::RegisterCallback& callback,
const std::string& registration_id,
......
......@@ -86,6 +86,8 @@ class PushMessagingServiceImpl : public content::PushMessagingService,
const GURL& requesting_origin,
const GURL& embedding_origin,
bool user_visible) override;
bool SupportNonVisibleMessages() override;
// content_settings::Observer implementation.
void OnContentSettingChanged(const ContentSettingsPattern& primary_pattern,
......
......@@ -759,7 +759,8 @@ void PushMessagingMessageFilter::OnGetPermissionStatus(
service_worker_context_->GetLiveRegistration(
service_worker_registration_id);
if (!service_worker_registration) {
Send(new PushMessagingMsg_GetPermissionStatusError(request_id));
Send(new PushMessagingMsg_GetPermissionStatusError(
request_id, blink::WebPushError::ErrorTypeAbort));
return;
}
......@@ -777,6 +778,11 @@ void PushMessagingMessageFilter::Core::GetPermissionStatusOnUI(
blink::WebPushPermissionStatus permission_status;
PushMessagingService* push_service = service();
if (push_service) {
if (!user_visible && !push_service->SupportNonVisibleMessages()) {
Send(new PushMessagingMsg_GetPermissionStatusError(
request_id, blink::WebPushError::ErrorTypeNotSupported));
return;
}
GURL embedding_origin = requesting_origin;
permission_status = push_service->GetPermissionStatus(requesting_origin,
embedding_origin,
......@@ -785,7 +791,8 @@ void PushMessagingMessageFilter::Core::GetPermissionStatusOnUI(
// Return prompt, so the website can't detect incognito mode.
permission_status = blink::WebPushPermissionStatusPrompt;
} else {
Send(new PushMessagingMsg_GetPermissionStatusError(request_id));
Send(new PushMessagingMsg_GetPermissionStatusError(
request_id, blink::WebPushError::ErrorTypeAbort));
return;
}
Send(new PushMessagingMsg_GetPermissionStatusSuccess(request_id,
......
......@@ -251,13 +251,25 @@ void PushProvider::OnGetPermissionStatusSuccess(
permission_status_callbacks_.Remove(request_id);
}
void PushProvider::OnGetPermissionStatusError(int request_id) {
void PushProvider::OnGetPermissionStatusError(
int request_id,
blink::WebPushError::ErrorType error) {
blink::WebPushPermissionStatusCallbacks* callbacks =
permission_status_callbacks_.Lookup(request_id);
if (!callbacks)
return;
callbacks->onError();
std::string error_message;
if (error == blink::WebPushError::ErrorTypeNotSupported) {
error_message =
"Push subscriptions that don't enable userVisibleOnly are not "
"supported.";
}
scoped_ptr<blink::WebPushError> web_error(new blink::WebPushError(
error, blink::WebString::fromUTF8(error_message)));
callbacks->onError(web_error.release());
permission_status_callbacks_.Remove(request_id);
}
......
......@@ -77,7 +77,8 @@ class PushProvider : public blink::WebPushProvider,
void OnGetRegistrationError(int request_id, PushGetRegistrationStatus status);
void OnGetPermissionStatusSuccess(int request_id,
blink::WebPushPermissionStatus status);
void OnGetPermissionStatusError(int request_id);
void OnGetPermissionStatusError(int request_id,
blink::WebPushError::ErrorType error);
scoped_refptr<ThreadSafeSender> thread_safe_sender_;
scoped_refptr<PushDispatcher> push_dispatcher_;
......
......@@ -71,8 +71,9 @@ IPC_MESSAGE_CONTROL2(PushMessagingMsg_GetPermissionStatusSuccess,
int32_t /* request_id */,
blink::WebPushPermissionStatus /* status */)
IPC_MESSAGE_CONTROL1(PushMessagingMsg_GetPermissionStatusError,
int32_t /* request_id */)
IPC_MESSAGE_CONTROL2(PushMessagingMsg_GetPermissionStatusError,
int32_t /* request_id */,
blink::WebPushError::ErrorType /* error_type */)
// Messages sent from the child process to the browser.
......
......@@ -77,6 +77,11 @@ class CONTENT_EXPORT PushMessagingService {
const GURL& embedding_origin,
bool user_visible) = 0;
// Returns whether subscriptions that do not mandate user visible UI upon
// receiving a push message are supported. Influences permission request and
// permission check behaviour.
virtual bool SupportNonVisibleMessages() = 0;
// Provide a storage mechanism to read/write an opaque
// "notifications_shown_by_last_few_pushes" string associated with a Service
// Worker registration. Stored data is deleted when the associated
......
......@@ -82,6 +82,10 @@ LayoutTestPushMessagingService::GetPermissionStatus(
embedding_origin));
}
bool LayoutTestPushMessagingService::SupportNonVisibleMessages() {
return false;
}
void LayoutTestPushMessagingService::Unregister(
const GURL& requesting_origin,
int64 service_worker_registration_id,
......
......@@ -39,6 +39,7 @@ class LayoutTestPushMessagingService : public PushMessagingService {
const GURL& requesting_origin,
const GURL& embedding_origin,
bool user_visible) override;
bool SupportNonVisibleMessages() override;
void Unregister(const GURL& requesting_origin,
int64 service_worker_registration_id,
const std::string& sender_id,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment