OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 22 matching lines...) Expand all Loading... |
33 | 33 |
34 #include "DocumentLoader.h" | 34 #include "DocumentLoader.h" |
35 #include "EmptyClients.h" | 35 #include "EmptyClients.h" |
36 #include "FocusController.h" | 36 #include "FocusController.h" |
37 #include "FrameView.h" | 37 #include "FrameView.h" |
38 #include "HTMLPlugInElement.h" | 38 #include "HTMLPlugInElement.h" |
39 #include "NodeList.h" | 39 #include "NodeList.h" |
40 #include "Page.h" | 40 #include "Page.h" |
41 #include "PageWidgetDelegate.h" | 41 #include "PageWidgetDelegate.h" |
42 #include "Settings.h" | 42 #include "Settings.h" |
| 43 #include "WebDocument.h" |
43 #include "WebFrameImpl.h" | 44 #include "WebFrameImpl.h" |
44 #include "WebPlugin.h" | 45 #include "WebPlugin.h" |
45 #include "WebPluginContainerImpl.h" | 46 #include "WebPluginContainerImpl.h" |
46 #include "WebViewClient.h" | 47 #include "WebViewClient.h" |
47 #include "WebViewImpl.h" | 48 #include "WebViewImpl.h" |
48 #include "WebWidgetClient.h" | 49 #include "WebWidgetClient.h" |
49 | 50 |
50 using namespace WebCore; | 51 using namespace WebCore; |
51 | 52 |
52 namespace WebKit { | 53 namespace WebKit { |
53 | 54 |
54 #define addLiteral(literal, writer) writer.addData(literal, sizeof(literal) -
1) | 55 #define addLiteral(literal, writer) writer.addData(literal, sizeof(literal) -
1) |
55 | 56 |
56 static inline void addString(const String& str, DocumentWriter& writer) | 57 static inline void addString(const String& str, DocumentWriter& writer) |
57 { | 58 { |
58 CString str8 = str.utf8(); | 59 CString str8 = str.utf8(); |
59 writer.addData(str8.data(), str8.length()); | 60 writer.addData(str8.data(), str8.length()); |
60 } | 61 } |
61 | 62 |
62 void writeDocument(WebCore::DocumentWriter& writer, const String& pluginType) | 63 void writeDocument(const String& pluginType, const WebDocument& hostDocument, We
bCore::DocumentWriter& writer) |
63 { | 64 { |
| 65 // Give the new document the same URL as the hose document so that content |
| 66 // settings and other decisions can be made based on the correct origin. |
| 67 const WebURL& url = hostDocument.url(); |
| 68 |
64 writer.setMIMEType("text/html"); | 69 writer.setMIMEType("text/html"); |
65 writer.setEncoding("UTF-8", false); | 70 writer.setEncoding("UTF-8", false); |
66 writer.begin(); | 71 writer.begin(url); |
67 | 72 |
68 addLiteral("<!DOCTYPE html><head><meta charset='UTF-8'></head><body>\n", wri
ter); | 73 addLiteral("<!DOCTYPE html><head><meta charset='UTF-8'></head><body>\n", wri
ter); |
69 String objectTag = "<object type=\"" + pluginType + "\"></object>"; | 74 String objectTag = "<object type=\"" + pluginType + "\"></object>"; |
70 addString(objectTag, writer); | 75 addString(objectTag, writer); |
71 addLiteral("</body>\n", writer); | 76 addLiteral("</body>\n", writer); |
72 | 77 |
73 writer.end(); | 78 writer.end(); |
74 } | 79 } |
75 | 80 |
76 class HelperPluginChromeClient : public EmptyChromeClient { | 81 class HelperPluginChromeClient : public EmptyChromeClient { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 , m_webView(0) | 113 , m_webView(0) |
109 { | 114 { |
110 ASSERT(client); | 115 ASSERT(client); |
111 } | 116 } |
112 | 117 |
113 WebHelperPluginImpl::~WebHelperPluginImpl() | 118 WebHelperPluginImpl::~WebHelperPluginImpl() |
114 { | 119 { |
115 ASSERT(!m_page); | 120 ASSERT(!m_page); |
116 } | 121 } |
117 | 122 |
118 bool WebHelperPluginImpl::initialize(WebViewImpl* webView, const String& pluginT
ype) | 123 bool WebHelperPluginImpl::initialize(const String& pluginType, const WebDocument
& hostDocument, WebViewImpl* webView) |
119 { | 124 { |
120 ASSERT(webView); | 125 ASSERT(webView); |
121 m_webView = webView; | 126 m_webView = webView; |
122 | 127 |
123 return initializePage(webView, pluginType); | 128 return initializePage(pluginType, hostDocument); |
124 } | 129 } |
125 | 130 |
126 void WebHelperPluginImpl::closeHelperPlugin() | 131 void WebHelperPluginImpl::closeHelperPlugin() |
127 { | 132 { |
128 if (m_page) { | 133 if (m_page) { |
129 m_page->setGroupName(String()); | 134 m_page->setGroupName(String()); |
130 m_page->mainFrame()->loader()->stopAllLoaders(); | 135 m_page->mainFrame()->loader()->stopAllLoaders(); |
131 m_page->mainFrame()->loader()->stopLoading(UnloadEventPolicyNone); | 136 m_page->mainFrame()->loader()->stopLoading(UnloadEventPolicyNone); |
132 } | 137 } |
133 | 138 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 ASSERT(plugin); | 173 ASSERT(plugin); |
169 // If the plugin is a placeholder, it is not useful to the caller, and it | 174 // If the plugin is a placeholder, it is not useful to the caller, and it |
170 // could be replaced at any time. Therefore, do not return it. | 175 // could be replaced at any time. Therefore, do not return it. |
171 if (plugin->isPlaceholder()) | 176 if (plugin->isPlaceholder()) |
172 return 0; | 177 return 0; |
173 | 178 |
174 // The plugin was instantiated and will outlive this object. | 179 // The plugin was instantiated and will outlive this object. |
175 return plugin; | 180 return plugin; |
176 } | 181 } |
177 | 182 |
178 bool WebHelperPluginImpl::initializePage(WebKit::WebViewImpl* webView, const Str
ing& pluginType) | 183 bool WebHelperPluginImpl::initializePage(const String& pluginType, const WebDocu
ment& hostDocument) |
179 { | 184 { |
180 Page::PageClients pageClients; | 185 Page::PageClients pageClients; |
181 fillWithEmptyClients(pageClients); | 186 fillWithEmptyClients(pageClients); |
182 m_chromeClient = adoptPtr(new HelperPluginChromeClient(this)); | 187 m_chromeClient = adoptPtr(new HelperPluginChromeClient(this)); |
183 pageClients.chromeClient = m_chromeClient.get(); | 188 pageClients.chromeClient = m_chromeClient.get(); |
184 | 189 |
185 m_page = adoptPtr(new Page(pageClients)); | 190 m_page = adoptPtr(new Page(pageClients)); |
186 // Scripting must be enabled in ScriptController::windowScriptNPObject(). | 191 // Scripting must be enabled in ScriptController::windowScriptNPObject(). |
187 m_page->settings()->setScriptEnabled(true); | 192 m_page->settings()->setScriptEnabled(true); |
188 m_page->settings()->setPluginsEnabled(true); | 193 m_page->settings()->setPluginsEnabled(true); |
189 | 194 |
190 unsigned layoutMilestones = DidFirstLayout | DidFirstVisuallyNonEmptyLayout; | 195 unsigned layoutMilestones = DidFirstLayout | DidFirstVisuallyNonEmptyLayout; |
191 m_page->addLayoutMilestones(static_cast<LayoutMilestones>(layoutMilestones))
; | 196 m_page->addLayoutMilestones(static_cast<LayoutMilestones>(layoutMilestones))
; |
192 | 197 |
193 webView->client()->initializeHelperPluginWebFrame(this); | 198 m_webView->client()->initializeHelperPluginWebFrame(this); |
194 | 199 |
195 // The page's main frame was set in initializeFrame() as a result of the abo
ve call. | 200 // The page's main frame was set in initializeFrame() as a result of the abo
ve call. |
196 Frame* frame = m_page->mainFrame(); | 201 Frame* frame = m_page->mainFrame(); |
197 ASSERT(frame); | 202 ASSERT(frame); |
198 frame->setView(FrameView::create(frame)); | 203 frame->setView(FrameView::create(frame)); |
199 // No need to set a size or make it not transparent. | 204 // No need to set a size or make it not transparent. |
200 | 205 |
201 DocumentWriter* writer = frame->loader()->activeDocumentLoader()->writer(); | 206 DocumentWriter* writer = frame->loader()->activeDocumentLoader()->writer(); |
202 writeDocument(*writer, pluginType); | 207 writeDocument(pluginType, hostDocument, *writer); |
203 | 208 |
204 return true; | 209 return true; |
205 } | 210 } |
206 | 211 |
207 void WebHelperPluginImpl::destoryPage() | 212 void WebHelperPluginImpl::destoryPage() |
208 { | 213 { |
209 if (!m_page) | 214 if (!m_page) |
210 return; | 215 return; |
211 | 216 |
212 if (m_page->mainFrame()) | 217 if (m_page->mainFrame()) |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 // A WebHelperPluginImpl instance usually has two references. | 254 // A WebHelperPluginImpl instance usually has two references. |
250 // - One owned by the instance itself. It represents the visible widget. | 255 // - One owned by the instance itself. It represents the visible widget. |
251 // - One owned by the hosting element. It's released when the hosting | 256 // - One owned by the hosting element. It's released when the hosting |
252 // element asks the WebHelperPluginImpl to close. | 257 // element asks the WebHelperPluginImpl to close. |
253 // We need them because the closing operation is asynchronous and the widget | 258 // We need them because the closing operation is asynchronous and the widget |
254 // can be closed while the hosting element is unaware of it. | 259 // can be closed while the hosting element is unaware of it. |
255 return adoptRef(new WebHelperPluginImpl(client)).leakRef(); | 260 return adoptRef(new WebHelperPluginImpl(client)).leakRef(); |
256 } | 261 } |
257 | 262 |
258 } // namespace WebKit | 263 } // namespace WebKit |
OLD | NEW |