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 29 matching lines...) Expand all Loading... |
40 #include "core/html/PluginDocument.h" | 40 #include "core/html/PluginDocument.h" |
41 #include "core/input/EventHandler.h" | 41 #include "core/input/EventHandler.h" |
42 #include "core/layout/LayoutBlockFlow.h" | 42 #include "core/layout/LayoutBlockFlow.h" |
43 #include "core/layout/LayoutEmbeddedObject.h" | 43 #include "core/layout/LayoutEmbeddedObject.h" |
44 #include "core/layout/LayoutImage.h" | 44 #include "core/layout/LayoutImage.h" |
45 #include "core/layout/LayoutPart.h" | 45 #include "core/layout/LayoutPart.h" |
46 #include "core/loader/FrameLoaderClient.h" | 46 #include "core/loader/FrameLoaderClient.h" |
47 #include "core/loader/MixedContentChecker.h" | 47 #include "core/loader/MixedContentChecker.h" |
48 #include "core/page/Page.h" | 48 #include "core/page/Page.h" |
49 #include "core/page/scrolling/ScrollingCoordinator.h" | 49 #include "core/page/scrolling/ScrollingCoordinator.h" |
50 #include "core/plugins/PluginPlaceholder.h" | |
51 #include "core/plugins/PluginView.h" | 50 #include "core/plugins/PluginView.h" |
52 #include "platform/Logging.h" | 51 #include "platform/Logging.h" |
53 #include "platform/MIMETypeFromURL.h" | 52 #include "platform/MIMETypeFromURL.h" |
54 #include "platform/MIMETypeRegistry.h" | 53 #include "platform/MIMETypeRegistry.h" |
55 #include "platform/Widget.h" | 54 #include "platform/Widget.h" |
56 #include "platform/plugins/PluginData.h" | 55 #include "platform/plugins/PluginData.h" |
57 #include "public/platform/WebURLRequest.h" | 56 #include "public/platform/WebURLRequest.h" |
58 | 57 |
59 namespace blink { | 58 namespace blink { |
60 | 59 |
(...skipping 19 matching lines...) Expand all Loading... |
80 | 79 |
81 if (m_NPObject) { | 80 if (m_NPObject) { |
82 _NPN_ReleaseObject(m_NPObject); | 81 _NPN_ReleaseObject(m_NPObject); |
83 m_NPObject = 0; | 82 m_NPObject = 0; |
84 } | 83 } |
85 } | 84 } |
86 | 85 |
87 DEFINE_TRACE(HTMLPlugInElement) | 86 DEFINE_TRACE(HTMLPlugInElement) |
88 { | 87 { |
89 visitor->trace(m_imageLoader); | 88 visitor->trace(m_imageLoader); |
90 visitor->trace(m_placeholder); | |
91 visitor->trace(m_persistedPluginWidget); | 89 visitor->trace(m_persistedPluginWidget); |
92 HTMLFrameOwnerElement::trace(visitor); | 90 HTMLFrameOwnerElement::trace(visitor); |
93 } | 91 } |
94 | 92 |
95 #if ENABLE(OILPAN) | 93 #if ENABLE(OILPAN) |
96 void HTMLPlugInElement::disconnectContentFrame() | 94 void HTMLPlugInElement::disconnectContentFrame() |
97 { | 95 { |
98 if (m_persistedPluginWidget) { | 96 if (m_persistedPluginWidget) { |
99 m_persistedPluginWidget->dispose(); | 97 m_persistedPluginWidget->dispose(); |
100 m_persistedPluginWidget = nullptr; | 98 m_persistedPluginWidget = nullptr; |
(...skipping 22 matching lines...) Expand all Loading... |
123 LocalFrame* frame = toPluginView(widget)->pluginFrame(); | 121 LocalFrame* frame = toPluginView(widget)->pluginFrame(); |
124 ASSERT(frame); | 122 ASSERT(frame); |
125 frame->registerPluginElement(this); | 123 frame->registerPluginElement(this); |
126 } | 124 } |
127 #endif | 125 #endif |
128 m_persistedPluginWidget = widget; | 126 m_persistedPluginWidget = widget; |
129 } | 127 } |
130 | 128 |
131 bool HTMLPlugInElement::canProcessDrag() const | 129 bool HTMLPlugInElement::canProcessDrag() const |
132 { | 130 { |
133 if (Widget* widget = existingPluginWidget()) | 131 return pluginWidget() && pluginWidget()->isPluginView() && toPluginView(plug
inWidget())->canProcessDrag(); |
134 return widget->isPluginView() && toPluginView(widget)->canProcessDrag(); | |
135 return false; | |
136 } | 132 } |
137 | 133 |
138 bool HTMLPlugInElement::willRespondToMouseClickEvents() | 134 bool HTMLPlugInElement::willRespondToMouseClickEvents() |
139 { | 135 { |
140 if (isDisabledFormControl()) | 136 if (isDisabledFormControl()) |
141 return false; | 137 return false; |
142 LayoutObject* r = layoutObject(); | 138 LayoutObject* r = layoutObject(); |
143 return r && (r->isEmbeddedObject() || r->isLayoutPart()); | 139 return r && (r->isEmbeddedObject() || r->isLayoutPart()); |
144 } | 140 } |
145 | 141 |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 // a LayoutEmbeddedObject or LayoutPart. | 277 // a LayoutEmbeddedObject or LayoutPart. |
282 if (useFallbackContent()) | 278 if (useFallbackContent()) |
283 return LayoutObject::createObject(this, style); | 279 return LayoutObject::createObject(this, style); |
284 | 280 |
285 if (isImageType()) { | 281 if (isImageType()) { |
286 LayoutImage* image = new LayoutImage(this); | 282 LayoutImage* image = new LayoutImage(this); |
287 image->setImageResource(LayoutImageResource::create()); | 283 image->setImageResource(LayoutImageResource::create()); |
288 return image; | 284 return image; |
289 } | 285 } |
290 | 286 |
291 if (usePlaceholderContent()) | |
292 return new LayoutBlockFlow(this); | |
293 | 287 |
294 return new LayoutEmbeddedObject(this); | 288 return new LayoutEmbeddedObject(this); |
295 } | 289 } |
296 | 290 |
297 void HTMLPlugInElement::finishParsingChildren() | 291 void HTMLPlugInElement::finishParsingChildren() |
298 { | 292 { |
299 HTMLFrameOwnerElement::finishParsingChildren(); | 293 HTMLFrameOwnerElement::finishParsingChildren(); |
300 if (useFallbackContent()) | 294 if (useFallbackContent()) |
301 return; | 295 return; |
302 | 296 |
(...skipping 15 matching lines...) Expand all Loading... |
318 | 312 |
319 // If the host dynamically turns off JavaScript (or Java) we will still | 313 // If the host dynamically turns off JavaScript (or Java) we will still |
320 // return the cached allocated Bindings::Instance. Not supporting this | 314 // return the cached allocated Bindings::Instance. Not supporting this |
321 // edge-case is OK. | 315 // edge-case is OK. |
322 if (!m_pluginWrapper) { | 316 if (!m_pluginWrapper) { |
323 Widget* plugin; | 317 Widget* plugin; |
324 | 318 |
325 if (m_persistedPluginWidget) | 319 if (m_persistedPluginWidget) |
326 plugin = m_persistedPluginWidget.get(); | 320 plugin = m_persistedPluginWidget.get(); |
327 else | 321 else |
328 plugin = pluginWidgetForJSBindings(); | 322 plugin = pluginWidget(); |
329 | 323 |
330 if (plugin) | 324 if (plugin) |
331 m_pluginWrapper = frame->script().createPluginWrapper(plugin); | 325 m_pluginWrapper = frame->script().createPluginWrapper(plugin); |
332 } | 326 } |
333 return m_pluginWrapper.get(); | 327 return m_pluginWrapper.get(); |
334 } | 328 } |
335 | 329 |
336 Widget* HTMLPlugInElement::existingPluginWidget() const | 330 Widget* HTMLPlugInElement::pluginWidget() const |
337 { | |
338 if (LayoutPart* layoutPart = existingLayoutPart()) | |
339 return layoutPart->widget(); | |
340 return nullptr; | |
341 } | |
342 | |
343 Widget* HTMLPlugInElement::pluginWidgetForJSBindings() | |
344 { | 331 { |
345 if (LayoutPart* layoutPart = layoutPartForJSBindings()) | 332 if (LayoutPart* layoutPart = layoutPartForJSBindings()) |
346 return layoutPart->widget(); | 333 return layoutPart->widget(); |
347 return nullptr; | 334 return nullptr; |
348 } | 335 } |
349 | 336 |
350 bool HTMLPlugInElement::isPresentationAttribute(const QualifiedName& name) const | 337 bool HTMLPlugInElement::isPresentationAttribute(const QualifiedName& name) const |
351 { | 338 { |
352 if (name == widthAttr || name == heightAttr || name == vspaceAttr || name ==
hspaceAttr || name == alignAttr) | 339 if (name == widthAttr || name == heightAttr || name == vspaceAttr || name ==
hspaceAttr || name == alignAttr) |
353 return true; | 340 return true; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 { | 392 { |
406 // Needs to load the plugin immediatedly because this function is called | 393 // Needs to load the plugin immediatedly because this function is called |
407 // when JavaScript code accesses the plugin. | 394 // when JavaScript code accesses the plugin. |
408 // FIXME: Check if dispatching events here is safe. | 395 // FIXME: Check if dispatching events here is safe. |
409 document().updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasks
Synchronously); | 396 document().updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasks
Synchronously); |
410 return existingLayoutPart(); | 397 return existingLayoutPart(); |
411 } | 398 } |
412 | 399 |
413 bool HTMLPlugInElement::isKeyboardFocusable() const | 400 bool HTMLPlugInElement::isKeyboardFocusable() const |
414 { | 401 { |
415 if (useFallbackContent() || usePlaceholderContent()) | |
416 return HTMLElement::isKeyboardFocusable(); | |
417 | |
418 if (!document().isActive()) | 402 if (!document().isActive()) |
419 return false; | 403 return false; |
420 | 404 return pluginWidget() && pluginWidget()->isPluginView() && toPluginView(plug
inWidget())->supportsKeyboardFocus(); |
421 if (Widget* widget = existingPluginWidget()) | |
422 return widget->isPluginView() && toPluginView(widget)->supportsKeyboardF
ocus(); | |
423 | |
424 return false; | |
425 } | 405 } |
426 | 406 |
427 bool HTMLPlugInElement::hasCustomFocusLogic() const | 407 bool HTMLPlugInElement::hasCustomFocusLogic() const |
428 { | 408 { |
429 return !useFallbackContent() && !usePlaceholderContent(); | 409 return !useFallbackContent(); |
430 } | 410 } |
431 | 411 |
432 bool HTMLPlugInElement::isPluginElement() const | 412 bool HTMLPlugInElement::isPluginElement() const |
433 { | 413 { |
434 return true; | 414 return true; |
435 } | 415 } |
436 | 416 |
437 bool HTMLPlugInElement::layoutObjectIsFocusable() const | 417 bool HTMLPlugInElement::layoutObjectIsFocusable() const |
438 { | 418 { |
439 if (HTMLFrameOwnerElement::supportsFocus() && HTMLFrameOwnerElement::layoutO
bjectIsFocusable()) | 419 if (HTMLFrameOwnerElement::supportsFocus() && HTMLFrameOwnerElement::layoutO
bjectIsFocusable()) |
440 return true; | 420 return true; |
441 | 421 |
442 if (useFallbackContent() || !layoutObject() || !layoutObject()->isEmbeddedOb
ject()) | 422 if (useFallbackContent() || !layoutObject() || !layoutObject()->isEmbeddedOb
ject()) |
443 return false; | 423 return false; |
444 return !toLayoutEmbeddedObject(layoutObject())->showsUnavailablePluginIndica
tor(); | 424 return !toLayoutEmbeddedObject(layoutObject())->showsUnavailablePluginIndica
tor(); |
445 } | 425 } |
446 | 426 |
447 NPObject* HTMLPlugInElement::getNPObject() | 427 NPObject* HTMLPlugInElement::getNPObject() |
448 { | 428 { |
449 ASSERT(document().frame()); | 429 ASSERT(document().frame()); |
450 if (!m_NPObject) | 430 if (!m_NPObject) |
451 m_NPObject = document().frame()->script().createScriptObjectForPluginEle
ment(this); | 431 m_NPObject = document().frame()->script().createScriptObjectForPluginEle
ment(this); |
452 return m_NPObject; | 432 return m_NPObject; |
453 } | 433 } |
454 | 434 |
455 void HTMLPlugInElement::setPluginFocus(bool focused) | 435 void HTMLPlugInElement::setPluginFocus(bool focused) |
456 { | 436 { |
457 Widget* focusedWidget = existingPluginWidget(); | |
458 // NPAPI flash requires to receive messages when web contents focus changes. | 437 // NPAPI flash requires to receive messages when web contents focus changes. |
459 if (getNPObject() && focusedWidget) | 438 if (getNPObject() && pluginWidget() && pluginWidget()->isPluginView()) |
460 focusedWidget->setFocus(focused, WebFocusTypeNone); | 439 toPluginView(pluginWidget())->setFocus(focused, WebFocusTypeNone); |
461 } | 440 } |
462 | 441 |
463 bool HTMLPlugInElement::isImageType() | 442 bool HTMLPlugInElement::isImageType() |
464 { | 443 { |
465 if (m_serviceType.isEmpty() && protocolIs(m_url, "data")) | 444 if (m_serviceType.isEmpty() && protocolIs(m_url, "data")) |
466 m_serviceType = mimeTypeFromDataURL(m_url); | 445 m_serviceType = mimeTypeFromDataURL(m_url); |
467 | 446 |
468 if (LocalFrame* frame = document().frame()) { | 447 if (LocalFrame* frame = document().frame()) { |
469 KURL completedURL = document().completeURL(m_url); | 448 KURL completedURL = document().completeURL(m_url); |
470 return frame->loader().client()->objectContentType(completedURL, m_servi
ceType, shouldPreferPlugInsForImages()) == ObjectContentImage; | 449 return frame->loader().client()->objectContentType(completedURL, m_servi
ceType, shouldPreferPlugInsForImages()) == ObjectContentImage; |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 | 515 |
537 LayoutEmbeddedObject* layoutObject = layoutEmbeddedObject(); | 516 LayoutEmbeddedObject* layoutObject = layoutEmbeddedObject(); |
538 // FIXME: This code should not depend on layoutObject! | 517 // FIXME: This code should not depend on layoutObject! |
539 if ((!layoutObject && requireLayoutObject) || useFallback) | 518 if ((!layoutObject && requireLayoutObject) || useFallback) |
540 return false; | 519 return false; |
541 | 520 |
542 WTF_LOG(Plugins, "%p Plugin URL: %s", this, m_url.utf8().data()); | 521 WTF_LOG(Plugins, "%p Plugin URL: %s", this, m_url.utf8().data()); |
543 WTF_LOG(Plugins, " Loaded URL: %s", url.string().utf8().data()); | 522 WTF_LOG(Plugins, " Loaded URL: %s", url.string().utf8().data()); |
544 m_loadedUrl = url; | 523 m_loadedUrl = url; |
545 | 524 |
546 OwnPtrWillBeRawPtr<PluginPlaceholder> placeholder = nullptr; | |
547 RefPtrWillBeRawPtr<Widget> widget = m_persistedPluginWidget; | 525 RefPtrWillBeRawPtr<Widget> widget = m_persistedPluginWidget; |
548 if (!widget) { | 526 if (!widget) { |
549 bool loadManually = document().isPluginDocument() && !document().contain
sPlugins(); | 527 bool loadManually = document().isPluginDocument() && !document().contain
sPlugins(); |
550 placeholder = frame->loader().client()->createPluginPlaceholder(document
(), url, paramNames, paramValues, mimeType, loadManually); | 528 FrameLoaderClient::DetachedPluginPolicy policy = requireLayoutObject ? F
rameLoaderClient::FailOnDetachedPlugin : FrameLoaderClient::AllowDetachedPlugin; |
551 if (!placeholder) { | 529 widget = frame->loader().client()->createPlugin(this, url, paramNames, p
aramValues, mimeType, loadManually, policy); |
552 FrameLoaderClient::DetachedPluginPolicy policy = requireLayoutObject
? FrameLoaderClient::FailOnDetachedPlugin : FrameLoaderClient::AllowDetachedPlu
gin; | |
553 widget = frame->loader().client()->createPlugin(this, url, paramName
s, paramValues, mimeType, loadManually, policy); | |
554 } | |
555 } | 530 } |
556 | 531 |
557 if (!placeholder && !widget) { | 532 if (!widget) { |
558 if (layoutObject && !layoutObject->showsUnavailablePluginIndicator()) | 533 if (layoutObject && !layoutObject->showsUnavailablePluginIndicator()) |
559 layoutObject->setPluginUnavailabilityReason(LayoutEmbeddedObject::Pl
uginMissing); | 534 layoutObject->setPluginUnavailabilityReason(LayoutEmbeddedObject::Pl
uginMissing); |
560 setPlaceholder(nullptr); | |
561 return false; | 535 return false; |
562 } | 536 } |
563 | 537 |
564 if (placeholder) { | |
565 setPlaceholder(placeholder.release()); | |
566 return true; | |
567 } | |
568 | |
569 if (layoutObject) { | 538 if (layoutObject) { |
570 setWidget(widget); | 539 setWidget(widget); |
571 setPersistedPluginWidget(nullptr); | 540 setPersistedPluginWidget(nullptr); |
572 } else { | 541 } else { |
573 setPersistedPluginWidget(widget.get()); | 542 setPersistedPluginWidget(widget.get()); |
574 } | 543 } |
575 setPlaceholder(nullptr); | |
576 document().setContainsPlugins(); | 544 document().setContainsPlugins(); |
577 // TODO(esprehn): WebPluginContainerImpl::setWebLayer also schedules a compo
siting update, do we need both? | 545 // TODO(esprehn): WebPluginContainerImpl::setWebLayer also schedules a compo
siting update, do we need both? |
578 setNeedsCompositingUpdate(); | 546 setNeedsCompositingUpdate(); |
579 // Make sure any input event handlers introduced by the plugin are taken int
o account. | 547 // Make sure any input event handlers introduced by the plugin are taken int
o account. |
580 if (Page* page = document().frame()->page()) { | 548 if (Page* page = document().frame()->page()) { |
581 if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordina
tor()) | 549 if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordina
tor()) |
582 scrollingCoordinator->notifyLayoutUpdated(); | 550 scrollingCoordinator->notifyLayoutUpdated(); |
583 } | 551 } |
584 return true; | 552 return true; |
585 } | 553 } |
586 | 554 |
587 bool HTMLPlugInElement::shouldUsePlugin(const KURL& url, const String& mimeType,
bool hasFallback, bool& useFallback) | 555 bool HTMLPlugInElement::shouldUsePlugin(const KURL& url, const String& mimeType,
bool hasFallback, bool& useFallback) |
588 { | 556 { |
589 // Allow other plugins to win over QuickTime because if the user has | 557 // Allow other plugins to win over QuickTime because if the user has |
590 // installed a plugin that can handle TIFF (which QuickTime can also | 558 // installed a plugin that can handle TIFF (which QuickTime can also |
591 // handle) they probably intended to override QT. | 559 // handle) they probably intended to override QT. |
592 if (document().frame()->page() && (mimeType == "image/tiff" || mimeType == "
image/tif" || mimeType == "image/x-tiff")) { | 560 if (document().frame()->page() && (mimeType == "image/tiff" || mimeType == "
image/tif" || mimeType == "image/x-tiff")) { |
593 const PluginData* pluginData = document().frame()->page()->pluginData(); | 561 const PluginData* pluginData = document().frame()->page()->pluginData(); |
594 String pluginName = pluginData ? pluginData->pluginNameForMimeType(mimeT
ype) : String(); | 562 String pluginName = pluginData ? pluginData->pluginNameForMimeType(mimeT
ype) : String(); |
595 if (!pluginName.isEmpty() && !pluginName.contains("QuickTime", TextCaseI
nsensitive)) | 563 if (!pluginName.isEmpty() && !pluginName.contains("QuickTime", TextCaseI
nsensitive)) |
596 return true; | 564 return true; |
597 } | 565 } |
598 | 566 |
599 ObjectContentType objectType = document().frame()->loader().client()->object
ContentType(url, mimeType, shouldPreferPlugInsForImages()); | 567 ObjectContentType objectType = document().frame()->loader().client()->object
ContentType(url, mimeType, shouldPreferPlugInsForImages()); |
600 // If an object's content can't be handled and it has no fallback, let | 568 // If an object's content can't be handled and it has no fallback, let |
601 // it be handled as a plugin to show the broken plugin icon. | 569 // it be handled as a plugin to show the broken plugin icon. |
602 useFallback = objectType == ObjectContentNone && hasFallback; | 570 useFallback = objectType == ObjectContentNone && hasFallback; |
603 return objectType == ObjectContentNone || objectType == ObjectContentNetscap
ePlugin || objectType == ObjectContentOtherPlugin; | 571 return objectType == ObjectContentNone || objectType == ObjectContentNetscap
ePlugin || objectType == ObjectContentOtherPlugin; |
604 } | |
605 | 572 |
606 void HTMLPlugInElement::setPlaceholder(PassOwnPtrWillBeRawPtr<PluginPlaceholder>
placeholder) | |
607 { | |
608 bool needsLazyReattach = (!placeholder) != (!m_placeholder); | |
609 if (placeholder) { | |
610 placeholder->loadIntoContainer(ensureUserAgentShadowRoot()); | |
611 m_placeholder = placeholder; | |
612 } else { | |
613 ShadowRoot& shadowRoot = ensureUserAgentShadowRoot(); | |
614 shadowRoot.removeChildren(); | |
615 shadowRoot.appendChild(HTMLContentElement::create(document())); | |
616 m_placeholder.clear(); | |
617 } | |
618 if (needsLazyReattach) | |
619 lazyReattachIfAttached(); | |
620 } | 573 } |
621 | 574 |
622 void HTMLPlugInElement::dispatchErrorEvent() | 575 void HTMLPlugInElement::dispatchErrorEvent() |
623 { | 576 { |
624 if (document().isPluginDocument() && document().ownerElement()) | 577 if (document().isPluginDocument() && document().ownerElement()) |
625 document().ownerElement()->dispatchEvent(Event::create(EventTypeNames::e
rror)); | 578 document().ownerElement()->dispatchEvent(Event::create(EventTypeNames::e
rror)); |
626 else | 579 else |
627 dispatchEvent(Event::create(EventTypeNames::error)); | 580 dispatchEvent(Event::create(EventTypeNames::error)); |
628 } | 581 } |
629 | 582 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 return false; | 628 return false; |
676 } | 629 } |
677 | 630 |
678 bool HTMLPlugInElement::useFallbackContent() const | 631 bool HTMLPlugInElement::useFallbackContent() const |
679 { | 632 { |
680 return openShadowRoot(); | 633 return openShadowRoot(); |
681 } | 634 } |
682 | 635 |
683 void HTMLPlugInElement::lazyReattachIfNeeded() | 636 void HTMLPlugInElement::lazyReattachIfNeeded() |
684 { | 637 { |
685 if (!useFallbackContent() && !usePlaceholderContent() && needsWidgetUpdate()
&& layoutObject() && !isImageType()) | 638 if (!useFallbackContent() && needsWidgetUpdate() && layoutObject() && !isIma
geType()) |
686 lazyReattachIfAttached(); | 639 lazyReattachIfAttached(); |
687 } | 640 } |
688 | 641 |
689 } | 642 } |
OLD | NEW |