| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 LocalFrame* frame = document()->frame(); | 139 LocalFrame* frame = document()->frame(); |
| 140 Settings* settings = frame->settings(); | 140 Settings* settings = frame->settings(); |
| 141 if (!frame->loader().client()->allowImage(!settings || settings->imagesEnabl
ed(), document()->url())) | 141 if (!frame->loader().client()->allowImage(!settings || settings->imagesEnabl
ed(), document()->url())) |
| 142 return; | 142 return; |
| 143 | 143 |
| 144 if (document()->cachedImage()) { | 144 if (document()->cachedImage()) { |
| 145 RELEASE_ASSERT(length <= std::numeric_limits<unsigned>::max()); | 145 RELEASE_ASSERT(length <= std::numeric_limits<unsigned>::max()); |
| 146 document()->cachedImage()->appendData(data, length); | 146 document()->cachedImage()->appendData(data, length); |
| 147 } | 147 } |
| 148 | 148 |
| 149 if (!document()) | 149 // TODO(esprehn): These null checks on Document don't make sense, document() |
| 150 return; | 150 // will ASSERT if it was null. Do these want to check isDetached() ? |
| 151 | 151 if (document()) |
| 152 // Make sure the image layoutObject gets created because we need the layoutO
bject | 152 document()->imageUpdated(); |
| 153 // to read the aspect ratio. See crbug.com/320244 | |
| 154 document()->updateLayoutTreeIfNeeded(); | |
| 155 document()->imageUpdated(); | |
| 156 } | 153 } |
| 157 | 154 |
| 158 void ImageDocumentParser::finish() | 155 void ImageDocumentParser::finish() |
| 159 { | 156 { |
| 160 if (!isStopped() && document()->imageElement() && document()->cachedImage())
{ | 157 if (!isStopped() && document()->imageElement() && document()->cachedImage())
{ |
| 161 ImageResource* cachedImage = document()->cachedImage(); | 158 ImageResource* cachedImage = document()->cachedImage(); |
| 162 cachedImage->finish(); | 159 cachedImage->finish(); |
| 163 cachedImage->setResponse(document()->frame()->loader().documentLoader()-
>response()); | 160 cachedImage->setResponse(document()->frame()->loader().documentLoader()-
>response()); |
| 164 | 161 |
| 165 // Report the natural image size in the page title, regardless of zoom l
evel. | 162 // Report the natural image size in the page title, regardless of zoom l
evel. |
| 166 // At a zoom level of 1 the image is guaranteed to have an integer size. | 163 // At a zoom level of 1 the image is guaranteed to have an integer size. |
| 167 IntSize size = flooredIntSize(cachedImage->imageSizeForLayoutObject(docu
ment()->imageElement()->layoutObject(), 1.0f)); | 164 IntSize size = flooredIntSize(cachedImage->imageSizeForLayoutObject(docu
ment()->imageElement()->layoutObject(), 1.0f)); |
| 168 if (size.width()) { | 165 if (size.width()) { |
| 169 // Compute the title, we use the decoded filename of the resource, f
alling | 166 // Compute the title, we use the decoded filename of the resource, f
alling |
| 170 // back on the (decoded) hostname if there is no path. | 167 // back on the (decoded) hostname if there is no path. |
| 171 String fileName = decodeURLEscapeSequences(document()->url().lastPat
hComponent()); | 168 String fileName = decodeURLEscapeSequences(document()->url().lastPat
hComponent()); |
| 172 if (fileName.isEmpty()) | 169 if (fileName.isEmpty()) |
| 173 fileName = document()->url().host(); | 170 fileName = document()->url().host(); |
| 174 document()->setTitle(imageTitle(fileName, size)); | 171 document()->setTitle(imageTitle(fileName, size)); |
| 175 } | 172 } |
| 176 | 173 |
| 177 document()->imageUpdated(); | 174 document()->imageUpdated(); |
| 178 } | 175 } |
| 179 | 176 |
| 177 // TODO(esprehn): These null checks on Document don't make sense, document() |
| 178 // will ASSERT if it was null. Do these want to check isDetached() ? |
| 180 if (document()) | 179 if (document()) |
| 181 document()->finishedParsing(); | 180 document()->finishedParsing(); |
| 182 } | 181 } |
| 183 | 182 |
| 184 // -------- | 183 // -------- |
| 185 | 184 |
| 186 ImageDocument::ImageDocument(const DocumentInit& initializer) | 185 ImageDocument::ImageDocument(const DocumentInit& initializer) |
| 187 : HTMLDocument(initializer, ImageDocumentClass) | 186 : HTMLDocument(initializer, ImageDocumentClass) |
| 188 , m_imageElement(nullptr) | 187 , m_imageElement(nullptr) |
| 189 , m_imageSizeIsKnown(false) | 188 , m_imageSizeIsKnown(false) |
| (...skipping 28 matching lines...) Expand all Loading... |
| 218 | 217 |
| 219 RefPtrWillBeRawPtr<HTMLHeadElement> head = HTMLHeadElement::create(*this); | 218 RefPtrWillBeRawPtr<HTMLHeadElement> head = HTMLHeadElement::create(*this); |
| 220 RefPtrWillBeRawPtr<HTMLMetaElement> meta = HTMLMetaElement::create(*this); | 219 RefPtrWillBeRawPtr<HTMLMetaElement> meta = HTMLMetaElement::create(*this); |
| 221 meta->setAttribute(nameAttr, "viewport"); | 220 meta->setAttribute(nameAttr, "viewport"); |
| 222 meta->setAttribute(contentAttr, "width=device-width, minimum-scale=0.1"); | 221 meta->setAttribute(contentAttr, "width=device-width, minimum-scale=0.1"); |
| 223 head->appendChild(meta); | 222 head->appendChild(meta); |
| 224 | 223 |
| 225 RefPtrWillBeRawPtr<HTMLBodyElement> body = HTMLBodyElement::create(*this); | 224 RefPtrWillBeRawPtr<HTMLBodyElement> body = HTMLBodyElement::create(*this); |
| 226 body->setAttribute(styleAttr, "margin: 0px;"); | 225 body->setAttribute(styleAttr, "margin: 0px;"); |
| 227 | 226 |
| 227 if (frame()) |
| 228 frame()->loader().client()->dispatchWillInsertBody(); |
| 229 |
| 228 m_imageElement = HTMLImageElement::create(*this); | 230 m_imageElement = HTMLImageElement::create(*this); |
| 229 m_imageElement->setAttribute(styleAttr, "-webkit-user-select: none"); | 231 m_imageElement->setAttribute(styleAttr, "-webkit-user-select: none"); |
| 230 // If the image is multipart, we neglect to mention to the HTMLImageElement
that it's in an | 232 // If the image is multipart, we neglect to mention to the HTMLImageElement
that it's in an |
| 231 // ImageDocument, so that it requests the image normally. | 233 // ImageDocument, so that it requests the image normally. |
| 232 if (!loadingMultipartContent) | 234 if (!loadingMultipartContent) |
| 233 m_imageElement->setLoadingImageDocument(); | 235 m_imageElement->setLoadingImageDocument(); |
| 234 m_imageElement->setSrc(url().string()); | 236 m_imageElement->setSrc(url().string()); |
| 235 body->appendChild(m_imageElement.get()); | 237 body->appendChild(m_imageElement.get()); |
| 236 | 238 |
| 237 if (shouldShrinkToFit()) { | 239 if (shouldShrinkToFit()) { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 } | 310 } |
| 309 } | 311 } |
| 310 | 312 |
| 311 void ImageDocument::imageUpdated() | 313 void ImageDocument::imageUpdated() |
| 312 { | 314 { |
| 313 ASSERT(m_imageElement); | 315 ASSERT(m_imageElement); |
| 314 | 316 |
| 315 if (m_imageSizeIsKnown) | 317 if (m_imageSizeIsKnown) |
| 316 return; | 318 return; |
| 317 | 319 |
| 320 updateLayoutTreeIfNeeded(); |
| 318 if (!m_imageElement->cachedImage() || m_imageElement->cachedImage()->imageSi
zeForLayoutObject(m_imageElement->layoutObject(), pageZoomFactor(this)).isEmpty(
)) | 321 if (!m_imageElement->cachedImage() || m_imageElement->cachedImage()->imageSi
zeForLayoutObject(m_imageElement->layoutObject(), pageZoomFactor(this)).isEmpty(
)) |
| 319 return; | 322 return; |
| 320 | 323 |
| 321 m_imageSizeIsKnown = true; | 324 m_imageSizeIsKnown = true; |
| 322 | 325 |
| 323 if (shouldShrinkToFit()) { | 326 if (shouldShrinkToFit()) { |
| 324 // Force resizing of the image | 327 // Force resizing of the image |
| 325 windowSizeChanged(ScaleOnlyUnzoomedDocument); | 328 windowSizeChanged(ScaleOnlyUnzoomedDocument); |
| 326 } | 329 } |
| 327 | |
| 328 // Update layout as soon as image size is known. This enables large image fi
les to render progressively or to animate. | |
| 329 updateLayout(); | |
| 330 } | 330 } |
| 331 | 331 |
| 332 void ImageDocument::restoreImageSize(ScaleType type) | 332 void ImageDocument::restoreImageSize(ScaleType type) |
| 333 { | 333 { |
| 334 ASSERT(m_shrinkToFitMode == Desktop); | 334 ASSERT(m_shrinkToFitMode == Desktop); |
| 335 | 335 |
| 336 if (!m_imageElement || !m_imageSizeIsKnown || m_imageElement->document() !=
this || (pageZoomFactor(this) < 1 && type == ScaleOnlyUnzoomedDocument)) | 336 if (!m_imageElement || !m_imageSizeIsKnown || m_imageElement->document() !=
this || (pageZoomFactor(this) < 1 && type == ScaleOnlyUnzoomedDocument)) |
| 337 return; | 337 return; |
| 338 | 338 |
| 339 ASSERT(m_imageElement->cachedImage()); | 339 ASSERT(m_imageElement->cachedImage()); |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 } | 452 } |
| 453 | 453 |
| 454 bool ImageEventListener::operator==(const EventListener& listener) | 454 bool ImageEventListener::operator==(const EventListener& listener) |
| 455 { | 455 { |
| 456 if (const ImageEventListener* imageEventListener = ImageEventListener::cast(
&listener)) | 456 if (const ImageEventListener* imageEventListener = ImageEventListener::cast(
&listener)) |
| 457 return m_doc == imageEventListener->m_doc; | 457 return m_doc == imageEventListener->m_doc; |
| 458 return false; | 458 return false; |
| 459 } | 459 } |
| 460 | 460 |
| 461 } | 461 } |
| OLD | NEW |