Index: chrome/test/data/extensions/api_test/messaging/interstitial_component/background.js |
diff --git a/chrome/test/data/extensions/api_test/messaging/interstitial_component/background.js b/chrome/test/data/extensions/api_test/messaging/interstitial_component/background.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9364ef6288fcb7cf1e974345ff4dedbfc62b8e1f |
--- /dev/null |
+++ b/chrome/test/data/extensions/api_test/messaging/interstitial_component/background.js |
@@ -0,0 +1,110 @@ |
+// Copyright 2016 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. |
+ |
+// This port is opened by a content script in an interstitial. This is used by |
+// the tests to drive the tests. |
+var testPort; |
+var testPortPromise = new Promise(function(resolve) { |
+ chrome.test.listenOnce(chrome.runtime.onConnect, function(port) { |
+ testPort = port; |
+ resolve(); |
+ }); |
+}); |
+ |
+// Start a test and wait until the set-up (not necessarily the test!) is done. |
+function sendToInterstitialAndWait(testName) { |
+ testPort.postMessage(testName); |
+ chrome.test.listenOnce(testPort.onMessage, function(msg) { |
+ chrome.test.assertEq(testName, msg); |
+ }); |
+} |
+ |
+function assertIsPortFromInterstitial(port, expectedName) { |
+ chrome.test.assertEq(expectedName, port.name); |
+ chrome.test.assertEq(undefined, port.sender.tab); |
+ chrome.test.assertEq(undefined, port.sender.frameId); |
+ chrome.test.assertTrue(port.sender.url.startsWith('data:')); |
+} |
+ |
+var httpsTabId; |
+var httpsTabIdPromise = new Promise(function(resolve) { |
+ // The test runner will open a https page after loading the extension. |
+ chrome.tabs.onUpdated.addListener(function listener(tabId, changeInfo, tab) { |
+ if (tab.url.startsWith('https://')) { |
+ chrome.tabs.onUpdated.removeListener(listener); |
+ httpsTabId = tabId; |
+ resolve(); |
+ } |
+ }); |
+}); |
+ |
+chrome.test.runTests([ |
+ function waitForHttpsPage() { |
+ httpsTabIdPromise.then(chrome.test.callbackPass(function() { |
+ chrome.tabs.query({ |
+ url: 'https://*/*' |
+ }, chrome.test.callbackPass(function(tabs) { |
+ // Sanity check. There should only be one https tab. |
+ chrome.test.assertEq(1, tabs.length); |
+ })); |
+ })); |
+ }, |
+ |
+ // All following tests rely on testPort, so ensure that it exists! |
+ function waitForPortFromInterstitial() { |
+ testPortPromise.then(chrome.test.callbackPass(function() { |
+ assertIsPortFromInterstitial(testPort, 'port from interstitial'); |
+ })); |
+ }, |
+ |
+ // Tests whether ping-ponging with sendMessage works. |
+ function testSendMessage() { |
+ chrome.test.listenOnce(chrome.runtime.onMessage, |
+ function(msg, sender, sendResponse) { |
+ chrome.test.assertEq('First from interstitial', msg); |
+ |
+ var kResponse = 'hello me!'; |
+ chrome.test.listenOnce(chrome.runtime.onMessage, function(msg) { |
+ chrome.test.assertEq('interstitial received: ' + kResponse, msg); |
+ }); |
+ sendResponse(kResponse); |
+ }); |
+ sendToInterstitialAndWait('testSendMessage'); |
+ }, |
+ |
+ // Tests whether the onDisconnect event is fired in the interstitial page. |
+ function testDisconnectByBackground() { |
+ chrome.test.listenOnce(chrome.runtime.onConnect, |
+ function(port) { |
+ assertIsPortFromInterstitial(port, 'disconnect by background'); |
+ port.disconnect(); |
+ }); |
+ sendToInterstitialAndWait('testDisconnectByBackground'); |
+ }, |
+ |
+ // Tests whether the onDisconnect event is fired when the port is closed from |
+ // the content script in the interstitial page. |
+ function testDisconnectByInterstitial() { |
+ chrome.test.listenOnce(chrome.runtime.onConnect, |
+ function(port) { |
+ assertIsPortFromInterstitial(port, 'disconnect by interstitial'); |
+ chrome.test.listenOnce(port.onDisconnect, function() { |
+ chrome.test.assertNoLastError(); |
+ }); |
+ }); |
+ sendToInterstitialAndWait('testDisconnectByInterstitial'); |
+ }, |
+ |
+ // Closing the interstitial should cause the ports to disconnect. |
+ function testDisconnectByClosingInterstitial() { |
+ chrome.test.listenOnce(testPort.onDisconnect, function() { |
+ chrome.test.assertNoLastError(); |
+ testPort = null; |
+ }); |
+ // Close the interstitial. Should trigger onDisconnect. |
+ chrome.tabs.update(httpsTabId, { |
+ url: 'about:blank' |
+ }); |
+ }, |
+]); |