blob: d54353edc1753a9f80c3f871b119443bd370793b [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// For complex connect tests.
chrome.runtime.onConnect.addListener(function onConnect(port) {
console.log('connected');
port.onMessage.addListener(function(msg) {
console.log('got ' + msg);
if (msg.testPostMessage) {
port.postMessage({success: true});
} else if (msg.testPostMessageFromTab) {
testPostMessageFromTab(port);
} else if (msg.testSendMessageFromTab) {
testSendMessageFromTab();
} else if (msg.testSendMessageFromFrame) {
testSendMessageFromFrame();
} else if (msg.testSendMessageFromSandboxedFrame) {
testSendMessageFromSandboxedFrame();
} else if (msg.testSendMessageToFrame) {
port.postMessage('from_main');
} else if (msg.testDisconnect) {
port.disconnect();
} else if (msg.testConnectChildFrameAndNavigateSetup) {
chrome.runtime.onConnect.removeListener(onConnect);
chrome.test.assertFalse(chrome.runtime.onConnect.hasListeners());
testConnectChildFrameAndNavigateSetup();
} else if (msg.testNavigateAwayAndHistoryBack) {
// This tests the following scenario:
// 1. Open port to the background script (test.js).
// 2. The background script (test.js) sends a message
// ("navigateAwayAndHistoryBack") to this page.
// 3. Attach a pageshow event handler on this page.
// 4. Navigate to history_back.html, and navigate away from the
// current page.
// 5. The current page is stored in the back/forward cache.
// 6. history_back.html runs window.history.back().
// 7. The previous page is salvaged from the back/forward cache.
// 8. The pageshow event handler sends two messages to the
// background script (test.js) to confirm that these ports
// that are opened before navigating away are still
// available.
let portFromTab = chrome.runtime.connect();
portFromTab.onMessage.addListener(function(msg) {
window.addEventListener('pageshow', function(event) {
if (event.persisted) {
port.postMessage({salvagedFromBackForwardCache1: true});
portFromTab.postMessage({salvagedFromBackForwardCache2: true});
}
});
chrome.test.assertEq('navigateAwayAndHistoryBack', msg);
window.location = 'api_test/messaging/connect/history_back.html';
});
} else if (msg.testDisconnectOnClose) {
chrome.runtime.connect().onMessage.addListener(function(msg) {
chrome.test.assertEq('unloadTabContent', msg);
window.location = 'about:blank';
});
} else if (msg.testPortName) {
port.postMessage({portName:port.name});
} else if (msg.testSendMessageFromTabError) {
testSendMessageFromTabError();
} else if (msg.testConnectFromTabError) {
testConnectFromTabError();
}
});
});
// Tests that postMessage to the extension and its response works.
function testPostMessageFromTab(origPort) {
var portName = "peter";
var port = chrome.runtime.connect({name: portName});
port.postMessage({testPostMessageFromTab: true});
port.onMessage.addListener(function(msg) {
origPort.postMessage({success: (msg.success && (msg.portName == portName))});
console.log('testPostMessageFromTab sent ' + msg.success);
port.disconnect();
});
}
// For test onMessage.
function testSendMessageFromTab() {
chrome.runtime.sendMessage({step: 1}, function(response) {
if (response.nextStep) {
console.log('testSendMessageFromTab sent');
chrome.runtime.sendMessage({step: 2});
}
});
}
function testSendMessageFromFrame() {
// Add two frames. The content script declared in manifest.json (frame.js)
// runs in frames whose URL matches ?testSendMessageFromFrame.
// frame.js sends a message to the background page, which checks that the
// sender has the expected frameId, url, origin, tab and runtime id.
for (var i = 0; i < 2; ++i) {
var f = document.createElement('iframe');
f.src = '?testSendMessageFromFrame' + i;
document.body.appendChild(f);
}
}
function testSendMessageFromSandboxedFrame() {
// Add two frames. The content script declared in manifest.json (frame.js)
// runs in frames whose URL matches ?testSendMessageFromSandboxFrame.
// frame.js sends a message to the background page, which checks that the
// sender has the expected frameId, url, origin, tab and runtime id.
for (var i = 2; i < 4; ++i) {
var f = document.createElement('iframe');
f.sandbox = 'allow-scripts';
f.src = '?testSendMessageFromSandboxedFrame' + i;
document.body.appendChild(f);
}
}
function testConnectChildFrameAndNavigateSetup() {
var frames = document.querySelectorAll('iframe');
for (var i = 0; i < frames.length; ++i) {
frames[i].remove();
}
var f = document.createElement('iframe');
f.src = '?testConnectChildFrameAndNavigateSetup';
document.body.appendChild(f);
// Test will continue in frame.js
}
// Use a potentially-valid extension id.
var fakeExtensionId = 'c'.repeat(32);
// Tests sendMessage to an invalid extension.
function testSendMessageFromTabError() {
// try sending a request to a bad extension id
chrome.runtime.sendMessage(fakeExtensionId, {m: 1}, function(response) {
var success = (response === undefined && chrome.runtime.lastError);
chrome.runtime.sendMessage({success: success});
});
}
// Tests connecting to an invalid extension.
function testConnectFromTabError() {
var port = chrome.runtime.connect(fakeExtensionId);
port.onDisconnect.addListener(function() {
var success = (chrome.runtime.lastError ? true : false);
chrome.runtime.sendMessage({success: success});
});
}
// For test sendMessage.
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
const extensionOrigin = new URL(chrome.runtime.getURL('')).origin;
chrome.test.assertEq(
{ id: chrome.runtime.id, origin: extensionOrigin }, sender);
sendResponse({success: (request.step2 == 1)});
});