summaryrefslogtreecommitdiffstats
path: root/WebCore/loader/ImageDocument.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/loader/ImageDocument.cpp')
-rw-r--r--WebCore/loader/ImageDocument.cpp129
1 files changed, 67 insertions, 62 deletions
diff --git a/WebCore/loader/ImageDocument.cpp b/WebCore/loader/ImageDocument.cpp
index 2f564cc..b1e33f4 100644
--- a/WebCore/loader/ImageDocument.cpp
+++ b/WebCore/loader/ImageDocument.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -25,14 +25,11 @@
#include "config.h"
#include "ImageDocument.h"
-#include "CSSStyleDeclaration.h"
#include "CachedImage.h"
#include "DocumentLoader.h"
-#include "Element.h"
#include "EventListener.h"
#include "EventNames.h"
#include "Frame.h"
-#include "FrameLoader.h"
#include "FrameLoaderClient.h"
#include "FrameView.h"
#include "HTMLImageElement.h"
@@ -41,10 +38,8 @@
#include "MouseEvent.h"
#include "NotImplemented.h"
#include "Page.h"
-#include "SegmentedString.h"
+#include "RawDataDocumentParser.h"
#include "Settings.h"
-#include "Text.h"
-#include "XMLTokenizer.h"
using std::min;
@@ -76,101 +71,102 @@ private:
ImageDocument* m_doc;
};
-class ImageTokenizer : public Tokenizer {
+class ImageDocumentParser : public RawDataDocumentParser {
public:
- ImageTokenizer(ImageDocument* doc) : m_doc(doc) {}
+ ImageDocumentParser(ImageDocument* document)
+ : RawDataDocumentParser(document)
+ {
+ }
- virtual void write(const SegmentedString&, bool appendData);
- virtual void finish();
- virtual bool isWaitingForScripts() const;
-
- virtual bool wantsRawData() const { return true; }
- virtual bool writeRawData(const char* data, int len);
+ ImageDocument* document() const
+ {
+ return static_cast<ImageDocument*>(m_document);
+ }
private:
- ImageDocument* m_doc;
+ virtual void appendBytes(DocumentWriter*, const char*, int, bool);
+ virtual void finish();
};
class ImageDocumentElement : public HTMLImageElement {
public:
- ImageDocumentElement(ImageDocument* doc)
- : HTMLImageElement(imgTag, doc)
- , m_imageDocument(doc)
+ static PassRefPtr<ImageDocumentElement> create(ImageDocument*);
+
+private:
+ ImageDocumentElement(ImageDocument* document)
+ : HTMLImageElement(imgTag, document)
+ , m_imageDocument(document)
{
}
virtual ~ImageDocumentElement();
virtual void willMoveToNewOwnerDocument();
-private:
ImageDocument* m_imageDocument;
};
+inline PassRefPtr<ImageDocumentElement> ImageDocumentElement::create(ImageDocument* document)
+{
+ return adoptRef(new ImageDocumentElement(document));
+}
+
// --------
-void ImageTokenizer::write(const SegmentedString&, bool)
+static float pageZoomFactor(Document* document)
{
- // <https://bugs.webkit.org/show_bug.cgi?id=25397>: JS code can always call document.write, we need to handle it.
- notImplemented();
+ FrameView* view = document->view();
+ return view ? view->pageZoomFactor() : 1;
}
-bool ImageTokenizer::writeRawData(const char*, int)
+void ImageDocumentParser::appendBytes(DocumentWriter*, const char*, int, bool)
{
- Frame* frame = m_doc->frame();
+ Frame* frame = document()->frame();
Settings* settings = frame->settings();
if (!frame->loader()->client()->allowImages(!settings || settings->areImagesEnabled()))
- return false;
-
- CachedImage* cachedImage = m_doc->cachedImage();
+ return;
+
+ CachedImage* cachedImage = document()->cachedImage();
cachedImage->data(frame->loader()->documentLoader()->mainResourceData(), false);
- m_doc->imageChanged();
-
- return false;
+ document()->imageChanged();
}
-void ImageTokenizer::finish()
+void ImageDocumentParser::finish()
{
- if (!m_parserStopped && m_doc->imageElement()) {
- CachedImage* cachedImage = m_doc->cachedImage();
- RefPtr<SharedBuffer> data = m_doc->frame()->loader()->documentLoader()->mainResourceData();
+ if (!m_parserStopped && document()->imageElement()) {
+ CachedImage* cachedImage = document()->cachedImage();
+ RefPtr<SharedBuffer> data = document()->frame()->loader()->documentLoader()->mainResourceData();
// If this is a multipart image, make a copy of the current part, since the resource data
// will be overwritten by the next part.
- if (m_doc->frame()->loader()->documentLoader()->isLoadingMultipartContent())
+ if (document()->frame()->loader()->documentLoader()->isLoadingMultipartContent())
data = data->copy();
cachedImage->data(data.release(), true);
cachedImage->finish();
- cachedImage->setResponse(m_doc->frame()->loader()->documentLoader()->response());
+ cachedImage->setResponse(document()->frame()->loader()->documentLoader()->response());
- IntSize size = cachedImage->imageSize(m_doc->frame()->pageZoomFactor());
+ IntSize size = cachedImage->imageSize(pageZoomFactor(document()));
if (size.width()) {
// Compute the title, we use the decoded filename of the resource, falling
// back on the (decoded) hostname if there is no path.
- String fileName = decodeURLEscapeSequences(m_doc->url().lastPathComponent());
+ String fileName = decodeURLEscapeSequences(document()->url().lastPathComponent());
if (fileName.isEmpty())
- fileName = m_doc->url().host();
- m_doc->setTitle(imageTitle(fileName, size));
+ fileName = document()->url().host();
+ document()->setTitle(imageTitle(fileName, size));
}
- m_doc->imageChanged();
+ document()->imageChanged();
}
- m_doc->finishedParsing();
-}
-
-bool ImageTokenizer::isWaitingForScripts() const
-{
- // An image document is never waiting for scripts
- return false;
+ document()->finishedParsing();
}
// --------
-ImageDocument::ImageDocument(Frame* frame)
- : HTMLDocument(frame)
+ImageDocument::ImageDocument(Frame* frame, const KURL& url)
+ : HTMLDocument(frame, url)
, m_imageElement(0)
, m_imageSizeIsKnown(false)
, m_didShrinkImage(false)
@@ -179,9 +175,9 @@ ImageDocument::ImageDocument(Frame* frame)
setParseMode(Compat);
}
-Tokenizer* ImageDocument::createTokenizer()
+DocumentParser* ImageDocument::createParser()
{
- return new ImageTokenizer(this);
+ return new ImageDocumentParser(this);
}
void ImageDocument::createDocumentStructure()
@@ -190,13 +186,16 @@ void ImageDocument::createDocumentStructure()
RefPtr<Element> rootElement = Document::createElement(htmlTag, false);
appendChild(rootElement, ec);
+
+ if (frame() && frame()->loader())
+ frame()->loader()->dispatchDocumentElementAvailable();
RefPtr<Element> body = Document::createElement(bodyTag, false);
body->setAttribute(styleAttr, "margin: 0px;");
rootElement->appendChild(body, ec);
- RefPtr<ImageDocumentElement> imageElement = new ImageDocumentElement(this);
+ RefPtr<ImageDocumentElement> imageElement = ImageDocumentElement::create(this);
imageElement->setAttribute(styleAttr, "-webkit-user-select: none");
imageElement->setLoadManually(true);
@@ -220,8 +219,12 @@ float ImageDocument::scale() const
if (!m_imageElement)
return 1.0f;
- IntSize imageSize = m_imageElement->cachedImage()->imageSize(frame()->pageZoomFactor());
- IntSize windowSize = IntSize(frame()->view()->width(), frame()->view()->height());
+ FrameView* view = frame()->view();
+ if (!view)
+ return 1;
+
+ IntSize imageSize = m_imageElement->cachedImage()->imageSize(view->pageZoomFactor());
+ IntSize windowSize = IntSize(view->width(), view->height());
float widthScale = (float)windowSize.width() / imageSize.width();
float heightScale = (float)windowSize.height() / imageSize.height();
@@ -234,7 +237,7 @@ void ImageDocument::resizeImageToFit()
if (!m_imageElement)
return;
- IntSize imageSize = m_imageElement->cachedImage()->imageSize(frame()->pageZoomFactor());
+ IntSize imageSize = m_imageElement->cachedImage()->imageSize(pageZoomFactor(this));
float scale = this->scale();
m_imageElement->setWidth(static_cast<int>(imageSize.width() * scale));
@@ -274,7 +277,7 @@ void ImageDocument::imageChanged()
if (m_imageSizeIsKnown)
return;
- if (m_imageElement->cachedImage()->imageSize(frame()->pageZoomFactor()).isEmpty())
+ if (m_imageElement->cachedImage()->imageSize(pageZoomFactor(this)).isEmpty())
return;
m_imageSizeIsKnown = true;
@@ -290,8 +293,8 @@ void ImageDocument::restoreImageSize()
if (!m_imageElement || !m_imageSizeIsKnown)
return;
- m_imageElement->setWidth(m_imageElement->cachedImage()->imageSize(frame()->pageZoomFactor()).width());
- m_imageElement->setHeight(m_imageElement->cachedImage()->imageSize(frame()->pageZoomFactor()).height());
+ m_imageElement->setWidth(m_imageElement->cachedImage()->imageSize(pageZoomFactor(this)).width());
+ m_imageElement->setHeight(m_imageElement->cachedImage()->imageSize(pageZoomFactor(this)).height());
ExceptionCode ec;
if (imageFitsInWindow())
@@ -307,8 +310,10 @@ bool ImageDocument::imageFitsInWindow() const
if (!m_imageElement)
return true;
- IntSize imageSize = m_imageElement->cachedImage()->imageSize(frame()->pageZoomFactor());
- IntSize windowSize = IntSize(frame()->view()->width(), frame()->view()->height());
+ FrameView* view = frame()->view();
+
+ IntSize imageSize = m_imageElement->cachedImage()->imageSize(view->pageZoomFactor());
+ IntSize windowSize = IntSize(view->width(), view->height());
return imageSize.width() <= windowSize.width() && imageSize.height() <= windowSize.height();
}