// Copyright 2017 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.

(async function() {
  TestRunner.addResult(`Tests that splitting properties when pasting works.\n`);
  await TestRunner.loadModule('elements_test_runner');
  await TestRunner.showPanel('elements');
  await TestRunner.loadHTML(`
      <div id="inspected" style="font-size: 12px">Text</div>
      <div id="other"></div>
    `);

  ElementsTestRunner.selectNodeAndWaitForStyles('inspected', pasteFirstProperty);

  async function pasteFirstProperty() {
    TestRunner.addResult('Before pasting:');
    await ElementsTestRunner.dumpSelectedElementStyles(true);
    var section = ElementsTestRunner.inlineStyleSection();

    var treeElement = section.addNewBlankProperty(0);
    pasteProperty(treeElement, 'margin-left: 1px', pasteTwoProperties);
  }

  async function pasteTwoProperties() {
    TestRunner.addResult('After pasting \'margin-left: 1px\':');
    await ElementsTestRunner.dumpSelectedElementStyles(true);

    var treeElement = ElementsTestRunner.inlineStyleSection().addNewBlankProperty(2);
    pasteProperty(treeElement, 'margin-top: 1px; color: red;', pasteOverExistingProperty);
  }

  async function pasteOverExistingProperty() {
    TestRunner.addResult('After pasting \'margin-top: 1px; color: red;\':');
    await ElementsTestRunner.dumpSelectedElementStyles(true);

    var treeElement = ElementsTestRunner.getElementStylePropertyTreeItem('margin-top');
    pasteProperty(treeElement, 'foo: bar; moo: zoo', dumpAndComplete);
  }

  async function dumpAndComplete() {
    TestRunner.addResult('After pasting \'foo: bar; moo: zoo\' over \'margin-top\':');
    await ElementsTestRunner.dumpSelectedElementStyles(true);

    TestRunner.completeTest();
  }

  function pasteProperty(treeElement, propertyText, callback) {
    treeElement.nameElement.textContent = propertyText;
    treeElement.startEditing();

    document.execCommand('SelectAll');
    document.execCommand('Copy');
    ElementsTestRunner.waitForStyleApplied(reloadStyles.bind(this, callback));
    document.execCommand('Paste');
  }

  function reloadStyles(callback) {
    ElementsTestRunner.selectNodeAndWaitForStyles('other', otherCallback);

    function otherCallback() {
      ElementsTestRunner.selectNodeAndWaitForStyles('inspected', callback);
    }
  }
})();
