// 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 user can mutate author shadow DOM by means of elements panel.\n`);
  await TestRunner.loadModule('elements_test_runner');
  await TestRunner.showPanel('elements');
  await TestRunner.loadHTML(`
      <div>
          <div id="testSetAuthorShadowDOMElementAttribute"></div>
      </div>
    `);
  await TestRunner.evaluateInPagePromise(`
      function createRootWithContents(id, html)
      {
          var container = document.getElementById(id);
          var root = container.attachShadow({mode: 'open'});
          root.innerHTML = html;
      }

      createRootWithContents("testSetAuthorShadowDOMElementAttribute", "<div foo='attribute value' id='shadow-node-to-set-attribute'></div>");
    `);

  // Save time on style updates.
  await UI.viewManager.showView('elements');

  Elements.StylesSidebarPane.prototype.update = function() {};
  Elements.MetricsSidebarPane.prototype.update = function() {};

  TestRunner.runTestSuite([
    function testSetUp(next) {
      ElementsTestRunner.expandElementsTree(next);
    },

    function testSetAuthorShadowDOMElementAttribute(next) {
      ElementsTestRunner.domActionTestForNodeId(
          'testSetAuthorShadowDOMElementAttribute', 'shadow-node-to-set-attribute', testBody, next);

      function testBody(node, done) {
        ElementsTestRunner.editNodePartAndRun(node, 'webkit-html-attribute', 'bar="edited attribute"', done, true);
      }
    },
  ]);
})();
