| 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 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 v8::Local<v8::Value> nodeV8Value(v8::Local<v8::Context> context, Node* node) { | 132 v8::Local<v8::Value> nodeV8Value(v8::Local<v8::Context> context, Node* node) { |
| 133 v8::Isolate* isolate = context->GetIsolate(); | 133 v8::Isolate* isolate = context->GetIsolate(); |
| 134 if (!node || | 134 if (!node || |
| 135 !BindingSecurity::shouldAllowAccessTo( | 135 !BindingSecurity::shouldAllowAccessTo( |
| 136 currentDOMWindow(isolate), node, | 136 currentDOMWindow(isolate), node, |
| 137 BindingSecurity::ErrorReportOption::DoNotReport)) | 137 BindingSecurity::ErrorReportOption::DoNotReport)) |
| 138 return v8::Null(isolate); | 138 return v8::Null(isolate); |
| 139 return toV8(node, context->Global(), isolate); | 139 return toV8(node, context->Global(), isolate); |
| 140 } | 140 } |
| 141 | 141 |
| 142 std::unique_ptr<protocol::DOM::Rect> buildRectForFloatRect( | |
| 143 const FloatRect& rect) { | |
| 144 return protocol::DOM::Rect::create() | |
| 145 .setX(rect.x()) | |
| 146 .setY(rect.y()) | |
| 147 .setWidth(rect.width()) | |
| 148 .setHeight(rect.height()) | |
| 149 .build(); | |
| 150 } | |
| 151 | |
| 152 } // namespace | 142 } // namespace |
| 153 | 143 |
| 154 class InspectorRevalidateDOMTask final | 144 class InspectorRevalidateDOMTask final |
| 155 : public GarbageCollectedFinalized<InspectorRevalidateDOMTask> { | 145 : public GarbageCollectedFinalized<InspectorRevalidateDOMTask> { |
| 156 public: | 146 public: |
| 157 explicit InspectorRevalidateDOMTask(InspectorDOMAgent*); | 147 explicit InspectorRevalidateDOMTask(InspectorDOMAgent*); |
| 158 void scheduleStyleAttrRevalidationFor(Element*); | 148 void scheduleStyleAttrRevalidationFor(Element*); |
| 159 void reset() { m_timer.stop(); } | 149 void reset() { m_timer.stop(); } |
| 160 void onTimer(TimerBase*); | 150 void onTimer(TimerBase*); |
| 161 DECLARE_TRACE(); | 151 DECLARE_TRACE(); |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 534 | 524 |
| 535 int sanitizedDepth = depth.fromMaybe(2); | 525 int sanitizedDepth = depth.fromMaybe(2); |
| 536 if (sanitizedDepth == -1) | 526 if (sanitizedDepth == -1) |
| 537 sanitizedDepth = INT_MAX; | 527 sanitizedDepth = INT_MAX; |
| 538 | 528 |
| 539 *root = buildObjectForNode(m_document.get(), sanitizedDepth, | 529 *root = buildObjectForNode(m_document.get(), sanitizedDepth, |
| 540 traverseFrames.fromMaybe(false), | 530 traverseFrames.fromMaybe(false), |
| 541 m_documentNodeToIdMap.get()); | 531 m_documentNodeToIdMap.get()); |
| 542 } | 532 } |
| 543 | 533 |
| 544 void InspectorDOMAgent::getLayoutTreeNodes( | |
| 545 ErrorString* errorString, | |
| 546 std::unique_ptr<protocol::Array<protocol::DOM::LayoutTreeNode>>* | |
| 547 layoutTreeNodes) { | |
| 548 layoutTreeNodes->reset(new protocol::Array<protocol::DOM::LayoutTreeNode>); | |
| 549 visitLayoutTreeNodes(m_document.get(), *layoutTreeNodes->get()); | |
| 550 } | |
| 551 | |
| 552 void InspectorDOMAgent::visitLayoutTreeNodes( | |
| 553 Node* node, | |
| 554 protocol::Array<protocol::DOM::LayoutTreeNode>& layoutTreeNodes) { | |
| 555 for (; node; node = NodeTraversal::next(*node)) { | |
| 556 // Visit shadow dom nodes. | |
| 557 if (node->isElementNode()) { | |
| 558 const Element* element = toElement(node); | |
| 559 ElementShadow* elementShadow = element->shadow(); | |
| 560 if (elementShadow) { | |
| 561 visitLayoutTreeNodes(&elementShadow->youngestShadowRoot(), | |
| 562 layoutTreeNodes); | |
| 563 } | |
| 564 } | |
| 565 | |
| 566 // Pierce iframe boundaries. | |
| 567 if (node->isFrameOwnerElement()) { | |
| 568 visitLayoutTreeNodes( | |
| 569 toHTMLFrameOwnerElement(node)->contentDocument()->documentElement(), | |
| 570 layoutTreeNodes); | |
| 571 } | |
| 572 | |
| 573 LayoutObject* layoutObject = node->layoutObject(); | |
| 574 if (!layoutObject) | |
| 575 continue; | |
| 576 | |
| 577 int backendNodeId = DOMNodeIds::idForNode(node); | |
| 578 std::unique_ptr<protocol::DOM::LayoutTreeNode> layoutTreeNode = | |
| 579 protocol::DOM::LayoutTreeNode::create() | |
| 580 .setBackendNodeId(backendNodeId) | |
| 581 .setBoundingBox(buildRectForFloatRect( | |
| 582 node->isElementNode() | |
| 583 ? FloatRect(toElement(node)->boundsInViewport()) | |
| 584 : layoutObject->absoluteBoundingBoxRect())) | |
| 585 .build(); | |
| 586 | |
| 587 if (layoutObject->isText()) { | |
| 588 LayoutText* layoutText = toLayoutText(layoutObject); | |
| 589 layoutTreeNode->setLayoutText(layoutText->text()); | |
| 590 if (layoutText->hasTextBoxes()) { | |
| 591 std::unique_ptr<protocol::Array<protocol::DOM::InlineTextBox>> | |
| 592 inlineTextNodes( | |
| 593 new protocol::Array<protocol::DOM::InlineTextBox>()); | |
| 594 for (const InlineTextBox* textBox = layoutText->firstTextBox(); textBox; | |
| 595 textBox = textBox->nextTextBox()) { | |
| 596 FloatRect localCoordsTextBoxRect(textBox->calculateBoundaries()); | |
| 597 FloatRect absoluteCoordsTextBoxRect = | |
| 598 layoutObject->localToAbsoluteQuad(localCoordsTextBoxRect) | |
| 599 .boundingBox(); | |
| 600 inlineTextNodes->addItem(protocol::DOM::InlineTextBox::create() | |
| 601 .setStartCharacterIndex(textBox->start()) | |
| 602 .setNumCharacters(textBox->len()) | |
| 603 .setBoundingBox(buildRectForFloatRect( | |
| 604 absoluteCoordsTextBoxRect)) | |
| 605 .build()); | |
| 606 } | |
| 607 layoutTreeNode->setInlineTextNodes(std::move(inlineTextNodes)); | |
| 608 } | |
| 609 } | |
| 610 | |
| 611 layoutTreeNodes.addItem(std::move(layoutTreeNode)); | |
| 612 } | |
| 613 } | |
| 614 | |
| 615 void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId, | 534 void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId, |
| 616 int depth, | 535 int depth, |
| 617 bool traverseFrames) { | 536 bool traverseFrames) { |
| 618 Node* node = nodeForId(nodeId); | 537 Node* node = nodeForId(nodeId); |
| 619 if (!node || (!node->isElementNode() && !node->isDocumentNode() && | 538 if (!node || (!node->isElementNode() && !node->isDocumentNode() && |
| 620 !node->isDocumentFragment())) | 539 !node->isDocumentFragment())) |
| 621 return; | 540 return; |
| 622 | 541 |
| 623 NodeToIdMap* nodeMap = m_idToNodesMap.get(nodeId); | 542 NodeToIdMap* nodeMap = m_idToNodesMap.get(nodeId); |
| 624 | 543 |
| (...skipping 1766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2391 visitor->trace(m_idToNodesMap); | 2310 visitor->trace(m_idToNodesMap); |
| 2392 visitor->trace(m_document); | 2311 visitor->trace(m_document); |
| 2393 visitor->trace(m_revalidateTask); | 2312 visitor->trace(m_revalidateTask); |
| 2394 visitor->trace(m_searchResults); | 2313 visitor->trace(m_searchResults); |
| 2395 visitor->trace(m_history); | 2314 visitor->trace(m_history); |
| 2396 visitor->trace(m_domEditor); | 2315 visitor->trace(m_domEditor); |
| 2397 InspectorBaseAgent::trace(visitor); | 2316 InspectorBaseAgent::trace(visitor); |
| 2398 } | 2317 } |
| 2399 | 2318 |
| 2400 } // namespace blink | 2319 } // namespace blink |
| OLD | NEW |