1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 var listenOnce = chrome.test.listenOnce;
6 var listenForever = chrome.test.listenForever;
8 JSON.parse = function() {
9 return "JSON.parse clobbered by extension.";
12 JSON.stringify = function() {
13 return "JSON.stringify clobbered by extension.";
16 Array.prototype.toJSON = function() {
17 return "Array.prototype.toJSON clobbered by extension.";
20 Object.prototype.toJSON = function() {
21 return "Object.prototype.toJSON clobbered by extension.";
24 // Keep track of the tab that we're running tests in, for simplicity.
27 chrome.test.getConfig(function(config) {
28 chrome.test.runTests([
29 function setupTestTab() {
30 chrome.test.log("Creating tab...");
32 var doneListening = listenForever(chrome.tabs.onUpdated,
33 function(_, info, tab) {
34 if (newTab && tab.id == newTab.id && info.status == 'complete') {
35 chrome.test.log("Created tab: " + tab.url);
41 url: "http://localhost:PORT/extensions/test_file.html"
42 .replace(/PORT/, config.testServer.port)
48 // Tests that postMessage to the tab and its response works.
49 function postMessage() {
50 var port = chrome.tabs.connect(testTab.id);
51 port.postMessage({testPostMessage: true});
52 listenOnce(port.onMessage, function(msg) {
57 // Tests that port name is sent & received correctly.
59 var portName = "lemonjello";
60 var port = chrome.tabs.connect(testTab.id, {name: portName});
61 port.postMessage({testPortName: true});
62 listenOnce(port.onMessage, function(msg) {
63 chrome.test.assertEq(msg.portName, portName);
68 // Tests that postMessage from the tab and its response works.
69 function postMessageFromTab() {
70 listenOnce(chrome.runtime.onConnect, function(port) {
71 chrome.test.assertEq({
76 listenOnce(port.onMessage, function(msg) {
77 chrome.test.assertTrue(msg.testPostMessageFromTab);
78 port.postMessage({success: true, portName: port.name});
79 chrome.test.log("postMessageFromTab: got message from tab");
83 var port = chrome.tabs.connect(testTab.id);
84 port.postMessage({testPostMessageFromTab: true});
85 chrome.test.log("postMessageFromTab: sent first message to tab");
86 listenOnce(port.onMessage, function(msg) {
91 // Tests receiving a request from a content script and responding.
92 function sendMessageFromTab() {
93 var doneListening = listenForever(
94 chrome.runtime.onMessage,
95 function(request, sender, sendResponse) {
96 chrome.test.assertEq({
101 if (request.step == 1) {
102 // Step 1: Page should send another request for step 2.
103 chrome.test.log("sendMessageFromTab: got step 1");
104 sendResponse({nextStep: true});
107 chrome.test.assertEq(request.step, 2);
113 var port = chrome.tabs.connect(testTab.id);
114 port.postMessage({testSendMessageFromTab: true});
116 chrome.test.log("sendMessageFromTab: sent first message to tab");
119 // Tests error handling when sending a request from a content script to an
120 // invalid extension.
121 function sendMessageFromTabError() {
123 chrome.runtime.onMessage,
124 function(request, sender, sendResponse) {
125 if (!request.success)
130 var port = chrome.tabs.connect(testTab.id);
131 port.postMessage({testSendMessageFromTabError: true});
133 chrome.test.log("testSendMessageFromTabError: send 1st message to tab");
136 // Tests error handling when connecting to an invalid extension from a
138 function connectFromTabError() {
140 chrome.runtime.onMessage,
141 function(request, sender, sendResponse) {
142 if (!request.success)
147 var port = chrome.tabs.connect(testTab.id);
148 port.postMessage({testConnectFromTabError: true});
150 chrome.test.log("testConnectFromTabError: sent 1st message to tab");
153 // Tests sending a request to a tab and receiving a response.
154 function sendMessage() {
155 chrome.tabs.sendMessage(testTab.id, {step2: 1}, function(response) {
156 chrome.test.assertTrue(response.success);
157 chrome.test.succeed();
161 // Tests that we get the disconnect event when the tab disconnect.
162 function disconnect() {
163 var port = chrome.tabs.connect(testTab.id);
164 port.postMessage({testDisconnect: true});
165 listenOnce(port.onDisconnect, function() {});
168 // Tests that a message which fails to serialize prints an error and
169 // doesn't send (http://crbug.com/263077).
170 function unserializableMessage() {
172 chrome.tabs.connect(testTab.id).postMessage(function() {
173 // This shouldn't ever be called, so it's a bit pointless.
177 chrome.test.succeed();
179 chrome.test.fail(e.stack);
183 // Tests that we get the disconnect event when the tab context closes.
184 function disconnectOnClose() {
185 var port = chrome.tabs.connect(testTab.id);
186 port.postMessage({testDisconnectOnClose: true});
187 listenOnce(port.onDisconnect, function() {
188 testTab = null; // the tab is about:blank now.
192 // Tests that the sendRequest API is disabled.
193 function sendRequest() {
196 chrome.extension.sendRequest("hi");
200 chrome.test.assertTrue(error != undefined);
204 chrome.extension.onRequest.addListener(function() {});
208 chrome.test.assertTrue(error != undefined);
210 chrome.test.succeed();