1/*
2 * Copyright (C) 2012 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "WebRenderLayer.h"
28
29#include "APIArray.h"
30#include "APIString.h"
31#include "WebPage.h"
32#include <WebCore/Frame.h>
33#include <WebCore/FrameLoader.h>
34#include <WebCore/FrameLoaderClient.h>
35#include <WebCore/RenderLayer.h>
36#include <WebCore/RenderLayerBacking.h>
37#include <WebCore/RenderView.h>
38#include <WebCore/StyledElement.h>
39
40using namespace WebCore;
41
42namespace WebKit {
43
44PassRefPtr<WebRenderLayer> WebRenderLayer::create(WebPage* page)
45{
46    Frame* mainFrame = page->mainFrame();
47    if (!mainFrame)
48        return 0;
49
50    if (!mainFrame->loader().client().hasHTMLView())
51        return 0;
52
53    RenderView* contentRenderer = mainFrame->contentRenderer();
54    if (!contentRenderer)
55        return 0;
56
57    RenderLayer* rootLayer = contentRenderer->layer();
58    if (!rootLayer)
59        return 0;
60
61    return adoptRef(new WebRenderLayer(rootLayer));
62}
63
64PassRefPtr<WebRenderLayer> WebRenderLayer::create(PassRefPtr<WebRenderObject> renderer, bool isReflection, bool isClipping, bool isClipped, CompositingLayerType type, WebCore::IntRect absoluteBoundingBox, PassRefPtr<API::Array> negativeZOrderList, PassRefPtr<API::Array> normalFlowList, PassRefPtr<API::Array> positiveZOrderList)
65{
66    return adoptRef(new WebRenderLayer(renderer, isReflection, isClipping, isClipped, type, absoluteBoundingBox, negativeZOrderList, normalFlowList, positiveZOrderList));
67}
68
69PassRefPtr<API::Array> WebRenderLayer::createArrayFromLayerList(Vector<RenderLayer*>* list)
70{
71    if (!list || !list->size())
72        return nullptr;
73
74    Vector<RefPtr<API::Object>> layers;
75    layers.reserveInitialCapacity(list->size());
76
77    for (const auto& layer : *list)
78        layers.uncheckedAppend(adoptRef(new WebRenderLayer(layer)));
79
80    return API::Array::create(WTF::move(layers));
81}
82
83WebRenderLayer::WebRenderLayer(RenderLayer* layer)
84{
85    m_renderer = WebRenderObject::create(&layer->renderer());
86    m_isReflection = layer->isReflection();
87
88    if (layer->isComposited()) {
89        RenderLayerBacking* backing = layer->backing();
90        m_isClipping = backing->hasClippingLayer();
91        m_isClipped = backing->hasAncestorClippingLayer();
92        switch (backing->compositingLayerType()) {
93        case NormalCompositingLayer:
94            m_compositingLayerType = Normal;
95            break;
96        case TiledCompositingLayer:
97            m_compositingLayerType = Tiled;
98            break;
99        case MediaCompositingLayer:
100            m_compositingLayerType = Media;
101            break;
102        case ContainerCompositingLayer:
103            m_compositingLayerType = Container;
104            break;
105        }
106    } else {
107        m_isClipping = false;
108        m_isClipped = false;
109        m_compositingLayerType = None;
110    }
111
112    m_absoluteBoundingBox = layer->absoluteBoundingBox();
113
114    m_negativeZOrderList = createArrayFromLayerList(layer->negZOrderList());
115    m_normalFlowList = createArrayFromLayerList(layer->normalFlowList());
116    m_positiveZOrderList = createArrayFromLayerList(layer->posZOrderList());
117}
118
119WebRenderLayer::WebRenderLayer(PassRefPtr<WebRenderObject> renderer, bool isReflection, bool isClipping, bool isClipped, CompositingLayerType type, WebCore::IntRect absoluteBoundingBox, PassRefPtr<API::Array> negativeZOrderList, PassRefPtr<API::Array> normalFlowList, PassRefPtr<API::Array> positiveZOrderList)
120    : m_renderer(renderer)
121    , m_isReflection(isReflection)
122    , m_isClipping(isClipping)
123    , m_isClipped(isClipped)
124    , m_compositingLayerType(type)
125    , m_absoluteBoundingBox(absoluteBoundingBox)
126    , m_negativeZOrderList(negativeZOrderList)
127    , m_normalFlowList(normalFlowList)
128    , m_positiveZOrderList(positiveZOrderList)
129{
130}
131
132} // namespace WebKit
133