summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/page-visibility
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/page-visibility')
-rw-r--r--testing/web-platform/tests/page-visibility/OWNERS3
-rw-r--r--testing/web-platform/tests/page-visibility/idlharness.html48
-rw-r--r--testing/web-platform/tests/page-visibility/resources/blank_page_green.html10
-rw-r--r--testing/web-platform/tests/page-visibility/resources/pagevistestharness.js121
-rw-r--r--testing/web-platform/tests/page-visibility/test_attributes_exist.html22
-rw-r--r--testing/web-platform/tests/page-visibility/test_child_document.html94
-rw-r--r--testing/web-platform/tests/page-visibility/test_default_view.html43
-rw-r--r--testing/web-platform/tests/page-visibility/test_minimize-manual.html188
-rw-r--r--testing/web-platform/tests/page-visibility/test_read_only.html37
-rw-r--r--testing/web-platform/tests/page-visibility/test_tab_state_change-manual.html186
-rw-r--r--testing/web-platform/tests/page-visibility/unload-1.html17
-rw-r--r--testing/web-platform/tests/page-visibility/unload.html18
12 files changed, 787 insertions, 0 deletions
diff --git a/testing/web-platform/tests/page-visibility/OWNERS b/testing/web-platform/tests/page-visibility/OWNERS
new file mode 100644
index 000000000..56997198b
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/OWNERS
@@ -0,0 +1,3 @@
+@plehegar
+@igrigorik
+@toddreifsteck
diff --git a/testing/web-platform/tests/page-visibility/idlharness.html b/testing/web-platform/tests/page-visibility/idlharness.html
new file mode 100644
index 000000000..c8086a1bc
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/idlharness.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Page Visibility IDL tests</title>
+<link rel="author" title="W3C" href="http://www.w3.org/" />
+<link rel="help" href="http://www.w3.org/TR/page-visibility/#sec-document-interface"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+</head>
+<body>
+<h1>Page Visibility IDL tests</h1>
+
+<pre id='untested_idl' style='display:none'>
+interface Document {
+};
+</pre>
+
+<pre id='idl'>
+enum VisibilityState { "hidden", "visible", "prerender", "unloaded" };
+
+partial interface Document {
+ readonly attribute boolean hidden;
+ readonly attribute VisibilityState visibilityState;
+};
+</pre>
+
+<script>
+
+(function() {
+ var idl_array = new IdlArray();
+
+ idl_array.add_untested_idls(document.getElementById("untested_idl").textContent);
+ idl_array.add_idls(document.getElementById("idl").textContent);
+
+ idl_array.add_objects({Document: ["window.document"]});
+
+ idl_array.test();
+})();
+
+</script>
+
+<div id="log"></div>
+
+</body>
+</html>
diff --git a/testing/web-platform/tests/page-visibility/resources/blank_page_green.html b/testing/web-platform/tests/page-visibility/resources/blank_page_green.html
new file mode 100644
index 000000000..b8a1947b7
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/resources/blank_page_green.html
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+ <title>Green Test Page</title>
+ </head>
+ <body style="background-color:#00FF00;">
+ <h1>Placeholder</h1>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/page-visibility/resources/pagevistestharness.js b/testing/web-platform/tests/page-visibility/resources/pagevistestharness.js
new file mode 100644
index 000000000..d53d73b42
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/resources/pagevistestharness.js
@@ -0,0 +1,121 @@
+/*
+Distributed under both the W3C Test Suite License [1] and the W3C
+3-clause BSD License [2]. To contribute to a W3C Test Suite, see the
+policies and contribution forms [3].
+
+[1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
+[2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license
+[3] http://www.w3.org/2004/10/27-testcases
+*/
+
+//
+// Helper Functions for PageVisibility W3C tests
+//
+var VISIBILITY_STATES =
+{
+ HIDDEN: "hidden",
+ VISIBLE: "visible"
+};
+
+var feature_check = false;
+
+//
+// All test() functions in the WebPerf PageVis test suite should use pv_test() instead.
+//
+// pv_test() validates the document.hidden and document.visibilityState attributes
+// exist prior to running tests and immediately shows a failure if they do not.
+//
+
+function pv_test(func, msg, doc)
+{
+ if (!doc)
+ {
+ doc = document;
+ }
+
+ // only run the feature check once, unless func == null, in which case,
+ // this call is intended as a feature check
+ if (!feature_check)
+ {
+ feature_check = true;
+
+ var hiddenVal = doc.hidden;
+ var visStateVal = doc.visibilityState;
+
+ // show a single error that the Page Visibility feature is undefined
+ test(function()
+ {
+ assert_true(hiddenVal !== undefined && hiddenVal != null,
+ "document.hidden is defined and not null.");},
+ "document.hidden is defined and not null.");
+
+ test(function()
+ {
+ assert_true(visStateVal !== undefined && hiddenVal != null,
+ "document.visibilityState is defined and not null.");},
+ "document.visibilityState is defined and not null.");
+
+ }
+
+ if (func)
+ {
+ test(func, msg);
+ }
+}
+
+
+function test_feature_exists(doc, msg)
+{
+ if (!msg)
+ {
+ msg = "";
+ }
+ var hiddenMsg = "document.hidden is defined" + msg + ".";
+ var stateMsg = "document.visibilityState is defined" + msg + ".";
+ pv_test(function(){assert_true(document.hidden !== undefined, hiddenMsg);}, hiddenMsg, doc);
+ pv_test(function(){assert_true(document.visibilityState !== undefined, stateMsg);}, stateMsg, doc);
+}
+
+//
+// Common helper functions
+//
+
+function test_true(value, msg)
+{
+ pv_test(function() { assert_true(value, msg); }, msg);
+}
+
+function test_equals(value, equals, msg)
+{
+ pv_test(function() { assert_equals(value, equals, msg); }, msg);
+}
+
+//
+// asynchronous test helper functions
+//
+
+function add_async_result(test_obj, pass_state)
+{
+ // add assertion to manual test for the pass state
+ test_obj.step(function() { assert_true(pass_state) });
+
+ // end manual test
+ test_obj.done();
+}
+
+function add_async_result_assert(test_obj, func)
+{
+ // add assertion to manual test for the pass state
+ test_obj.step(func);
+
+ // end manual test
+ test_obj.done();
+}
+
+var open_link;
+function TabSwitch()
+{
+ //var open_link = window.open("http://www.bing.com");
+ open_link = window.open('', '_blank');
+ setTimeout(function() { open_link.close(); }, 2000);
+}
diff --git a/testing/web-platform/tests/page-visibility/test_attributes_exist.html b/testing/web-platform/tests/page-visibility/test_attributes_exist.html
new file mode 100644
index 000000000..748161fdf
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/test_attributes_exist.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <title>Page Visibility API Definition</title>
+
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script type="text/javascript" src="resources/pagevistestharness.js"></script>
+ </head>
+ <body>
+ <h1>Description</h1>
+ <p>This test validates that all of the attributes associated with the Page Visibility feature exist
+ (but does not validate that their values are correct).</p>
+
+ <div id="log"></div>
+
+ <script type="text/javascript" >
+ test_feature_exists();
+ </script>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/page-visibility/test_child_document.html b/testing/web-platform/tests/page-visibility/test_child_document.html
new file mode 100644
index 000000000..77ec8f8fd
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/test_child_document.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <title>Page Visibility API Child Document Test</title>
+
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script type="text/javascript" src="resources/pagevistestharness.js"></script>
+
+ <style type="text/css">
+ iframe
+ {
+ width:250px;
+ height:250px;
+ margin-left:5px;
+ }
+
+ div.docs
+ {
+ position:relative;
+ float:left;
+ text-align:center;
+ margin:10px;
+ border:solid 1px black;
+ padding:3px;
+ }
+ </style>
+
+ <script type="text/javascript" >
+ setup({explicit_done: true});
+
+ function onload_test()
+ {
+ pv_test();
+
+ var frames = document.getElementsByTagName("iframe");
+ var doc, doc_name;
+
+ for (var i = 0; i < frames.length; i++)
+ {
+ doc = frames[i].contentDocument;
+ doc_name = "IFrame with " + frames[i].id;
+
+ pv_test(function()
+ {
+ test_feature_exists(doc, " for frame with " + frames[i].id);
+ });
+
+ test_equals(doc.visibilityState, VISIBILITY_STATES.VISIBLE,
+ "document.visibilityState for frame with " +
+ frames[i].id + " == " +
+ VISIBILITY_STATES.VISIBLE);
+ }
+
+ done();
+ }
+ </script>
+ </head>
+ <body onload="onload_test()">
+ <h1>Description</h1>
+ <p>This test validates that, within child documents, all of the Page Visibility API attributes exist,
+ are read-only, and match the value of the attributes within the parent document.</p>
+
+ <div id="log"></div>
+
+ <br/>
+
+ <div class="docs">
+ IFrame with no style attribute
+ <br/>
+ <iframe id="no style attribute" src="resources/blank_page_green.html">
+ iframes unsupported
+ </iframe>
+ </div>
+
+ <div class="docs">
+ IFrame with "display:none" style<br/>
+ <iframe id="'display:none' style" style="display:none"
+ src="resources/blank_page_green.html">
+ iframes unsupported
+ </iframe>
+ </div>
+
+ <div class="docs">
+ IFrame with "visibility:hidden" style
+ <br/>
+ <iframe id="'visibility:hidden' style" style="visibility:hidden"
+ src="resources/blank_page_green.html">
+ iframes unsupported
+ </iframe>
+ </div>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/page-visibility/test_default_view.html b/testing/web-platform/tests/page-visibility/test_default_view.html
new file mode 100644
index 000000000..6e2f97084
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/test_default_view.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <title>Page Visibility Null Default View Test</title>
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script type="text/javascript" src="resources/pagevistestharness.js"></script>
+
+ <script type="text/javascript" >
+ setup({explicit_done: true});
+
+ function onload_test()
+ {
+ // inject a windowless subdocument as a child of the root document <html> element
+ var subDoc = document.implementation.createDocument('resources/blank_page_green.html', 'html', null);
+
+ // Test precondition: ensure subdocument has a null default view
+ test_true(subDoc.defaultView == null, "windowless subdocument generated for test has a null default view");
+
+ // check that feature exists within subdocument
+ test_feature_exists(subDoc, 'windowless subdocument');
+
+ // check that the subdocument has a hidden visibility state
+ test_true(subDoc.hidden,
+ "hidden == true for windowless subdocuments with a null default view");
+ test_equals(subDoc.visibilityState, VISIBILITY_STATES.HIDDEN,
+ "visibilityState == " + VISIBILITY_STATES.HIDDEN +
+ " for windowless subdocuments with a null default view");
+
+ done();
+ }
+ </script>
+ </head>
+ <body onload="onload_test()">
+ <h1>Description</h1>
+ <p>This test validates that document.hidden == false and
+ document.visibilityState == "visible" for windowless subdocuments.</p>
+ <div id="log"></div>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/page-visibility/test_minimize-manual.html b/testing/web-platform/tests/page-visibility/test_minimize-manual.html
new file mode 100644
index 000000000..28e848676
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/test_minimize-manual.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <title>Page Visibility API Operation While Minimizing Browser Window</title>
+ <meta name="flags" content="interact" />
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script type="text/javascript" src="resources/pagevistestharness.js"></script>
+
+ </head>
+ <body>
+ <h1>Description</h1>
+ <p>This test validates that the page properly becomes hidden and visible due to minimizing, maximizing, and
+ restoring the browser window.</p>
+
+ <h1>Manual Test Steps:</h1>
+ <p>
+ <ol>
+ <li> Ensure this page is the foreground and click the "Start Test"</li>
+ <li> Minimize the browser</li>
+ <li> Restore or maximize the browser</li>
+ </ol>
+ Note: This test will automatically timeout and fail if not completed within 60 seconds.
+ </p>
+
+ <button onclick="start_test();">Start Test</button>
+
+ <div id="log"></div>
+
+ <br />
+ IFrame with default style:
+ <br />
+ <iframe id="childDocShown" src="resources/blank_page_green.html">
+ iframes unsupported
+ </iframe>
+ <hr />
+ IFrame with "display:none" style:
+ <br />
+ <iframe id="childDocHidden" src="resources/blank_page_green.html" style="display:none">
+ iframes unsupported
+ </iframe>
+
+ <script type="text/javascript" >
+ var child_doc_shown = null;
+ var child_doc_hidden = null;
+ var transition_mode;
+ var manual_test = null;
+
+ var expected_notification_count = 2;
+ var notification_count = new Array();
+ var page_docs = new Array();
+ var notification_handlers = new Array();
+ var two_notifications = false;
+
+ var PAGE_HIDDEN_VAL = "hidden";
+ var PAGE_VISIBLE_VAL = "visible";
+
+ setup({ explicit_done: true });
+
+ function test_transition_init()
+ {
+ child_doc_shown = document.getElementById("childDocShown").contentDocument;
+ child_doc_hidden = document.getElementById("childDocHidden").contentDocument;
+
+ // fill in data for page documents
+ page_docs.push([document, "document"]);
+ page_docs.push([child_doc_shown, "document.getElementById(\"childDocShown\").contentDocument"]);
+ page_docs.push([child_doc_hidden, "document.getElementById(\"childDocHidden\").contentDocument"]);
+
+ notification_handlers[0] = function(){ VerifyNotification(0); };
+ notification_handlers[1] = function(){ VerifyNotification(1); };
+ notification_handlers[2] = function(){ VerifyNotification(2); };
+
+ for (var i in page_docs)
+ {
+ notification_count[i] = 0;
+ page_docs[i][0].addEventListener("visibilitychange", notification_handlers[i]);
+ }
+
+ test_true(!document.hidden, "Page is visible on load.");
+ test_true((!child_doc_shown.hidden) && (!child_doc_hidden.hidden),
+ "All IFrame child documents are visible on load.");
+
+ document.addEventListener("visibilitychange", notification_handlers[0]);
+ document.addEventListener("visibilitychange", VerifyTwoNotifications);
+
+ manual_test = AddManual("Browser minimization has occurred.");
+ }
+
+ function VerifyNotification(doc_index)
+ {
+ doc = page_docs[doc_index][0];
+ docName = page_docs[doc_index][1];
+
+ notification_count[doc_index]++;
+ switch (notification_count[doc_index])
+ {
+ case 1:
+ // First step, check page visibility after tab deselection / minimization.
+ // hidden should change to true; visibilityState should change to "hidden"
+ test_true(doc.hidden, docName + ".hidden == true (after browser frame minimization)");
+ test_true(doc.visibilityState == PAGE_HIDDEN_VAL,
+ docName + ".visibilityState == \"hidden\" (after browser frame minimization)");
+
+ break;
+
+ case 2:
+ //Second step, check page visibility after tab reselection / maximization / restoration.
+ // hidden should change to false; visibilityState should change to "visible"
+ test_true(!doc.hidden,
+ docName + ".hidden == false (after browser frame maximization / restoration)");
+ test_true(doc.visibilityState == PAGE_VISIBLE_VAL,
+ docName + ".visibilityState == \"visible\" (after browser frame maximization / " +
+ "restoration)");
+
+ // perform tests specific to the main document
+ if (doc == document)
+ {
+ //Verify that a second registration to a different callback also occurred
+ test_true(two_notifications, "Two registrations (different callbacks) occurred.");
+
+ //Verify that a second registration to the same callback did not occur
+ test_equals(notification_count[doc_index],
+ expected_notification_count,
+ "Two registrations (same callback) did not occur.");
+
+ // pass the manual item associated with these tests
+ AddManualResult(manual_test, true);
+
+ document.removeEventListener("visibilitychange", VerifyTwoNotifications);
+
+ // schedule the rollup
+ setTimeout(VerifyAllNotifications, 200);
+ }
+
+ //Remove all event listeners and verify that the event does not fire
+ doc.removeEventListener("visibilitychange", notification_handlers[doc_index]);
+ break;
+ case 3:
+ //This step should not have occurred since the event handlers were cleared
+ test_true(false, "Event did not fire when event listener is removed.");
+
+ //On final step, schedule the rollup
+ setTimeout(done, 2000);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ function VerifyAllNotifications()
+ {
+ //On final step, schedule the rollup
+ setTimeout(done, 1000);
+ }
+
+ function VerifyTwoNotifications()
+ {
+ //This is a duplicate registration on visibilitychange and
+ //should never get fired. Check that duplicate_notification
+ //is false to verify that this never occurred.
+ two_notifications = true;
+ }
+
+ // Manual Test helper functions
+ function AddManual(test)
+ {
+ // add asynchronous test for manual tests
+ return async_test(test);
+ }
+
+ function AddManualResult(oManualTest, passState)
+ {
+ // add assertion to manual test for the pass state
+ oManualTest.step(function() {assert_true(passState)});
+
+ // end manual test
+ oManualTest.done();
+ }
+
+ function start_test()
+ {
+ test_transition_init();
+ }
+ </script>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/page-visibility/test_read_only.html b/testing/web-platform/tests/page-visibility/test_read_only.html
new file mode 100644
index 000000000..6d3702292
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/test_read_only.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <title>Page Visibility API is Read Only</title>
+
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script type="text/javascript" src="resources/pagevistestharness.js"></script>
+
+ <script type="text/javascript">
+ setup({ explicit_done: true });
+ function onload_test()
+ {
+ //check for feature definition first before attempting to overwrite
+ pv_test();
+
+ //Check document.hidden
+ document.hidden = "new value";
+ test_true(document.hidden !== "new value", 'document.hidden is read only.');
+
+ //Check document.visibilityState
+ document.visibilityState = "new value";
+ test_true(document.visibilityState !== "new value",
+ "document.visibilityState is read only.");
+
+ done();
+ }
+ </script>
+ </head>
+ <body onload="onload_test();">
+ <h1>Description</h1>
+ <p>This test validates that the Page Visibility attributes are read only.</p>
+
+ <div id="log"></div>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/page-visibility/test_tab_state_change-manual.html b/testing/web-platform/tests/page-visibility/test_tab_state_change-manual.html
new file mode 100644
index 000000000..c701e5078
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/test_tab_state_change-manual.html
@@ -0,0 +1,186 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <title>Page Visibility API Operation While Changing Tabs</title>
+ <meta name="flags" content="interact" />
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script type="text/javascript" src="resources/pagevistestharness.js"></script>
+
+ </head>
+ <body>
+ <h1>Description</h1>
+ <p>This test validates that the page properly becomes hidden and visible due to switching tabs.</p>
+
+ <h1>Manual Test Steps:</h1>
+ <p>
+ <ol>
+ <li> Ensure this page is the foreground and click the "Start Test"</li>
+ <li> Switch to another tab</li>
+ <li> Return to the current tab containing this test page</li>
+ </ol>
+ Note: This test will automatically timeout and fail if not completed within 60 seconds.
+ </p>
+
+ <button onclick="start_test();">Start Test</button>
+
+ <div id="log"></div>
+
+ <br />
+ IFrame with default style:
+ <br />
+ <iframe id="childDocShown" src="resources/blank_page_green.html">
+ iframes unsupported
+ </iframe>
+ <hr />
+ IFrame with "display:none" style:
+ <br />
+ <iframe id="childDocHidden" src="resources/blank_page_green.html" style="display:none">
+ iframes unsupported
+ </iframe>
+
+ <script type="text/javascript" >
+ var child_doc_shown = null;
+ var child_doc_hidden = null;
+ var transition_mode;
+ var manual_test = null;
+
+ var expected_notification_count = 2;
+ var notification_count = new Array();
+ var page_docs = new Array();
+ var notification_handlers = new Array();
+ var two_notifications = false;
+
+ var PAGE_HIDDEN_VAL = "hidden";
+ var PAGE_VISIBLE_VAL = "visible";
+
+ setup({ explicit_done: true });
+
+ function test_transition_init()
+ {
+ child_doc_shown = document.getElementById("childDocShown").contentDocument;
+ child_doc_hidden = document.getElementById("childDocHidden").contentDocument;
+
+ // fill in data for page documents
+ page_docs.push([document, "document"]);
+ page_docs.push([child_doc_shown, "document.getElementById(\"childDocShown\").contentDocument"]);
+ page_docs.push([child_doc_hidden, "document.getElementById(\"childDocHidden\").contentDocument"]);
+
+ notification_handlers[0] = function(){ VerifyNotification(0); };
+ notification_handlers[1] = function(){ VerifyNotification(1); };
+ notification_handlers[2] = function(){ VerifyNotification(2); };
+
+ for (var i in page_docs)
+ {
+ notification_count[i] = 0;
+ page_docs[i][0].addEventListener("visibilitychange", notification_handlers[i]);
+ }
+
+ test_true(!document.hidden, "Page is visible on load.");
+ test_true((!child_doc_shown.hidden) && (!child_doc_hidden.hidden),
+ "All IFrame child documents are visible on load.");
+
+ document.addEventListener("visibilitychange", notification_handlers[0]);
+ document.addEventListener("visibilitychange", VerifyTwoNotifications);
+
+ manual_test = AddManual("Browser tab switch has occurred.");
+ }
+
+ function VerifyNotification(doc_index)
+ {
+ doc = page_docs[doc_index][0];
+ docName = page_docs[doc_index][1];
+
+ notification_count[doc_index]++;
+ switch (notification_count[doc_index])
+ {
+ case 1:
+ // First step, check page visibility after tab deselection / minimization.
+ // hidden should change to true; visibilityState should change to "hidden"
+ test_true(doc.hidden, docName + ".hidden == true (after tab switch)");
+ test_true(doc.visibilityState == PAGE_HIDDEN_VAL,
+ docName + ".visibilityState == \"hidden\" (after tab switch)");
+
+ break;
+
+ case 2:
+ //Second step, check page visibility after tab reselection / maximization / restoration.
+ // hidden should change to false; visibilityState should change to "visible"
+ test_true(!doc.hidden,
+ docName + ".hidden == false (after return to original tab)");
+ test_true(doc.visibilityState == PAGE_VISIBLE_VAL,
+ docName + ".visibilityState == \"visible\" (after return to original tab)");
+
+ // perform tests specific to the main document
+ if (doc == document)
+ {
+ //Verify that a second registration to a different callback also occurred
+ test_true(two_notifications, "Two registrations (different callbacks) occurred.");
+
+ //Verify that a second registration to the same callback did not occur
+ test_equals(notification_count[doc_index],
+ expected_notification_count,
+ "Two registrations (same callback) did not occur.");
+
+ // pass the manual item associated with these tests
+ AddManualResult(manual_test, true);
+
+ document.removeEventListener("visibilitychange", VerifyTwoNotifications);
+
+ // schedule the rollup
+ setTimeout(VerifyAllNotifications, 200);
+ }
+
+ //Remove all event listeners and verify that the event does not fire
+ doc.removeEventListener("visibilitychange", notification_handlers[doc_index]);
+ break;
+ case 3:
+ //This step should not have occurred since the event handlers were cleared
+ test_true(false, "Event did not fire when event listener is removed.");
+
+ //On final step, schedule the rollup
+ setTimeout(done, 2000);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ function VerifyAllNotifications()
+ {
+ //On final step, schedule the rollup
+ setTimeout(done, 1000);
+ }
+
+ function VerifyTwoNotifications()
+ {
+ //This is a duplicate registration on visibilitychange and
+ //should never get fired. Check that duplicate_notification
+ //is false to verify that this never occurred.
+ two_notifications = true;
+ }
+
+ // Manual Test helper functions
+ function AddManual(test)
+ {
+ // add asynchronous test for manual tests
+ return async_test(test);
+ }
+
+ function AddManualResult(oManualTest, passState)
+ {
+ // add assertion to manual test for the pass state
+ oManualTest.step(function() {assert_true(passState)});
+
+ // end manual test
+ oManualTest.done();
+ }
+
+ function start_test()
+ {
+ test_transition_init();
+ }
+ </script>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/page-visibility/unload-1.html b/testing/web-platform/tests/page-visibility/unload-1.html
new file mode 100644
index 000000000..b54851878
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/unload-1.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<html>
+<head><title>Document</title></head>
+<body>
+<h1>Document</h1>
+<script>
+onload = function() {
+ document.addEventListener("visibilitychange", onVisibilityChange, false);
+ opener.postMessage("close", "*");
+}
+
+function onVisibilityChange() {
+ opener.postMessage(document.visibilityState, "*");
+}
+</script>
+</body>
+</html>
diff --git a/testing/web-platform/tests/page-visibility/unload.html b/testing/web-platform/tests/page-visibility/unload.html
new file mode 100644
index 000000000..48cf203cd
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/unload.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<title>visibilitychange fires on unload</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+async_test(function(t) {
+ var w = window.open("unload-1.html");
+ window.onmessage = t.step_func(function(event) {
+ if (event.data === "close") {
+ w.close();
+ return;
+ }
+ assert_equals(event.data, "hidden");
+ t.done();
+ });
+});
+</script>