910e62b5创建于 1月15日历史提交
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// META script=resources/controlled_frame_helpers.js

function reload(controlledFrame) {
  return new Promise((resolve, reject) => {
    const onAbort = () => {
      controlledFrame.removeEventListener('loadabort', onAbort);
      controlledFrame.removeEventListener('loadcommit', onCommit);
      reject();
    };
    const onCommit = () => {
      controlledFrame.removeEventListener('loadabort', onAbort);
      controlledFrame.removeEventListener('loadcommit', onCommit);
      resolve();
    };
    controlledFrame.addEventListener('loadabort', onAbort);
    controlledFrame.addEventListener('loadcommit', onCommit);

    // HTMLControlledFrameElement.reload() doesn't actually trigger the
    // loadcommit or loadabort events. Appending a new query parameter to the
    // URL will force a new navigation.
    controlledFrame.src += '&reload';
  });
}

async function getBackgroundColor(controlledFrame) {
  return await executeAsyncScript(
      controlledFrame, 'document.body.style.backgroundColor');
}

promise_test(async (test) => {
  const controlledFrame = await createControlledFrame('/simple.html?');

  await controlledFrame.addContentScripts([{
    name: 'test',
    urlPatterns: ['https://*/*'],
    js: {files: ['/resources/content_script.js']},
    runAt: 'document-start',
  }]);

  assert_equals('', await getBackgroundColor(controlledFrame));

  await reload(controlledFrame);

  assert_equals('red', await getBackgroundColor(controlledFrame));

  await controlledFrame.removeContentScripts(['test']);
  await reload(controlledFrame);

  assert_equals('', await getBackgroundColor(controlledFrame));
}, 'Content scripts run');

promise_test(async (test) => {
  const controlledFrame = await createControlledFrame('/simple.html?');

  const result = controlledFrame.addContentScripts([{
    name: 'test',
    urlPatterns: ['*invalid pattern*'],
    js: {files: ['/resources/content_script.js']},
    runAt: 'document-start',
  }]);

  return promise_rejects_js(test, TypeError, result, 'Promise should reject');
}, 'Reject a content script with invalid pattern');