| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008, 2011, 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008, 2011, 2012 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 if (!renderer() || !renderer()->isEmbeddedObject()) | 81 if (!renderer() || !renderer()->isEmbeddedObject()) |
| 82 return 0; | 82 return 0; |
| 83 return toRenderEmbeddedObject(renderer()); | 83 return toRenderEmbeddedObject(renderer()); |
| 84 } | 84 } |
| 85 | 85 |
| 86 bool HTMLPlugInImageElement::isImageType() | 86 bool HTMLPlugInImageElement::isImageType() |
| 87 { | 87 { |
| 88 if (m_serviceType.isEmpty() && protocolIs(m_url, "data")) | 88 if (m_serviceType.isEmpty() && protocolIs(m_url, "data")) |
| 89 m_serviceType = mimeTypeFromDataURL(m_url); | 89 m_serviceType = mimeTypeFromDataURL(m_url); |
| 90 | 90 |
| 91 if (Frame* frame = document()->frame()) { | 91 if (Frame* frame = document().frame()) { |
| 92 KURL completedURL = document()->completeURL(m_url); | 92 KURL completedURL = document().completeURL(m_url); |
| 93 return frame->loader()->client()->objectContentType(completedURL, m_serv
iceType, shouldPreferPlugInsForImages()) == ObjectContentImage; | 93 return frame->loader()->client()->objectContentType(completedURL, m_serv
iceType, shouldPreferPlugInsForImages()) == ObjectContentImage; |
| 94 } | 94 } |
| 95 | 95 |
| 96 return Image::supportsType(m_serviceType); | 96 return Image::supportsType(m_serviceType); |
| 97 } | 97 } |
| 98 | 98 |
| 99 // We don't use m_url, as it may not be the final URL that the object loads, | 99 // We don't use m_url, as it may not be the final URL that the object loads, |
| 100 // depending on <param> values. | 100 // depending on <param> values. |
| 101 bool HTMLPlugInImageElement::allowedToLoadFrameURL(const String& url) | 101 bool HTMLPlugInImageElement::allowedToLoadFrameURL(const String& url) |
| 102 { | 102 { |
| 103 KURL completeURL = document()->completeURL(url); | 103 KURL completeURL = document().completeURL(url); |
| 104 | 104 |
| 105 if (contentFrame() && protocolIsJavaScript(completeURL) | 105 if (contentFrame() && protocolIsJavaScript(completeURL) |
| 106 && !document()->securityOrigin()->canAccess(contentDocument()->securityO
rigin())) | 106 && !document().securityOrigin()->canAccess(contentDocument()->securityOr
igin())) |
| 107 return false; | 107 return false; |
| 108 | 108 |
| 109 return document()->frame()->isURLAllowed(completeURL); | 109 return document().frame()->isURLAllowed(completeURL); |
| 110 } | 110 } |
| 111 | 111 |
| 112 // We don't use m_url, or m_serviceType as they may not be the final values | 112 // We don't use m_url, or m_serviceType as they may not be the final values |
| 113 // that <object> uses depending on <param> values. | 113 // that <object> uses depending on <param> values. |
| 114 bool HTMLPlugInImageElement::wouldLoadAsNetscapePlugin(const String& url, const
String& serviceType) | 114 bool HTMLPlugInImageElement::wouldLoadAsNetscapePlugin(const String& url, const
String& serviceType) |
| 115 { | 115 { |
| 116 ASSERT(document()); | 116 ASSERT(document().frame()); |
| 117 ASSERT(document()->frame()); | |
| 118 KURL completedURL; | 117 KURL completedURL; |
| 119 if (!url.isEmpty()) | 118 if (!url.isEmpty()) |
| 120 completedURL = document()->completeURL(url); | 119 completedURL = document().completeURL(url); |
| 121 | 120 |
| 122 FrameLoader* frameLoader = document()->frame()->loader(); | 121 FrameLoader* frameLoader = document().frame()->loader(); |
| 123 ASSERT(frameLoader); | 122 ASSERT(frameLoader); |
| 124 if (frameLoader->client()->objectContentType(completedURL, serviceType, shou
ldPreferPlugInsForImages()) == ObjectContentNetscapePlugin) | 123 if (frameLoader->client()->objectContentType(completedURL, serviceType, shou
ldPreferPlugInsForImages()) == ObjectContentNetscapePlugin) |
| 125 return true; | 124 return true; |
| 126 return false; | 125 return false; |
| 127 } | 126 } |
| 128 | 127 |
| 129 RenderObject* HTMLPlugInImageElement::createRenderer(RenderStyle* style) | 128 RenderObject* HTMLPlugInImageElement::createRenderer(RenderStyle* style) |
| 130 { | 129 { |
| 131 // Fallback content breaks the DOM->Renderer class relationship of this | 130 // Fallback content breaks the DOM->Renderer class relationship of this |
| 132 // class and all superclasses because createObject won't necessarily | 131 // class and all superclasses because createObject won't necessarily |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 // we can end up detaching during an attach() call, before we even have a | 173 // we can end up detaching during an attach() call, before we even have a |
| 175 // renderer. In that case, don't mark the widget for update. | 174 // renderer. In that case, don't mark the widget for update. |
| 176 if (attached() && renderer() && !useFallbackContent()) | 175 if (attached() && renderer() && !useFallbackContent()) |
| 177 // Update the widget the next time we attach (detaching destroys the plu
gin). | 176 // Update the widget the next time we attach (detaching destroys the plu
gin). |
| 178 setNeedsWidgetUpdate(true); | 177 setNeedsWidgetUpdate(true); |
| 179 HTMLPlugInElement::detach(context); | 178 HTMLPlugInElement::detach(context); |
| 180 } | 179 } |
| 181 | 180 |
| 182 void HTMLPlugInImageElement::updateWidgetIfNecessary() | 181 void HTMLPlugInImageElement::updateWidgetIfNecessary() |
| 183 { | 182 { |
| 184 document()->updateStyleIfNeeded(); | 183 document().updateStyleIfNeeded(); |
| 185 | 184 |
| 186 if (!needsWidgetUpdate() || useFallbackContent() || isImageType()) | 185 if (!needsWidgetUpdate() || useFallbackContent() || isImageType()) |
| 187 return; | 186 return; |
| 188 | 187 |
| 189 if (!renderEmbeddedObject() || renderEmbeddedObject()->showsUnavailablePlugi
nIndicator()) | 188 if (!renderEmbeddedObject() || renderEmbeddedObject()->showsUnavailablePlugi
nIndicator()) |
| 190 return; | 189 return; |
| 191 | 190 |
| 192 updateWidget(CreateOnlyNonNetscapePlugins); | 191 updateWidget(CreateOnlyNonNetscapePlugins); |
| 193 } | 192 } |
| 194 | 193 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 219 { | 218 { |
| 220 if (url.isEmpty() && mimeType.isEmpty()) | 219 if (url.isEmpty() && mimeType.isEmpty()) |
| 221 return false; | 220 return false; |
| 222 | 221 |
| 223 // FIXME: None of this code should use renderers! | 222 // FIXME: None of this code should use renderers! |
| 224 RenderEmbeddedObject* renderer = renderEmbeddedObject(); | 223 RenderEmbeddedObject* renderer = renderEmbeddedObject(); |
| 225 ASSERT(renderer); | 224 ASSERT(renderer); |
| 226 if (!renderer) | 225 if (!renderer) |
| 227 return false; | 226 return false; |
| 228 | 227 |
| 229 KURL completedURL = document()->completeURL(url); | 228 KURL completedURL = document().completeURL(url); |
| 230 | 229 |
| 231 bool useFallback; | 230 bool useFallback; |
| 232 if (shouldUsePlugin(completedURL, mimeType, renderer->hasFallbackContent(),
useFallback)) { | 231 if (shouldUsePlugin(completedURL, mimeType, renderer->hasFallbackContent(),
useFallback)) { |
| 233 bool success = loadPlugin(completedURL, mimeType, paramNames, paramValue
s, useFallback); | 232 bool success = loadPlugin(completedURL, mimeType, paramNames, paramValue
s, useFallback); |
| 234 return success; | 233 return success; |
| 235 } | 234 } |
| 236 | 235 |
| 237 // If the plug-in element already contains a subframe, loadOrRedirectSubfram
e will re-use it. Otherwise, | 236 // If the plug-in element already contains a subframe, loadOrRedirectSubfram
e will re-use it. Otherwise, |
| 238 // it will create a new frame and set it as the RenderPart's widget, causing
what was previously | 237 // it will create a new frame and set it as the RenderPart's widget, causing
what was previously |
| 239 // in the widget to be torn down. | 238 // in the widget to be torn down. |
| 240 return loadOrRedirectSubframe(completedURL, getNameAttribute(), true); | 239 return loadOrRedirectSubframe(completedURL, getNameAttribute(), true); |
| 241 } | 240 } |
| 242 | 241 |
| 243 bool HTMLPlugInImageElement::loadPlugin(const KURL& url, const String& mimeType,
const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFa
llback) | 242 bool HTMLPlugInImageElement::loadPlugin(const KURL& url, const String& mimeType,
const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFa
llback) |
| 244 { | 243 { |
| 245 Frame* frame = document()->frame(); | 244 Frame* frame = document().frame(); |
| 246 | 245 |
| 247 if (!frame->loader()->allowPlugins(AboutToInstantiatePlugin)) | 246 if (!frame->loader()->allowPlugins(AboutToInstantiatePlugin)) |
| 248 return false; | 247 return false; |
| 249 | 248 |
| 250 if (!pluginIsLoadable(url, mimeType)) | 249 if (!pluginIsLoadable(url, mimeType)) |
| 251 return false; | 250 return false; |
| 252 | 251 |
| 253 RenderEmbeddedObject* renderer = renderEmbeddedObject(); | 252 RenderEmbeddedObject* renderer = renderEmbeddedObject(); |
| 254 | 253 |
| 255 // FIXME: This code should not depend on renderer! | 254 // FIXME: This code should not depend on renderer! |
| 256 if (!renderer || useFallback) | 255 if (!renderer || useFallback) |
| 257 return false; | 256 return false; |
| 258 | 257 |
| 259 LOG(Plugins, "%p Plug-in URL: %s", this, m_url.utf8().data()); | 258 LOG(Plugins, "%p Plug-in URL: %s", this, m_url.utf8().data()); |
| 260 LOG(Plugins, " Loaded URL: %s", url.string().utf8().data()); | 259 LOG(Plugins, " Loaded URL: %s", url.string().utf8().data()); |
| 261 m_loadedUrl = url; | 260 m_loadedUrl = url; |
| 262 | 261 |
| 263 IntSize contentSize = roundedIntSize(LayoutSize(renderer->contentWidth(), re
nderer->contentHeight())); | 262 IntSize contentSize = roundedIntSize(LayoutSize(renderer->contentWidth(), re
nderer->contentHeight())); |
| 264 bool loadManually = document()->isPluginDocument() && !frame->loader()->cont
ainsPlugins() && toPluginDocument(document())->shouldLoadPluginManually(); | 263 bool loadManually = document().isPluginDocument() && !frame->loader()->conta
insPlugins() && toPluginDocument(&document())->shouldLoadPluginManually(); |
| 265 RefPtr<Widget> widget = frame->loader()->client()->createPlugin(contentSize,
this, url, paramNames, paramValues, mimeType, loadManually); | 264 RefPtr<Widget> widget = frame->loader()->client()->createPlugin(contentSize,
this, url, paramNames, paramValues, mimeType, loadManually); |
| 266 | 265 |
| 267 if (!widget) { | 266 if (!widget) { |
| 268 if (!renderer->showsUnavailablePluginIndicator()) | 267 if (!renderer->showsUnavailablePluginIndicator()) |
| 269 renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::Plugin
Missing); | 268 renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::Plugin
Missing); |
| 270 return false; | 269 return false; |
| 271 } | 270 } |
| 272 | 271 |
| 273 renderer->setWidget(widget); | 272 renderer->setWidget(widget); |
| 274 frame->loader()->setContainsPlugins(); | 273 frame->loader()->setContainsPlugins(); |
| 275 setNeedsStyleRecalc(LocalStyleChange, StyleChangeFromRenderer); | 274 setNeedsStyleRecalc(LocalStyleChange, StyleChangeFromRenderer); |
| 276 return true; | 275 return true; |
| 277 } | 276 } |
| 278 | 277 |
| 279 bool HTMLPlugInImageElement::shouldUsePlugin(const KURL& url, const String& mime
Type, bool hasFallback, bool& useFallback) | 278 bool HTMLPlugInImageElement::shouldUsePlugin(const KURL& url, const String& mime
Type, bool hasFallback, bool& useFallback) |
| 280 { | 279 { |
| 281 // Allow other plug-ins to win over QuickTime because if the user has instal
led a plug-in that | 280 // Allow other plug-ins to win over QuickTime because if the user has instal
led a plug-in that |
| 282 // can handle TIFF (which QuickTime can also handle) they probably intended
to override QT. | 281 // can handle TIFF (which QuickTime can also handle) they probably intended
to override QT. |
| 283 if (document()->frame()->page() && (mimeType == "image/tiff" || mimeType ==
"image/tif" || mimeType == "image/x-tiff")) { | 282 if (document().frame()->page() && (mimeType == "image/tiff" || mimeType == "
image/tif" || mimeType == "image/x-tiff")) { |
| 284 const PluginData* pluginData = document()->frame()->page()->pluginData()
; | 283 const PluginData* pluginData = document().frame()->page()->pluginData(); |
| 285 String pluginName = pluginData ? pluginData->pluginNameForMimeType(mimeT
ype) : String(); | 284 String pluginName = pluginData ? pluginData->pluginNameForMimeType(mimeT
ype) : String(); |
| 286 if (!pluginName.isEmpty() && !pluginName.contains("QuickTime", false)) | 285 if (!pluginName.isEmpty() && !pluginName.contains("QuickTime", false)) |
| 287 return true; | 286 return true; |
| 288 } | 287 } |
| 289 | 288 |
| 290 ObjectContentType objectType = document()->frame()->loader()->client()->obje
ctContentType(url, mimeType, shouldPreferPlugInsForImages()); | 289 ObjectContentType objectType = document().frame()->loader()->client()->objec
tContentType(url, mimeType, shouldPreferPlugInsForImages()); |
| 291 // If an object's content can't be handled and it has no fallback, let | 290 // If an object's content can't be handled and it has no fallback, let |
| 292 // it be handled as a plugin to show the broken plugin icon. | 291 // it be handled as a plugin to show the broken plugin icon. |
| 293 useFallback = objectType == ObjectContentNone && hasFallback; | 292 useFallback = objectType == ObjectContentNone && hasFallback; |
| 294 return objectType == ObjectContentNone || objectType == ObjectContentNetscap
ePlugin || objectType == ObjectContentOtherPlugin; | 293 return objectType == ObjectContentNone || objectType == ObjectContentNetscap
ePlugin || objectType == ObjectContentOtherPlugin; |
| 295 | 294 |
| 296 } | 295 } |
| 297 | 296 |
| 298 bool HTMLPlugInImageElement::pluginIsLoadable(const KURL& url, const String& mim
eType) | 297 bool HTMLPlugInImageElement::pluginIsLoadable(const KURL& url, const String& mim
eType) |
| 299 { | 298 { |
| 300 Frame* frame = document()->frame(); | 299 Frame* frame = document().frame(); |
| 301 Settings* settings = frame->settings(); | 300 Settings* settings = frame->settings(); |
| 302 if (!settings) | 301 if (!settings) |
| 303 return false; | 302 return false; |
| 304 | 303 |
| 305 if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) { | 304 if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) { |
| 306 if (!settings->isJavaEnabled()) | 305 if (!settings->isJavaEnabled()) |
| 307 return false; | 306 return false; |
| 308 } | 307 } |
| 309 | 308 |
| 310 if (document()->isSandboxed(SandboxPlugins)) | 309 if (document().isSandboxed(SandboxPlugins)) |
| 311 return false; | 310 return false; |
| 312 | 311 |
| 313 if (!document()->securityOrigin()->canDisplay(url)) { | 312 if (!document().securityOrigin()->canDisplay(url)) { |
| 314 FrameLoader::reportLocalLoadFailed(frame, url.string()); | 313 FrameLoader::reportLocalLoadFailed(frame, url.string()); |
| 315 return false; | 314 return false; |
| 316 } | 315 } |
| 317 | 316 |
| 318 String declaredMimeType = document()->isPluginDocument() && document()->owne
rElement() ? | 317 String declaredMimeType = document().isPluginDocument() && document().ownerE
lement() ? |
| 319 document()->ownerElement()->fastGetAttribute(HTMLNames::typeAttr) : | 318 document().ownerElement()->fastGetAttribute(HTMLNames::typeAttr) : |
| 320 fastGetAttribute(HTMLNames::typeAttr); | 319 fastGetAttribute(HTMLNames::typeAttr); |
| 321 if (!document()->contentSecurityPolicy()->allowObjectFromSource(url) | 320 if (!document().contentSecurityPolicy()->allowObjectFromSource(url) |
| 322 || !document()->contentSecurityPolicy()->allowPluginType(mimeType, decla
redMimeType, url)) { | 321 || !document().contentSecurityPolicy()->allowPluginType(mimeType, declar
edMimeType, url)) { |
| 323 renderEmbeddedObject()->setPluginUnavailabilityReason(RenderEmbeddedObje
ct::PluginBlockedByContentSecurityPolicy); | 322 renderEmbeddedObject()->setPluginUnavailabilityReason(RenderEmbeddedObje
ct::PluginBlockedByContentSecurityPolicy); |
| 324 return false; | 323 return false; |
| 325 } | 324 } |
| 326 | 325 |
| 327 if (frame->loader() && !frame->loader()->mixedContentChecker()->canRunInsecu
reContent(document()->securityOrigin(), url)) | 326 if (frame->loader() && !frame->loader()->mixedContentChecker()->canRunInsecu
reContent(document().securityOrigin(), url)) |
| 328 return false; | 327 return false; |
| 329 return true; | 328 return true; |
| 330 } | 329 } |
| 331 | 330 |
| 332 } // namespace WebCore | 331 } // namespace WebCore |
| OLD | NEW |