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 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 } | 461 } |
462 | 462 |
463 if (node->isPseudoElement()) { | 463 if (node->isPseudoElement()) { |
464 *errorString = "Cannot edit pseudo elements"; | 464 *errorString = "Cannot edit pseudo elements"; |
465 return 0; | 465 return 0; |
466 } | 466 } |
467 | 467 |
468 return node; | 468 return node; |
469 } | 469 } |
470 | 470 |
| 471 Node* InspectorDOMAgent::assertEditableChildNode(ErrorString* errorString, Eleme
nt* parentElement, int nodeId) |
| 472 { |
| 473 Node* node = assertEditableNode(errorString, nodeId); |
| 474 if (!node) |
| 475 return 0; |
| 476 if (node->parentNode() != parentElement) { |
| 477 *errorString = "Anchor node must be child of the target element"; |
| 478 return 0; |
| 479 } |
| 480 return node; |
| 481 } |
| 482 |
471 Element* InspectorDOMAgent::assertEditableElement(ErrorString* errorString, int
nodeId) | 483 Element* InspectorDOMAgent::assertEditableElement(ErrorString* errorString, int
nodeId) |
472 { | 484 { |
473 Element* element = assertElement(errorString, nodeId); | 485 Element* element = assertElement(errorString, nodeId); |
474 if (!element) | 486 if (!element) |
475 return 0; | 487 return 0; |
476 | 488 |
477 if (element->isInShadowTree() && userAgentShadowRoot(element)) { | 489 if (element->isInShadowTree() && userAgentShadowRoot(element)) { |
478 *errorString = "Cannot edit elements from user-agent shadow trees"; | 490 *errorString = "Cannot edit elements from user-agent shadow trees"; |
479 return 0; | 491 return 0; |
480 } | 492 } |
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1285 highlightConfig->contentOutline = parseColor(outlineColor); | 1297 highlightConfig->contentOutline = parseColor(outlineColor); |
1286 m_overlay->highlightNode(frame->deprecatedLocalOwner(), 0 /* eventTarget
*/, *highlightConfig, false); | 1298 m_overlay->highlightNode(frame->deprecatedLocalOwner(), 0 /* eventTarget
*/, *highlightConfig, false); |
1287 } | 1299 } |
1288 } | 1300 } |
1289 | 1301 |
1290 void InspectorDOMAgent::hideHighlight(ErrorString*) | 1302 void InspectorDOMAgent::hideHighlight(ErrorString*) |
1291 { | 1303 { |
1292 m_overlay->hideHighlight(); | 1304 m_overlay->hideHighlight(); |
1293 } | 1305 } |
1294 | 1306 |
1295 void InspectorDOMAgent::moveTo(ErrorString* errorString, int nodeId, int targetE
lementId, const int* const anchorNodeId, int* newNodeId) | 1307 void InspectorDOMAgent::copyTo(ErrorString* errorString, int nodeId, int targetE
lementId, const int* const anchorNodeId, const bool* const deep, int* newNodeId) |
1296 { | 1308 { |
1297 Node* node = assertEditableNode(errorString, nodeId); | 1309 Node* node = assertEditableNode(errorString, nodeId); |
1298 if (!node) | 1310 if (!node) |
1299 return; | 1311 return; |
1300 | 1312 |
1301 Element* targetElement = assertEditableElement(errorString, targetElementId)
; | 1313 Element* targetElement = assertEditableElement(errorString, targetElementId)
; |
1302 if (!targetElement) | 1314 if (!targetElement) |
1303 return; | 1315 return; |
1304 | 1316 |
1305 Node* anchorNode = 0; | 1317 Node* anchorNode = 0; |
1306 if (anchorNodeId && *anchorNodeId) { | 1318 if (anchorNodeId && *anchorNodeId) { |
1307 anchorNode = assertEditableNode(errorString, *anchorNodeId); | 1319 anchorNode = assertEditableChildNode(errorString, targetElement, *anchor
NodeId); |
1308 if (!anchorNode) | 1320 if (!anchorNode) |
1309 return; | 1321 return; |
1310 if (anchorNode->parentNode() != targetElement) { | 1322 } |
1311 *errorString = "Anchor node must be child of the target element"; | 1323 |
| 1324 // The clone is deep by default. |
| 1325 RefPtrWillBeRawPtr<Node> clonedNode = node->cloneNode(!deep || *deep); |
| 1326 if (!clonedNode) { |
| 1327 *errorString = "Failed to clone node"; |
| 1328 return; |
| 1329 } |
| 1330 if (!m_domEditor->insertBefore(targetElement, clonedNode, anchorNode, errorS
tring)) |
| 1331 return; |
| 1332 |
| 1333 *newNodeId = pushNodePathToFrontend(clonedNode.get()); |
| 1334 } |
| 1335 |
| 1336 void InspectorDOMAgent::moveTo(ErrorString* errorString, int nodeId, int targetE
lementId, const int* const anchorNodeId, int* newNodeId) |
| 1337 { |
| 1338 Node* node = assertEditableNode(errorString, nodeId); |
| 1339 if (!node) |
| 1340 return; |
| 1341 |
| 1342 Element* targetElement = assertEditableElement(errorString, targetElementId)
; |
| 1343 if (!targetElement) |
| 1344 return; |
| 1345 |
| 1346 Node* current = targetElement; |
| 1347 while (current && current != node) |
| 1348 current = current->parentNode(); |
| 1349 if (current == node) { |
| 1350 *errorString = "Unable to move node into self or descendant"; |
| 1351 return; |
| 1352 } |
| 1353 |
| 1354 Node* anchorNode = 0; |
| 1355 if (anchorNodeId && *anchorNodeId) { |
| 1356 anchorNode = assertEditableChildNode(errorString, targetElement, *anchor
NodeId); |
| 1357 if (!anchorNode) |
1312 return; | 1358 return; |
1313 } | |
1314 } | 1359 } |
1315 | 1360 |
1316 if (!m_domEditor->insertBefore(targetElement, node, anchorNode, errorString)
) | 1361 if (!m_domEditor->insertBefore(targetElement, node, anchorNode, errorString)
) |
1317 return; | 1362 return; |
1318 | 1363 |
1319 *newNodeId = pushNodePathToFrontend(node); | 1364 *newNodeId = pushNodePathToFrontend(node); |
1320 } | 1365 } |
1321 | 1366 |
1322 void InspectorDOMAgent::undo(ErrorString* errorString) | 1367 void InspectorDOMAgent::undo(ErrorString* errorString) |
1323 { | 1368 { |
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2118 if (!m_documentNodeToIdMap->contains(m_document.get())) { | 2163 if (!m_documentNodeToIdMap->contains(m_document.get())) { |
2119 RefPtr<TypeBuilder::DOM::Node> root; | 2164 RefPtr<TypeBuilder::DOM::Node> root; |
2120 getDocument(errorString, root); | 2165 getDocument(errorString, root); |
2121 return errorString->isEmpty(); | 2166 return errorString->isEmpty(); |
2122 } | 2167 } |
2123 return true; | 2168 return true; |
2124 } | 2169 } |
2125 | 2170 |
2126 } // namespace WebCore | 2171 } // namespace WebCore |
2127 | 2172 |
OLD | NEW |