OLD | NEW |
1 /** | 1 /** |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2000 Stefan Schimanski (1Stein@gmx.de) | 4 * (C) 2000 Stefan Schimanski (1Stein@gmx.de) |
5 * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. | 5 * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 15 matching lines...) Expand all Loading... |
26 #include "CSSPropertyNames.h" | 26 #include "CSSPropertyNames.h" |
27 #include "HTMLNames.h" | 27 #include "HTMLNames.h" |
28 #include "bindings/v8/ScriptController.h" | 28 #include "bindings/v8/ScriptController.h" |
29 #include "bindings/v8/npruntime_impl.h" | 29 #include "bindings/v8/npruntime_impl.h" |
30 #include "core/dom/Document.h" | 30 #include "core/dom/Document.h" |
31 #include "core/dom/PostAttachCallbacks.h" | 31 #include "core/dom/PostAttachCallbacks.h" |
32 #include "core/dom/shadow/ShadowRoot.h" | 32 #include "core/dom/shadow/ShadowRoot.h" |
33 #include "core/events/Event.h" | 33 #include "core/events/Event.h" |
34 #include "core/frame/ContentSecurityPolicy.h" | 34 #include "core/frame/ContentSecurityPolicy.h" |
35 #include "core/frame/Frame.h" | 35 #include "core/frame/Frame.h" |
| 36 #include "core/frame/FrameView.h" |
36 #include "core/html/HTMLImageLoader.h" | 37 #include "core/html/HTMLImageLoader.h" |
37 #include "core/html/PluginDocument.h" | 38 #include "core/html/PluginDocument.h" |
38 #include "core/html/shadow/HTMLContentElement.h" | 39 #include "core/html/shadow/HTMLContentElement.h" |
39 #include "core/loader/FrameLoaderClient.h" | 40 #include "core/loader/FrameLoaderClient.h" |
40 #include "core/page/EventHandler.h" | 41 #include "core/page/EventHandler.h" |
41 #include "core/page/Page.h" | 42 #include "core/page/Page.h" |
42 #include "core/page/Settings.h" | 43 #include "core/page/Settings.h" |
43 #include "core/plugins/PluginView.h" | 44 #include "core/plugins/PluginView.h" |
44 #include "core/rendering/RenderEmbeddedObject.h" | 45 #include "core/rendering/RenderEmbeddedObject.h" |
45 #include "core/rendering/RenderImage.h" | 46 #include "core/rendering/RenderImage.h" |
(...skipping 16 matching lines...) Expand all Loading... |
62 , m_NPObject(0) | 63 , m_NPObject(0) |
63 , m_isCapturingMouseEvents(false) | 64 , m_isCapturingMouseEvents(false) |
64 , m_inBeforeLoadEventHandler(false) | 65 , m_inBeforeLoadEventHandler(false) |
65 // m_needsWidgetUpdate(!createdByParser) allows HTMLObjectElement to delay | 66 // m_needsWidgetUpdate(!createdByParser) allows HTMLObjectElement to delay |
66 // widget updates until after all children are parsed. For HTMLEmbedElement | 67 // widget updates until after all children are parsed. For HTMLEmbedElement |
67 // this delay is unnecessary, but it is simpler to make both classes share | 68 // this delay is unnecessary, but it is simpler to make both classes share |
68 // the same codepath in this class. | 69 // the same codepath in this class. |
69 , m_needsWidgetUpdate(!createdByParser) | 70 , m_needsWidgetUpdate(!createdByParser) |
70 , m_shouldPreferPlugInsForImages(preferPlugInsForImagesOption == ShouldPrefe
rPlugInsForImages) | 71 , m_shouldPreferPlugInsForImages(preferPlugInsForImagesOption == ShouldPrefe
rPlugInsForImages) |
71 , m_displayState(Playing) | 72 , m_displayState(Playing) |
| 73 , m_persistedPluginWidget(0) |
72 { | 74 { |
73 setHasCustomStyleCallbacks(); | 75 setHasCustomStyleCallbacks(); |
74 } | 76 } |
75 | 77 |
76 HTMLPlugInElement::~HTMLPlugInElement() | 78 HTMLPlugInElement::~HTMLPlugInElement() |
77 { | 79 { |
78 ASSERT(!m_pluginWrapper); // cleared in detach() | 80 ASSERT(!m_pluginWrapper); // cleared in detach() |
79 ASSERT(!m_isDelayingLoadEvent); | 81 ASSERT(!m_isDelayingLoadEvent); |
80 | 82 |
81 if (m_NPObject) { | 83 if (m_NPObject) { |
82 _NPN_ReleaseObject(m_NPObject); | 84 _NPN_ReleaseObject(m_NPObject); |
83 m_NPObject = 0; | 85 m_NPObject = 0; |
84 } | 86 } |
85 } | 87 } |
86 | 88 |
87 bool HTMLPlugInElement::canProcessDrag() const | 89 bool HTMLPlugInElement::canProcessDrag() const |
88 { | 90 { |
89 return pluginWidget() && pluginWidget()->isPluginView() && toPluginView(plug
inWidget())->canProcessDrag(); | 91 return widget() && widget()->isPluginView() && toPluginView(widget())->canPr
ocessDrag(); |
90 } | 92 } |
91 | 93 |
92 bool HTMLPlugInElement::willRespondToMouseClickEvents() | 94 bool HTMLPlugInElement::willRespondToMouseClickEvents() |
93 { | 95 { |
94 if (isDisabledFormControl()) | 96 if (isDisabledFormControl()) |
95 return false; | 97 return false; |
96 RenderObject* r = renderer(); | 98 RenderObject* r = renderer(); |
97 return r && (r->isEmbeddedObject() || r->isWidget()); | 99 return r && (r->isEmbeddedObject() || r->isWidget()); |
98 } | 100 } |
99 | 101 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 void HTMLPlugInElement::updateWidget() | 138 void HTMLPlugInElement::updateWidget() |
137 { | 139 { |
138 RefPtr<HTMLPlugInElement> protector(this); | 140 RefPtr<HTMLPlugInElement> protector(this); |
139 updateWidgetInternal(); | 141 updateWidgetInternal(); |
140 if (m_isDelayingLoadEvent) { | 142 if (m_isDelayingLoadEvent) { |
141 m_isDelayingLoadEvent = false; | 143 m_isDelayingLoadEvent = false; |
142 document().decrementLoadEventDelayCount(); | 144 document().decrementLoadEventDelayCount(); |
143 } | 145 } |
144 } | 146 } |
145 | 147 |
| 148 void HTMLPlugInElement::requestPluginCreationWithoutRendererIfPossible() |
| 149 { |
| 150 if (m_serviceType.isEmpty()) |
| 151 return; |
| 152 |
| 153 if (!document().frame()->loader().client()->canCreatePluginWithoutRenderer(m
_serviceType)) |
| 154 return; |
| 155 |
| 156 if (renderer() && renderer()->isWidget()) |
| 157 return; |
| 158 |
| 159 createPluginWithoutRenderer(); |
| 160 } |
| 161 |
| 162 void HTMLPlugInElement::createPluginWithoutRenderer() |
| 163 { |
| 164 ASSERT(document().frame()->loader().client()->canCreatePluginWithoutRenderer
(m_serviceType)); |
| 165 |
| 166 KURL url; |
| 167 Vector<String> paramNames; |
| 168 Vector<String> paramValues; |
| 169 |
| 170 paramNames.append("type"); |
| 171 paramValues.append(m_serviceType); |
| 172 |
| 173 bool useFallback = false; |
| 174 loadPlugin(url, m_serviceType, paramNames, paramValues, useFallback, false); |
| 175 } |
| 176 |
146 void HTMLPlugInElement::detach(const AttachContext& context) | 177 void HTMLPlugInElement::detach(const AttachContext& context) |
147 { | 178 { |
148 // Update the widget the next time we attach (detaching destroys the plugin)
. | 179 // Update the widget the next time we attach (detaching destroys the plugin)
. |
149 // FIXME: None of this "needsWidgetUpdate" related code looks right. | 180 // FIXME: None of this "needsWidgetUpdate" related code looks right. |
150 if (renderer() && !useFallbackContent()) | 181 if (renderer() && !useFallbackContent()) |
151 setNeedsWidgetUpdate(true); | 182 setNeedsWidgetUpdate(true); |
152 if (m_isDelayingLoadEvent) { | 183 if (m_isDelayingLoadEvent) { |
153 m_isDelayingLoadEvent = false; | 184 m_isDelayingLoadEvent = false; |
154 document().decrementLoadEventDelayCount(); | 185 document().decrementLoadEventDelayCount(); |
155 } | 186 } |
156 | 187 |
| 188 Widget* plugin = widget(); |
| 189 if (plugin && plugin->pluginShouldPersist()) |
| 190 m_persistedPluginWidget = plugin; |
157 resetInstance(); | 191 resetInstance(); |
| 192 setWidget(0); |
| 193 |
158 | 194 |
159 if (m_isCapturingMouseEvents) { | 195 if (m_isCapturingMouseEvents) { |
160 if (Frame* frame = document().frame()) | 196 if (Frame* frame = document().frame()) |
161 frame->eventHandler().setCapturingMouseEventsNode(0); | 197 frame->eventHandler().setCapturingMouseEventsNode(0); |
162 m_isCapturingMouseEvents = false; | 198 m_isCapturingMouseEvents = false; |
163 } | 199 } |
164 | 200 |
165 if (m_NPObject) { | 201 if (m_NPObject) { |
166 _NPN_ReleaseObject(m_NPObject); | 202 _NPN_ReleaseObject(m_NPObject); |
167 m_NPObject = 0; | 203 m_NPObject = 0; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 SharedPersistent<v8::Object>* HTMLPlugInElement::pluginWrapper() | 249 SharedPersistent<v8::Object>* HTMLPlugInElement::pluginWrapper() |
214 { | 250 { |
215 Frame* frame = document().frame(); | 251 Frame* frame = document().frame(); |
216 if (!frame) | 252 if (!frame) |
217 return 0; | 253 return 0; |
218 | 254 |
219 // If the host dynamically turns off JavaScript (or Java) we will still | 255 // If the host dynamically turns off JavaScript (or Java) we will still |
220 // return the cached allocated Bindings::Instance. Not supporting this | 256 // return the cached allocated Bindings::Instance. Not supporting this |
221 // edge-case is OK. | 257 // edge-case is OK. |
222 if (!m_pluginWrapper) { | 258 if (!m_pluginWrapper) { |
223 if (Widget* widget = pluginWidget()) | 259 Widget* plugin = widget(); |
224 m_pluginWrapper = frame->script().createPluginWrapper(widget); | 260 if (!plugin && m_persistedPluginWidget) |
| 261 plugin = m_persistedPluginWidget.get(); |
| 262 if (!plugin && !m_inBeforeLoadEventHandler) { |
| 263 // If the plugin wasn't created without a renderer, then we can |
| 264 // trigger its creation here. Although widgets are no longer owned |
| 265 // by the renderWidget, the creation of the latter will still lead |
| 266 // to loadPlugin() being called. |
| 267 renderWidgetForJSBindings(); |
| 268 plugin = widget(); |
| 269 } |
| 270 if (plugin) |
| 271 m_pluginWrapper = frame->script().createPluginWrapper(plugin); |
225 } | 272 } |
226 return m_pluginWrapper.get(); | 273 return m_pluginWrapper.get(); |
227 } | 274 } |
228 | 275 |
229 bool HTMLPlugInElement::dispatchBeforeLoadEvent(const String& sourceURL) | 276 bool HTMLPlugInElement::dispatchBeforeLoadEvent(const String& sourceURL) |
230 { | 277 { |
231 // FIXME: Our current plug-in loading design can't guarantee the following | 278 // FIXME: Our current plug-in loading design can't guarantee the following |
232 // assertion is true, since plug-in loading can be initiated during layout, | 279 // assertion is true, since plug-in loading can be initiated during layout, |
233 // and synchronous layout can be initiated in a beforeload event handler! | 280 // and synchronous layout can be initiated in a beforeload event handler! |
234 // See <http://webkit.org/b/71264>. | 281 // See <http://webkit.org/b/71264>. |
235 // ASSERT(!m_inBeforeLoadEventHandler); | 282 // ASSERT(!m_inBeforeLoadEventHandler); |
236 m_inBeforeLoadEventHandler = true; | 283 m_inBeforeLoadEventHandler = true; |
237 bool beforeLoadAllowedLoad = HTMLFrameOwnerElement::dispatchBeforeLoadEvent(
sourceURL); | 284 bool beforeLoadAllowedLoad = HTMLFrameOwnerElement::dispatchBeforeLoadEvent(
sourceURL); |
238 m_inBeforeLoadEventHandler = false; | 285 m_inBeforeLoadEventHandler = false; |
239 return beforeLoadAllowedLoad; | 286 return beforeLoadAllowedLoad; |
240 } | 287 } |
241 | 288 |
242 Widget* HTMLPlugInElement::pluginWidget() const | |
243 { | |
244 if (m_inBeforeLoadEventHandler) { | |
245 // The plug-in hasn't loaded yet, and it makes no sense to try to load | |
246 // if beforeload handler happened to touch the plug-in element. That | |
247 // would recursively call beforeload for the same element. | |
248 return 0; | |
249 } | |
250 | |
251 if (RenderWidget* renderWidget = renderWidgetForJSBindings()) | |
252 return renderWidget->widget(); | |
253 return 0; | |
254 } | |
255 | |
256 bool HTMLPlugInElement::isPresentationAttribute(const QualifiedName& name) const | 289 bool HTMLPlugInElement::isPresentationAttribute(const QualifiedName& name) const |
257 { | 290 { |
258 if (name == widthAttr || name == heightAttr || name == vspaceAttr || name ==
hspaceAttr || name == alignAttr) | 291 if (name == widthAttr || name == heightAttr || name == vspaceAttr || name ==
hspaceAttr || name == alignAttr) |
259 return true; | 292 return true; |
260 return HTMLFrameOwnerElement::isPresentationAttribute(name); | 293 return HTMLFrameOwnerElement::isPresentationAttribute(name); |
261 } | 294 } |
262 | 295 |
263 void HTMLPlugInElement::collectStyleForPresentationAttribute(const QualifiedName
& name, const AtomicString& value, MutableStylePropertySet* style) | 296 void HTMLPlugInElement::collectStyleForPresentationAttribute(const QualifiedName
& name, const AtomicString& value, MutableStylePropertySet* style) |
264 { | 297 { |
265 if (name == widthAttr) { | 298 if (name == widthAttr) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 // when JavaScript code accesses the plugin. | 348 // when JavaScript code accesses the plugin. |
316 // FIXME: Check if dispatching events here is safe. | 349 // FIXME: Check if dispatching events here is safe. |
317 document().updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasks
Synchronously); | 350 document().updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasks
Synchronously); |
318 return existingRenderWidget(); | 351 return existingRenderWidget(); |
319 } | 352 } |
320 | 353 |
321 bool HTMLPlugInElement::isKeyboardFocusable() const | 354 bool HTMLPlugInElement::isKeyboardFocusable() const |
322 { | 355 { |
323 if (!document().page()) | 356 if (!document().page()) |
324 return false; | 357 return false; |
325 return pluginWidget() && pluginWidget()->isPluginView() && toPluginView(plug
inWidget())->supportsKeyboardFocus(); | 358 return widget() && widget()->isPluginView() && toPluginView(widget())->suppo
rtsKeyboardFocus(); |
326 } | 359 } |
327 | 360 |
328 bool HTMLPlugInElement::isPluginElement() const | 361 bool HTMLPlugInElement::isPluginElement() const |
329 { | 362 { |
330 return true; | 363 return true; |
331 } | 364 } |
332 | 365 |
333 bool HTMLPlugInElement::rendererIsFocusable() const | 366 bool HTMLPlugInElement::rendererIsFocusable() const |
334 { | 367 { |
335 if (HTMLFrameOwnerElement::supportsFocus() && HTMLFrameOwnerElement::rendere
rIsFocusable()) | 368 if (HTMLFrameOwnerElement::supportsFocus() && HTMLFrameOwnerElement::rendere
rIsFocusable()) |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 | 440 |
408 // FIXME: None of this code should use renderers! | 441 // FIXME: None of this code should use renderers! |
409 RenderEmbeddedObject* renderer = renderEmbeddedObject(); | 442 RenderEmbeddedObject* renderer = renderEmbeddedObject(); |
410 ASSERT(renderer); | 443 ASSERT(renderer); |
411 if (!renderer) | 444 if (!renderer) |
412 return false; | 445 return false; |
413 | 446 |
414 KURL completedURL = document().completeURL(url); | 447 KURL completedURL = document().completeURL(url); |
415 | 448 |
416 bool useFallback; | 449 bool useFallback; |
| 450 bool requireRenderer = true; |
417 if (shouldUsePlugin(completedURL, mimeType, renderer->hasFallbackContent(),
useFallback)) | 451 if (shouldUsePlugin(completedURL, mimeType, renderer->hasFallbackContent(),
useFallback)) |
418 return loadPlugin(completedURL, mimeType, paramNames, paramValues, useFa
llback); | 452 return loadPlugin(completedURL, mimeType, paramNames, paramValues, useFa
llback, requireRenderer); |
419 | 453 |
420 // If the plug-in element already contains a subframe, | 454 // If the plug-in element already contains a subframe, |
421 // loadOrRedirectSubframe will re-use it. Otherwise, it will create a new | 455 // loadOrRedirectSubframe will re-use it. Otherwise, it will create a new |
422 // frame and set it as the RenderPart's widget, causing what was previously | 456 // frame and set it as the RenderPart's widget, causing what was previously |
423 // in the widget to be torn down. | 457 // in the widget to be torn down. |
424 return loadOrRedirectSubframe(completedURL, getNameAttribute(), true); | 458 return loadOrRedirectSubframe(completedURL, getNameAttribute(), true); |
425 } | 459 } |
426 | 460 |
427 bool HTMLPlugInElement::loadPlugin(const KURL& url, const String& mimeType, cons
t Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallbac
k) | 461 bool HTMLPlugInElement::loadPlugin(const KURL& url, const String& mimeType, cons
t Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallbac
k, bool requireRenderer) |
428 { | 462 { |
429 Frame* frame = document().frame(); | 463 Frame* frame = document().frame(); |
430 | 464 |
431 if (!frame->loader().allowPlugins(AboutToInstantiatePlugin)) | 465 if (!frame->loader().allowPlugins(AboutToInstantiatePlugin)) |
432 return false; | 466 return false; |
433 | 467 |
434 if (!pluginIsLoadable(url, mimeType)) | 468 if (!pluginIsLoadable(url, mimeType)) |
435 return false; | 469 return false; |
436 | 470 |
437 RenderEmbeddedObject* renderer = renderEmbeddedObject(); | 471 RenderEmbeddedObject* renderer = renderEmbeddedObject(); |
438 // FIXME: This code should not depend on renderer! | 472 // FIXME: This code should not depend on renderer! |
439 if (!renderer || useFallback) | 473 if ((!renderer && requireRenderer) || useFallback) |
440 return false; | 474 return false; |
441 | 475 |
| 476 FrameLoaderClient::PluginLoadType loadType = renderer ? FrameLoaderClient::P
luginLoadRequiresRenderer : FrameLoaderClient::PluginLoadWithoutRenderer; |
| 477 |
442 WTF_LOG(Plugins, "%p Plug-in URL: %s", this, m_url.utf8().data()); | 478 WTF_LOG(Plugins, "%p Plug-in URL: %s", this, m_url.utf8().data()); |
443 WTF_LOG(Plugins, " Loaded URL: %s", url.string().utf8().data()); | 479 WTF_LOG(Plugins, " Loaded URL: %s", url.string().utf8().data()); |
| 480 |
444 m_loadedUrl = url; | 481 m_loadedUrl = url; |
445 | 482 |
446 IntSize contentSize = roundedIntSize(LayoutSize(renderer->contentWidth(), re
nderer->contentHeight())); | 483 IntSize contentSize; |
447 bool loadManually = document().isPluginDocument() && !document().containsPlu
gins() && toPluginDocument(document()).shouldLoadPluginManually(); | 484 if (renderer) |
448 RefPtr<Widget> widget = frame->loader().client()->createPlugin(contentSize,
this, url, paramNames, paramValues, mimeType, loadManually); | 485 contentSize = roundedIntSize(LayoutSize(renderer->contentWidth(), render
er->contentHeight())); |
| 486 RefPtr<Widget> plugin = m_persistedPluginWidget; |
449 | 487 |
450 if (!widget) { | 488 if (!plugin) { |
451 if (!renderer->showsUnavailablePluginIndicator()) | 489 bool loadManually = document().isPluginDocument() && !document().contain
sPlugins() && toPluginDocument(document()).shouldLoadPluginManually(); |
| 490 plugin = frame->loader().client()->createPlugin(contentSize, this, url,
paramNames, paramValues, mimeType, loadManually, loadType); |
| 491 } |
| 492 |
| 493 if (!plugin) { |
| 494 if (renderer && !renderer->showsUnavailablePluginIndicator()) |
452 renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::Plugin
Missing); | 495 renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::Plugin
Missing); |
453 return false; | 496 return false; |
454 } | 497 } |
455 | 498 |
456 renderer->setWidget(widget); | 499 ASSERT(plugin->isPluginContainer()); |
| 500 |
| 501 if (renderer) { |
| 502 // FIXME: We assume we don't layout without a renderer, but check this a
ssumption. |
| 503 setWidget(plugin); |
| 504 m_persistedPluginWidget = 0; |
| 505 } else { |
| 506 if (plugin != m_persistedPluginWidget) |
| 507 m_persistedPluginWidget = plugin; |
| 508 } |
| 509 // FIXME: it may be that nothing has change (we might be continuing to |
| 510 // persist the same plugin? In that case, would we need to recalc style? |
| 511 setNeedsStyleRecalc(LocalStyleChange, StyleChangeFromRenderer); |
457 document().setContainsPlugins(); | 512 document().setContainsPlugins(); |
458 setNeedsStyleRecalc(LocalStyleChange, StyleChangeFromRenderer); | |
459 return true; | 513 return true; |
460 } | 514 } |
461 | 515 |
462 bool HTMLPlugInElement::shouldUsePlugin(const KURL& url, const String& mimeType,
bool hasFallback, bool& useFallback) | 516 bool HTMLPlugInElement::shouldUsePlugin(const KURL& url, const String& mimeType,
bool hasFallback, bool& useFallback) |
463 { | 517 { |
464 // Allow other plug-ins to win over QuickTime because if the user has | 518 // Allow other plug-ins to win over QuickTime because if the user has |
465 // installed a plug-in that can handle TIFF (which QuickTime can also | 519 // installed a plug-in that can handle TIFF (which QuickTime can also |
466 // handle) they probably intended to override QT. | 520 // handle) they probably intended to override QT. |
467 if (document().frame()->page() && (mimeType == "image/tiff" || mimeType == "
image/tif" || mimeType == "image/x-tiff")) { | 521 if (document().frame()->page() && (mimeType == "image/tiff" || mimeType == "
image/tif" || mimeType == "image/x-tiff")) { |
468 const PluginData* pluginData = document().frame()->page()->pluginData(); | 522 const PluginData* pluginData = document().frame()->page()->pluginData(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 if (root.isOldestAuthorShadowRoot()) | 573 if (root.isOldestAuthorShadowRoot()) |
520 lazyReattachIfAttached(); | 574 lazyReattachIfAttached(); |
521 } | 575 } |
522 | 576 |
523 bool HTMLPlugInElement::useFallbackContent() const | 577 bool HTMLPlugInElement::useFallbackContent() const |
524 { | 578 { |
525 return hasAuthorShadowRoot(); | 579 return hasAuthorShadowRoot(); |
526 } | 580 } |
527 | 581 |
528 } | 582 } |
OLD | NEW |