/*
- * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
class ImageEventListener : public EventListener {
public:
ImageEventListener(ImageDocument* doc) : m_doc(doc) { }
-
virtual void handleEvent(Event*, bool isWindowEvent);
+
private:
ImageDocument* m_doc;
};
class ImageTokenizer : public Tokenizer {
public:
ImageTokenizer(ImageDocument* doc) : m_doc(doc) {}
-
+
virtual bool 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);
+
private:
ImageDocument* m_doc;
};
+class ImageDocumentElement : public HTMLImageElement {
+public:
+ ImageDocumentElement(ImageDocument* doc) : HTMLImageElement(doc), m_imageDocument(doc) { }
+ virtual ~ImageDocumentElement();
+ virtual void willMoveToNewOwnerDocument();
+
+private:
+ ImageDocument* m_imageDocument;
+};
+
+// --------
+
bool ImageTokenizer::write(const SegmentedString& s, bool appendData)
{
ASSERT_NOT_REACHED();
return false;
}
+// --------
+
ImageDocument::ImageDocument(DOMImplementation* implementation, Frame* frame)
: HTMLDocument(implementation, frame)
, m_imageElement(0)
rootElement->appendChild(body, ec);
- RefPtr<Element> imageElement = createElementNS(xhtmlNamespaceURI, "img", ec);
+ RefPtr<ImageDocumentElement> imageElement = new ImageDocumentElement(this);
- m_imageElement = static_cast<HTMLImageElement *>(imageElement.get());
- m_imageElement->setAttribute(styleAttr, "-webkit-user-select: none");
- m_imageElement->setLoadManually(true);
- m_imageElement->setSrc(URL());
+ imageElement->setAttribute(styleAttr, "-webkit-user-select: none");
+ imageElement->setLoadManually(true);
+ imageElement->setSrc(URL());
body->appendChild(imageElement, ec);
// Add event listeners
RefPtr<EventListener> listener = new ImageEventListener(this);
addWindowEventListener("resize", listener, false);
- m_imageElement->addEventListener("click", listener.release(), false);
+ imageElement->addEventListener("click", listener.release(), false);
}
+
+ m_imageElement = imageElement.get();
}
float ImageDocument::scale() const
{
+ if (!m_imageElement)
+ return 1.0f;
+
IntSize imageSize = m_imageElement->cachedImage()->imageSize();
IntSize windowSize = IntSize(frame()->view()->width(), frame()->view()->height());
void ImageDocument::resizeImageToFit()
{
+ if (!m_imageElement)
+ return;
+
IntSize imageSize = m_imageElement->cachedImage()->imageSize();
float scale = this->scale();
void ImageDocument::restoreImageSize()
{
- if (!m_imageSizeIsKnown)
+ if (!m_imageElement || !m_imageSizeIsKnown)
return;
m_imageElement->setWidth(m_imageElement->cachedImage()->imageSize().width());
bool ImageDocument::imageFitsInWindow() const
{
+ if (!m_imageElement)
+ return true;
+
IntSize imageSize = m_imageElement->cachedImage()->imageSize();
IntSize windowSize = IntSize(frame()->view()->width(), frame()->view()->height());
void ImageDocument::windowSizeChanged()
{
- if (!m_imageSizeIsKnown)
+ if (!m_imageElement || !m_imageSizeIsKnown)
return;
bool fitsInWindow = imageFitsInWindow();
frame()->page()->mainFrame() == frame();
}
+// --------
+
void ImageEventListener::handleEvent(Event* event, bool isWindowEvent)
{
if (event->type() == resizeEvent)
}
}
+// --------
+
+ImageDocumentElement::~ImageDocumentElement()
+{
+ if (m_imageDocument)
+ m_imageDocument->disconnectImageElement();
+}
+
+void ImageDocumentElement::willMoveToNewOwnerDocument()
+{
+ if (m_imageDocument) {
+ m_imageDocument->disconnectImageElement();
+ m_imageDocument = 0;
+ }
+ HTMLImageElement::willMoveToNewOwnerDocument();
+}
+
}