1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/*
* Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#include "config.h"
#include "ShadowElement.h"
#include "HTMLNames.h"
#include "RenderTheme.h"
#include "RenderView.h"
namespace WebCore {
using namespace HTMLNames;
PassRefPtr<ShadowBlockElement> ShadowBlockElement::create(Node* shadowParent)
{
return adoptRef(new ShadowBlockElement(shadowParent));
}
ShadowBlockElement::ShadowBlockElement(Node* shadowParent)
: ShadowElement<HTMLDivElement>(divTag, shadowParent)
{
}
void ShadowBlockElement::layoutAsPart(const IntRect& partRect)
{
RenderBox* parentRenderer = toRenderBox(renderer()->parent());
RenderBox* selfRenderer = toRenderBox(renderer());
IntRect oldRect = selfRenderer->frameRect();
LayoutStateMaintainer statePusher(parentRenderer->view(), parentRenderer, parentRenderer->size());
if (oldRect.size() != partRect.size())
selfRenderer->setChildNeedsLayout(true, false);
selfRenderer->layoutIfNeeded();
selfRenderer->setFrameRect(partRect);
if (selfRenderer->checkForRepaintDuringLayout())
selfRenderer->repaintDuringLayoutIfMoved(oldRect);
statePusher.pop();
parentRenderer->addOverflowFromChild(selfRenderer);
}
void ShadowBlockElement::updateStyleForPart(PseudoId pseudoId)
{
if (renderer()->style()->styleType() != pseudoId)
renderer()->setStyle(createStyleForPart(renderer()->parent(), pseudoId));
}
PassRefPtr<ShadowBlockElement> ShadowBlockElement::createForPart(Node* shadowParent, PseudoId pseudoId)
{
RenderObject* parentRenderer = shadowParent->renderer();
RefPtr<RenderStyle> styleForPart = createStyleForPart(parentRenderer, pseudoId);
RefPtr<ShadowBlockElement> part = create(shadowParent);
part->setRenderer(part->createRenderer(parentRenderer->renderArena(), styleForPart.get()));
part->renderer()->setStyle(styleForPart.release());
part->setAttached();
part->setInDocument();
return part.release();
}
PassRefPtr<RenderStyle> ShadowBlockElement::createStyleForPart(RenderObject* parentRenderer, PseudoId pseudoId)
{
RefPtr<RenderStyle> styleForPart;
RenderStyle* pseudoStyle = parentRenderer->getCachedPseudoStyle(pseudoId);
if (pseudoStyle)
styleForPart = RenderStyle::clone(pseudoStyle);
else
styleForPart = RenderStyle::create();
styleForPart->inheritFrom(parentRenderer->style());
styleForPart->setDisplay(BLOCK);
styleForPart->setAppearance(NoControlPart);
return styleForPart.release();
}
bool ShadowBlockElement::partShouldHaveStyle(const RenderObject* parentRenderer, PseudoId pseudoId)
{
// We have some -webkit-appearance values for default styles of parts and
// that appearance get turned off during RenderStyle creation
// if they have background styles specified.
// So !hasAppearance() implies that there are something to be styled.
RenderStyle* pseudoStyle = parentRenderer->getCachedPseudoStyle(pseudoId);
return !(pseudoStyle && pseudoStyle->hasAppearance());
}
PassRefPtr<ShadowInputElement> ShadowInputElement::create(Node* shadowParent)
{
return adoptRef(new ShadowInputElement(shadowParent));
}
ShadowInputElement::ShadowInputElement(Node* shadowParent)
: ShadowElement<HTMLInputElement>(inputTag, shadowParent)
{
}
} // namespace WebCore
|