OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 2000 Simon Hausmann <hausmann@kde.org> | 3 * (C) 2000 Simon Hausmann <hausmann@kde.org> |
4 * (C) 2000 Stefan Schimanski (1Stein@gmx.de) | 4 * (C) 2000 Stefan Schimanski (1Stein@gmx.de) |
5 * Copyright (C) 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. |
6 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2011. 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 23 matching lines...) Expand all Loading... |
34 #include "core/layout/api/LayoutAPIShim.h" | 34 #include "core/layout/api/LayoutAPIShim.h" |
35 #include "core/layout/api/LayoutViewItem.h" | 35 #include "core/layout/api/LayoutViewItem.h" |
36 #include "core/paint/PartPainter.h" | 36 #include "core/paint/PartPainter.h" |
37 #include "core/plugins/PluginView.h" | 37 #include "core/plugins/PluginView.h" |
38 | 38 |
39 namespace blink { | 39 namespace blink { |
40 | 40 |
41 LayoutPart::LayoutPart(Element* element) | 41 LayoutPart::LayoutPart(Element* element) |
42 : LayoutReplaced(element), | 42 : LayoutReplaced(element), |
43 // Reference counting is used to prevent the part from being destroyed | 43 // Reference counting is used to prevent the part from being destroyed |
44 // while inside the Widget code, which might not be able to handle that. | 44 // while inside the FrameViewBase code, which might not be able to handle |
| 45 // that. |
45 m_refCount(1) { | 46 m_refCount(1) { |
46 ASSERT(element); | 47 ASSERT(element); |
47 frameView()->addPart(this); | 48 frameView()->addPart(this); |
48 setInline(false); | 49 setInline(false); |
49 } | 50 } |
50 | 51 |
51 void LayoutPart::deref() { | 52 void LayoutPart::deref() { |
52 if (--m_refCount <= 0) | 53 if (--m_refCount <= 0) |
53 delete this; | 54 delete this; |
54 } | 55 } |
(...skipping 25 matching lines...) Expand all Loading... |
80 // object points too is invalid, so we have to clear the node so we make sure | 81 // object points too is invalid, so we have to clear the node so we make sure |
81 // we don't access it in the future. | 82 // we don't access it in the future. |
82 clearNode(); | 83 clearNode(); |
83 deref(); | 84 deref(); |
84 } | 85 } |
85 | 86 |
86 LayoutPart::~LayoutPart() { | 87 LayoutPart::~LayoutPart() { |
87 ASSERT(m_refCount <= 0); | 88 ASSERT(m_refCount <= 0); |
88 } | 89 } |
89 | 90 |
90 Widget* LayoutPart::widget() const { | 91 FrameViewBase* LayoutPart::widget() const { |
91 // Plugin widgets are stored in their DOM node. | 92 // Plugin FrameViewBases are stored in their DOM node. |
92 Element* element = toElement(node()); | 93 Element* element = toElement(node()); |
93 | 94 |
94 if (element && element->isFrameOwnerElement()) | 95 if (element && element->isFrameOwnerElement()) |
95 return toHTMLFrameOwnerElement(element)->ownedWidget(); | 96 return toHTMLFrameOwnerElement(element)->ownedWidget(); |
96 | 97 |
97 return nullptr; | 98 return nullptr; |
98 } | 99 } |
99 | 100 |
100 PaintLayerType LayoutPart::layerTypeRequired() const { | 101 PaintLayerType LayoutPart::layerTypeRequired() const { |
101 PaintLayerType type = LayoutReplaced::layerTypeRequired(); | 102 PaintLayerType type = LayoutReplaced::layerTypeRequired(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 | 138 |
138 bool LayoutPart::nodeAtPointOverWidget( | 139 bool LayoutPart::nodeAtPointOverWidget( |
139 HitTestResult& result, | 140 HitTestResult& result, |
140 const HitTestLocation& locationInContainer, | 141 const HitTestLocation& locationInContainer, |
141 const LayoutPoint& accumulatedOffset, | 142 const LayoutPoint& accumulatedOffset, |
142 HitTestAction action) { | 143 HitTestAction action) { |
143 bool hadResult = result.innerNode(); | 144 bool hadResult = result.innerNode(); |
144 bool inside = LayoutReplaced::nodeAtPoint(result, locationInContainer, | 145 bool inside = LayoutReplaced::nodeAtPoint(result, locationInContainer, |
145 accumulatedOffset, action); | 146 accumulatedOffset, action); |
146 | 147 |
147 // Check to see if we are really over the widget itself (and not just in the | 148 // Check to see if we are really over the FrameViewBase itself (and not just |
148 // border/padding area). | 149 // in the border/padding area). |
149 if ((inside || result.isRectBasedTest()) && !hadResult && | 150 if ((inside || result.isRectBasedTest()) && !hadResult && |
150 result.innerNode() == node()) | 151 result.innerNode() == node()) |
151 result.setIsOverWidget(contentBoxRect().contains(result.localPoint())); | 152 result.setIsOverWidget(contentBoxRect().contains(result.localPoint())); |
152 return inside; | 153 return inside; |
153 } | 154 } |
154 | 155 |
155 bool LayoutPart::nodeAtPoint(HitTestResult& result, | 156 bool LayoutPart::nodeAtPoint(HitTestResult& result, |
156 const HitTestLocation& locationInContainer, | 157 const HitTestLocation& locationInContainer, |
157 const LayoutPoint& accumulatedOffset, | 158 const LayoutPoint& accumulatedOffset, |
158 HitTestAction action) { | 159 HitTestAction action) { |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 | 227 |
227 CompositingReasons LayoutPart::additionalCompositingReasons() const { | 228 CompositingReasons LayoutPart::additionalCompositingReasons() const { |
228 if (requiresAcceleratedCompositing()) | 229 if (requiresAcceleratedCompositing()) |
229 return CompositingReasonIFrame; | 230 return CompositingReasonIFrame; |
230 return CompositingReasonNone; | 231 return CompositingReasonNone; |
231 } | 232 } |
232 | 233 |
233 void LayoutPart::styleDidChange(StyleDifference diff, | 234 void LayoutPart::styleDidChange(StyleDifference diff, |
234 const ComputedStyle* oldStyle) { | 235 const ComputedStyle* oldStyle) { |
235 LayoutReplaced::styleDidChange(diff, oldStyle); | 236 LayoutReplaced::styleDidChange(diff, oldStyle); |
236 Widget* widget = this->widget(); | 237 FrameViewBase* frameViewBase = this->widget(); |
237 | 238 |
238 if (!widget) | 239 if (!frameViewBase) |
239 return; | 240 return; |
240 | 241 |
241 // If the iframe has custom scrollbars, recalculate their style. | 242 // If the iframe has custom scrollbars, recalculate their style. |
242 if (widget && widget->isFrameView()) | 243 if (frameViewBase && frameViewBase->isFrameView()) |
243 toFrameView(widget)->recalculateCustomScrollbarStyle(); | 244 toFrameView(frameViewBase)->recalculateCustomScrollbarStyle(); |
244 | 245 |
245 if (style()->visibility() != EVisibility::kVisible) { | 246 if (style()->visibility() != EVisibility::kVisible) { |
246 widget->hide(); | 247 frameViewBase->hide(); |
247 } else { | 248 } else { |
248 widget->show(); | 249 frameViewBase->show(); |
249 } | 250 } |
250 } | 251 } |
251 | 252 |
252 void LayoutPart::layout() { | 253 void LayoutPart::layout() { |
253 ASSERT(needsLayout()); | 254 ASSERT(needsLayout()); |
254 LayoutAnalyzer::Scope analyzer(*this); | 255 LayoutAnalyzer::Scope analyzer(*this); |
255 clearNeedsLayout(); | 256 clearNeedsLayout(); |
256 } | 257 } |
257 | 258 |
258 void LayoutPart::paint(const PaintInfo& paintInfo, | 259 void LayoutPart::paint(const PaintInfo& paintInfo, |
(...skipping 20 matching lines...) Expand all Loading... |
279 // We don't propagate sub-pixel into sub-frame layout, in other words, the | 280 // We don't propagate sub-pixel into sub-frame layout, in other words, the |
280 // rect is snapped at the document boundary, and sub-pixel movement could | 281 // rect is snapped at the document boundary, and sub-pixel movement could |
281 // cause the sub-frame to layout due to the 1px snap difference. In order to | 282 // cause the sub-frame to layout due to the 1px snap difference. In order to |
282 // avoid that, the size of sub-frame is rounded in advance. | 283 // avoid that, the size of sub-frame is rounded in advance. |
283 LayoutRect sizeRoundedRect = contentBoxRect(); | 284 LayoutRect sizeRoundedRect = contentBoxRect(); |
284 sizeRoundedRect.setSize(LayoutSize(roundedIntSize(sizeRoundedRect.size()))); | 285 sizeRoundedRect.setSize(LayoutSize(roundedIntSize(sizeRoundedRect.size()))); |
285 return sizeRoundedRect; | 286 return sizeRoundedRect; |
286 } | 287 } |
287 | 288 |
288 void LayoutPart::updateOnWidgetChange() { | 289 void LayoutPart::updateOnWidgetChange() { |
289 Widget* widget = this->widget(); | 290 FrameViewBase* frameViewBase = this->widget(); |
290 if (!widget) | 291 if (!frameViewBase) |
291 return; | 292 return; |
292 | 293 |
293 if (!style()) | 294 if (!style()) |
294 return; | 295 return; |
295 | 296 |
296 if (!needsLayout()) | 297 if (!needsLayout()) |
297 updateWidgetGeometryInternal(); | 298 updateWidgetGeometryInternal(); |
298 | 299 |
299 if (style()->visibility() != EVisibility::kVisible) { | 300 if (style()->visibility() != EVisibility::kVisible) { |
300 widget->hide(); | 301 frameViewBase->hide(); |
301 } else { | 302 } else { |
302 widget->show(); | 303 frameViewBase->show(); |
303 // FIXME: Why do we issue a full paint invalidation in this case, but not | 304 // FIXME: Why do we issue a full paint invalidation in this case, but not |
304 // the other? | 305 // the other? |
305 setShouldDoFullPaintInvalidation(); | 306 setShouldDoFullPaintInvalidation(); |
306 } | 307 } |
307 } | 308 } |
308 | 309 |
309 void LayoutPart::updateWidgetGeometry() { | 310 void LayoutPart::updateWidgetGeometry() { |
310 Widget* widget = this->widget(); | 311 FrameViewBase* frameViewBase = this->widget(); |
311 if (!widget || !node()) // Check the node in case destroy() has been called. | 312 if (!frameViewBase || |
| 313 !node()) // Check the node in case destroy() has been called. |
312 return; | 314 return; |
313 | 315 |
314 LayoutRect newFrame = replacedContentRect(); | 316 LayoutRect newFrame = replacedContentRect(); |
315 DCHECK(newFrame.size() == roundedIntSize(newFrame.size())); | 317 DCHECK(newFrame.size() == roundedIntSize(newFrame.size())); |
316 bool boundsWillChange = | 318 bool boundsWillChange = |
317 LayoutSize(widget->frameRect().size()) != newFrame.size(); | 319 LayoutSize(frameViewBase->frameRect().size()) != newFrame.size(); |
318 | 320 |
319 FrameView* frameView = widget->isFrameView() ? toFrameView(widget) : nullptr; | 321 FrameView* frameView = |
| 322 frameViewBase->isFrameView() ? toFrameView(frameViewBase) : nullptr; |
320 | 323 |
321 // If frame bounds are changing mark the view for layout. Also check the | 324 // If frame bounds are changing mark the view for layout. Also check the |
322 // frame's page to make sure that the frame isn't in the process of being | 325 // frame's page to make sure that the frame isn't in the process of being |
323 // destroyed. If iframe scrollbars needs reconstruction from native to custom | 326 // destroyed. If iframe scrollbars needs reconstruction from native to custom |
324 // scrollbar, then also we need to layout the frameview. | 327 // scrollbar, then also we need to layout the frameview. |
325 if (frameView && frameView->frame().page() && | 328 if (frameView && frameView->frame().page() && |
326 (boundsWillChange || frameView->needsScrollbarReconstruction())) | 329 (boundsWillChange || frameView->needsScrollbarReconstruction())) |
327 frameView->setNeedsLayout(); | 330 frameView->setNeedsLayout(); |
328 | 331 |
329 updateWidgetGeometryInternal(); | 332 updateWidgetGeometryInternal(); |
330 | 333 |
331 // If view needs layout, either because bounds have changed or possibly | 334 // If view needs layout, either because bounds have changed or possibly |
332 // indicating content size is wrong, we have to do a layout to set the right | 335 // indicating content size is wrong, we have to do a layout to set the right |
333 // widget size. | 336 // FrameViewBase size. |
334 if (frameView && frameView->needsLayout() && frameView->frame().page()) | 337 if (frameView && frameView->needsLayout() && frameView->frame().page()) |
335 frameView->layout(); | 338 frameView->layout(); |
336 | 339 |
337 widget->widgetGeometryMayHaveChanged(); | 340 frameViewBase->widgetGeometryMayHaveChanged(); |
338 } | 341 } |
339 | 342 |
340 void LayoutPart::updateWidgetGeometryInternal() { | 343 void LayoutPart::updateWidgetGeometryInternal() { |
341 Widget* widget = this->widget(); | 344 FrameViewBase* frameViewBase = this->widget(); |
342 ASSERT(widget); | 345 DCHECK(frameViewBase); |
343 | 346 |
344 // Ignore transform here, as we only care about the sub-pixel accumulation. | 347 // Ignore transform here, as we only care about the sub-pixel accumulation. |
345 // TODO(trchen): What about multicol? Need a LayoutBox function to query | 348 // TODO(trchen): What about multicol? Need a LayoutBox function to query |
346 // sub-pixel accumulation. | 349 // sub-pixel accumulation. |
347 LayoutPoint absoluteLocation(localToAbsolute(FloatPoint())); | 350 LayoutPoint absoluteLocation(localToAbsolute(FloatPoint())); |
348 LayoutRect absoluteReplacedRect = replacedContentRect(); | 351 LayoutRect absoluteReplacedRect = replacedContentRect(); |
349 absoluteReplacedRect.moveBy(absoluteLocation); | 352 absoluteReplacedRect.moveBy(absoluteLocation); |
350 | 353 |
351 IntRect frameRect(IntPoint(), | 354 IntRect frameRect(IntPoint(), |
352 pixelSnappedIntRect(absoluteReplacedRect).size()); | 355 pixelSnappedIntRect(absoluteReplacedRect).size()); |
353 // Normally the location of the frame rect is ignored by the painter, but | 356 // Normally the location of the frame rect is ignored by the painter, but |
354 // currently it is still used by a family of coordinate conversion function in | 357 // currently it is still used by a family of coordinate conversion function in |
355 // Widget/FrameView. This is incorrect because coordinate conversion needs to | 358 // FrameViewBase/FrameView. This is incorrect because coordinate conversion |
356 // take transform and into account. | 359 // needs to take transform and into account. A few callers still use the |
357 // A few callers still use the family of conversion function, including but | 360 // family of conversion function, including but not exhaustive: |
358 // not exhaustive: | |
359 // FrameView::updateViewportIntersectionIfNeeded() | 361 // FrameView::updateViewportIntersectionIfNeeded() |
360 // RemoteFrameView::frameRectsChanged(). | 362 // RemoteFrameView::frameRectsChanged(). |
361 // WebPluginContainerImpl::reportGeometry() | 363 // WebPluginContainerImpl::reportGeometry() |
362 // TODO(trchen): Remove this hack once we fixed all callers. | 364 // TODO(trchen): Remove this hack once we fixed all callers. |
363 FloatRect absoluteBoundingBox = | 365 FloatRect absoluteBoundingBox = |
364 localToAbsoluteQuad(FloatRect(replacedContentRect())).boundingBox(); | 366 localToAbsoluteQuad(FloatRect(replacedContentRect())).boundingBox(); |
365 frameRect.setLocation(roundedIntPoint(absoluteBoundingBox.location())); | 367 frameRect.setLocation(roundedIntPoint(absoluteBoundingBox.location())); |
366 | 368 |
367 // Why is the protector needed? | 369 // Why is the protector needed? |
368 RefPtr<LayoutPart> protector(this); | 370 RefPtr<LayoutPart> protector(this); |
369 widget->setFrameRect(frameRect); | 371 frameViewBase->setFrameRect(frameRect); |
370 } | 372 } |
371 | 373 |
372 void LayoutPart::invalidatePaintOfSubtreesIfNeeded( | 374 void LayoutPart::invalidatePaintOfSubtreesIfNeeded( |
373 const PaintInvalidationState& paintInvalidationState) { | 375 const PaintInvalidationState& paintInvalidationState) { |
374 if (widget() && widget()->isFrameView() && !isThrottledFrameView()) { | 376 if (widget() && widget()->isFrameView() && !isThrottledFrameView()) { |
375 FrameView* childFrameView = toFrameView(widget()); | 377 FrameView* childFrameView = toFrameView(widget()); |
376 // |childFrameView| is in another document, which could be | 378 // |childFrameView| is in another document, which could be |
377 // missing its LayoutView. TODO(jchaffraix): Ideally we should | 379 // missing its LayoutView. TODO(jchaffraix): Ideally we should |
378 // not need this code. | 380 // not need this code. |
379 if (LayoutView* childLayoutView = | 381 if (LayoutView* childLayoutView = |
380 toLayoutView(LayoutAPIShim::layoutObjectFrom( | 382 toLayoutView(LayoutAPIShim::layoutObjectFrom( |
381 childFrameView->layoutViewItem()))) { | 383 childFrameView->layoutViewItem()))) { |
382 PaintInvalidationState childViewPaintInvalidationState( | 384 PaintInvalidationState childViewPaintInvalidationState( |
383 paintInvalidationState, *childLayoutView); | 385 paintInvalidationState, *childLayoutView); |
384 childFrameView->invalidateTreeIfNeeded(childViewPaintInvalidationState); | 386 childFrameView->invalidateTreeIfNeeded(childViewPaintInvalidationState); |
385 } | 387 } |
386 } | 388 } |
387 | 389 |
388 LayoutReplaced::invalidatePaintOfSubtreesIfNeeded(paintInvalidationState); | 390 LayoutReplaced::invalidatePaintOfSubtreesIfNeeded(paintInvalidationState); |
389 } | 391 } |
390 | 392 |
391 bool LayoutPart::isThrottledFrameView() const { | 393 bool LayoutPart::isThrottledFrameView() const { |
392 if (!widget() || !widget()->isFrameView()) | 394 if (!widget() || !widget()->isFrameView()) |
393 return false; | 395 return false; |
394 const FrameView* frameView = toFrameView(widget()); | 396 const FrameView* frameView = toFrameView(widget()); |
395 return frameView->shouldThrottleRendering(); | 397 return frameView->shouldThrottleRendering(); |
396 } | 398 } |
397 | 399 |
398 } // namespace blink | 400 } // namespace blink |
OLD | NEW |