Chromium Code Reviews| 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) 2007 David Smith (catfish.man@gmail.com) | 4 * (C) 2007 David Smith (catfish.man@gmail.com) |
| 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. | 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. |
| 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2010. 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 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 ASSERT(containerSet->contains(block)); | 175 ASSERT(containerSet->contains(block)); |
| 176 containerSet->remove(block); | 176 containerSet->remove(block); |
| 177 if (containerSet->isEmpty()) | 177 if (containerSet->isEmpty()) |
| 178 containerMap->remove(it); | 178 containerMap->remove(it); |
| 179 } | 179 } |
| 180 } | 180 } |
| 181 } | 181 } |
| 182 | 182 |
| 183 static void appendImageIfNotNull(Vector<ImageResource*>& imageResources, const S tyleImage* styleImage) | 183 static void appendImageIfNotNull(Vector<ImageResource*>& imageResources, const S tyleImage* styleImage) |
| 184 { | 184 { |
| 185 if (styleImage && styleImage->cachedImage()) | 185 if (styleImage && styleImage->cachedImage()) { |
| 186 imageResources.append(styleImage->cachedImage()); | 186 ImageResource* imageResource = styleImage->cachedImage(); |
| 187 if (imageResource && !imageResource->isLoaded()) | |
| 188 imageResources.append(styleImage->cachedImage()); | |
| 189 } | |
| 187 } | 190 } |
| 188 | 191 |
| 189 static void appendLayers(Vector<ImageResource*>& images, const FillLayer* styleL ayer) | 192 static void appendLayers(Vector<ImageResource*>& images, const FillLayer* styleL ayer) |
| 190 { | 193 { |
| 191 for (const FillLayer* layer = styleLayer; layer; layer = layer->next()) { | 194 for (const FillLayer* layer = styleLayer; layer; layer = layer->next()) { |
| 192 appendImageIfNotNull(images, layer->image()); | 195 appendImageIfNotNull(images, layer->image()); |
| 193 } | 196 } |
| 194 } | 197 } |
| 195 | 198 |
| 199 static void appendImagesFromStyle(Vector<ImageResource*>& images, RenderStyle& b lockStyle) | |
| 200 { | |
| 201 appendLayers(images, blockStyle.backgroundLayers()); | |
| 202 appendLayers(images, blockStyle.maskLayers()); | |
| 203 | |
| 204 const ContentData* contentData = blockStyle.contentData(); | |
| 205 if (contentData && contentData->isImage()) { | |
| 206 const ImageContentData* imageContentData = static_cast<const ImageConten tData*>(contentData); | |
| 207 appendImageIfNotNull(images, imageContentData->image()); | |
| 208 } | |
| 209 if (blockStyle.boxReflect()) | |
| 210 appendImageIfNotNull(images, blockStyle.boxReflect()->mask().image()); | |
| 211 appendImageIfNotNull(images, blockStyle.listStyleImage()); | |
| 212 appendImageIfNotNull(images, blockStyle.borderImageSource()); | |
| 213 appendImageIfNotNull(images, blockStyle.maskBoxImageSource()); | |
| 214 } | |
| 215 | |
| 196 RenderBlock::~RenderBlock() | 216 RenderBlock::~RenderBlock() |
| 197 { | 217 { |
| 218 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->removeRender Object(this); | |
|
ojan
2014/01/23 06:32:59
Is this needed with the RenderObject destructor al
| |
| 198 if (hasColumns()) | 219 if (hasColumns()) |
| 199 gColumnInfoMap->take(this); | 220 gColumnInfoMap->take(this); |
| 200 if (gPercentHeightDescendantsMap) | 221 if (gPercentHeightDescendantsMap) |
| 201 removeBlockFromDescendantAndContainerMaps(this, gPercentHeightDescendant sMap, gPercentHeightContainerMap); | 222 removeBlockFromDescendantAndContainerMaps(this, gPercentHeightDescendant sMap, gPercentHeightContainerMap); |
| 202 if (gPositionedDescendantsMap) | 223 if (gPositionedDescendantsMap) |
| 203 removeBlockFromDescendantAndContainerMaps(this, gPositionedDescendantsMa p, gPositionedContainerMap); | 224 removeBlockFromDescendantAndContainerMaps(this, gPositionedDescendantsMa p, gPositionedContainerMap); |
| 204 } | 225 } |
| 205 | 226 |
| 206 void RenderBlock::willBeDestroyed() | 227 void RenderBlock::willBeDestroyed() |
| 207 { | 228 { |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 319 | 340 |
| 320 if (FastTextAutosizer* textAutosizer = document().fastTextAutosizer()) | 341 if (FastTextAutosizer* textAutosizer = document().fastTextAutosizer()) |
| 321 textAutosizer->record(this); | 342 textAutosizer->record(this); |
| 322 | 343 |
| 323 propagateStyleToAnonymousChildren(true); | 344 propagateStyleToAnonymousChildren(true); |
| 324 m_lineHeight = -1; | 345 m_lineHeight = -1; |
| 325 | 346 |
| 326 // It's possible for our border/padding to change, but for the overall logic al width of the block to | 347 // It's possible for our border/padding to change, but for the overall logic al width of the block to |
| 327 // end up being the same. We keep track of this change so in layoutBlock, we can know to set relayoutChildren=true. | 348 // end up being the same. We keep track of this change so in layoutBlock, we can know to set relayoutChildren=true. |
| 328 m_hasBorderOrPaddingLogicalWidthChanged = oldStyle && diff == StyleDifferenc eLayout && needsLayout() && borderOrPaddingLogicalWidthChanged(oldStyle, newStyl e); | 349 m_hasBorderOrPaddingLogicalWidthChanged = oldStyle && diff == StyleDifferenc eLayout && needsLayout() && borderOrPaddingLogicalWidthChanged(oldStyle, newStyl e); |
| 350 | |
| 351 // If the style has unloaded images, want to notify the ResourceLoadPriority Optimizer so that | |
| 352 // network priorities can be set. | |
| 353 Vector<ImageResource*> images; | |
| 354 appendImagesFromStyle(images, *newStyle); | |
| 355 if (images.isEmpty()) | |
| 356 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->removeRe nderObject(this); | |
| 357 else | |
| 358 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->addRende rObject(this); | |
| 329 } | 359 } |
| 330 | 360 |
| 331 RenderBlock* RenderBlock::continuationBefore(RenderObject* beforeChild) | 361 RenderBlock* RenderBlock::continuationBefore(RenderObject* beforeChild) |
| 332 { | 362 { |
| 333 if (beforeChild && beforeChild->parent() == this) | 363 if (beforeChild && beforeChild->parent() == this) |
| 334 return this; | 364 return this; |
| 335 | 365 |
| 336 RenderBlock* curr = toRenderBlock(continuation()); | 366 RenderBlock* curr = toRenderBlock(continuation()); |
| 337 RenderBlock* nextToLast = this; | 367 RenderBlock* nextToLast = this; |
| 338 RenderBlock* last = this; | 368 RenderBlock* last = this; |
| (...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1259 return; | 1289 return; |
| 1260 | 1290 |
| 1261 // It's safe to check for control clip here, since controls can never be tab le cells. | 1291 // It's safe to check for control clip here, since controls can never be tab le cells. |
| 1262 // If we have a lightweight clip, there can never be any overflow from child ren. | 1292 // If we have a lightweight clip, there can never be any overflow from child ren. |
| 1263 if (hasControlClip() && m_overflow) | 1293 if (hasControlClip() && m_overflow) |
| 1264 clearLayoutOverflow(); | 1294 clearLayoutOverflow(); |
| 1265 | 1295 |
| 1266 invalidateBackgroundObscurationStatus(); | 1296 invalidateBackgroundObscurationStatus(); |
| 1267 } | 1297 } |
| 1268 | 1298 |
| 1269 void RenderBlock::didLayout(ResourceLoadPriorityOptimizer& optimizer) | 1299 bool RenderBlock::updateImageLoadingPriorities() |
| 1270 { | 1300 { |
| 1271 RenderBox::didLayout(optimizer); | |
| 1272 updateStyleImageLoadingPriorities(optimizer); | |
| 1273 } | |
| 1274 | |
| 1275 void RenderBlock::didScroll(ResourceLoadPriorityOptimizer& optimizer) | |
| 1276 { | |
| 1277 RenderBox::didScroll(optimizer); | |
| 1278 updateStyleImageLoadingPriorities(optimizer); | |
| 1279 } | |
| 1280 | |
| 1281 void RenderBlock::updateStyleImageLoadingPriorities(ResourceLoadPriorityOptimize r& optimizer) | |
| 1282 { | |
| 1283 RenderStyle* blockStyle = style(); | |
| 1284 if (!blockStyle) | |
| 1285 return; | |
| 1286 | |
| 1287 Vector<ImageResource*> images; | 1301 Vector<ImageResource*> images; |
| 1288 | 1302 appendImagesFromStyle(images, *style()); |
| 1289 appendLayers(images, blockStyle->backgroundLayers()); | |
| 1290 appendLayers(images, blockStyle->maskLayers()); | |
| 1291 | |
| 1292 const ContentData* contentData = blockStyle->contentData(); | |
| 1293 if (contentData && contentData->isImage()) { | |
| 1294 const ImageContentData* imageContentData = static_cast<const ImageConten tData*>(contentData); | |
| 1295 appendImageIfNotNull(images, imageContentData->image()); | |
| 1296 } | |
| 1297 if (blockStyle->boxReflect()) | |
| 1298 appendImageIfNotNull(images, blockStyle->boxReflect()->mask().image()); | |
| 1299 appendImageIfNotNull(images, blockStyle->listStyleImage()); | |
| 1300 appendImageIfNotNull(images, blockStyle->borderImageSource()); | |
| 1301 appendImageIfNotNull(images, blockStyle->maskBoxImageSource()); | |
| 1302 | 1303 |
| 1303 if (images.isEmpty()) | 1304 if (images.isEmpty()) |
| 1304 return; | 1305 return false; |
| 1305 | 1306 |
| 1306 LayoutRect viewBounds = viewRect(); | 1307 LayoutRect viewBounds = viewRect(); |
| 1307 LayoutRect objectBounds = absoluteContentBox(); | 1308 LayoutRect objectBounds = absoluteContentBox(); |
| 1308 // The object bounds might be empty right now, so intersects will fail since it doesn't deal | 1309 // The object bounds might be empty right now, so intersects will fail since it doesn't deal |
| 1309 // with empty rects. Use LayoutRect::contains in that case. | 1310 // with empty rects. Use LayoutRect::contains in that case. |
| 1310 bool isVisible; | 1311 bool isVisible; |
| 1311 if (!objectBounds.isEmpty()) | 1312 if (!objectBounds.isEmpty()) |
| 1312 isVisible = viewBounds.intersects(objectBounds); | 1313 isVisible = viewBounds.intersects(objectBounds); |
| 1313 else | 1314 else |
| 1314 isVisible = viewBounds.contains(objectBounds); | 1315 isVisible = viewBounds.contains(objectBounds); |
| 1315 | 1316 |
| 1316 ResourceLoadPriorityOptimizer::VisibilityStatus status = isVisible ? | 1317 ResourceLoadPriorityOptimizer::VisibilityStatus status = isVisible ? |
| 1317 ResourceLoadPriorityOptimizer::Visible : ResourceLoadPriorityOptimizer:: NotVisible; | 1318 ResourceLoadPriorityOptimizer::Visible : ResourceLoadPriorityOptimizer:: NotVisible; |
| 1318 | 1319 |
| 1319 for (Vector<ImageResource*>::iterator it = images.begin(), end = images.end( ); it != end; ++it) | 1320 for (Vector<ImageResource*>::iterator it = images.begin(), end = images.end( ); it != end; ++it) |
| 1320 optimizer.notifyImageResourceVisibility(*it, status); | 1321 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->notifyIm ageResourceVisibility(*it, status); |
| 1322 | |
| 1323 return true; | |
| 1321 } | 1324 } |
| 1322 | 1325 |
| 1323 void RenderBlock::relayoutShapeDescendantIfMoved(RenderBlock* child, LayoutSize offset) | 1326 void RenderBlock::relayoutShapeDescendantIfMoved(RenderBlock* child, LayoutSize offset) |
| 1324 { | 1327 { |
| 1325 LayoutUnit left = isHorizontalWritingMode() ? offset.width() : offset.height (); | 1328 LayoutUnit left = isHorizontalWritingMode() ? offset.width() : offset.height (); |
| 1326 if (!left || !child || child->shapeInsideInfo() || !layoutShapeInsideInfo()) | 1329 if (!left || !child || child->shapeInsideInfo() || !layoutShapeInsideInfo()) |
| 1327 return; | 1330 return; |
| 1328 // Propagate layout markers only up to the child, as we are still in the mid dle | 1331 // Propagate layout markers only up to the child, as we are still in the mid dle |
| 1329 // of a layout pass | 1332 // of a layout pass |
| 1330 child->setNormalChildNeedsLayout(true); | 1333 child->setNormalChildNeedsLayout(true); |
| (...skipping 4339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5670 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render Object* obj) const | 5673 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render Object* obj) const |
| 5671 { | 5674 { |
| 5672 showRenderObject(); | 5675 showRenderObject(); |
| 5673 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box()) | 5676 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box()) |
| 5674 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1); | 5677 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1); |
| 5675 } | 5678 } |
| 5676 | 5679 |
| 5677 #endif | 5680 #endif |
| 5678 | 5681 |
| 5679 } // namespace WebCore | 5682 } // namespace WebCore |
| OLD | NEW |