OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009 Apple Inc. All rights reserved. |
3 * Copyright (C) 2011 Google Inc. All rights reserved. | 3 * Copyright (C) 2011 Google Inc. All rights reserved. |
4 * Copyright (C) 2009 Joseph Pecoraro | 4 * Copyright (C) 2009 Joseph Pecoraro |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * | 9 * |
10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 #include "InspectorState.h" | 68 #include "InspectorState.h" |
69 #include "InstrumentingAgents.h" | 69 #include "InstrumentingAgents.h" |
70 #include "MutationEvent.h" | 70 #include "MutationEvent.h" |
71 #include "Node.h" | 71 #include "Node.h" |
72 #include "NodeList.h" | 72 #include "NodeList.h" |
73 #include "Page.h" | 73 #include "Page.h" |
74 #include "Pasteboard.h" | 74 #include "Pasteboard.h" |
75 #include "RenderStyle.h" | 75 #include "RenderStyle.h" |
76 #include "RenderStyleConstants.h" | 76 #include "RenderStyleConstants.h" |
77 #include "ScriptEventListener.h" | 77 #include "ScriptEventListener.h" |
78 #include "ShadowRoot.h" | |
79 #include "StyleSheetList.h" | 78 #include "StyleSheetList.h" |
80 #include "Text.h" | 79 #include "Text.h" |
81 | 80 |
82 #if ENABLE(XPATH) | 81 #if ENABLE(XPATH) |
83 #include "XPathResult.h" | 82 #include "XPathResult.h" |
84 #endif | 83 #endif |
85 | 84 |
86 #include "markup.h" | 85 #include "markup.h" |
87 | 86 |
88 #include <wtf/text/CString.h> | 87 #include <wtf/text/CString.h> |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 RefPtr<Document> doc = m_document; | 443 RefPtr<Document> doc = m_document; |
445 reset(); | 444 reset(); |
446 m_document = doc; | 445 m_document = doc; |
447 | 446 |
448 *root = buildObjectForNode(m_document.get(), 2, &m_documentNodeToIdMap); | 447 *root = buildObjectForNode(m_document.get(), 2, &m_documentNodeToIdMap); |
449 } | 448 } |
450 | 449 |
451 void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId) | 450 void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId) |
452 { | 451 { |
453 Node* node = nodeForId(nodeId); | 452 Node* node = nodeForId(nodeId); |
454 if (!node || !isContainerNode(*node)) | 453 if (!node || (node->nodeType() != Node::ELEMENT_NODE && node->nodeType() !=
Node::DOCUMENT_NODE && node->nodeType() != Node::DOCUMENT_FRAGMENT_NODE)) |
455 return; | 454 return; |
456 if (m_childrenRequested.contains(nodeId)) | 455 if (m_childrenRequested.contains(nodeId)) |
457 return; | 456 return; |
458 | 457 |
459 NodeToIdMap* nodeMap = m_idToNodesMap.get(nodeId); | 458 NodeToIdMap* nodeMap = m_idToNodesMap.get(nodeId); |
460 RefPtr<InspectorArray> children = buildArrayForContainerChildren(node, 1, no
deMap); | 459 RefPtr<InspectorArray> children = buildArrayForContainerChildren(node, 1, no
deMap); |
461 m_frontend->setChildNodes(nodeId, children.release()); | 460 m_frontend->setChildNodes(nodeId, children.release()); |
462 } | 461 } |
463 | 462 |
464 void InspectorDOMAgent::discardBindings() | 463 void InspectorDOMAgent::discardBindings() |
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1051 | 1050 |
1052 switch (node->nodeType()) { | 1051 switch (node->nodeType()) { |
1053 case Node::TEXT_NODE: | 1052 case Node::TEXT_NODE: |
1054 case Node::COMMENT_NODE: | 1053 case Node::COMMENT_NODE: |
1055 case Node::CDATA_SECTION_NODE: | 1054 case Node::CDATA_SECTION_NODE: |
1056 nodeValue = node->nodeValue(); | 1055 nodeValue = node->nodeValue(); |
1057 break; | 1056 break; |
1058 case Node::ATTRIBUTE_NODE: | 1057 case Node::ATTRIBUTE_NODE: |
1059 localName = node->localName(); | 1058 localName = node->localName(); |
1060 break; | 1059 break; |
1061 case Node::SHADOW_ROOT_NODE: | |
1062 case Node::DOCUMENT_FRAGMENT_NODE: | 1060 case Node::DOCUMENT_FRAGMENT_NODE: |
1063 break; | 1061 break; |
1064 case Node::DOCUMENT_NODE: | 1062 case Node::DOCUMENT_NODE: |
1065 case Node::ELEMENT_NODE: | 1063 case Node::ELEMENT_NODE: |
1066 default: | 1064 default: |
1067 nodeName = node->nodeName(); | 1065 nodeName = node->nodeName(); |
1068 localName = node->localName(); | 1066 localName = node->localName(); |
1069 break; | 1067 break; |
1070 } | 1068 } |
1071 | 1069 |
1072 value->setNumber("id", id); | 1070 value->setNumber("id", id); |
1073 value->setNumber("nodeType", node->nodeType()); | 1071 value->setNumber("nodeType", node->nodeType()); |
1074 value->setString("nodeName", nodeName); | 1072 value->setString("nodeName", nodeName); |
1075 value->setString("localName", localName); | 1073 value->setString("localName", localName); |
1076 value->setString("nodeValue", nodeValue); | 1074 value->setString("nodeValue", nodeValue); |
1077 | 1075 |
1078 if (isContainerNode(*node)) { | 1076 if (node->nodeType() == Node::ELEMENT_NODE || node->nodeType() == Node::DOCU
MENT_NODE || node->nodeType() == Node::DOCUMENT_FRAGMENT_NODE) { |
1079 int nodeCount = innerChildNodeCount(node); | 1077 int nodeCount = innerChildNodeCount(node); |
1080 value->setNumber("childNodeCount", nodeCount); | 1078 value->setNumber("childNodeCount", nodeCount); |
1081 RefPtr<InspectorArray> children = buildArrayForContainerChildren(node, d
epth, nodesMap); | 1079 RefPtr<InspectorArray> children = buildArrayForContainerChildren(node, d
epth, nodesMap); |
1082 if (children->length() > 0) | 1080 if (children->length() > 0) |
1083 value->setArray("children", children.release()); | 1081 value->setArray("children", children.release()); |
1084 | 1082 |
1085 if (node->nodeType() == Node::ELEMENT_NODE) { | 1083 if (node->nodeType() == Node::ELEMENT_NODE) { |
1086 Element* element = static_cast<Element*>(node); | 1084 Element* element = static_cast<Element*>(node); |
1087 value->setArray("attributes", buildArrayForElementAttributes(element
)); | 1085 value->setArray("attributes", buildArrayForElementAttributes(element
)); |
1088 if (node->isFrameOwnerElement()) { | 1086 if (node->isFrameOwnerElement()) { |
1089 HTMLFrameOwnerElement* frameOwner = static_cast<HTMLFrameOwnerEl
ement*>(node); | 1087 HTMLFrameOwnerElement* frameOwner = static_cast<HTMLFrameOwnerEl
ement*>(node); |
1090 value->setString("documentURL", documentURLString(frameOwner->co
ntentDocument())); | 1088 value->setString("documentURL", documentURLString(frameOwner->co
ntentDocument())); |
1091 } | 1089 } |
1092 if (ShadowRoot* shadowRoot = element->shadowRoot()) | |
1093 value->setObject("shadowRoot", buildObjectForNode(shadowRoot, de
pth, nodesMap)); | |
1094 } else if (node->nodeType() == Node::DOCUMENT_NODE) { | 1090 } else if (node->nodeType() == Node::DOCUMENT_NODE) { |
1095 Document* document = static_cast<Document*>(node); | 1091 Document* document = static_cast<Document*>(node); |
1096 value->setString("documentURL", documentURLString(document)); | 1092 value->setString("documentURL", documentURLString(document)); |
1097 value->setString("xmlVersion", document->xmlVersion()); | 1093 value->setString("xmlVersion", document->xmlVersion()); |
1098 } | 1094 } |
1099 } else if (node->nodeType() == Node::DOCUMENT_TYPE_NODE) { | 1095 } else if (node->nodeType() == Node::DOCUMENT_TYPE_NODE) { |
1100 DocumentType* docType = static_cast<DocumentType*>(node); | 1096 DocumentType* docType = static_cast<DocumentType*>(node); |
1101 value->setString("publicId", docType->publicId()); | 1097 value->setString("publicId", docType->publicId()); |
1102 value->setString("systemId", docType->systemId()); | 1098 value->setString("systemId", docType->systemId()); |
1103 value->setString("internalSubset", docType->internalSubset()); | 1099 value->setString("internalSubset", docType->internalSubset()); |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1256 } | 1252 } |
1257 | 1253 |
1258 void InspectorDOMAgent::didInsertDOMNode(Node* node) | 1254 void InspectorDOMAgent::didInsertDOMNode(Node* node) |
1259 { | 1255 { |
1260 if (isWhitespace(node)) | 1256 if (isWhitespace(node)) |
1261 return; | 1257 return; |
1262 | 1258 |
1263 // We could be attaching existing subtree. Forget the bindings. | 1259 // We could be attaching existing subtree. Forget the bindings. |
1264 unbind(node, &m_documentNodeToIdMap); | 1260 unbind(node, &m_documentNodeToIdMap); |
1265 | 1261 |
1266 ContainerNode* parent = node->isShadowRoot() ? node->shadowHost() : node->pa
rentNode(); | 1262 ContainerNode* parent = node->parentNode(); |
1267 int parentId = m_documentNodeToIdMap.get(parent); | 1263 int parentId = m_documentNodeToIdMap.get(parent); |
1268 // Return if parent is not mapped yet. | 1264 // Return if parent is not mapped yet. |
1269 if (!parentId) | 1265 if (!parentId) |
1270 return; | 1266 return; |
1271 | 1267 |
1272 if (node->isShadowRoot()) { | |
1273 RefPtr<InspectorObject> value = buildObjectForNode(node, 0, &m_documentN
odeToIdMap); | |
1274 m_frontend->shadowRootUpdated(parentId, value.release()); | |
1275 return; | |
1276 } | |
1277 if (!m_childrenRequested.contains(parentId)) { | 1268 if (!m_childrenRequested.contains(parentId)) { |
1278 // No children are mapped yet -> only notify on changes of hasChildren. | 1269 // No children are mapped yet -> only notify on changes of hasChildren. |
1279 m_frontend->childNodeCountUpdated(parentId, innerChildNodeCount(parent))
; | 1270 m_frontend->childNodeCountUpdated(parentId, innerChildNodeCount(parent))
; |
1280 } else { | 1271 } else { |
1281 // Children have been requested -> return value of a new child. | 1272 // Children have been requested -> return value of a new child. |
1282 Node* prevSibling = innerPreviousSibling(node); | 1273 Node* prevSibling = innerPreviousSibling(node); |
1283 int prevId = prevSibling ? m_documentNodeToIdMap.get(prevSibling) : 0; | 1274 int prevId = prevSibling ? m_documentNodeToIdMap.get(prevSibling) : 0; |
1284 RefPtr<InspectorObject> value = buildObjectForNode(node, 0, &m_documentN
odeToIdMap); | 1275 RefPtr<InspectorObject> value = buildObjectForNode(node, 0, &m_documentN
odeToIdMap); |
1285 m_frontend->childNodeInserted(parentId, prevId, value.release()); | 1276 m_frontend->childNodeInserted(parentId, prevId, value.release()); |
1286 } | 1277 } |
1287 } | 1278 } |
1288 | 1279 |
1289 void InspectorDOMAgent::didRemoveDOMNode(Node* node) | 1280 void InspectorDOMAgent::didRemoveDOMNode(Node* node) |
1290 { | 1281 { |
1291 if (isWhitespace(node)) | 1282 if (isWhitespace(node)) |
1292 return; | 1283 return; |
1293 | 1284 |
1294 ContainerNode* parent = node->isShadowRoot() ? node->shadowHost() : node->pa
rentNode(); | 1285 ContainerNode* parent = node->parentNode(); |
1295 int parentId = m_documentNodeToIdMap.get(parent); | 1286 int parentId = m_documentNodeToIdMap.get(parent); |
1296 // If parent is not mapped yet -> ignore the event. | 1287 // If parent is not mapped yet -> ignore the event. |
1297 if (!parentId) | 1288 if (!parentId) |
1298 return; | 1289 return; |
1299 | 1290 |
1300 if (m_domListener) | 1291 if (m_domListener) |
1301 m_domListener->didRemoveDOMNode(node); | 1292 m_domListener->didRemoveDOMNode(node); |
1302 | 1293 |
1303 if (node->isShadowRoot()) | 1294 if (!m_childrenRequested.contains(parentId)) { |
1304 m_frontend->shadowRootUpdated(parentId, 0); | |
1305 else if (!m_childrenRequested.contains(parentId)) { | |
1306 // No children are mapped yet -> only notify on changes of hasChildren. | 1295 // No children are mapped yet -> only notify on changes of hasChildren. |
1307 if (innerChildNodeCount(parent) == 1) | 1296 if (innerChildNodeCount(parent) == 1) |
1308 m_frontend->childNodeCountUpdated(parentId, 0); | 1297 m_frontend->childNodeCountUpdated(parentId, 0); |
1309 } else | 1298 } else |
1310 m_frontend->childNodeRemoved(parentId, m_documentNodeToIdMap.get(node)); | 1299 m_frontend->childNodeRemoved(parentId, m_documentNodeToIdMap.get(node)); |
1311 unbind(node, &m_documentNodeToIdMap); | 1300 unbind(node, &m_documentNodeToIdMap); |
1312 } | 1301 } |
1313 | 1302 |
1314 void InspectorDOMAgent::didModifyDOMAttr(Element* element) | 1303 void InspectorDOMAgent::didModifyDOMAttr(Element* element) |
1315 { | 1304 { |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1444 mode = DOMNodeHighlighter::HighlightContent; | 1433 mode = DOMNodeHighlighter::HighlightContent; |
1445 else if (m_highlightMode == "padding") | 1434 else if (m_highlightMode == "padding") |
1446 mode = DOMNodeHighlighter::HighlightPadding; | 1435 mode = DOMNodeHighlighter::HighlightPadding; |
1447 else if (m_highlightMode == "border") | 1436 else if (m_highlightMode == "border") |
1448 mode = DOMNodeHighlighter::HighlightBorder; | 1437 mode = DOMNodeHighlighter::HighlightBorder; |
1449 else if (m_highlightMode == "margin") | 1438 else if (m_highlightMode == "margin") |
1450 mode = DOMNodeHighlighter::HighlightMargin; | 1439 mode = DOMNodeHighlighter::HighlightMargin; |
1451 DOMNodeHighlighter::DrawNodeHighlight(context, m_highlightedNode.get(), mode
); | 1440 DOMNodeHighlighter::DrawNodeHighlight(context, m_highlightedNode.get(), mode
); |
1452 } | 1441 } |
1453 | 1442 |
1454 bool InspectorDOMAgent::isContainerNode(const Node& node) | |
1455 { | |
1456 Node::NodeType type = node.nodeType(); | |
1457 return type == Node::ELEMENT_NODE | |
1458 || type == Node::DOCUMENT_NODE | |
1459 || type == Node::DOCUMENT_FRAGMENT_NODE | |
1460 || type == Node::SHADOW_ROOT_NODE; | |
1461 } | |
1462 | |
1463 } // namespace WebCore | 1443 } // namespace WebCore |
1464 | 1444 |
1465 #endif // ENABLE(INSPECTOR) | 1445 #endif // ENABLE(INSPECTOR) |
OLD | NEW |