| Index: chrome/test/data/extensions/api_test/executescript/frame_id/test.js
|
| diff --git a/chrome/test/data/extensions/api_test/executescript/frame_id/test.js b/chrome/test/data/extensions/api_test/executescript/frame_id/test.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cc98a20aa0df66d2366abbc24ad7943c016a1707
|
| --- /dev/null
|
| +++ b/chrome/test/data/extensions/api_test/executescript/frame_id/test.js
|
| @@ -0,0 +1,378 @@
|
| +// Copyright (c) 2015 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.
|
| +
|
| +var pass = chrome.test.callbackPass;
|
| +var fail = chrome.test.callbackFail;
|
| +var assertEq = chrome.test.assertEq;
|
| +var assertTrue = chrome.test.assertTrue;
|
| +var relativePath =
|
| + '/extensions/api_test/executescript/frame_id/frames.html';
|
| +var testUrl = 'http://a.com:PORT' + relativePath;
|
| +
|
| +// Frame ID of every frame in this test, and the patterns of the frame URLs.
|
| +// All patterns are mutually exclusive.
|
| +
|
| +var tabId;
|
| +// Main frame.
|
| +var id_frame_top = 0;
|
| +var r_frame_top = /frames\.html/;
|
| +// Frame with (same-origin) about:srcdoc.
|
| +var id_frame_srcdoc;
|
| +var r_frame_srcdoc = /about:srcdoc/;
|
| +// Frame with (unique-origin) sandboxed about:blank.
|
| +var id_frame_unreachable;
|
| +var r_frame_unreachable = /about:blank/;
|
| +// Frame with same-origin page.
|
| +var id_frame_second;
|
| +var r_frame_second = /frame\.html/;
|
| +// Same-origin child frame of |frame_second|.
|
| +var id_frame_third;
|
| +var r_frame_third = /nested\.html/;
|
| +// Frame for which the extension does not have the right permissions.
|
| +var id_frame_nopermission;
|
| +var r_frame_nopermission = /empty\.html/;
|
| +
|
| +function matchesAny(urls, regex) {
|
| + return urls.some(function(url) {
|
| + return regex.test(url);
|
| + });
|
| +}
|
| +
|
| +var g_cssCounter = 0;
|
| +// Calls chrome.tabs.insertCSS and invoke the callback with a list of affected
|
| +// URLs. This function assumes that the insertCSS call will succeed.
|
| +function insertCSS(tabId, injectDetails, callback) {
|
| + var marker = (++g_cssCounter) + 'px';
|
| + injectDetails.code = 'body { min-width: ' + marker + ';}';
|
| + chrome.tabs.insertCSS(tabId, injectDetails, function() {
|
| + chrome.test.assertNoLastError();
|
| + chrome.tabs.executeScript(tabId, {
|
| + code: '[getComputedStyle(document.body).minWidth, document.URL];',
|
| + allFrames: true,
|
| + matchAboutBlank: true
|
| + }, function(results) {
|
| + chrome.test.assertNoLastError();
|
| + results = results.filter(function(result) {
|
| + return result && result[0] === marker;
|
| + }).map(function(result) {
|
| + return result[1]; // "document.URL"
|
| + });
|
| + callback(results);
|
| + });
|
| + });
|
| +}
|
| +
|
| +chrome.test.getConfig(function(config) {
|
| + testUrl = testUrl.replace(/PORT/, config.testServer.port);
|
| + chrome.tabs.onUpdated.addListener(function(_, changeInfo, tab) {
|
| + if (changeInfo.status != 'complete' || tab.id !== tabId)
|
| + return;
|
| +
|
| + chrome.webNavigation.getAllFrames({
|
| + tabId: tabId
|
| + }, function(frames) {
|
| + function getFrameId(r_url) {
|
| + var filtered = frames.filter(function(frame) {
|
| + return r_url.test(frame.url);
|
| + });
|
| + // Sanity check.
|
| + chrome.test.assertEq(1, filtered.length);
|
| + chrome.test.assertTrue(filtered[0].frameId > 0);
|
| + return filtered[0].frameId;
|
| + }
|
| +
|
| + id_frame_srcdoc = getFrameId(r_frame_srcdoc);
|
| + id_frame_unreachable = getFrameId(r_frame_unreachable);
|
| + id_frame_second = getFrameId(r_frame_second);
|
| + id_frame_third = getFrameId(r_frame_third);
|
| + id_frame_nopermission = getFrameId(r_frame_nopermission);
|
| +
|
| + runTests(config);
|
| + });
|
| + });
|
| +
|
| + chrome.tabs.create({ url: testUrl }, function(tab) {
|
| + tabId = tab.id;
|
| + });
|
| +});
|
| +
|
| +function runTests(config) {
|
| + chrome.test.runTests([
|
| + function executeScriptFrameIdTop() {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: 0,
|
| + code: 'document.URL'
|
| + }, pass(function(results) {
|
| + assertEq(1, results.length);
|
| + assertTrue(matchesAny(results, r_frame_top));
|
| + }));
|
| + },
|
| +
|
| + function executeScriptFrameIdTopAllFrames() {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: 0,
|
| + matchAboutBlank: true,
|
| + allFrames: true,
|
| + code: 'document.URL'
|
| + }, pass(function(results) {
|
| + assertEq(4, results.length);
|
| + assertTrue(matchesAny(results, r_frame_top));
|
| + assertTrue(matchesAny(results, r_frame_srcdoc));
|
| + assertTrue(matchesAny(results, r_frame_second));
|
| + assertTrue(matchesAny(results, r_frame_third));
|
| + }));
|
| + },
|
| +
|
| + function executeScriptFrameIdSrcdoc() {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: id_frame_srcdoc,
|
| + matchAboutBlank: true,
|
| + code: 'document.URL'
|
| + }, pass(function(results) {
|
| + assertEq(1, results.length);
|
| + assertTrue(matchesAny(results, r_frame_srcdoc));
|
| + }));
|
| + },
|
| +
|
| + function executeScriptFrameIdSrcdocWithoutMatchAboutBlank() {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: id_frame_srcdoc,
|
| + code: 'document.URL'
|
| + }, fail('Cannot access contents of url "about:srcdoc". Extension must ' +
|
| + 'have permission to access the frame\'s origin, and ' +
|
| + 'matchAboutBlank must be true.'))
|
| + },
|
| +
|
| + function executeScriptFrameIdSrcdocAllFrames() {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: id_frame_srcdoc,
|
| + matchAboutBlank: true,
|
| + allFrames: true,
|
| + code: 'document.URL'
|
| + }, pass(function(results) {
|
| + assertEq(1, results.length);
|
| + assertTrue(matchesAny(results, r_frame_srcdoc));
|
| + }));
|
| + },
|
| +
|
| + function executeScriptFrameIdSandboxedFrame() {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: id_frame_unreachable,
|
| + matchAboutBlank: true,
|
| + code: 'document.URL'
|
| + }, fail('Cannot access contents of url "about:blank". Extension must ' +
|
| + 'have permission to access the frame\'s origin, and ' +
|
| + 'matchAboutBlank must be true.'))
|
| + },
|
| +
|
| + function executeScriptFrameIdSubframe() {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: id_frame_second,
|
| + code: 'document.URL'
|
| + }, pass(function(results) {
|
| + assertEq(1, results.length);
|
| + assertTrue(matchesAny(results, r_frame_second));
|
| + }));
|
| + },
|
| +
|
| + function executeScriptFrameIdSubframeAllFrames() {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: id_frame_second,
|
| + allFrames: true,
|
| + code: 'document.URL'
|
| + }, pass(function(results) {
|
| + assertEq(2, results.length);
|
| + assertTrue(matchesAny(results, r_frame_second));
|
| + assertTrue(matchesAny(results, r_frame_third));
|
| + }));
|
| + },
|
| +
|
| + function executeScriptFrameIdNestedFrame() {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: id_frame_third,
|
| + code: 'document.URL'
|
| + }, pass(function(results) {
|
| + assertEq(1, results.length);
|
| + assertTrue(matchesAny(results, r_frame_third));
|
| + }));
|
| + },
|
| +
|
| + function executeScriptFrameIdNestedFrame() {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: id_frame_third,
|
| + allFrames: true,
|
| + code: 'document.URL'
|
| + }, pass(function(results) {
|
| + assertEq(1, results.length);
|
| + assertTrue(matchesAny(results, r_frame_third));
|
| + }));
|
| + },
|
| +
|
| + function executeScriptFrameIdNoPermission() {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: id_frame_nopermission,
|
| + code: 'document.URL'
|
| + }, fail('Cannot access contents of url "http://c.com:' +
|
| + config.testServer.port + '/empty.html". Extension manifest ' +
|
| + 'must request permission to access this host.'));
|
| + },
|
| +
|
| + function executeScriptFrameIdNonExistent() {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: 999999999,
|
| + code: 'document.URL'
|
| + }, fail('No frame with id 999999999 in tab ' + tabId + '.'));
|
| + },
|
| +
|
| + function executeScriptFrameIdNegative() {
|
| + try {
|
| + chrome.tabs.executeScript(tabId, {
|
| + frameId: -1,
|
| + code: 'document.URL'
|
| + }, function() {
|
| + chrome.test.fail('executeScript should never have been executed!');
|
| + });
|
| + } catch (e) {
|
| + assertEq('Invalid value for argument 2. Property \'frameId\': ' +
|
| + 'Value must not be less than 0.', e.message);
|
| + chrome.test.succeed();
|
| + }
|
| + },
|
| +
|
| + function insertCSSFrameIdTop() {
|
| + insertCSS(tabId, {
|
| + frameId: 0
|
| + }, pass(function(results) {
|
| + assertEq(1, results.length);
|
| + assertTrue(matchesAny(results, r_frame_top));
|
| + }));
|
| + },
|
| +
|
| + function insertCSSFrameIdTopAllFrames() {
|
| + insertCSS(tabId, {
|
| + frameId: 0,
|
| + matchAboutBlank: true,
|
| + allFrames: true
|
| + }, pass(function(results) {
|
| + assertEq(4, results.length);
|
| + assertTrue(matchesAny(results, r_frame_top));
|
| + assertTrue(matchesAny(results, r_frame_srcdoc));
|
| + assertTrue(matchesAny(results, r_frame_second));
|
| + assertTrue(matchesAny(results, r_frame_third));
|
| + }));
|
| + },
|
| +
|
| + function insertCSSFrameIdSrcdoc() {
|
| + insertCSS(tabId, {
|
| + frameId: id_frame_srcdoc,
|
| + matchAboutBlank: true
|
| + }, pass(function(results) {
|
| + assertEq(1, results.length);
|
| + assertTrue(matchesAny(results, r_frame_srcdoc));
|
| + }));
|
| + },
|
| +
|
| + function insertCSSFrameIdSrcdocWithoutMatchAboutBlank() {
|
| + chrome.tabs.insertCSS(tabId, {
|
| + frameId: id_frame_srcdoc,
|
| + code: 'body{color:red;}'
|
| + }, fail('Cannot access contents of url "about:srcdoc". Extension must ' +
|
| + 'have permission to access the frame\'s origin, and ' +
|
| + 'matchAboutBlank must be true.'))
|
| + },
|
| +
|
| + function insertCSSFrameIdSrcdocAllFrames() {
|
| + insertCSS(tabId, {
|
| + frameId: id_frame_srcdoc,
|
| + matchAboutBlank: true,
|
| + allFrames: true
|
| + }, pass(function(results) {
|
| + assertEq(1, results.length);
|
| + assertTrue(matchesAny(results, r_frame_srcdoc));
|
| + }));
|
| + },
|
| +
|
| + function insertCSSFrameIdSandboxedFrame() {
|
| + chrome.tabs.insertCSS(tabId, {
|
| + frameId: id_frame_unreachable,
|
| + matchAboutBlank: true,
|
| + code: 'body{color:red}'
|
| + }, fail('Cannot access contents of url "about:blank". Extension must ' +
|
| + 'have permission to access the frame\'s origin, and ' +
|
| + 'matchAboutBlank must be true.'))
|
| + },
|
| +
|
| + function insertCSSFrameIdSubframe() {
|
| + insertCSS(tabId, {
|
| + frameId: id_frame_second
|
| + }, pass(function(results) {
|
| + assertEq(1, results.length);
|
| + assertTrue(matchesAny(results, r_frame_second));
|
| + }));
|
| + },
|
| +
|
| + function insertCSSFrameIdSubframeAllFrames() {
|
| + insertCSS(tabId, {
|
| + frameId: id_frame_second,
|
| + allFrames: true
|
| + }, pass(function(results) {
|
| + assertEq(2, results.length);
|
| + assertTrue(matchesAny(results, r_frame_second));
|
| + assertTrue(matchesAny(results, r_frame_third));
|
| + }));
|
| + },
|
| +
|
| + function insertCSSFrameIdNestedFrame() {
|
| + insertCSS(tabId, {
|
| + frameId: id_frame_third
|
| + }, pass(function(results) {
|
| + assertEq(1, results.length);
|
| + assertTrue(matchesAny(results, r_frame_third));
|
| + }));
|
| + },
|
| +
|
| + function insertCSSFrameIdNestedFrame() {
|
| + insertCSS(tabId, {
|
| + frameId: id_frame_third,
|
| + allFrames: true
|
| + }, pass(function(results) {
|
| + assertEq(1, results.length);
|
| + assertTrue(matchesAny(results, r_frame_third));
|
| + }));
|
| + },
|
| +
|
| + function insertCSSFrameIdNoPermission() {
|
| + chrome.tabs.insertCSS(tabId, {
|
| + frameId: id_frame_nopermission,
|
| + code: 'body{color:red}'
|
| + }, fail('Cannot access contents of url "http://c.com:' +
|
| + config.testServer.port + '/empty.html". Extension manifest ' +
|
| + 'must request permission to access this host.'));
|
| + },
|
| +
|
| + function insertCSSFrameIdNonExistent() {
|
| + chrome.tabs.insertCSS(tabId, {
|
| + frameId: 999999999,
|
| + code: 'body{color:red}'
|
| + }, fail('No frame with id 999999999 in tab ' + tabId + '.'));
|
| + },
|
| +
|
| + function insertCSSFrameIdNegative() {
|
| + try {
|
| + chrome.tabs.insertCSS(tabId, {
|
| + frameId: -1,
|
| + code: 'body{color:red}'
|
| + }, function() {
|
| + chrome.test.fail('insertCSS should never have been executed!');
|
| + });
|
| + } catch (e) {
|
| + assertEq('Invalid value for argument 2. Property \'frameId\': ' +
|
| + 'Value must not be less than 0.', e.message);
|
| + chrome.test.succeed();
|
| + }
|
| + },
|
| +
|
| +
|
| + ]);
|
| +}
|
|
|