WebRenderLayer.cpp [plain text]
#include "config.h"
#include "WebRenderLayer.h"
#include "WebPage.h"
#include "WebString.h"
#include <WebCore/Frame.h>
#include <WebCore/FrameLoaderClient.h>
#include <WebCore/RenderLayer.h>
#include <WebCore/RenderLayerBacking.h>
#include <WebCore/RenderView.h>
#include <WebCore/StyledElement.h>
using namespace WebCore;
namespace WebKit {
PassRefPtr<WebRenderLayer> WebRenderLayer::create(WebPage* page)
{
Frame* mainFrame = page->mainFrame();
if (!mainFrame)
return 0;
if (!mainFrame->loader()->client()->hasHTMLView())
return 0;
RenderView* contentRenderer = mainFrame->contentRenderer();
if (!contentRenderer)
return 0;
RenderLayer* rootLayer = contentRenderer->layer();
if (!rootLayer)
return 0;
return adoptRef(new WebRenderLayer(rootLayer));
}
PassRefPtr<MutableArray> WebRenderLayer::createArrayFromLayerList(Vector<RenderLayer*>* list)
{
if (!list || !list->size())
return 0;
RefPtr<MutableArray> array = MutableArray::create();
for (size_t i = 0; i < list->size(); ++i) {
RefPtr<WebRenderLayer> layer = adoptRef(new WebRenderLayer(list->at(i)));
array->append(layer.get());
}
return array.release();
}
WebRenderLayer::WebRenderLayer(RenderLayer* layer)
{
RenderBoxModelObject* renderer = layer->renderer();
m_renderObjectName = renderer->renderName();
if (Node* node = renderer->node()) {
if (node->isElementNode()) {
Element* element = toElement(node);
m_elementTagName = element->tagName();
m_elementID = element->getIdAttribute();
if (element->isStyledElement() && element->hasClass()) {
StyledElement* styledElement = static_cast<StyledElement*>(element);
if (size_t classNameCount = styledElement->classNames().size()) {
m_elementClassNames = MutableArray::create();
for (size_t i = 0; i < classNameCount; ++i)
m_elementClassNames->append(WebString::create(styledElement->classNames()[i]).get());
}
}
}
}
m_isReflection = layer->isReflection();
#if USE(ACCELERATED_COMPOSITING)
if (layer->isComposited()) {
RenderLayerBacking* backing = layer->backing();
m_isClipping = backing->hasClippingLayer();
m_isClipped = backing->hasAncestorClippingLayer();
switch (backing->compositingLayerType()) {
case NormalCompositingLayer:
m_compositingLayerType = Normal;
break;
case TiledCompositingLayer:
m_compositingLayerType = Tiled;
break;
case MediaCompositingLayer:
m_compositingLayerType = Media;
break;
case ContainerCompositingLayer:
m_compositingLayerType = Container;
break;
}
} else {
#endif
m_isClipping = false;
m_isClipped = false;
m_compositingLayerType = None;
#if USE(ACCELERATED_COMPOSITING)
}
#endif
m_absoluteBoundingBox = layer->absoluteBoundingBox();
m_negativeZOrderList = createArrayFromLayerList(layer->negZOrderList());
m_normalFlowList = createArrayFromLayerList(layer->normalFlowList());
m_positiveZOrderList = createArrayFromLayerList(layer->posZOrderList());
}
}