2006-10-04 Anders Carlsson <acarlsson@apple.com>
[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
96         if (m_doc->frame()->pluginsEnabled()) {
97             m_doc->frame()->redirectDataToPlugin(static_cast<RenderWidget*>(m_embedElement->renderer())->widget());
98         
99             finish();
100         }
101         
102         return false;
103     }
104     
105     ASSERT_NOT_REACHED();
106     
107     return false;
108 }
109     
110 void PluginTokenizer::stopParsing()
111 {
112     Tokenizer::stopParsing();        
113 }
114     
115 void PluginTokenizer::finish()
116 {
117     if (!m_parserStopped) 
118         m_doc->finishedParsing();            
119 }
120     
121 bool PluginTokenizer::isWaitingForScripts() const
122 {
123     // A plugin document is never waiting for scripts
124     return false;
125 }
126     
127 PluginDocument::PluginDocument(DOMImplementation* _implementation, FrameView* v)
128     : HTMLDocument(_implementation, v)
129 {
130     setParseMode(Compat);
131 }
132     
133 Tokenizer* PluginDocument::createTokenizer()
134 {
135     return new PluginTokenizer(this);
136 }
137     
138 }