Changeset 135242 in webkit
- Timestamp:
- Nov 19, 2012 8:45:02 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 10 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r135241 r135242 1 2012-11-19 Matt Falkenhagen <falken@chromium.org> 2 3 Implement the new stacking layer needed by the Fullscreen API and the new <dialog> element 4 https://bugs.webkit.org/show_bug.cgi?id=84796 5 6 Reviewed by Julien Chaffraix. 7 8 Add tests for top layer stacking and rendering. 9 10 * fast/dom/HTMLDialogElement/top-layer-containing-block-expected.html: Added. 11 * fast/dom/HTMLDialogElement/top-layer-containing-block.html: Added. 12 * fast/dom/HTMLDialogElement/top-layer-display-none-expected.html: Added. 13 * fast/dom/HTMLDialogElement/top-layer-display-none.html: Added. 14 * fast/dom/HTMLDialogElement/top-layer-nesting-expected.html: Added. 15 * fast/dom/HTMLDialogElement/top-layer-nesting.html: Added. 16 * fast/dom/HTMLDialogElement/top-layer-stacking-dynamic-expected.html: Added. 17 * fast/dom/HTMLDialogElement/top-layer-stacking-dynamic.html: Added. 18 * fast/dom/HTMLDialogElement/top-layer-stacking-expected.html: Added. 19 * fast/dom/HTMLDialogElement/top-layer-stacking.html: Added. 20 1 21 2012-11-19 Yury Semikhatsky <yurys@chromium.org> 2 22 -
trunk/Source/WebCore/ChangeLog
r135240 r135242 1 2012-11-19 Matt Falkenhagen <falken@chromium.org> 2 3 Implement the new stacking layer needed by the Fullscreen API and the new <dialog> element 4 https://bugs.webkit.org/show_bug.cgi?id=84796 5 6 Reviewed by Julien Chaffraix. 7 8 This adds the top layer element stack to Document. The Fullscreen 9 specification mandates that we track the ordering of the DOM nodes in 10 the top layer, not the renderers. That makes it hard to implement on 11 the rendering side only. 12 13 Elements in the top layer get a layer. Layers in the top layer are 14 added to the root layer's child list after normal layers and in the 15 order of the top layer stack. This way, the top layer appears above 16 all other stacking contexts and in the desired order. 17 18 In addition, top layer renderers are added as children of RenderView 19 in top layer order. This is to satisfy requirements such as the 20 containing block of an element in the top layer is the initial 21 containing block. It also allows RenderLayer to know the proper 22 stacking order of the layers without going directly from the top layer 23 elements to their layers. 24 25 So far, only modal dialog elements can be added to the top layer. 26 The plan is to make the Fullscreen API also use the top layer. 27 28 Tests: fast/dom/HTMLDialogElement/top-layer-containing-block.html 29 fast/dom/HTMLDialogElement/top-layer-display-none.html 30 fast/dom/HTMLDialogElement/top-layer-nesting.html 31 fast/dom/HTMLDialogElement/top-layer-stacking-dynamic.html 32 fast/dom/HTMLDialogElement/top-layer-stacking.html 33 34 * WebCore.exp.in: 35 * css/StyleResolver.cpp: 36 (WebCore::StyleResolver::adjustRenderStyle): Elements in the top layer have a stacking context. 37 * dom/Document.cpp: 38 (WebCore): 39 (WebCore::Document::addToTopLayer): 40 (WebCore::Document::removeFromTopLayer): 41 * dom/Document.h: 42 (Document): 43 (WebCore::Document::topLayerElements): Add the top layer element stack to Document. 44 * dom/Element.cpp: 45 (WebCore::Element::removedFrom): 46 (WebCore): 47 (WebCore::Element::isInTopLayer): 48 (WebCore::Element::setIsInTopLayer): 49 * dom/Element.h: 50 * dom/ElementRareData.h: 51 (ElementRareData): 52 * dom/Node.cpp: 53 (WebCore::Node::detach): Add an exception to the assert since top layer elements and their descendants are moved from their 54 regular position in the render tree. 55 * dom/NodeRareData.h: 56 (WebCore::NodeRareData::NodeRareData): 57 (NodeRareData): 58 (WebCore::NodeRareData::isInTopLayer): 59 (WebCore::NodeRareData::setIsInTopLayer): 60 * dom/NodeRenderingContext.cpp: 61 (WebCore): 62 (WebCore::adjustInsertionPointForTopLayerElement): 63 (WebCore::NodeRendererFactory::createRendererIfNeeded): Add renderers for top layer elements as children of RenderView, and 64 in top layer stacking order. 65 * html/HTMLDialogElement.cpp: 66 (WebCore::HTMLDialogElement::close): 67 (WebCore::HTMLDialogElement::showModal): 68 * rendering/RenderLayer.cpp: 69 (WebCore): 70 (WebCore::RenderLayer::isInTopLayer): 71 (WebCore::RenderLayer::isInTopLayerSubtree): 72 (WebCore::RenderLayer::rebuildZOrderLists): Add the top layer stack after normal layer collection. 73 (WebCore::RenderLayer::collectLayers): Avoid adding layers for top layer elements during normal layer collection. 74 * rendering/RenderLayer.h: 75 (RenderLayer): 76 1 77 2012-11-19 Kentaro Hara <haraken@chromium.org> 2 78 -
trunk/Source/WebCore/WebCore.exp.in
r135189 r135242 2216 2216 #endif 2217 2217 2218 #if ENABLE(DIALOG_ELEMENT) 2219 __ZNK7WebCore11RenderLayer12isInTopLayerEv 2220 #endif 2221 2218 2222 #if ENABLE(DRAG_SUPPORT) 2219 2223 __ZN7WebCore12EventHandler17dragSourceEndedAtERKNS_18PlatformMouseEventENS_13DragOperationE -
trunk/Source/WebCore/css/StyleResolver.cpp
r135164 r135242 1984 1984 || ((style->overflowX() != OHIDDEN || style->overflowY() != OHIDDEN) && style->useTouchOverflowScrolling()) 1985 1985 #endif 1986 #if ENABLE(DIALOG_ELEMENT) 1987 || (e && e->isInTopLayer()) 1988 #endif 1986 1989 )) 1987 1990 style->setZIndex(0); -
trunk/Source/WebCore/dom/Document.cpp
r135189 r135242 5489 5489 #endif 5490 5490 5491 #if ENABLE(DIALOG_ELEMENT) 5492 void Document::addToTopLayer(Element* element) 5493 { 5494 ASSERT(!m_topLayerElements.contains(element)); 5495 m_topLayerElements.append(element); 5496 } 5497 5498 void Document::removeFromTopLayer(Element* element) 5499 { 5500 size_t position = m_topLayerElements.find(element); 5501 ASSERT(position != notFound); 5502 m_topLayerElements.remove(position); 5503 } 5504 #endif 5505 5491 5506 #if ENABLE(POINTER_LOCK) 5492 5507 void Document::webkitExitPointerLock() -
trunk/Source/WebCore/dom/Document.h
r135163 r135242 1169 1169 Locale& getCachedLocale(const AtomicString& locale = nullAtom); 1170 1170 1171 #if ENABLE(DIALOG_ELEMENT) 1172 void addToTopLayer(Element*); 1173 void removeFromTopLayer(Element*); 1174 const Vector<RefPtr<Element> >& topLayerElements() const { return m_topLayerElements; } 1175 #endif 1176 1171 1177 protected: 1172 1178 Document(Frame*, const KURL&, bool isXHTML, bool isHTML); … … 1469 1475 #endif 1470 1476 1477 #if ENABLE(DIALOG_ELEMENT) 1478 Vector<RefPtr<Element> > m_topLayerElements; 1479 #endif 1480 1471 1481 int m_loadEventDelayCount; 1472 1482 Timer<Document> m_loadEventDelayTimer; -
trunk/Source/WebCore/dom/Element.cpp
r135174 r135242 1152 1152 void Element::removedFrom(ContainerNode* insertionPoint) 1153 1153 { 1154 #if ENABLE(DIALOG_ELEMENT) 1155 setIsInTopLayer(false); 1156 #endif 1154 1157 #if ENABLE(FULLSCREEN_API) 1155 1158 if (containsFullScreenElement()) … … 2178 2181 #endif 2179 2182 2183 #if ENABLE(DIALOG_ELEMENT) 2184 bool Element::isInTopLayer() const 2185 { 2186 return hasRareData() && elementRareData()->isInTopLayer(); 2187 } 2188 2189 void Element::setIsInTopLayer(bool inTopLayer) 2190 { 2191 // To avoid an extra call to elementRareData(), don't use Element::isInTopLayer(). 2192 ElementRareData* rareData = hasRareData() ? elementRareData() : 0; 2193 if (rareData) { 2194 if (rareData->isInTopLayer() == inTopLayer) 2195 return; 2196 } else { 2197 if (!inTopLayer) 2198 return; 2199 rareData = ensureElementRareData(); 2200 } 2201 rareData->setIsInTopLayer(inTopLayer); 2202 2203 if (inTopLayer) 2204 document()->addToTopLayer(this); 2205 else 2206 document()->removeFromTopLayer(this); 2207 setNeedsStyleRecalc(SyntheticStyleChange); 2208 } 2209 #endif 2210 2180 2211 #if ENABLE(POINTER_LOCK) 2181 2212 void Element::webkitRequestPointerLock() -
trunk/Source/WebCore/dom/Element.h
r135174 r135242 414 414 #endif 415 415 416 #if ENABLE(DIALOG_ELEMENT) 417 virtual bool isInTopLayer() const; 418 virtual void setIsInTopLayer(bool); 419 #endif 420 416 421 #if ENABLE(POINTER_LOCK) 417 422 void webkitRequestPointerLock(); -
trunk/Source/WebCore/dom/ElementRareData.h
r133848 r135242 53 53 using NodeRareData::containsFullScreenElement; 54 54 using NodeRareData::setContainsFullScreenElement; 55 #endif 56 #if ENABLE(DIALOG_ELEMENT) 57 using NodeRareData::isInTopLayer; 58 using NodeRareData::setIsInTopLayer; 55 59 #endif 56 60 -
trunk/Source/WebCore/dom/Node.cpp
r135030 r135242 113 113 #include <wtf/text/StringBuilder.h> 114 114 115 #ifndef NDEBUG 116 #include "RenderLayer.h" 117 #endif 118 115 119 #if ENABLE(GESTURE_EVENTS) 116 120 #include "GestureEvent.h" … … 1307 1311 for (Node* node = this; node; node = node->traverseNextNode(this)) { 1308 1312 RenderObject* renderer = node->renderer(); 1309 // RenderFlowThread removes some elements from the regular tree1313 // RenderFlowThread and the top layer remove elements from the regular tree 1310 1314 // hierarchy. They will be cleaned up when we call detach on them. 1315 #if ENABLE(DIALOG_ELEMENT) 1316 ASSERT(!renderer || renderer->inRenderFlowThread() || (renderer->enclosingLayer()->isInTopLayerSubtree())); 1317 #else 1311 1318 ASSERT(!renderer || renderer->inRenderFlowThread()); 1319 #endif 1312 1320 } 1313 1321 #endif -
trunk/Source/WebCore/dom/NodeRareData.h
r135030 r135242 194 194 , m_containsFullScreenElement(false) 195 195 #endif 196 #if ENABLE(DIALOG_ELEMENT) 197 , m_isInTopLayer(false) 198 #endif 196 199 { 197 200 } … … 311 314 bool containsFullScreenElement() { return m_containsFullScreenElement; } 312 315 void setContainsFullScreenElement(bool value) { m_containsFullScreenElement = value; } 316 #endif 317 #if ENABLE(DIALOG_ELEMENT) 318 bool isInTopLayer() const { return m_isInTopLayer; } 319 void setIsInTopLayer(bool value) { m_isInTopLayer = value; } 313 320 #endif 314 321 … … 326 333 bool m_containsFullScreenElement : 1; 327 334 #endif 335 #if ENABLE(DIALOG_ELEMENT) 336 bool m_isInTopLayer : 1; 337 #endif 328 338 329 339 #if ENABLE(MUTATION_OBSERVERS) -
trunk/Source/WebCore/dom/NodeRenderingContext.cpp
r135237 r135242 213 213 } 214 214 215 #if ENABLE(DIALOG_ELEMENT) 216 static void adjustInsertionPointForTopLayerElement(Element* element, RenderObject*& parentRenderer, RenderObject*& nextRenderer) 217 { 218 parentRenderer = parentRenderer->view(); 219 nextRenderer = 0; 220 const Vector<RefPtr<Element> >& topLayerElements = element->document()->topLayerElements(); 221 size_t topLayerPosition = topLayerElements.find(element); 222 ASSERT(topLayerPosition != notFound); 223 // Find the next top layer renderer that's stacked above this element. Note that the immediate next element in the top layer 224 // stack might not have a renderer (due to display: none, or possibly it is not attached yet). 225 for (size_t i = topLayerPosition + 1; i < topLayerElements.size(); ++i) { 226 nextRenderer = topLayerElements[i]->renderer(); 227 if (nextRenderer) { 228 ASSERT(nextRenderer->parent() == parentRenderer); 229 break; 230 } 231 } 232 } 233 #endif 234 215 235 void NodeRendererFactory::createRendererIfNeeded() 216 236 { … … 242 262 // the renderer added to its parent already. 243 263 RenderObject* nextRenderer = m_context.hasFlowThreadParent() ? m_context.parentFlowRenderer()->nextRendererForNode(node) : m_context.nextRenderer(); 264 265 #if ENABLE(DIALOG_ELEMENT) 266 if (element && element->isInTopLayer()) 267 adjustInsertionPointForTopLayerElement(element, parentRenderer, nextRenderer); 268 #endif 269 244 270 RenderObject* newRenderer = createRenderer(); 245 271 -
trunk/Source/WebCore/html/HTMLDialogElement.cpp
r129330 r135242 54 54 } 55 55 setBooleanAttribute(openAttr, false); 56 setIsInTopLayer(false); 56 57 } 57 58 … … 70 71 } 71 72 setBooleanAttribute(openAttr, true); 73 setIsInTopLayer(true); 72 74 } 73 75 -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r135080 r135242 3668 3668 } 3669 3669 3670 #if ENABLE(DIALOG_ELEMENT) 3671 bool RenderLayer::isInTopLayer() const 3672 { 3673 Node* node = renderer()->node(); 3674 return node && node->isElementNode() && toElement(node)->isInTopLayer(); 3675 } 3676 3677 bool RenderLayer::isInTopLayerSubtree() const 3678 { 3679 for (const RenderLayer* layer = this; layer; layer = layer->parent()) { 3680 if (layer->isInTopLayer()) 3681 return true; 3682 } 3683 return false; 3684 } 3685 #endif 3686 3670 3687 // Compute the z-offset of the point in the transformState. 3671 3688 // This is effectively projecting a ray normal to the plane of ancestor, finding where that … … 4787 4804 std::stable_sort(m_negZOrderList->begin(), m_negZOrderList->end(), compareZIndex); 4788 4805 4806 #if ENABLE(DIALOG_ELEMENT) 4807 // Append layers for top layer elements after normal layer collection, to ensure they are on top regardless of z-indexes. 4808 // The renderers of top layer elements are children of the view, sorted in top layer stacking order. 4809 if (isRootLayer()) { 4810 RenderObject* view = renderer()->view(); 4811 for (RenderObject* child = view->firstChild(); child; child = child->nextSibling()) { 4812 Element* childElement = child->node()->isElementNode() ? toElement(child->node()) : 0; 4813 if (childElement && childElement->isInTopLayer()) { 4814 RenderLayer* layer = toRenderLayerModelObject(child)->layer(); 4815 m_posZOrderList->append(layer); 4816 } 4817 } 4818 } 4819 #endif 4820 4789 4821 m_zOrderListsDirty = false; 4790 4822 } … … 4811 4843 void RenderLayer::collectLayers(bool includeHiddenLayers, Vector<RenderLayer*>*& posBuffer, Vector<RenderLayer*>*& negBuffer) 4812 4844 { 4845 #if ENABLE(DIALOG_ELEMENT) 4846 if (isInTopLayer()) 4847 return; 4848 #endif 4849 4813 4850 updateDescendantDependentFlags(); 4814 4851 -
trunk/Source/WebCore/rendering/RenderLayer.h
r135064 r135242 703 703 Node* enclosingElement() const; 704 704 705 #if ENABLE(DIALOG_ELEMENT) 706 bool isInTopLayer() const; 707 bool isInTopLayerSubtree() const; 708 #endif 709 705 710 private: 706 711 void updateZOrderLists();
Note: See TracChangeset
for help on using the changeset viewer.