#include "config.h"
#include "ImageDocument.h"
#include "CachedImage.h"
#include "Element.h"
#include "HTMLImageElement.h"
#include "HTMLNames.h"
#include "SegmentedString.h"
#include "Text.h"
#include "XMLTokenizer.h"
#if PLATFORM(MAC)
#include "ImageDocumentMac.h"
#endif
namespace WebCore {
using namespace HTMLNames;
class ImageTokenizer : public Tokenizer {
public:
ImageTokenizer(Document* doc) : m_doc(doc), m_imageElement(0) {}
virtual bool write(const SegmentedString&, bool appendData);
virtual void stopParsing();
virtual void finish();
virtual bool isWaitingForScripts() const;
virtual bool wantsRawData() const { return true; }
virtual bool writeRawData(const char* data, int len);
void createDocumentStructure();
private:
Document* m_doc;
HTMLImageElement* m_imageElement;
HTMLElement * m_htmlElement;
};
bool ImageTokenizer::write(const SegmentedString& s, bool appendData)
{
ASSERT_NOT_REACHED();
return false;
}
void ImageTokenizer::createDocumentStructure()
{
ExceptionCode ec;
RefPtr<Element> rootElement = m_doc->createElementNS(xhtmlNamespaceURI, "html", ec);
m_doc->appendChild(rootElement, ec);
RefPtr<Element> body = m_doc->createElementNS(xhtmlNamespaceURI, "body", ec);
body->setAttribute(styleAttr, "margin: 0px;");
rootElement->appendChild(body, ec);
RefPtr<Element> imageElement = m_doc->createElementNS(xhtmlNamespaceURI, "img", ec);
m_imageElement = static_cast<HTMLImageElement *>(imageElement.get());
m_imageElement->setAttribute(styleAttr, "-webkit-user-select: none");
m_imageElement->setLoadManually(true);
m_imageElement->setSrc(m_doc->URL());
body->appendChild(imageElement, ec);
m_htmlElement = static_cast<HTMLElement *>(rootElement.get());
}
bool ImageTokenizer::writeRawData(const char* data, int len)
{
if (!m_imageElement)
createDocumentStructure();
CachedImage* cachedImage = m_imageElement->cachedImage();
cachedImage->data(cachedImage->bufferData(data, len, 0), false);
return false;
}
void ImageTokenizer::stopParsing()
{
Tokenizer::stopParsing();
m_imageElement->cachedImage()->error();
}
void ImageTokenizer::finish()
{
if (!m_parserStopped) {
CachedImage* cachedImage = m_imageElement->cachedImage();
Vector<char>& buffer = cachedImage->bufferData(0, 0, 0);
cachedImage->data(buffer, true);
cachedImage->finish();
#if PLATFORM(MAC)
finishImageLoad(m_doc, cachedImage, buffer.data(), buffer.size());
#endif
}
m_doc->finishedParsing();
}
bool ImageTokenizer::isWaitingForScripts() const
{
return false;
}
ImageDocument::ImageDocument(DOMImplementation *_implementation, FrameView *v)
: HTMLDocument(_implementation, v)
{
}
Tokenizer* ImageDocument::createTokenizer()
{
return new ImageTokenizer(this);
}
}