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 url: "http://localhost:PORT/extensions/test_file.html"
33 .replace(/PORT/, config.testServer.port)
35 var doneListening = listenForever(chrome.tabs.onUpdated,
36 function(_, info, tab) {
37 if (tab.id == newTab.id && info.status == 'complete') {
38 chrome.test.log("Created tab: " + tab.url);
46 // Tests that postMessage to the tab and its response works.
47 function postMessage() {
48 var port = chrome.tabs.connect(testTab.id);
49 port.postMessage({testPostMessage: true});
50 listenOnce(port.onMessage, function(msg) {
55 // Tests that port name is sent & received correctly.
57 var portName = "lemonjello";
58 var port = chrome.tabs.connect(testTab.id, {name: portName});
59 port.postMessage({testPortName: true});
60 listenOnce(port.onMessage, function(msg) {
61 chrome.test.assertEq(msg.portName, portName);
66 // Tests that postMessage from the tab and its response works.
67 function postMessageFromTab() {
68 listenOnce(chrome.runtime.onConnect, function(port) {
69 chrome.test.assertEq({
74 listenOnce(port.onMessage, function(msg) {
75 chrome.test.assertTrue(msg.testPostMessageFromTab);
76 port.postMessage({success: true, portName: port.name});
77 chrome.test.log("postMessageFromTab: got message from tab");
81 var port = chrome.tabs.connect(testTab.id);
82 port.postMessage({testPostMessageFromTab: true});
83 chrome.test.log("postMessageFromTab: sent first message to tab");
84 listenOnce(port.onMessage, function(msg) {
89 // Tests receiving a request from a content script and responding.
90 function sendMessageFromTab() {
91 var doneListening = listenForever(
92 chrome.runtime.onMessage,
93 function(request, sender, sendResponse) {
94 chrome.test.assertEq({
99 if (request.step == 1) {
100 // Step 1: Page should send another request for step 2.
101 chrome.test.log("sendMessageFromTab: got step 1");
102 sendResponse({nextStep: true});
105 chrome.test.assertEq(request.step, 2);
111 var port = chrome.tabs.connect(testTab.id);
112 port.postMessage({testSendMessageFromTab: true});
114 chrome.test.log("sendMessageFromTab: sent first message to tab");
117 // Tests error handling when sending a request from a content script to an
118 // invalid extension.
119 function sendMessageFromTabError() {
121 chrome.runtime.onMessage,
122 function(request, sender, sendResponse) {
123 if (!request.success)
128 var port = chrome.tabs.connect(testTab.id);
129 port.postMessage({testSendMessageFromTabError: true});
131 chrome.test.log("testSendMessageFromTabError: send 1st message to tab");
134 // Tests error handling when connecting to an invalid extension from a
136 function connectFromTabError() {
138 chrome.runtime.onMessage,
139 function(request, sender, sendResponse) {
140 if (!request.success)
145 var port = chrome.tabs.connect(testTab.id);
146 port.postMessage({testConnectFromTabError: true});
148 chrome.test.log("testConnectFromTabError: sent 1st message to tab");
151 // Tests sending a request to a tab and receiving a response.
152 function sendMessage() {
153 chrome.tabs.sendMessage(testTab.id, {step2: 1}, function(response) {
154 chrome.test.assertTrue(response.success);
155 chrome.test.succeed();
159 // Tests that we get the disconnect event when the tab disconnect.
160 function disconnect() {
161 var port = chrome.tabs.connect(testTab.id);
162 port.postMessage({testDisconnect: true});
163 listenOnce(port.onDisconnect, function() {});
166 // Tests that a message which fails to serialize prints an error and
167 // doesn't send (http://crbug.com/263077).
168 function unserializableMessage() {
170 chrome.tabs.connect(testTab.id).postMessage(function() {
171 // This shouldn't ever be called, so it's a bit pointless.
175 chrome.test.succeed();
177 chrome.test.fail(e.stack);
181 // Tests that we get the disconnect event when the tab context closes.
182 function disconnectOnClose() {
183 var port = chrome.tabs.connect(testTab.id);
184 port.postMessage({testDisconnectOnClose: true});
185 listenOnce(port.onDisconnect, function() {
186 testTab = null; // the tab is about:blank now.
190 // Tests that the sendRequest API is disabled.
191 function sendRequest() {
194 chrome.extension.sendRequest("hi");
198 chrome.test.assertTrue(error != undefined);
202 chrome.extension.onRequest.addListener(function() {});
206 chrome.test.assertTrue(error != undefined);
208 chrome.test.succeed();