(async function(testRunner) {
  var {page, session, dp} = await testRunner.startHTML(`
<style>
#test { color: green; }
</style>
<article id='test'></article>
`, 'The test verifies functionality of protocol method CSS.setStyleTexts and DOM.undo.');

  const CSSHelper = await testRunner.loadScript('../resources/css-helper.js');
  const cssHelper = new CSSHelper(testRunner, dp);

  let eventPromise = dp.CSS.onceStyleSheetAdded();

  await dp.DOM.enable();
  await dp.CSS.enable();

  let event = await eventPromise;
  let styleSheetId = event.params.header.styleSheetId;

  const setStyleTexts = cssHelper.setStyleTexts.bind(cssHelper, styleSheetId, false);
  const documentNodeId = await cssHelper.requestDocumentNodeId();

  let response = await dp.CSS.getStyleSheetText({styleSheetId});
  testRunner.log('==== Initial style sheet text ====');
  testRunner.log(response.result.text);

  await setStyleTexts([{
    styleSheetId: styleSheetId,
    range: { startLine: 1, startColumn: 7, endLine: 1, endColumn: 22 },
    text: "color: blue;",
  }]);
  await cssHelper.loadAndDumpMatchingRules(documentNodeId, '#test');

  eventPromise = dp.CSS.onceStyleSheetAdded();
  // Clear the style content.
  await session.evaluate(fontURL => {
    const style = document.querySelector('style');
    style.textContent = '';
  });
  await dp.DOM.undo();

  event = await eventPromise;
  styleSheetId = event.params.header.styleSheetId;
  response = await dp.CSS.getStyleSheetText({styleSheetId});
  testRunner.log('==== Style sheet text after clearing the stylesheet and DOM.Undo ====');
  testRunner.log(response.result.text || '<empty>');
  testRunner.completeTest();
})
