OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |
5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) |
6 * Copyright (C) 2005-2010, 2015 Apple Inc. All rights reserved. | 6 * Copyright (C) 2005-2010, 2015 Apple Inc. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 949 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 return layer()->scrollPosition(); | 960 return layer()->scrollPosition(); |
961 } | 961 } |
962 | 962 |
963 LayoutSize RenderBox::cachedSizeForOverflowClip() const | 963 LayoutSize RenderBox::cachedSizeForOverflowClip() const |
964 { | 964 { |
965 ASSERT(hasOverflowClip()); | 965 ASSERT(hasOverflowClip()); |
966 ASSERT(hasLayer()); | 966 ASSERT(hasLayer()); |
967 return layer()->size(); | 967 return layer()->size(); |
968 } | 968 } |
969 | 969 |
970 void RenderBox::applyCachedClipAndScrollPositionForRepaint(LayoutRect& paintRect
) const | 970 bool RenderBox::applyCachedClipAndScrollPosition(LayoutRect& rect, const RenderL
ayerModelObject* container, bool applyCompositedClips, bool applyCompositedConta
inerScrolls, bool useEdgeInclusiveIntersection) const |
971 { | 971 { |
972 flipForWritingMode(paintRect); | 972 flipForWritingMode(rect); |
973 paintRect.moveBy(-scrollPosition()); // For overflow:auto/scroll/hidden. | 973 |
| 974 if (applyCompositedContainerScrolls || this != container || !usesCompositedS
crolling()) |
| 975 rect.moveBy(-scrollPosition()); // For overflow:auto/scroll/hidden. |
974 | 976 |
975 // Do not clip scroll layer contents to reduce the number of repaints while
scrolling. | 977 // Do not clip scroll layer contents to reduce the number of repaints while
scrolling. |
976 if (usesCompositedScrolling()) { | 978 if (!applyCompositedClips && usesCompositedScrolling()) { |
977 flipForWritingMode(paintRect); | 979 flipForWritingMode(rect); |
978 return; | 980 return true; |
979 } | 981 } |
980 | 982 |
981 // height() is inaccurate if we're in the middle of a layout of this RenderB
ox, so use the | 983 // height() is inaccurate if we're in the middle of a layout of this RenderB
ox, so use the |
982 // layer's size instead. Even if the layer's size is wrong, the layer itself
will repaint | 984 // layer's size instead. Even if the layer's size is wrong, the layer itself
will repaint |
983 // anyway if its size does change. | 985 // anyway if its size does change. |
984 LayoutRect clipRect(LayoutPoint(), cachedSizeForOverflowClip()); | 986 LayoutRect clipRect(LayoutPoint(), cachedSizeForOverflowClip()); |
985 paintRect = intersection(paintRect, clipRect); | 987 bool intersects; |
986 flipForWritingMode(paintRect); | 988 if (useEdgeInclusiveIntersection) |
| 989 intersects = rect.edgeInclusiveIntersect(clipRect); |
| 990 else { |
| 991 rect.intersect(clipRect); |
| 992 intersects = !rect.isEmpty(); |
| 993 } |
| 994 flipForWritingMode(rect); |
| 995 return intersects; |
987 } | 996 } |
988 | 997 |
989 void RenderBox::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layou
tUnit& maxLogicalWidth) const | 998 void RenderBox::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layou
tUnit& maxLogicalWidth) const |
990 { | 999 { |
991 minLogicalWidth = minPreferredLogicalWidth() - borderAndPaddingLogicalWidth(
); | 1000 minLogicalWidth = minPreferredLogicalWidth() - borderAndPaddingLogicalWidth(
); |
992 maxLogicalWidth = maxPreferredLogicalWidth() - borderAndPaddingLogicalWidth(
); | 1001 maxLogicalWidth = maxPreferredLogicalWidth() - borderAndPaddingLogicalWidth(
); |
993 } | 1002 } |
994 | 1003 |
995 LayoutUnit RenderBox::minPreferredLogicalWidth() const | 1004 LayoutUnit RenderBox::minPreferredLogicalWidth() const |
996 { | 1005 { |
(...skipping 1119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2116 { | 2125 { |
2117 if (style().visibility() != Visibility::Visible && !enclosingLayer()->hasVis
ibleContent()) | 2126 if (style().visibility() != Visibility::Visible && !enclosingLayer()->hasVis
ibleContent()) |
2118 return LayoutRect(); | 2127 return LayoutRect(); |
2119 LayoutRect r = visualOverflowRect(); | 2128 LayoutRect r = visualOverflowRect(); |
2120 // FIXME: layoutDelta needs to be applied in parts before/after transforms a
nd | 2129 // FIXME: layoutDelta needs to be applied in parts before/after transforms a
nd |
2121 // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308 | 2130 // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308 |
2122 r.move(view().frameView().layoutContext().layoutDelta()); | 2131 r.move(view().frameView().layoutContext().layoutDelta()); |
2123 return computeRectForRepaint(r, repaintContainer); | 2132 return computeRectForRepaint(r, repaintContainer); |
2124 } | 2133 } |
2125 | 2134 |
2126 bool RenderBox::shouldApplyClipAndScrollPositionForRepaint(const RenderLayerMode
lObject* repaintContainer) const | 2135 LayoutRect RenderBox::computeAbsoluteVisibleRectUsingPaintOffsetCache(const Layo
utRect& rect) const |
2127 { | 2136 { |
2128 #if PLATFORM(IOS) | 2137 LayoutRect adjustedRect = rect; |
2129 if (!repaintContainer || repaintContainer != this) | 2138 auto* layoutState = view().frameView().layoutContext().layoutState(); |
2130 return true; | |
2131 | 2139 |
2132 return !hasLayer() || !layer()->usesCompositedScrolling(); | 2140 if (layer() && layer()->transform()) |
2133 #else | 2141 adjustedRect = LayoutRect(encloseRectToDevicePixels(layer()->transform()
->mapRect(adjustedRect), document().deviceScaleFactor())); |
2134 UNUSED_PARAM(repaintContainer); | 2142 |
2135 return true; | 2143 // We can't trust the bits on RenderObject, because this might be called whi
le re-resolving style. |
2136 #endif | 2144 if (style().hasInFlowPosition() && layer()) |
| 2145 adjustedRect.move(layer()->offsetForInFlowPosition()); |
| 2146 |
| 2147 adjustedRect.moveBy(location()); |
| 2148 adjustedRect.move(layoutState->paintOffset()); |
| 2149 if (layoutState->isClipped()) |
| 2150 adjustedRect.intersect(layoutState->clipRect()); |
| 2151 return adjustedRect; |
2137 } | 2152 } |
2138 | 2153 |
2139 LayoutRect RenderBox::computeRectForRepaint(const LayoutRect& rect, const Render
LayerModelObject* repaintContainer, RepaintContext context) const | 2154 std::optional<LayoutRect> RenderBox::computeVisibleRectInContainer(const LayoutR
ect& rect, const RenderLayerModelObject* container, VisibleRectContext context)
const |
2140 { | 2155 { |
2141 // The rect we compute at each step is shifted by our x/y offset in the pare
nt container's coordinate space. | 2156 // The rect we compute at each step is shifted by our x/y offset in the pare
nt container's coordinate space. |
2142 // Only when we cross a writing mode boundary will we have to possibly flipF
orWritingMode (to convert into a more appropriate | 2157 // Only when we cross a writing mode boundary will we have to possibly flipF
orWritingMode (to convert into a more appropriate |
2143 // offset corner for the enclosing container). This allows for a fully RL o
r BT document to repaint | 2158 // offset corner for the enclosing container). This allows for a fully RL o
r BT document to repaint |
2144 // properly even during layout, since the rect remains flipped all the way u
ntil the end. | 2159 // properly even during layout, since the rect remains flipped all the way u
ntil the end. |
2145 // | 2160 // |
2146 // RenderView::computeRectForRepaint then converts the rect to physical coor
dinates. We also convert to | 2161 // RenderView::computeVisibleRectInContainer then converts the rect to physi
cal coordinates. We also convert to |
2147 // physical when we hit a repaintContainer boundary. Therefore the final re
ct returned is always in the | 2162 // physical when we hit a repaint container boundary. Therefore the final re
ct returned is always in the |
2148 // physical coordinate space of the repaintContainer. | 2163 // physical coordinate space of the container. |
2149 LayoutRect adjustedRect = rect; | |
2150 const RenderStyle& styleToUse = style(); | 2164 const RenderStyle& styleToUse = style(); |
2151 // Paint offset cache is only valid for root-relative, non-fixed position re
painting | 2165 // Paint offset cache is only valid for root-relative, non-fixed position re
painting |
2152 if (view().frameView().layoutContext().isPaintOffsetCacheEnabled() && !repai
ntContainer && styleToUse.position() != PositionType::Fixed) { | 2166 if (view().frameView().layoutContext().isPaintOffsetCacheEnabled() && !conta
iner && styleToUse.position() != PositionType::Fixed && !context.m_useEdgeInclus
iveIntersection) |
2153 auto* layoutState = view().frameView().layoutContext().layoutState(); | 2167 return computeAbsoluteVisibleRectUsingPaintOffsetCache(rect); |
2154 | 2168 |
2155 if (layer() && layer()->transform()) | 2169 LayoutRect adjustedRect = rect; |
2156 adjustedRect = LayoutRect(encloseRectToDevicePixels(layer()->transfo
rm()->mapRect(adjustedRect), document().deviceScaleFactor())); | |
2157 | |
2158 // We can't trust the bits on RenderObject, because this might be called
while re-resolving style. | |
2159 if (styleToUse.hasInFlowPosition() && layer()) | |
2160 adjustedRect.move(layer()->offsetForInFlowPosition()); | |
2161 | |
2162 adjustedRect.moveBy(location()); | |
2163 adjustedRect.move(layoutState->paintOffset()); | |
2164 if (layoutState->isClipped()) | |
2165 adjustedRect.intersect(layoutState->clipRect()); | |
2166 return adjustedRect; | |
2167 } | |
2168 | |
2169 if (hasReflection()) | 2170 if (hasReflection()) |
2170 adjustedRect.unite(reflectedRect(adjustedRect)); | 2171 adjustedRect.unite(reflectedRect(adjustedRect)); |
2171 | 2172 |
2172 if (repaintContainer == this) { | 2173 if (container == this) { |
2173 if (repaintContainer->style().isFlippedBlocksWritingMode()) | 2174 if (container->style().isFlippedBlocksWritingMode()) |
2174 flipForWritingMode(adjustedRect); | 2175 flipForWritingMode(adjustedRect); |
2175 return adjustedRect; | 2176 return adjustedRect; |
2176 } | 2177 } |
2177 | 2178 |
2178 bool repaintContainerIsSkipped; | 2179 bool containerIsSkipped; |
2179 auto* container = this->container(repaintContainer, repaintContainerIsSkippe
d); | 2180 auto* localContainer = this->container(container, containerIsSkipped); |
2180 if (!container) | 2181 if (!localContainer) |
2181 return adjustedRect; | 2182 return adjustedRect; |
2182 ···· | 2183 ···· |
2183 // This code isn't necessary for in-flow RenderFragmentedFlows. | 2184 // This code isn't necessary for in-flow RenderFragmentedFlows. |
2184 // Don't add the location of the fragment in the flow thread for absolute po
sitioned | 2185 // Don't add the location of the fragment in the flow thread for absolute po
sitioned |
2185 // elements because their absolute position already pushes them down through | 2186 // elements because their absolute position already pushes them down through |
2186 // the fragments so adding this here and then adding the topLeft again would
cause | 2187 // the fragments so adding this here and then adding the topLeft again would
cause |
2187 // us to add the height twice. | 2188 // us to add the height twice. |
2188 // The same logic applies for elements flowed directly into the flow thread.
Their topLeft member | 2189 // The same logic applies for elements flowed directly into the flow thread.
Their topLeft member |
2189 // will already contain the portion rect of the fragment. | 2190 // will already contain the portion rect of the fragment. |
2190 auto position = styleToUse.position(); | 2191 auto position = styleToUse.position(); |
2191 if (container->isOutOfFlowRenderFragmentedFlow() && position != PositionType
::Absolute && containingBlock() != enclosingFragmentedFlow()) { | 2192 if (localContainer->isOutOfFlowRenderFragmentedFlow() && position != Positio
nType::Absolute && containingBlock() != enclosingFragmentedFlow()) { |
2192 RenderFragmentContainer* firstFragment = nullptr; | 2193 RenderFragmentContainer* firstFragment = nullptr; |
2193 RenderFragmentContainer* lastFragment = nullptr; | 2194 RenderFragmentContainer* lastFragment = nullptr; |
2194 if (downcast<RenderFragmentedFlow>(*container).getFragmentRangeForBox(th
is, firstFragment, lastFragment)) | 2195 if (downcast<RenderFragmentedFlow>(*localContainer).getFragmentRangeForB
ox(this, firstFragment, lastFragment)) |
2195 adjustedRect.moveBy(firstFragment->fragmentedFlowPortionRect().locat
ion()); | 2196 adjustedRect.moveBy(firstFragment->fragmentedFlowPortionRect().locat
ion()); |
2196 } | 2197 } |
2197 | 2198 |
2198 if (isWritingModeRoot()) { | 2199 if (isWritingModeRoot()) { |
2199 if (!isOutOfFlowPositioned() || !context.m_dirtyRectIsFlipped) { | 2200 if (!isOutOfFlowPositioned() || !context.m_dirtyRectIsFlipped) { |
2200 flipForWritingMode(adjustedRect); | 2201 flipForWritingMode(adjustedRect); |
2201 context.m_dirtyRectIsFlipped = true; | 2202 context.m_dirtyRectIsFlipped = true; |
2202 } | 2203 } |
2203 } | 2204 } |
2204 | 2205 |
2205 LayoutSize locationOffset = this->locationOffset(); | 2206 LayoutSize locationOffset = this->locationOffset(); |
2206 // FIXME: This is needed as long as RenderWidget snaps to integral size/posi
tion. | 2207 // FIXME: This is needed as long as RenderWidget snaps to integral size/posi
tion. |
2207 if (isRenderReplaced() && isWidget()) { | 2208 if (isRenderReplaced() && isWidget()) { |
2208 LayoutSize flooredLocationOffset = toIntSize(flooredIntPoint(locationOff
set)); | 2209 LayoutSize flooredLocationOffset = toIntSize(flooredIntPoint(locationOff
set)); |
2209 adjustedRect.expand(locationOffset - flooredLocationOffset); | 2210 adjustedRect.expand(locationOffset - flooredLocationOffset); |
2210 locationOffset = flooredLocationOffset; | 2211 locationOffset = flooredLocationOffset; |
2211 } | 2212 } |
2212 | 2213 |
2213 if (is<RenderMultiColumnFlow>(this)) { | 2214 if (is<RenderMultiColumnFlow>(this)) { |
2214 // We won't normally run this code. Only when the repaintContainer is nu
ll (i.e., we're trying | 2215 // We won't normally run this code. Only when the container is null (i.e
., we're trying |
2215 // to get the rect in view coordinates) will we come in here, since norm
ally repaintContainer | 2216 // to get the rect in view coordinates) will we come in here, since norm
ally container |
2216 // will be set and we'll stop at the flow thread. This case is mainly hi
t by the check for whether | 2217 // will be set and we'll stop at the flow thread. This case is mainly hi
t by the check for whether |
2217 // or not images should animate. | 2218 // or not images should animate. |
2218 // FIXME: Just as with offsetFromContainer, we aren't really handling ob
jects that span | 2219 // FIXME: Just as with offsetFromContainer, we aren't really handling ob
jects that span |
2219 // multiple columns properly. | 2220 // multiple columns properly. |
2220 LayoutPoint physicalPoint(flipForWritingMode(adjustedRect.location())); | 2221 LayoutPoint physicalPoint(flipForWritingMode(adjustedRect.location())); |
2221 if (auto* fragment = downcast<RenderMultiColumnFlow>(*this).physicalTran
slationFromFlowToFragment((physicalPoint))) { | 2222 if (auto* fragment = downcast<RenderMultiColumnFlow>(*this).physicalTran
slationFromFlowToFragment((physicalPoint))) { |
2222 adjustedRect.setLocation(fragment->flipForWritingMode(physicalPoint)
); | 2223 adjustedRect.setLocation(fragment->flipForWritingMode(physicalPoint)
); |
2223 return fragment->computeRectForRepaint(adjustedRect, repaintContaine
r, context); | 2224 return fragment->computeVisibleRectInContainer(adjustedRect, contain
er, context); |
2224 } | 2225 } |
2225 } | 2226 } |
2226 | 2227 |
2227 LayoutPoint topLeft = adjustedRect.location(); | 2228 LayoutPoint topLeft = adjustedRect.location(); |
2228 topLeft.move(locationOffset); | 2229 topLeft.move(locationOffset); |
2229 | 2230 |
2230 // We are now in our parent container's coordinate space. Apply our transfor
m to obtain a bounding box | 2231 // We are now in our parent container's coordinate space. Apply our transfor
m to obtain a bounding box |
2231 // in the parent's coordinate space that encloses us. | 2232 // in the parent's coordinate space that encloses us. |
2232 if (hasLayer() && layer()->transform()) { | 2233 if (hasLayer() && layer()->transform()) { |
2233 context.m_hasPositionFixedDescendant = position == PositionType::Fixed; | 2234 context.m_hasPositionFixedDescendant = position == PositionType::Fixed; |
2234 adjustedRect = LayoutRect(encloseRectToDevicePixels(layer()->transform()
->mapRect(adjustedRect), document().deviceScaleFactor())); | 2235 adjustedRect = LayoutRect(encloseRectToDevicePixels(layer()->transform()
->mapRect(adjustedRect), document().deviceScaleFactor())); |
2235 topLeft = adjustedRect.location(); | 2236 topLeft = adjustedRect.location(); |
2236 topLeft.move(locationOffset); | 2237 topLeft.move(locationOffset); |
2237 } else if (position == PositionType::Fixed) | 2238 } else if (position == PositionType::Fixed) |
2238 context.m_hasPositionFixedDescendant = true; | 2239 context.m_hasPositionFixedDescendant = true; |
2239 | 2240 |
2240 if (position == PositionType::Absolute && container->isInFlowPositioned() &&
is<RenderInline>(*container)) | 2241 if (position == PositionType::Absolute && localContainer->isInFlowPositioned
() && is<RenderInline>(*localContainer)) |
2241 topLeft += downcast<RenderInline>(*container).offsetForInFlowPositionedI
nline(this); | 2242 topLeft += downcast<RenderInline>(*localContainer).offsetForInFlowPositi
onedInline(this); |
2242 else if (styleToUse.hasInFlowPosition() && layer()) { | 2243 else if (styleToUse.hasInFlowPosition() && layer()) { |
2243 // Apply the relative position offset when invalidating a rectangle. Th
e layer | 2244 // Apply the relative position offset when invalidating a rectangle. Th
e layer |
2244 // is translated, but the render box isn't, so we need to do this to get
the | 2245 // is translated, but the render box isn't, so we need to do this to get
the |
2245 // right dirty rect. Since this is called from RenderObject::setStyle,
the relative position | 2246 // right dirty rect. Since this is called from RenderObject::setStyle,
the relative position |
2246 // flag on the RenderObject has been cleared, so use the one on the styl
e(). | 2247 // flag on the RenderObject has been cleared, so use the one on the styl
e(). |
2247 topLeft += layer()->offsetForInFlowPosition(); | 2248 topLeft += layer()->offsetForInFlowPosition(); |
2248 } | 2249 } |
2249 | 2250 |
2250 // FIXME: We ignore the lightweight clipping rect that controls use, since i
f |o| is in mid-layout, | 2251 // FIXME: We ignore the lightweight clipping rect that controls use, since i
f |o| is in mid-layout, |
2251 // its controlClipRect will be wrong. For overflow clip we use the values ca
ched by the layer. | 2252 // its controlClipRect will be wrong. For overflow clip we use the values ca
ched by the layer. |
2252 adjustedRect.setLocation(topLeft); | 2253 adjustedRect.setLocation(topLeft); |
2253 if (container->hasOverflowClip()) { | 2254 if (localContainer->hasOverflowClip()) { |
2254 RenderBox& containerBox = downcast<RenderBox>(*container); | 2255 RenderBox& containerBox = downcast<RenderBox>(*localContainer); |
2255 if (containerBox.shouldApplyClipAndScrollPositionForRepaint(repaintConta
iner)) { | 2256 bool isEmpty = !containerBox.applyCachedClipAndScrollPosition(adjustedRe
ct, container, context.m_applyCompositedClips, context.m_applyCompositedContaine
rScrolls, context.m_useEdgeInclusiveIntersection); |
2256 containerBox.applyCachedClipAndScrollPositionForRepaint(adjustedRect
); | 2257 if (isEmpty) { |
2257 if (adjustedRect.isEmpty()) | 2258 if (context.m_useEdgeInclusiveIntersection) |
2258 return adjustedRect; | 2259 return std::nullopt; |
| 2260 return adjustedRect; |
2259 } | 2261 } |
2260 } | 2262 } |
2261 | 2263 |
2262 if (repaintContainerIsSkipped) { | 2264 if (containerIsSkipped) { |
2263 // If the repaintContainer is below container, then we need to map the r
ect into repaintContainer's coordinates. | 2265 // If the container is below localContainer, then we need to map the rec
t into container's coordinates. |
2264 LayoutSize containerOffset = repaintContainer->offsetFromAncestorContain
er(*container); | 2266 LayoutSize containerOffset = container->offsetFromAncestorContainer(*loc
alContainer); |
2265 adjustedRect.move(-containerOffset); | 2267 adjustedRect.move(-containerOffset); |
2266 return adjustedRect; | 2268 return adjustedRect; |
2267 } | 2269 } |
2268 return container->computeRectForRepaint(adjustedRect, repaintContainer, cont
ext); | 2270 return localContainer->computeVisibleRectInContainer(adjustedRect, container
, context); |
2269 } | 2271 } |
2270 | 2272 |
2271 void RenderBox::repaintDuringLayoutIfMoved(const LayoutRect& oldRect) | 2273 void RenderBox::repaintDuringLayoutIfMoved(const LayoutRect& oldRect) |
2272 { | 2274 { |
2273 if (oldRect.location() != m_frameRect.location()) { | 2275 if (oldRect.location() != m_frameRect.location()) { |
2274 LayoutRect newRect = m_frameRect; | 2276 LayoutRect newRect = m_frameRect; |
2275 // The child moved. Invalidate the object's old and new positions. We
have to do this | 2277 // The child moved. Invalidate the object's old and new positions. We
have to do this |
2276 // since the object may not have gotten a layout. | 2278 // since the object may not have gotten a layout. |
2277 m_frameRect = oldRect; | 2279 m_frameRect = oldRect; |
2278 repaint(); | 2280 repaint(); |
(...skipping 2649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4928 return &candidate; | 4930 return &candidate; |
4929 } | 4931 } |
4930 // If all parent elements are not overflow scrollable, check the body. | 4932 // If all parent elements are not overflow scrollable, check the body. |
4931 if (document().body() && frame().mainFrame().view() && frame().mainFrame().v
iew()->isScrollable()) | 4933 if (document().body() && frame().mainFrame().view() && frame().mainFrame().v
iew()->isScrollable()) |
4932 return document().body()->renderBox(); | 4934 return document().body()->renderBox(); |
4933 ···· | 4935 ···· |
4934 return nullptr; | 4936 return nullptr; |
4935 } | 4937 } |
4936 | 4938 |
4937 } // namespace WebCore | 4939 } // namespace WebCore |
OLD | NEW |