Commit 2df166ef authored by Jay Harris's avatar Jay Harris Committed by Commit Bot

Badging: Move Badging out of Origin Trial to stable.

This also removes the "Experimental" from the API methods, as features
must make a breaking change when they leave origin trial.

Bug: 719176
Change-Id: I3daa6bbe82fda07a9f549672c7b94269904059f0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2037181Reviewed-by: default avatarMatt Giuca <mgiuca@chromium.org>
Reviewed-by: default avatarPhilip Jägenstedt <foolip@chromium.org>
Commit-Queue: Jay Harris <harrisjay@chromium.org>
Cr-Commit-Position: refs/heads/master@{#739134}
parent 2d001317
......@@ -272,7 +272,7 @@ class WebAppBadgingBrowserTest : public WebAppControllerBrowserTest {
IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
CrossSiteFrameCannotChangeMainFrameBadge) {
// Clearing from cross site frame should affect only the cross site app.
ExecuteScriptAndWaitForBadgeChange("navigator.clearExperimentalAppBadge()",
ExecuteScriptAndWaitForBadgeChange("navigator.clearAppBadge()",
cross_site_frame_);
BadgeChange badge_change;
ASSERT_NO_FATAL_FAILURE(GetBadgeChange(cross_site_app_id(), &badge_change));
......@@ -280,7 +280,7 @@ IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
ASSERT_FALSE(badge_change.was_flagged_);
// Setting from cross site frame should affect only the cross site app.
ExecuteScriptAndWaitForBadgeChange("navigator.setExperimentalAppBadge(77)",
ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge(77)",
cross_site_frame_);
ASSERT_NO_FATAL_FAILURE(GetBadgeChange(cross_site_app_id(), &badge_change));
......@@ -292,8 +292,7 @@ IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
// Tests that setting the badge to an integer will be propagated across
// processes.
IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeCanBeSetToAnInteger) {
ExecuteScriptAndWaitForBadgeChange("navigator.setExperimentalAppBadge(99)",
main_frame_);
ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge(99)", main_frame_);
BadgeChange badge_change;
ASSERT_NO_FATAL_FAILURE(GetBadgeChange(main_app_id(), &badge_change));
ASSERT_FALSE(badge_change.was_cleared_);
......@@ -304,16 +303,14 @@ IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeCanBeSetToAnInteger) {
// Tests that calls to |Badge.clear| are propagated across processes.
IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
BadgeCanBeClearedWithClearMethod) {
ExecuteScriptAndWaitForBadgeChange("navigator.setExperimentalAppBadge(55)",
main_frame_);
ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge(55)", main_frame_);
BadgeChange badge_change;
ASSERT_NO_FATAL_FAILURE(GetBadgeChange(main_app_id(), &badge_change));
ASSERT_FALSE(badge_change.was_cleared_);
ASSERT_FALSE(badge_change.was_flagged_);
ASSERT_EQ(base::Optional<uint64_t>(55u), badge_change.last_badge_content_);
ExecuteScriptAndWaitForBadgeChange("navigator.clearExperimentalAppBadge()",
main_frame_);
ExecuteScriptAndWaitForBadgeChange("navigator.clearAppBadge()", main_frame_);
ASSERT_NO_FATAL_FAILURE(GetBadgeChange(main_app_id(), &badge_change));
ASSERT_TRUE(badge_change.was_cleared_);
ASSERT_FALSE(badge_change.was_flagged_);
......@@ -323,8 +320,7 @@ IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
// Tests that calling Badge.set(0) is equivalent to calling |Badge.clear| and
// that it propagates across processes.
IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeCanBeClearedWithZero) {
ExecuteScriptAndWaitForBadgeChange("navigator.setExperimentalAppBadge(0)",
main_frame_);
ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge(0)", main_frame_);
BadgeChange badge_change;
ASSERT_NO_FATAL_FAILURE(GetBadgeChange(main_app_id(), &badge_change));
ASSERT_TRUE(badge_change.was_cleared_);
......@@ -334,8 +330,7 @@ IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeCanBeClearedWithZero) {
// Tests that setting the badge without content is propagated across processes.
IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeCanBeSetWithoutAValue) {
ExecuteScriptAndWaitForBadgeChange("navigator.setExperimentalAppBadge()",
main_frame_);
ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge()", main_frame_);
BadgeChange badge_change;
ASSERT_NO_FATAL_FAILURE(GetBadgeChange(main_app_id(), &badge_change));
ASSERT_FALSE(badge_change.was_cleared_);
......@@ -346,7 +341,7 @@ IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeCanBeSetWithoutAValue) {
// Tests that the badge can be set and cleared from an in scope frame.
IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
BadgeCanBeSetAndClearedFromInScopeFrame) {
ExecuteScriptAndWaitForBadgeChange("navigator.setExperimentalAppBadge()",
ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge()",
in_scope_frame_);
BadgeChange badge_change;
ASSERT_NO_FATAL_FAILURE(GetBadgeChange(main_app_id(), &badge_change));
......@@ -354,7 +349,7 @@ IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
ASSERT_TRUE(badge_change.was_flagged_);
ASSERT_EQ(base::nullopt, badge_change.last_badge_content_);
ExecuteScriptAndWaitForBadgeChange("navigator.clearExperimentalAppBadge()",
ExecuteScriptAndWaitForBadgeChange("navigator.clearAppBadge()",
in_scope_frame_);
ASSERT_NO_FATAL_FAILURE(GetBadgeChange(main_app_id(), &badge_change));
ASSERT_TRUE(badge_change.was_cleared_);
......@@ -365,15 +360,14 @@ IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
// Tests that changing the badge of a subframe with an app affects the
// subframe's app.
IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, SubFrameBadgeAffectsSubApp) {
ExecuteScriptAndWaitForBadgeChange("navigator.setExperimentalAppBadge()",
sub_app_frame_);
ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge()", sub_app_frame_);
BadgeChange badge_change;
ASSERT_NO_FATAL_FAILURE(GetBadgeChange(sub_app_id(), &badge_change));
ASSERT_FALSE(badge_change.was_cleared_);
ASSERT_TRUE(badge_change.was_flagged_);
ASSERT_EQ(base::nullopt, badge_change.last_badge_content_);
ExecuteScriptAndWaitForBadgeChange("navigator.clearExperimentalAppBadge()",
ExecuteScriptAndWaitForBadgeChange("navigator.clearAppBadge()",
sub_app_frame_);
ASSERT_NO_FATAL_FAILURE(GetBadgeChange(sub_app_id(), &badge_change));
ASSERT_TRUE(badge_change.was_cleared_);
......@@ -385,7 +379,7 @@ IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, SubFrameBadgeAffectsSubApp) {
// app.
IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeSubFrameAppViaNavigator) {
ExecuteScriptAndWaitForBadgeChange(
"window['sub-app'].navigator.setExperimentalAppBadge()", main_frame_);
"window['sub-app'].navigator.setAppBadge()", main_frame_);
BadgeChange badge_change;
ASSERT_NO_FATAL_FAILURE(GetBadgeChange(sub_app_id(), &badge_change));
ASSERT_FALSE(badge_change.was_cleared_);
......@@ -398,7 +392,7 @@ IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeSubFrameAppViaNavigator) {
IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeSubFrameAppViaCall) {
ExecuteScriptAndWaitForBadgeChange(
"const promise = "
" window.navigator.setExperimentalAppBadge"
" window.navigator.setAppBadge"
" .call(window['sub-app'].navigator);"
"if (promise instanceof window.Promise)"
" throw new Error('Should be an instance of the subframes Promise!')",
......@@ -474,10 +468,10 @@ IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
->GetActiveWebContents()
->GetMainFrame();
ASSERT_TRUE(content::ExecuteScript(incognito_frame,
"navigator.setExperimentalAppBadge()"));
ASSERT_TRUE(content::ExecuteScript(incognito_frame,
"navigator.clearExperimentalAppBadge()"));
ASSERT_TRUE(
content::ExecuteScript(incognito_frame, "navigator.setAppBadge()"));
ASSERT_TRUE(
content::ExecuteScript(incognito_frame, "navigator.clearAppBadge()"));
// Updating badges through a ServiceWorkerGlobalScope must not crash.
const std::string register_app_service_worker_script = content::JsReplace(
......
......@@ -20,15 +20,15 @@ addEventListener('message', async function (event) {
case 'set-app-badge':
const badgeValue = event.data.value;
if (badgeValue !== undefined) {
await navigator.setExperimentalAppBadge(badgeValue);
await navigator.setAppBadge(badgeValue);
} else {
await navigator.setExperimentalAppBadge();
await navigator.setAppBadge();
}
event.source.postMessage('OK');
break;
case 'clear-app-badge':
await navigator.clearExperimentalAppBadge();
await navigator.clearAppBadge();
event.source.postMessage('OK');
break;
......
......@@ -8,9 +8,9 @@
RuntimeEnabled=Badging,
ImplementedAs=NavigatorBadge
] partial interface Navigator {
[CallWith=ScriptState, MeasureAs=BadgeSet, ImplementedAs=setAppBadge]
Promise<void> setExperimentalAppBadge(optional [EnforceRange] unsigned long long contents);
[CallWith=ScriptState, MeasureAs=BadgeSet]
Promise<void> setAppBadge(optional [EnforceRange] unsigned long long contents);
[CallWith=ScriptState, MeasureAs=BadgeClear, ImplementedAs=clearAppBadge]
Promise<void> clearExperimentalAppBadge();
[CallWith=ScriptState, MeasureAs=BadgeClear]
Promise<void> clearAppBadge();
};
\ No newline at end of file
......@@ -8,9 +8,9 @@
RuntimeEnabled=Badging,
ImplementedAs=NavigatorBadge
] partial interface WorkerNavigator {
[Exposed=ServiceWorker, CallWith=ScriptState, MeasureAs=BadgeSet, ImplementedAs=setAppBadge]
Promise<void> setExperimentalAppBadge(optional [EnforceRange] unsigned long long contents);
[Exposed=ServiceWorker, CallWith=ScriptState, MeasureAs=BadgeSet]
Promise<void> setAppBadge(optional [EnforceRange] unsigned long long contents);
[Exposed=ServiceWorker, CallWith=ScriptState, MeasureAs=BadgeClear, ImplementedAs=clearAppBadge]
Promise<void> clearExperimentalAppBadge();
[Exposed=ServiceWorker, CallWith=ScriptState, MeasureAs=BadgeClear]
Promise<void> clearAppBadge();
};
......@@ -228,8 +228,7 @@
},
{
name: "Badging",
origin_trial_feature_name: "BadgingV2",
status: "experimental",
status: "stable",
},
{
name: "BidiCaretAffinity",
......
......@@ -12,26 +12,26 @@
<script>
// Negative value not allowed.
badge_test(() => navigator.setExperimentalAppBadge(-1), undefined,
badge_test(() => navigator.setAppBadge(-1), undefined,
'TypeError');
// Value too large (2^53).
badge_test(() => navigator.setExperimentalAppBadge(Number.MAX_SAFE_INTEGER + 1),
badge_test(() => navigator.setAppBadge(Number.MAX_SAFE_INTEGER + 1),
undefined,
'TypeError');
// Illegal numeric values.
badge_test(() => navigator.setExperimentalAppBadge(Infinity), undefined,
badge_test(() => navigator.setAppBadge(Infinity), undefined,
'TypeError');
badge_test(() => navigator.setExperimentalAppBadge(-Infinity), undefined,
badge_test(() => navigator.setAppBadge(-Infinity), undefined,
'TypeError');
badge_test(() => navigator.setExperimentalAppBadge(NaN), undefined,
badge_test(() => navigator.setAppBadge(NaN), undefined,
'TypeError');
// Other values that can't convert to a long.
badge_test(() => navigator.setExperimentalAppBadge("Foo"), undefined,
badge_test(() => navigator.setAppBadge("Foo"), undefined,
'TypeError');
badge_test(() => navigator.setExperimentalAppBadge({}), undefined,
badge_test(() => navigator.setAppBadge({}), undefined,
'TypeError');
</script>
......
......@@ -11,29 +11,29 @@
<body>
<script>
badge_test(() => navigator.setExperimentalAppBadge(), 'flag');
badge_test(() => navigator.setAppBadge(), 'flag');
badge_test(() => navigator.setExperimentalAppBadge(undefined), 'flag');
badge_test(() => navigator.setAppBadge(undefined), 'flag');
badge_test(() => navigator.setExperimentalAppBadge(1), 'number:1');
badge_test(() => navigator.setAppBadge(1), 'number:1');
// Non-whole number should round down to nearest integer.
badge_test(() => navigator.setExperimentalAppBadge(10.6), 'number:10');
badge_test(() => navigator.setAppBadge(10.6), 'number:10');
// Maximum allowed value (2^53 - 1).
badge_test(() => navigator.setExperimentalAppBadge(Number.MAX_SAFE_INTEGER),
badge_test(() => navigator.setAppBadge(Number.MAX_SAFE_INTEGER),
'number:' + Number.MAX_SAFE_INTEGER);
// Setting the Badge to 0 should be equivalent to clearing the badge.
badge_test(() => navigator.setExperimentalAppBadge(0), 'clear');
badge_test(() => navigator.setAppBadge(0), 'clear');
badge_test(() => navigator.clearExperimentalAppBadge(), 'clear');
badge_test(() => navigator.clearAppBadge(), 'clear');
// Non-numeric values that convert to integer.
badge_test(() => navigator.setExperimentalAppBadge(null), 'clear');
badge_test(() => navigator.setExperimentalAppBadge(false), 'clear');
badge_test(() => navigator.setExperimentalAppBadge(true), 'number:1');
badge_test(() => navigator.setExperimentalAppBadge('3'), 'number:3');
badge_test(() => navigator.setAppBadge(null), 'clear');
badge_test(() => navigator.setAppBadge(false), 'clear');
badge_test(() => navigator.setAppBadge(true), 'number:1');
badge_test(() => navigator.setAppBadge('3'), 'number:3');
</script>
</body>
......
......@@ -6,8 +6,8 @@
<script src="../resources/idlharness.js"></script>
<script type="text/plain" id="tested">
interface Navigator {
Promise<void> setExperimentalAppBadge(optional [EnforceRange] unsigned long long contents);
Promise<void> clearExperimentalAppBadge();
Promise<void> setAppBadge(optional [EnforceRange] unsigned long long contents);
Promise<void> clearAppBadge();
};
</script>
<script>
......
<!DOCTYPE html>
<meta charset="utf-8">
<!-- Generate token with the command:
generate_token.py http://127.0.0.1:8000 BadgingV2 --expire-timestamp=2000000000
-->
<meta http-equiv="origin-trial" content="AqzH1yAjqt/6grJkR3r1584FLOYa+kkfoenZBdnmBOShEN/eGrOF7OoxdPXg5e2b+KeB+ysH8qp/F9eyimHZygIAAABReyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiQmFkZ2luZ1YyIiwgImV4cGlyeSI6IDIwMDAwMDAwMDB9" />
<title>Badging API - interfaces exposed by origin trial</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/origin-trials-helper.js"></script>
<script src="/serviceworker/resources/test-helpers.js"></script>
<script>
function assert_function_on(object, function_name, explanation) {
assert_equals(typeof object[function_name], 'function', explanation);
}
test(t => {
assert_function_on(navigator, 'setExperimentalAppBadge', 'setExperimentalAppBadge is not defined on navigator');
assert_function_on(navigator, 'clearExperimentalAppBadge', 'clearExperimentalAppBadge is not defined on navigator');
}, 'Badge API interfaces and properties in Origin-Trial enabled document.');
// Only run "disabled" tests if the feature is not enabled via runtime flags.
if (!self.internals.runtimeFlags.badgingEnabled) {
service_worker_test('resources/badging-serviceworker-disabled.js');
}
// ServiceWorkerGlobalScope must expose badging through origin trials.
service_worker_test('resources/badging-serviceworker-enabled.php');
</script>
......@@ -3,8 +3,11 @@
importScripts('/resources/testharness.js');
test(t => {
assert_false('setExperimentalAppBadge' in navigator, 'setExperimentalAppBadge does not exist in navigator');
assert_false('clearExperimentalAppBadge' in navigator, 'clearExperimentalAppBadge does not exist in navigator');
assert_false(
'setAppBadge' in navigator, 'setAppBadge does not exist in navigator');
assert_false(
'clearAppBadge' in navigator,
'clearAppBadge does not exist in navigator');
}, 'Badge API interfaces and properties in Origin-Trial disabled service worker.');
done();
......@@ -13,8 +13,8 @@ function assert_function_on(object, function_name, explanation) {
}
test(t => {
assert_function_on(navigator, 'setExperimentalAppBadge', 'setExperimentalAppBadge is not defined on navigator');
assert_function_on(navigator, 'clearExperimentalAppBadge', 'clearExperimentalAppBadge is not defined on navigator');
assert_function_on(navigator, 'setAppBadge', 'setAppBadge is not defined on navigator');
assert_function_on(navigator, 'clearAppBadge', 'clearAppBadge is not defined on navigator');
}, 'Badge API interfaces and properties in Origin-Trial enabled service worker.');
done();
......@@ -3771,9 +3771,9 @@ interface WorkerNavigator
getter usb
getter userAgent
getter wakeLock
method clearExperimentalAppBadge
method clearAppBadge
method constructor
method setExperimentalAppBadge
method setAppBadge
interface WritableStream
attribute @@toStringTag
getter locked
......
......@@ -2642,7 +2642,9 @@ interface WorkerNavigator
getter storage
getter usb
getter userAgent
method clearAppBadge
method constructor
method setAppBadge
interface WritableStream
attribute @@toStringTag
getter locked
......
......@@ -4506,6 +4506,7 @@ interface Navigator
getter webkitPersistentStorage
getter webkitTemporaryStorage
getter xr
method clearAppBadge
method constructor
method getBattery
method getGamepads
......@@ -4516,6 +4517,7 @@ interface Navigator
method requestMIDIAccess
method requestMediaKeySystemAccess
method sendBeacon
method setAppBadge
method unregisterProtocolHandler
method vibrate
method webkitGetUserMedia
......
......@@ -5464,7 +5464,7 @@ interface Navigator
getter webkitTemporaryStorage
getter xr
method canShare
method clearExperimentalAppBadge
method clearAppBadge
method constructor
method getBattery
method getGamepads
......@@ -5476,7 +5476,7 @@ interface Navigator
method requestMIDIAccess
method requestMediaKeySystemAccess
method sendBeacon
method setExperimentalAppBadge
method setAppBadge
method share
method unregisterProtocolHandler
method vibrate
......
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