Commit 8d7de5cd authored by pfeldman@chromium.org's avatar pfeldman@chromium.org

2011-03-14 Pavel Feldman <pfeldman@chromium.org>

        Reviewed by Yury Semikhatsky.

        Web Inspector: add tests for edit dom operations.
        https://bugs.webkit.org/show_bug.cgi?id=56248

        * inspector/elements/edit-dom-actions-expected.txt: Added.
        * inspector/elements/edit-dom-actions.html: Added.
2011-03-14  Pavel Feldman  <pfeldman@chromium.org>

        Reviewed by Yury Semikhatsky.

        Web Inspector: add tests for edit dom operations.
        https://bugs.webkit.org/show_bug.cgi?id=56248

        Test: inspector/elements/edit-dom-actions.html

        * inspector/Inspector.idl:
        * inspector/InspectorDOMAgent.cpp:
        (WebCore::InspectorDOMAgent::assertNode):
        (WebCore::InspectorDOMAgent::assertElement):
        (WebCore::InspectorDOMAgent::assertHTMLElement):
        (WebCore::InspectorDOMAgent::nodeToSelectOn):
        (WebCore::InspectorDOMAgent::querySelector):
        (WebCore::InspectorDOMAgent::querySelectorAll):
        (WebCore::InspectorDOMAgent::setAttribute):
        (WebCore::InspectorDOMAgent::removeAttribute):
        (WebCore::InspectorDOMAgent::getOuterHTML):
        (WebCore::InspectorDOMAgent::setOuterHTML):
        * inspector/InspectorDOMAgent.h:
        * inspector/front-end/DOMAgent.js:
        (WebInspector.DOMNode.prototype.setAttribute):
        (WebInspector.DOMNode.prototype.removeAttribute):
        * inspector/front-end/inspector.js:
        (WebInspector.startEditing.defaultFinishHandler):

git-svn-id: svn://svn.chromium.org/blink/trunk@81009 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent c9b547bc
2011-03-14 Pavel Feldman <pfeldman@chromium.org>
Reviewed by Yury Semikhatsky.
Web Inspector: add tests for edit dom operations.
https://bugs.webkit.org/show_bug.cgi?id=56248
* inspector/elements/edit-dom-actions-expected.txt: Added.
* inspector/elements/edit-dom-actions.html: Added.
2011-03-14 David Levin <levin@chromium.org> 2011-03-14 David Levin <levin@chromium.org>
Fix typo TEXT vs TEST. Fix typo TEXT vs TEST.
Tests that user can mutate DOM by means of elements panel.
Edited Text
Span contents
Running: testSetUp
Running: testRemove
==== before ====
- <div id="testRemove">
<div id="node-to-remove"></div>
</div>
==== after ====
- <div id="testRemove">
</div>
Running: testSetNodeName
==== before ====
- <div id="testSetNodeName">
<div id="node-to-set-name"></div>
</div>
==== after ====
- <div id="testSetNodeName">
<span id="node-to-set-name" ></span>
</div>
Running: testSetNodeValue
==== before ====
- <div id="testSetNodeValue">
<div id="node-to-set-value">Text</div>
</div>
==== after ====
- <div id="testSetNodeValue">
<div id="node-to-set-value">Edited Text</div>
</div>
Running: testSetAttribute
==== before ====
- <div id="testSetAttribute">
<div foo="attribute value" id="node-to-set-attribute"></div>
</div>
==== after ====
- <div id="testSetAttribute">
<div id="node-to-set-attribute" bar="edited attribute"></div>
</div>
Running: testRemoveAttribute
==== before ====
- <div id="testRemoveAttribute">
<div foo="attribute value" id="node-to-remove-attribute"></div>
</div>
==== after ====
- <div id="testRemoveAttribute">
<div id="node-to-remove-attribute"></div>
</div>
Running: testAddAttribute
==== before ====
- <div id="testAddAttribute">
<div id="node-to-add-attribute"></div>
</div>
==== after ====
- <div id="testAddAttribute">
<div id="node-to-add-attribute" newattr="new-value"></div>
</div>
Running: testEditAsHTML
==== before ====
- <div id="testEditAsHTML">
- <div id="node-to-edit-as-html">
<span id="span">Text</span>
</div>
</div>
<div id="node-to-edit-as-html"><span id="span">Text</span></div>
==== after ====
- <div id="testEditAsHTML">
- <div foo="bar">
<span id="inner-span">Span contents</span>
</div>
</div>
<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script src="../../http/tests/inspector/elements-test.js"></script>
<script>
function test()
{
// Save time on style updates.
WebInspector.StylesSidebarPane.prototype.update = function() {};
WebInspector.MetricsSidebarPane.prototype.update = function() {};
InspectorTest.runTestSuite([
function testSetUp(next)
{
InspectorTest.expandElementsTree(next);
},
function testRemove(next)
{
domActionTest("testRemove", "node-to-remove", testBody, next);
function testBody(node, done)
{
var treeElement = WebInspector.panels.elements.treeOutline.findTreeElement(node);
treeElement.remove();
InspectorTest.runAfterPendingDispatches(done);
}
},
function testSetNodeName(next)
{
domActionTest("testSetNodeName", "node-to-set-name", testBody, next);
function testBody(node, done)
{
editNodePartAndRun(node, "webkit-html-tag-name", "span", done);
}
},
function testSetNodeValue(next)
{
domActionTest("testSetNodeValue", "node-to-set-value", testBody, next);
function testBody(node, done)
{
editNodePartAndRun(node, "webkit-html-text-node", "Edited Text", done);
}
},
function testSetAttribute(next)
{
domActionTest("testSetAttribute", "node-to-set-attribute", testBody, next);
function testBody(node, done)
{
editNodePartAndRun(node, "webkit-html-attribute", "bar=\"edited attribute\"", done);
}
},
function testRemoveAttribute(next)
{
domActionTest("testRemoveAttribute", "node-to-remove-attribute", testBody, next);
function testBody(node, done)
{
editNodePartAndRun(node, "webkit-html-attribute", "", done);
}
},
function testAddAttribute(next)
{
domActionTest("testAddAttribute", "node-to-add-attribute", testBody, next);
function testBody(node, done)
{
editNodePart(node, "webkit-html-attribute");
var editorElement = window.getSelection().anchorNode.parentElement;
editorElement.dispatchEvent(InspectorTest.createKeyEvent("U+0009")); // Tab
var editorElement = window.getSelection().anchorNode.parentElement;
editorElement.textContent = "newattr=\"new-value\"";
editorElement.dispatchEvent(InspectorTest.createKeyEvent("Enter"));
InspectorTest.runAfterPendingDispatches(done);
}
},
function testEditAsHTML(next)
{
domActionTest("testEditAsHTML", "node-to-edit-as-html", testBody, next);
function testBody(node, done)
{
var treeElement = WebInspector.panels.elements.treeOutline.findTreeElement(node);
treeElement._editAsHTML();
InspectorTest.runAfterPendingDispatches(step2);
function step2()
{
InspectorTest.addResult(treeElement._htmlEditElement.textContent);
treeElement._htmlEditElement.textContent = "<div foo=\"bar\"><span id=\"inner-span\">Span contents</span></div>";
var event = InspectorTest.createKeyEvent("Enter");
event.isMetaOrCtrlForTest = true;
treeElement._htmlEditElement.dispatchEvent(event);
InspectorTest.runAfterPendingDispatches(done);
}
}
}
]);
function domActionTest(testName, dataNode, testBody, next)
{
var testNode = InspectorTest.expandedNodeWithId(testName);
InspectorTest.addResult("==== before ====");
InspectorTest.dumpElementsTree(testNode);
InspectorTest.selectNodeWithId(dataNode, step1);
function step1(node)
{
testBody(node, step2);
}
function step2()
{
InspectorTest.addResult("==== after ====");
InspectorTest.dumpElementsTree(testNode);
next();
}
}
function editNodePart(node, className)
{
var treeElement = WebInspector.panels.elements.treeOutline.findTreeElement(node);
var textElement = treeElement.listItemElement.getElementsByClassName(className)[0];
treeElement._startEditingTarget(textElement);
}
function editNodePartAndRun(node, className, newValue, step2)
{
editNodePart(node, className);
var editorElement = window.getSelection().anchorNode.parentElement;
editorElement.textContent = newValue;
editorElement.dispatchEvent(InspectorTest.createKeyEvent("Enter"));
InspectorTest.runAfterPendingDispatches(step2);
}
}
</script>
</head>
<body onload="runTest()">
<p>
Tests that user can mutate DOM by means of elements panel.
</p>
<div>
<div id="testRemove">
<div id="node-to-remove"></div>
</div>
<div id="testSetNodeName">
<div id="node-to-set-name"></div>
</div>
<div id="testSetNodeValue">
<div id="node-to-set-value">Text</div>
</div>
<div id="testSetAttribute">
<div foo="attribute value" id="node-to-set-attribute"></div>
</div>
<div id="testRemoveAttribute">
<div foo="attribute value" id="node-to-remove-attribute"></div>
</div>
<div id="testAddAttribute">
<div id="node-to-add-attribute"></div>
</div>
<div id="testEditAsHTML">
<div id="node-to-edit-as-html"><span id="span">Text</span></div>
</div>
</div>
</body>
</html>
2011-03-14 Pavel Feldman <pfeldman@chromium.org>
Reviewed by Yury Semikhatsky.
Web Inspector: add tests for edit dom operations.
https://bugs.webkit.org/show_bug.cgi?id=56248
Test: inspector/elements/edit-dom-actions.html
* inspector/Inspector.idl:
* inspector/InspectorDOMAgent.cpp:
(WebCore::InspectorDOMAgent::assertNode):
(WebCore::InspectorDOMAgent::assertElement):
(WebCore::InspectorDOMAgent::assertHTMLElement):
(WebCore::InspectorDOMAgent::nodeToSelectOn):
(WebCore::InspectorDOMAgent::querySelector):
(WebCore::InspectorDOMAgent::querySelectorAll):
(WebCore::InspectorDOMAgent::setAttribute):
(WebCore::InspectorDOMAgent::removeAttribute):
(WebCore::InspectorDOMAgent::getOuterHTML):
(WebCore::InspectorDOMAgent::setOuterHTML):
* inspector/InspectorDOMAgent.h:
* inspector/front-end/DOMAgent.js:
(WebInspector.DOMNode.prototype.setAttribute):
(WebInspector.DOMNode.prototype.removeAttribute):
* inspector/front-end/inspector.js:
(WebInspector.startEditing.defaultFinishHandler):
2011-03-14 Brady Eidson <beidson@apple.com> 2011-03-14 Brady Eidson <beidson@apple.com>
Reviewed by Dan Bernstein. Reviewed by Dan Bernstein.
......
...@@ -146,8 +146,8 @@ module core { ...@@ -146,8 +146,8 @@ module core {
void setNodeValue(in long nodeId, in String value, out boolean success); void setNodeValue(in long nodeId, in String value, out boolean success);
void removeNode(in long nodeId, out long outNodeId); void removeNode(in long nodeId, out long outNodeId);
void setAttribute(in long elementId, in String name, in String value, out boolean success); void setAttribute(in long elementId, in String name, in String value);
void removeAttribute(in long elementId, in String name, out boolean success); void removeAttribute(in long elementId, in String name);
void getEventListenersForNode(in long nodeId, out Array listenersArray); void getEventListenersForNode(in long nodeId, out Array listenersArray);
void copyNode(in long nodeId); void copyNode(in long nodeId);
...@@ -157,6 +157,7 @@ module core { ...@@ -157,6 +157,7 @@ module core {
void performSearch(in String query, in boolean runSynchronously); void performSearch(in String query, in boolean runSynchronously);
void searchCanceled(); void searchCanceled();
void pushNodeByPathToFrontend(in String path, out long nodeId); void pushNodeByPathToFrontend(in String path, out long nodeId);
void resolveNode(in long nodeId, in String objectGroup, out Value result); void resolveNode(in long nodeId, in String objectGroup, out Value result);
void pushNodeToFrontend(in Object objectId, out long nodeId); void pushNodeToFrontend(in Object objectId, out long nodeId);
......
...@@ -363,13 +363,53 @@ void InspectorDOMAgent::unbind(Node* node, NodeToIdMap* nodesMap) ...@@ -363,13 +363,53 @@ void InspectorDOMAgent::unbind(Node* node, NodeToIdMap* nodesMap)
} }
} }
Node* InspectorDOMAgent::nodeToSelectOn(long nodeId, bool documentWide) Node* InspectorDOMAgent::assertNode(ErrorString* errorString, long nodeId)
{
Node* node = nodeForId(nodeId);
if (!node) {
*errorString = "Could not find node with given id.";
return 0;
}
return node;
}
Element* InspectorDOMAgent::assertElement(ErrorString* errorString, long nodeId)
{
Node* node = assertNode(errorString, nodeId);
if (!node)
return 0;
if (node->nodeType() != Node::ELEMENT_NODE) {
*errorString = "Node is not an Element.";
return 0;
}
return toElement(node);
}
HTMLElement* InspectorDOMAgent::assertHTMLElement(ErrorString* errorString, long nodeId)
{
Element* element = assertElement(errorString, nodeId);
if (!element)
return 0;
if (!element->isHTMLElement()) {
*errorString = "Node is not an HTML Element.";
return 0;
}
return toHTMLElement(element);
}
Node* InspectorDOMAgent::nodeToSelectOn(ErrorString* errorString, long nodeId, bool documentWide)
{ {
Node* node; Node* node;
if (!nodeId) if (!nodeId) {
node = m_document.get(); node = m_document.get();
else if (!node)
node = nodeForId(nodeId); *errorString = "No document to query on.";
} else
node = assertNode(errorString, nodeId);
if (!node) if (!node)
return 0; return 0;
...@@ -435,11 +475,9 @@ void InspectorDOMAgent::getChildNodes(ErrorString*, long nodeId) ...@@ -435,11 +475,9 @@ void InspectorDOMAgent::getChildNodes(ErrorString*, long nodeId)
void InspectorDOMAgent::querySelector(ErrorString* errorString, long nodeId, const String& selectors, bool documentWide, long* elementId) void InspectorDOMAgent::querySelector(ErrorString* errorString, long nodeId, const String& selectors, bool documentWide, long* elementId)
{ {
*elementId = 0; *elementId = 0;
Node* node = nodeToSelectOn(nodeId, documentWide); Node* node = nodeToSelectOn(errorString, nodeId, documentWide);
if (!node) { if (!node)
*errorString = "Node with given id not found.";
return; return;
}
ExceptionCode ec = 0; ExceptionCode ec = 0;
RefPtr<Element> element = node->querySelector(selectors, ec); RefPtr<Element> element = node->querySelector(selectors, ec);
...@@ -454,11 +492,9 @@ void InspectorDOMAgent::querySelector(ErrorString* errorString, long nodeId, con ...@@ -454,11 +492,9 @@ void InspectorDOMAgent::querySelector(ErrorString* errorString, long nodeId, con
void InspectorDOMAgent::querySelectorAll(ErrorString* errorString, long nodeId, const String& selectors, bool documentWide, RefPtr<InspectorArray>* result) void InspectorDOMAgent::querySelectorAll(ErrorString* errorString, long nodeId, const String& selectors, bool documentWide, RefPtr<InspectorArray>* result)
{ {
Node* node = nodeToSelectOn(nodeId, documentWide); Node* node = nodeToSelectOn(errorString, nodeId, documentWide);
if (!node) { if (!node)
*errorString = "Node with given id not found.";
return; return;
}
ExceptionCode ec = 0; ExceptionCode ec = 0;
RefPtr<NodeList> nodes = node->querySelectorAll(selectors, ec); RefPtr<NodeList> nodes = node->querySelectorAll(selectors, ec);
...@@ -522,25 +558,25 @@ long InspectorDOMAgent::boundNodeId(Node* node) ...@@ -522,25 +558,25 @@ long InspectorDOMAgent::boundNodeId(Node* node)
return m_documentNodeToIdMap.get(node); return m_documentNodeToIdMap.get(node);
} }
void InspectorDOMAgent::setAttribute(ErrorString*, long elementId, const String& name, const String& value, bool* success) void InspectorDOMAgent::setAttribute(ErrorString* errorString, long elementId, const String& name, const String& value)
{ {
Node* node = nodeForId(elementId); Element* element = assertElement(errorString, elementId);
if (node && (node->nodeType() == Node::ELEMENT_NODE)) { if (element) {
Element* element = static_cast<Element*>(node);
ExceptionCode ec = 0; ExceptionCode ec = 0;
element->setAttribute(name, value, ec); element->setAttribute(name, value, ec);
*success = !ec; if (ec)
*errorString = "Exception while setting attribute value.";
} }
} }
void InspectorDOMAgent::removeAttribute(ErrorString*, long elementId, const String& name, bool* success) void InspectorDOMAgent::removeAttribute(ErrorString* errorString, long elementId, const String& name)
{ {
Node* node = nodeForId(elementId); Element* element = assertElement(errorString, elementId);
if (node && (node->nodeType() == Node::ELEMENT_NODE)) { if (element) {
Element* element = static_cast<Element*>(node);
ExceptionCode ec = 0; ExceptionCode ec = 0;
element->removeAttribute(name, ec); element->removeAttribute(name, ec);
*success = !ec; if (ec)
*errorString = "Exception while removing attribute.";
} }
} }
...@@ -599,28 +635,25 @@ void InspectorDOMAgent::setNodeName(ErrorString*, long nodeId, const String& tag ...@@ -599,28 +635,25 @@ void InspectorDOMAgent::setNodeName(ErrorString*, long nodeId, const String& tag
pushChildNodesToFrontend(*newId); pushChildNodesToFrontend(*newId);
} }
void InspectorDOMAgent::getOuterHTML(ErrorString*, long nodeId, WTF::String* outerHTML) void InspectorDOMAgent::getOuterHTML(ErrorString* errorString, long nodeId, WTF::String* outerHTML)
{ {
Node* node = nodeForId(nodeId); HTMLElement* element = assertHTMLElement(errorString, nodeId);
if (!node || !node->isHTMLElement()) if (element)
return; *outerHTML = element->outerHTML();
*outerHTML = toHTMLElement(node)->outerHTML();
} }
void InspectorDOMAgent::setOuterHTML(ErrorString*, long nodeId, const String& outerHTML, long* newId) void InspectorDOMAgent::setOuterHTML(ErrorString* errorString, long nodeId, const String& outerHTML, long* newId)
{ {
Node* node = nodeForId(nodeId); HTMLElement* htmlElement = assertHTMLElement(errorString, nodeId);
if (!node || !node->isHTMLElement()) if (!htmlElement)
return; return;
bool requiresTotalUpdate = node->nodeName() == "HTML" || node->nodeName() == "BODY" || node->nodeName() == "HEAD"; bool requiresTotalUpdate = htmlElement->tagName() == "HTML" || htmlElement->tagName() == "BODY" || htmlElement->tagName() == "HEAD";
bool childrenRequested = m_childrenRequested.contains(nodeId); bool childrenRequested = m_childrenRequested.contains(nodeId);
Node* previousSibling = node->previousSibling(); Node* previousSibling = htmlElement->previousSibling();
ContainerNode* parentNode = node->parentNode(); ContainerNode* parentNode = htmlElement->parentNode();
HTMLElement* htmlElement = toHTMLElement(node);
ExceptionCode ec = 0; ExceptionCode ec = 0;
htmlElement->setOuterHTML(outerHTML, ec); htmlElement->setOuterHTML(outerHTML, ec);
if (ec) if (ec)
......
...@@ -56,6 +56,7 @@ class Event; ...@@ -56,6 +56,7 @@ class Event;
class InspectorDOMAgent; class InspectorDOMAgent;
class InspectorFrontend; class InspectorFrontend;
class MatchJob; class MatchJob;
class HTMLElement;
class InspectorState; class InspectorState;
class InstrumentingAgents; class InstrumentingAgents;
class NameNodeMap; class NameNodeMap;
...@@ -110,8 +111,8 @@ public: ...@@ -110,8 +111,8 @@ public:
void querySelectorAll(ErrorString*, long nodeId, const String& selectors, bool documentWide, RefPtr<InspectorArray>* result); void querySelectorAll(ErrorString*, long nodeId, const String& selectors, bool documentWide, RefPtr<InspectorArray>* result);
void getDocument(ErrorString*, RefPtr<InspectorObject>* root); void getDocument(ErrorString*, RefPtr<InspectorObject>* root);
void getChildNodes(ErrorString*, long nodeId); void getChildNodes(ErrorString*, long nodeId);
void setAttribute(ErrorString*, long elementId, const String& name, const String& value, bool* success); void setAttribute(ErrorString*, long elementId, const String& name, const String& value);
void removeAttribute(ErrorString*, long elementId, const String& name, bool* success); void removeAttribute(ErrorString*, long elementId, const String& name);
void removeNode(ErrorString*, long nodeId, long* outNodeId); void removeNode(ErrorString*, long nodeId, long* outNodeId);
void setNodeName(ErrorString*, long nodeId, const String& name, long* newId); void setNodeName(ErrorString*, long nodeId, const String& name, long* newId);
void getOuterHTML(ErrorString*, long nodeId, WTF::String* outerHTML); void getOuterHTML(ErrorString*, long nodeId, WTF::String* outerHTML);
...@@ -162,8 +163,10 @@ private: ...@@ -162,8 +163,10 @@ private:
typedef HashMap<RefPtr<Node>, long> NodeToIdMap; typedef HashMap<RefPtr<Node>, long> NodeToIdMap;
long bind(Node*, NodeToIdMap*); long bind(Node*, NodeToIdMap*);
void unbind(Node*, NodeToIdMap*); void unbind(Node*, NodeToIdMap*);
Node* assertNode(ErrorString*, long nodeId);
Node* nodeToSelectOn(long nodeId, bool documentWide); Element* assertElement(ErrorString*, long nodeId);
HTMLElement* assertHTMLElement(ErrorString*, long nodeId);
Node* nodeToSelectOn(ErrorString*, long nodeId, bool documentWide);
long pushNodePathToFrontend(Node*); long pushNodePathToFrontend(Node*);
void pushChildNodesToFrontend(long nodeId); void pushChildNodesToFrontend(long nodeId);
......
...@@ -130,16 +130,15 @@ WebInspector.DOMNode.prototype = { ...@@ -130,16 +130,15 @@ WebInspector.DOMNode.prototype = {
setAttribute: function(name, value, callback) setAttribute: function(name, value, callback)
{ {
function mycallback(error, success) function mycallback(error)
{ {
if (error || !success) if (!error) {
return; var attr = this._attributesMap[name];
if (attr)
var attr = this._attributesMap[name]; attr.value = value;
if (attr) else
attr.value = value; attr = this._addAttribute(name, value);
else }
attr = this._addAttribute(name, value);
if (callback) if (callback)
callback(); callback();
...@@ -156,16 +155,16 @@ WebInspector.DOMNode.prototype = { ...@@ -156,16 +155,16 @@ WebInspector.DOMNode.prototype = {
{ {
function mycallback(error, success) function mycallback(error, success)
{ {
if (error || !success) if (!error) {
return; delete this._attributesMap[name];
for (var i = 0; i < this._attributes.length; ++i) {
delete this._attributesMap[name]; if (this._attributes[i].name === name) {
for (var i = 0; i < this._attributes.length; ++i) { this._attributes.splice(i, 1);
if (this._attributes[i].name === name) { break;
this._attributes.splice(i, 1); }
break;
} }
} }
if (callback) if (callback)
callback(); callback();
} }
......
...@@ -1537,7 +1537,7 @@ WebInspector.startEditing = function(element, config) ...@@ -1537,7 +1537,7 @@ WebInspector.startEditing = function(element, config)
var isMetaOrCtrl = WebInspector.isMac() ? var isMetaOrCtrl = WebInspector.isMac() ?
event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey : event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey :
event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey; event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
if (isEnterKey(event) && (!config.multiline || isMetaOrCtrl)) if (isEnterKey(event) && (event.isMetaOrCtrlForTest || !config.multiline || isMetaOrCtrl))
return "commit"; return "commit";
else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code) else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code)
return "cancel"; return "cancel";
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment