|  | // Copyright 2017 The Chromium Authors. All | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | /** | 
|  | * @fileoverview using private properties isn't a Closure violation in tests. | 
|  | * @suppress {accessControls} | 
|  | */ | 
|  |  | 
|  | ElementsTestRunner.events = []; | 
|  | ElementsTestRunner.containerId; | 
|  |  | 
|  | ElementsTestRunner.setUpTestSuite = function(next) { | 
|  | ElementsTestRunner.expandElementsTree(step1); | 
|  |  | 
|  | function step1() { | 
|  | ElementsTestRunner.selectNodeWithId('container', step2); | 
|  | } | 
|  |  | 
|  | function step2(node) { | 
|  | ElementsTestRunner.containerId = node.id; | 
|  | TestRunner.DOMAgent.getOuterHTML(ElementsTestRunner.containerId).then(step3); | 
|  | } | 
|  |  | 
|  | function step3(text) { | 
|  | ElementsTestRunner.containerText = text; | 
|  |  | 
|  | for (const key in SDK.DOMModel.Events) { | 
|  | const eventName = SDK.DOMModel.Events[key]; | 
|  |  | 
|  | if (eventName === SDK.DOMModel.Events.MarkersChanged || eventName === SDK.DOMModel.Events.DOMMutated) { | 
|  | continue; | 
|  | } | 
|  |  | 
|  | TestRunner.domModel.addEventListener( | 
|  | eventName, ElementsTestRunner.recordEvent.bind(ElementsTestRunner, eventName)); | 
|  | } | 
|  |  | 
|  | next(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | ElementsTestRunner.recordEvent = function(eventName, event) { | 
|  | if (!event.data) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | const node = event.data.node || event.data; | 
|  | const parent = event.data.parent; | 
|  |  | 
|  | for (let currentNode = parent || node; currentNode; currentNode = currentNode.parentNode) { | 
|  | if (currentNode.getAttribute('id') === 'output') { | 
|  | return; | 
|  | } | 
|  | } | 
|  |  | 
|  | ElementsTestRunner.events.push('Event ' + eventName.toString() + ': ' + node.nodeName()); | 
|  | }; | 
|  |  | 
|  | ElementsTestRunner.patchOuterHTML = function(pattern, replacement, next) { | 
|  | TestRunner.addResult('Replacing \'' + pattern + '\' with \'' + replacement + '\'\n'); | 
|  | ElementsTestRunner.setOuterHTML(ElementsTestRunner.containerText.replace(pattern, replacement), next); | 
|  | }; | 
|  |  | 
|  | ElementsTestRunner.patchOuterHTMLUseUndo = function(pattern, replacement, next) { | 
|  | TestRunner.addResult('Replacing \'' + pattern + '\' with \'' + replacement + '\'\n'); | 
|  | ElementsTestRunner.setOuterHTMLUseUndo(ElementsTestRunner.containerText.replace(pattern, replacement), next); | 
|  | }; | 
|  |  | 
|  | ElementsTestRunner.setOuterHTML = function(newText, next) { | 
|  | ElementsTestRunner.innerSetOuterHTML(newText, false, bringBack); | 
|  |  | 
|  | function bringBack() { | 
|  | TestRunner.addResult('\nBringing things back\n'); | 
|  | ElementsTestRunner.innerSetOuterHTML(ElementsTestRunner.containerText, true, next); | 
|  | } | 
|  | }; | 
|  |  | 
|  | ElementsTestRunner.setOuterHTMLUseUndo = function(newText, next) { | 
|  | ElementsTestRunner.innerSetOuterHTML(newText, false, bringBack); | 
|  |  | 
|  | async function bringBack() { | 
|  | TestRunner.addResult('\nBringing things back\n'); | 
|  | await SDK.domModelUndoStack.undo(); | 
|  | ElementsTestRunner._dumpOuterHTML(true, next); | 
|  | } | 
|  | }; | 
|  |  | 
|  | ElementsTestRunner.innerSetOuterHTML = async function(newText, last, next) { | 
|  | await TestRunner.DOMAgent.setOuterHTML(ElementsTestRunner.containerId, newText); | 
|  | TestRunner.domModel.markUndoableState(); | 
|  | ElementsTestRunner._dumpOuterHTML(last, next); | 
|  | }; | 
|  |  | 
|  | ElementsTestRunner._dumpOuterHTML = async function(last, next) { | 
|  | const result = await TestRunner.RuntimeAgent.evaluate('document.getElementById("identity").wrapperIdentity'); | 
|  | TestRunner.addResult('Wrapper identity: ' + result.value); | 
|  | ElementsTestRunner.events.sort(); | 
|  |  | 
|  | for (let i = 0; i < ElementsTestRunner.events.length; ++i) { | 
|  | TestRunner.addResult(ElementsTestRunner.events[i]); | 
|  | } | 
|  |  | 
|  | ElementsTestRunner.events = []; | 
|  | const text = await TestRunner.DOMAgent.getOuterHTML(ElementsTestRunner.containerId); | 
|  | TestRunner.addResult('==========8<=========='); | 
|  | TestRunner.addResult(text); | 
|  | TestRunner.addResult('==========>8=========='); | 
|  |  | 
|  | if (last) { | 
|  | TestRunner.addResult('\n\n\n'); | 
|  | } | 
|  |  | 
|  | next(); | 
|  | }; |