Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(173)

Unified Diff: chrome/test/data/extensions/api_test/executescript/frame_id/test.js

Issue 1628423002: Add frameId to chrome.tabs.executeScript/insertCSS (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@permissiondata-remove-process_id
Patch Set: Nits + comments Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..fa03dd1062765626af94d2da70358b8d7c1093b9
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/executescript/frame_id/test.js
@@ -0,0 +1,375 @@
+// 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.
+
+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 testOrigin = 'http://a.com:PORT';
+var testUrl = 'http://a.com:PORT' + relativePath;
+
+var tabId;
+
+// Frame ID of every frame in this test, and the patterns of the frame URLs.
+// Frame IDs are lazily initialized (and constant thereafter).
+// All patterns are mutually exclusive.
+
+// 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 gCssCounter = 0;
Devlin 2016/01/26 20:40:36 nit: \n
robwu 2016/01/26 23:57:59 Done.
+// Calls chrome.tabs.insertCSS and invoke the callback with a list of affected
Devlin 2016/01/26 20:40:36 *invokes
robwu 2016/01/26 23:57:59 Done.
+// URLs. This function assumes that the insertCSS call will succeed.
Devlin 2016/01/26 20:40:36 insertCSS and also executeScript, right?
robwu 2016/01/26 23:57:59 I really meant insertCSS (in relation with the arg
+function insertCSS(tabId, injectDetails, callback) {
+ var marker = (++gCssCounter) + '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) {
Devlin 2016/01/26 20:40:36 I think it's just the indentation that makes this,
robwu 2016/01/26 23:57:59 Done.
+ return result && result[0] === marker;
+ })
+ .map(function(result) {
+ return result[1]; // "document.URL"
+ });
+ callback(results);
+ });
+ });
+}
+
+chrome.test.getConfig(function(config) {
+ testOrigin = testOrigin.replace(/PORT/, config.testServer.port);
+ 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) {
Devlin 2016/01/26 20:40:36 strange to have a function param in CONST_STYLE.
robwu 2016/01/26 23:57:58 Done.
+ 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) {
Devlin 2016/01/26 20:40:36 Awesome tests. Unfortunately, I'm worried it's go
robwu 2016/01/26 23:57:59 What is the maximum execution time? I'll keep the
Devlin 2016/01/27 18:33:48 We have different execution times depending on the
+ chrome.test.runTests([
+ function executeScriptFrameIdTop() {
Devlin 2016/01/26 20:40:36 There's enough parameters in these test names that
robwu 2016/01/26 23:57:59 Done.
+ chrome.tabs.executeScript(
+ tabId, {frameId: 0, code: 'document.URL'}, pass(function(results) {
+ assertEq(1, results.length);
+ assertTrue(matchesAny(results, R_FRAME_TOP));
+ }));
+ },
+
+ function executeScriptFrameIdTopAllFrames() {
Devlin 2016/01/26 20:40:36 executeScriptByFrameIdInTopFrameWithSubFrames or s
robwu 2016/01/26 23:57:59 Done.
+ 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() {
+ // TODO(robwu): Why is the origin serialized as "about:blank" instead of
+ // "about:srcdoc"?
+ chrome.tabs.executeScript(
+ tabId, {frameId: ID_FRAME_SRCDOC, code: 'document.URL'},
+ fail(
+ 'Cannot access "about:blank" at origin "' + testOrigin + '". ' +
+ '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 "about:blank" at origin "null". 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() {
Devlin 2016/01/26 20:40:36 Is this the same name as line 199?
robwu 2016/01/26 23:57:59 Done.
+ 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() {
+ // TODO(robwu): Why is the origin serialized as "about:blank" instead of
+ // "about:srcdoc"?
+ chrome.tabs.insertCSS(
+ tabId, {frameId: ID_FRAME_SRCDOC, code: 'body{color:red;}'},
+ fail(
+ 'Cannot access "about:blank" at origin "' + testOrigin + '". ' +
+ '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 "about:blank" at origin "null". 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();
+ }
+ },
+
+ ]);
+}

Powered by Google App Engine
This is Rietveld 408576698