diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebKit2/Shared/WebRenderObject.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebKit2/Shared/WebRenderObject.cpp')
-rw-r--r-- | Source/WebKit2/Shared/WebRenderObject.cpp | 86 |
1 files changed, 47 insertions, 39 deletions
diff --git a/Source/WebKit2/Shared/WebRenderObject.cpp b/Source/WebKit2/Shared/WebRenderObject.cpp index 3b44988a8..afc4336ed 100644 --- a/Source/WebKit2/Shared/WebRenderObject.cpp +++ b/Source/WebKit2/Shared/WebRenderObject.cpp @@ -32,6 +32,8 @@ #include <WebCore/Frame.h> #include <WebCore/FrameLoader.h> #include <WebCore/FrameLoaderClient.h> +#include <WebCore/MainFrame.h> +#include <WebCore/RenderInline.h> #include <WebCore/RenderText.h> #include <WebCore/RenderView.h> #include <WebCore/RenderWidget.h> @@ -40,95 +42,101 @@ using namespace WebCore; namespace WebKit { -PassRefPtr<WebRenderObject> WebRenderObject::create(WebPage* page) +RefPtr<WebRenderObject> WebRenderObject::create(WebPage* page) { Frame* mainFrame = page->mainFrame(); if (!mainFrame) - return 0; + return nullptr; if (!mainFrame->loader().client().hasHTMLView()) - return 0; + return nullptr; RenderView* contentRenderer = mainFrame->contentRenderer(); if (!contentRenderer) - return 0; + return nullptr; return adoptRef(new WebRenderObject(contentRenderer, true)); } -PassRefPtr<WebRenderObject> WebRenderObject::create(const String& name, const String& elementTagName, const String& elementID, PassRefPtr<API::Array> elementClassNames, WebCore::IntPoint absolutePosition, WebCore::IntRect frameRect, PassRefPtr<API::Array> children) +PassRefPtr<WebRenderObject> WebRenderObject::create(const String& name, const String& elementTagName, const String& elementID, PassRefPtr<API::Array> elementClassNames, WebCore::IntPoint absolutePosition, WebCore::IntRect frameRect, const String& textSnippet, unsigned textLength, PassRefPtr<API::Array> children) { - return adoptRef(new WebRenderObject(name, elementTagName, elementID, elementClassNames, absolutePosition, frameRect, children)); + return adoptRef(new WebRenderObject(name, elementTagName, elementID, elementClassNames, absolutePosition, frameRect, textSnippet, textLength, children)); } WebRenderObject::WebRenderObject(RenderObject* renderer, bool shouldIncludeDescendants) { m_name = renderer->renderName(); + m_textLength = 0; if (Node* node = renderer->node()) { - if (node->isElementNode()) { - Element* element = toElement(node); - m_elementTagName = element->tagName(); - m_elementID = element->getIdAttribute(); + if (is<Element>(*node)) { + Element& element = downcast<Element>(*node); + m_elementTagName = element.tagName(); + m_elementID = element.getIdAttribute(); - if (element->isStyledElement() && element->hasClass()) { + if (element.isStyledElement() && element.hasClass()) { Vector<RefPtr<API::Object>> classNames; - classNames.reserveInitialCapacity(element->classNames().size()); + classNames.reserveInitialCapacity(element.classNames().size()); - for (size_t i = 0, size = element->classNames().size(); i < size; ++i) - classNames.append(API::String::create(element->classNames()[i])); + for (size_t i = 0, size = element.classNames().size(); i < size; ++i) + classNames.append(API::String::create(element.classNames()[i])); - m_elementClassNames = API::Array::create(std::move(classNames)); + m_elementClassNames = API::Array::create(WTFMove(classNames)); } } + + if (node->isTextNode()) { + String value = node->nodeValue(); + m_textLength = value.length(); + + const int maxSnippetLength = 40; + if (value.length() > maxSnippetLength) + m_textSnippet = value.substring(0, maxSnippetLength); + else + m_textSnippet = value; + } } // FIXME: broken with transforms m_absolutePosition = flooredIntPoint(renderer->localToAbsolute()); - if (renderer->isBox()) - m_frameRect = toRenderBox(renderer)->pixelSnappedFrameRect(); - else if (renderer->isText()) { - m_frameRect = toRenderText(renderer)->linesBoundingBox(); - m_frameRect.setX(toRenderText(renderer)->firstRunX()); - m_frameRect.setY(toRenderText(renderer)->firstRunY()); - } else if (renderer->isRenderInline()) - m_frameRect = toRenderBoxModelObject(renderer)->borderBoundingBox(); + if (is<RenderBox>(*renderer)) + m_frameRect = snappedIntRect(downcast<RenderBox>(*renderer).frameRect()); + else if (is<RenderText>(*renderer)) { + m_frameRect = downcast<RenderText>(*renderer).linesBoundingBox(); + m_frameRect.setLocation(downcast<RenderText>(*renderer).firstRunLocation()); + } else if (is<RenderInline>(*renderer)) + m_frameRect = IntRect(downcast<RenderInline>(*renderer).borderBoundingBox()); if (!shouldIncludeDescendants) return; Vector<RefPtr<API::Object>> children; - for (RenderObject* coreChild = renderer->firstChildSlow(); coreChild; coreChild = coreChild->nextSibling()) { - RefPtr<WebRenderObject> child = adoptRef(new WebRenderObject(coreChild, shouldIncludeDescendants)); - children.append(std::move(child)); - } - - if (renderer->isWidget()) { - if (Widget* widget = toRenderWidget(renderer)->widget()) { - if (widget->isFrameView()) { - FrameView* frameView = toFrameView(widget); - if (RenderView* coreContentRenderer = frameView->frame().contentRenderer()) { - RefPtr<WebRenderObject> contentRenderer = adoptRef(new WebRenderObject(coreContentRenderer, shouldIncludeDescendants)); + for (auto* coreChild = renderer->firstChildSlow(); coreChild; coreChild = coreChild->nextSibling()) + children.append(adoptRef(*new WebRenderObject(coreChild, shouldIncludeDescendants))); - children.append(std::move(contentRenderer)); - } - } + if (is<RenderWidget>(*renderer)) { + auto* widget = downcast<RenderWidget>(*renderer).widget(); + if (is<FrameView>(widget)) { + if (auto* coreContentRenderer = downcast<FrameView>(*widget).frame().contentRenderer()) + children.append(adoptRef(*new WebRenderObject(coreContentRenderer, shouldIncludeDescendants))); } } - m_children = API::Array::create(std::move(children)); + m_children = API::Array::create(WTFMove(children)); } -WebRenderObject::WebRenderObject(const String& name, const String& elementTagName, const String& elementID, PassRefPtr<API::Array> elementClassNames, WebCore::IntPoint absolutePosition, WebCore::IntRect frameRect, PassRefPtr<API::Array> children) +WebRenderObject::WebRenderObject(const String& name, const String& elementTagName, const String& elementID, PassRefPtr<API::Array> elementClassNames, WebCore::IntPoint absolutePosition, WebCore::IntRect frameRect, const String& textSnippet, unsigned textLength, PassRefPtr<API::Array> children) : m_children(children) , m_name(name) , m_elementTagName(elementTagName) , m_elementID(elementID) + , m_textSnippet(textSnippet) , m_elementClassNames(elementClassNames) , m_absolutePosition(absolutePosition) , m_frameRect(frameRect) + , m_textLength(textLength) { } |