3c2f012dc4751873eb36a0a9c4c447dac728fe2f
[WebKit-https.git] / WebCore / loader / PluginDocument.cpp
1 /*
2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
20  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
23  */
24
25 #include "config.h"
26
27 #include "PluginDocument.h"
28
29 #include "Frame.h"
30 #include "Element.h"
31 #include "HTMLNames.h"
32 #include "RenderWidget.h"
33 #include "SegmentedString.h"
34 #include "Text.h"
35 #include "HTMLEmbedElement.h"
36 #include "XMLTokenizer.h"
37
38 namespace WebCore {
39     
40 using namespace HTMLNames;
41     
42 class PluginTokenizer : public Tokenizer {
43 public:
44     PluginTokenizer(Document* doc) : m_doc(doc), m_embedElement(0) {}
45         
46     virtual bool write(const SegmentedString&, bool appendData);
47     virtual void stopParsing();
48     virtual void finish();
49     virtual bool isWaitingForScripts() const;
50         
51     virtual bool wantsRawData() const { return true; }
52     virtual bool writeRawData(const char* data, int len);
53         
54     void createDocumentStructure();
55 private:
56     Document* m_doc;
57     HTMLEmbedElement* m_embedElement;
58 };
59     
60 bool PluginTokenizer::write(const SegmentedString& s, bool appendData)
61 {
62     ASSERT_NOT_REACHED();
63     return false;
64 }
65     
66 void PluginTokenizer::createDocumentStructure()
67 {
68     ExceptionCode ec;
69     RefPtr<Element> rootElement = m_doc->createElementNS(xhtmlNamespaceURI, "html", ec);
70     m_doc->appendChild(rootElement, ec);
71         
72     RefPtr<Element> body = m_doc->createElementNS(xhtmlNamespaceURI, "body", ec);
73     body->setAttribute(marginwidthAttr, "0");
74     body->setAttribute(marginheightAttr, "0");
75        
76     rootElement->appendChild(body, ec);
77         
78     RefPtr<Element> embedElement = m_doc->createElementNS(xhtmlNamespaceURI, "embed", ec);
79         
80     m_embedElement = static_cast<HTMLEmbedElement*>(embedElement.get());
81     m_embedElement->setAttribute(widthAttr, "100%");
82     m_embedElement->setAttribute(heightAttr, "100%");
83     
84     m_embedElement->setAttribute(nameAttr, "plugin");
85     m_embedElement->setSrc(m_doc->URL());
86     m_embedElement->setType(m_doc->frame()->resourceRequest().m_responseMIMEType);
87     
88     body->appendChild(embedElement, ec);    
89 }
90     
91 bool PluginTokenizer::writeRawData(const char* data, int len)
92 {
93     if (!m_embedElement) {
94         createDocumentStructure();
95         m_doc->frame()->redirectDataToPlugin(static_cast<RenderWidget*>(m_embedElement->renderer())->widget());
96         finish();
97         return false;
98     }
99     
100     ASSERT_NOT_REACHED();
101     
102     return false;
103 }
104     
105 void PluginTokenizer::stopParsing()
106 {
107     Tokenizer::stopParsing();        
108 }
109     
110 void PluginTokenizer::finish()
111 {
112     if (!m_parserStopped) 
113         m_doc->finishedParsing();            
114 }
115     
116 bool PluginTokenizer::isWaitingForScripts() const
117 {
118     // A plugin document is never waiting for scripts
119     return false;
120 }
121     
122 PluginDocument::PluginDocument(DOMImplementation* _implementation, FrameView* v)
123     : HTMLDocument(_implementation, v)
124 {
125     setParseMode(Compat);
126 }
127     
128 Tokenizer* PluginDocument::createTokenizer()
129 {
130     return new PluginTokenizer(this);
131 }
132     
133 }