| 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 28 matching lines...) Expand all Loading... |
| 39 #include "core/html/PluginDocument.h" | 39 #include "core/html/PluginDocument.h" |
| 40 #include "core/input/EventHandler.h" | 40 #include "core/input/EventHandler.h" |
| 41 #include "core/inspector/ConsoleMessage.h" | 41 #include "core/inspector/ConsoleMessage.h" |
| 42 #include "core/layout/LayoutImage.h" | 42 #include "core/layout/LayoutImage.h" |
| 43 #include "core/layout/LayoutPart.h" | 43 #include "core/layout/LayoutPart.h" |
| 44 #include "core/layout/api/LayoutEmbeddedItem.h" | 44 #include "core/layout/api/LayoutEmbeddedItem.h" |
| 45 #include "core/loader/MixedContentChecker.h" | 45 #include "core/loader/MixedContentChecker.h" |
| 46 #include "core/page/Page.h" | 46 #include "core/page/Page.h" |
| 47 #include "core/page/scrolling/ScrollingCoordinator.h" | 47 #include "core/page/scrolling/ScrollingCoordinator.h" |
| 48 #include "core/plugins/PluginView.h" | 48 #include "core/plugins/PluginView.h" |
| 49 #include "platform/FrameViewBase.h" |
| 49 #include "platform/Histogram.h" | 50 #include "platform/Histogram.h" |
| 50 #include "platform/Widget.h" | |
| 51 #include "platform/network/ResourceRequest.h" | 51 #include "platform/network/ResourceRequest.h" |
| 52 #include "platform/network/mime/MIMETypeFromURL.h" | 52 #include "platform/network/mime/MIMETypeFromURL.h" |
| 53 #include "platform/network/mime/MIMETypeRegistry.h" | 53 #include "platform/network/mime/MIMETypeRegistry.h" |
| 54 #include "platform/plugins/PluginData.h" | 54 #include "platform/plugins/PluginData.h" |
| 55 #include "public/platform/WebURLRequest.h" | 55 #include "public/platform/WebURLRequest.h" |
| 56 | 56 |
| 57 namespace blink { | 57 namespace blink { |
| 58 | 58 |
| 59 using namespace HTMLNames; | 59 using namespace HTMLNames; |
| 60 | 60 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 71 } // anonymous namespace | 71 } // anonymous namespace |
| 72 | 72 |
| 73 HTMLPlugInElement::HTMLPlugInElement( | 73 HTMLPlugInElement::HTMLPlugInElement( |
| 74 const QualifiedName& tagName, | 74 const QualifiedName& tagName, |
| 75 Document& doc, | 75 Document& doc, |
| 76 bool createdByParser, | 76 bool createdByParser, |
| 77 PreferPlugInsForImagesOption preferPlugInsForImagesOption) | 77 PreferPlugInsForImagesOption preferPlugInsForImagesOption) |
| 78 : HTMLFrameOwnerElement(tagName, doc), | 78 : HTMLFrameOwnerElement(tagName, doc), |
| 79 m_isDelayingLoadEvent(false), | 79 m_isDelayingLoadEvent(false), |
| 80 // m_needsWidgetUpdate(!createdByParser) allows HTMLObjectElement to delay | 80 // m_needsWidgetUpdate(!createdByParser) allows HTMLObjectElement to delay |
| 81 // widget updates until after all children are parsed. For | 81 // FrameViewBase updates until after all children are parsed. For |
| 82 // HTMLEmbedElement this delay is unnecessary, but it is simpler to make | 82 // HTMLEmbedElement this delay is unnecessary, but it is simpler to make |
| 83 // both classes share the same codepath in this class. | 83 // both classes share the same codepath in this class. |
| 84 m_needsWidgetUpdate(!createdByParser), | 84 m_needsWidgetUpdate(!createdByParser), |
| 85 m_shouldPreferPlugInsForImages(preferPlugInsForImagesOption == | 85 m_shouldPreferPlugInsForImages(preferPlugInsForImagesOption == |
| 86 ShouldPreferPlugInsForImages) {} | 86 ShouldPreferPlugInsForImages) {} |
| 87 | 87 |
| 88 HTMLPlugInElement::~HTMLPlugInElement() { | 88 HTMLPlugInElement::~HTMLPlugInElement() { |
| 89 DCHECK(!m_pluginWrapper); // cleared in detachLayoutTree() | 89 DCHECK(!m_pluginWrapper); // cleared in detachLayoutTree() |
| 90 DCHECK(!m_isDelayingLoadEvent); | 90 DCHECK(!m_isDelayingLoadEvent); |
| 91 } | 91 } |
| 92 | 92 |
| 93 DEFINE_TRACE(HTMLPlugInElement) { | 93 DEFINE_TRACE(HTMLPlugInElement) { |
| 94 visitor->trace(m_imageLoader); | 94 visitor->trace(m_imageLoader); |
| 95 visitor->trace(m_persistedPluginWidget); | 95 visitor->trace(m_persistedPluginWidget); |
| 96 HTMLFrameOwnerElement::trace(visitor); | 96 HTMLFrameOwnerElement::trace(visitor); |
| 97 } | 97 } |
| 98 | 98 |
| 99 void HTMLPlugInElement::setPersistedPluginWidget(Widget* widget) { | 99 void HTMLPlugInElement::setPersistedPluginWidget(FrameViewBase* frameViewBase) { |
| 100 if (m_persistedPluginWidget == widget) | 100 if (m_persistedPluginWidget == frameViewBase) |
| 101 return; | 101 return; |
| 102 if (m_persistedPluginWidget) { | 102 if (m_persistedPluginWidget) { |
| 103 if (m_persistedPluginWidget->isPluginView()) { | 103 if (m_persistedPluginWidget->isPluginView()) { |
| 104 m_persistedPluginWidget->hide(); | 104 m_persistedPluginWidget->hide(); |
| 105 disposeWidgetSoon(m_persistedPluginWidget.release()); | 105 disposeWidgetSoon(m_persistedPluginWidget.release()); |
| 106 } else { | 106 } else { |
| 107 DCHECK(m_persistedPluginWidget->isFrameView() || | 107 DCHECK(m_persistedPluginWidget->isFrameView() || |
| 108 m_persistedPluginWidget->isRemoteFrameView()); | 108 m_persistedPluginWidget->isRemoteFrameView()); |
| 109 } | 109 } |
| 110 } | 110 } |
| 111 m_persistedPluginWidget = widget; | 111 m_persistedPluginWidget = frameViewBase; |
| 112 } | 112 } |
| 113 | 113 |
| 114 bool HTMLPlugInElement::requestObjectInternal( | 114 bool HTMLPlugInElement::requestObjectInternal( |
| 115 const String& url, | 115 const String& url, |
| 116 const String& mimeType, | 116 const String& mimeType, |
| 117 const Vector<String>& paramNames, | 117 const Vector<String>& paramNames, |
| 118 const Vector<String>& paramValues) { | 118 const Vector<String>& paramValues) { |
| 119 if (url.isEmpty() && mimeType.isEmpty()) | 119 if (url.isEmpty() && mimeType.isEmpty()) |
| 120 return false; | 120 return false; |
| 121 | 121 |
| 122 if (protocolIsJavaScript(url)) | 122 if (protocolIsJavaScript(url)) |
| 123 return false; | 123 return false; |
| 124 | 124 |
| 125 KURL completedURL = url.isEmpty() ? KURL() : document().completeURL(url); | 125 KURL completedURL = url.isEmpty() ? KURL() : document().completeURL(url); |
| 126 if (!allowedToLoadObject(completedURL, mimeType)) | 126 if (!allowedToLoadObject(completedURL, mimeType)) |
| 127 return false; | 127 return false; |
| 128 | 128 |
| 129 bool useFallback; | 129 bool useFallback; |
| 130 if (!shouldUsePlugin(completedURL, mimeType, hasFallbackContent(), | 130 if (!shouldUsePlugin(completedURL, mimeType, hasFallbackContent(), |
| 131 useFallback)) { | 131 useFallback)) { |
| 132 // If the plugin element already contains a subframe, | 132 // If the plugin element already contains a subframe, |
| 133 // loadOrRedirectSubframe will re-use it. Otherwise, it will create a | 133 // loadOrRedirectSubframe will re-use it. Otherwise, it will create a |
| 134 // new frame and set it as the LayoutPart's widget, causing what was | 134 // new frame and set it as the LayoutPart's FrameViewBase, causing what was |
| 135 // previously in the widget to be torn down. | 135 // previously in the FrameViewBase to be torn down. |
| 136 return loadOrRedirectSubframe(completedURL, getNameAttribute(), true); | 136 return loadOrRedirectSubframe(completedURL, getNameAttribute(), true); |
| 137 } | 137 } |
| 138 | 138 |
| 139 return loadPlugin(completedURL, mimeType, paramNames, paramValues, | 139 return loadPlugin(completedURL, mimeType, paramNames, paramValues, |
| 140 useFallback, true); | 140 useFallback, true); |
| 141 } | 141 } |
| 142 | 142 |
| 143 bool HTMLPlugInElement::canProcessDrag() const { | 143 bool HTMLPlugInElement::canProcessDrag() const { |
| 144 return pluginWidget() && pluginWidget()->isPluginView() && | 144 return pluginWidget() && pluginWidget()->isPluginView() && |
| 145 toPluginView(pluginWidget())->canProcessDrag(); | 145 toPluginView(pluginWidget())->canProcessDrag(); |
| 146 } | 146 } |
| 147 | 147 |
| 148 bool HTMLPlugInElement::canStartSelection() const { | 148 bool HTMLPlugInElement::canStartSelection() const { |
| 149 return useFallbackContent() && Node::canStartSelection(); | 149 return useFallbackContent() && Node::canStartSelection(); |
| 150 } | 150 } |
| 151 | 151 |
| 152 bool HTMLPlugInElement::willRespondToMouseClickEvents() { | 152 bool HTMLPlugInElement::willRespondToMouseClickEvents() { |
| 153 if (isDisabledFormControl()) | 153 if (isDisabledFormControl()) |
| 154 return false; | 154 return false; |
| 155 LayoutObject* r = layoutObject(); | 155 LayoutObject* r = layoutObject(); |
| 156 return r && (r->isEmbeddedObject() || r->isLayoutPart()); | 156 return r && (r->isEmbeddedObject() || r->isLayoutPart()); |
| 157 } | 157 } |
| 158 | 158 |
| 159 void HTMLPlugInElement::removeAllEventListeners() { | 159 void HTMLPlugInElement::removeAllEventListeners() { |
| 160 HTMLFrameOwnerElement::removeAllEventListeners(); | 160 HTMLFrameOwnerElement::removeAllEventListeners(); |
| 161 if (LayoutPart* layoutObject = existingLayoutPart()) { | 161 if (LayoutPart* layoutObject = existingLayoutPart()) { |
| 162 if (Widget* widget = layoutObject->widget()) | 162 if (FrameViewBase* frameViewBase = layoutObject->widget()) |
| 163 widget->eventListenersRemoved(); | 163 frameViewBase->eventListenersRemoved(); |
| 164 } | 164 } |
| 165 } | 165 } |
| 166 | 166 |
| 167 void HTMLPlugInElement::didMoveToNewDocument(Document& oldDocument) { | 167 void HTMLPlugInElement::didMoveToNewDocument(Document& oldDocument) { |
| 168 if (m_imageLoader) | 168 if (m_imageLoader) |
| 169 m_imageLoader->elementDidMoveToNewDocument(); | 169 m_imageLoader->elementDidMoveToNewDocument(); |
| 170 HTMLFrameOwnerElement::didMoveToNewDocument(oldDocument); | 170 HTMLFrameOwnerElement::didMoveToNewDocument(oldDocument); |
| 171 } | 171 } |
| 172 | 172 |
| 173 void HTMLPlugInElement::attachLayoutTree(const AttachContext& context) { | 173 void HTMLPlugInElement::attachLayoutTree(const AttachContext& context) { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 Vector<String> paramValues; | 245 Vector<String> paramValues; |
| 246 | 246 |
| 247 paramNames.push_back("type"); | 247 paramNames.push_back("type"); |
| 248 paramValues.push_back(m_serviceType); | 248 paramValues.push_back(m_serviceType); |
| 249 | 249 |
| 250 bool useFallback = false; | 250 bool useFallback = false; |
| 251 loadPlugin(url, m_serviceType, paramNames, paramValues, useFallback, false); | 251 loadPlugin(url, m_serviceType, paramNames, paramValues, useFallback, false); |
| 252 } | 252 } |
| 253 | 253 |
| 254 bool HTMLPlugInElement::shouldAccelerate() const { | 254 bool HTMLPlugInElement::shouldAccelerate() const { |
| 255 if (Widget* widget = ownedWidget()) | 255 if (FrameViewBase* frameViewBase = ownedWidget()) { |
| 256 return widget->isPluginView() && toPluginView(widget)->platformLayer(); | 256 return frameViewBase->isPluginView() && |
| 257 toPluginView(frameViewBase)->platformLayer(); |
| 258 } |
| 257 return false; | 259 return false; |
| 258 } | 260 } |
| 259 | 261 |
| 260 void HTMLPlugInElement::detachLayoutTree(const AttachContext& context) { | 262 void HTMLPlugInElement::detachLayoutTree(const AttachContext& context) { |
| 261 // Update the widget the next time we attach (detaching destroys the plugin). | 263 // Update the FrameViewBase the next time we attach (detaching destroys the |
| 264 // plugin). |
| 262 // FIXME: None of this "needsWidgetUpdate" related code looks right. | 265 // FIXME: None of this "needsWidgetUpdate" related code looks right. |
| 263 if (layoutObject() && !useFallbackContent()) | 266 if (layoutObject() && !useFallbackContent()) |
| 264 setNeedsWidgetUpdate(true); | 267 setNeedsWidgetUpdate(true); |
| 265 if (m_isDelayingLoadEvent) { | 268 if (m_isDelayingLoadEvent) { |
| 266 m_isDelayingLoadEvent = false; | 269 m_isDelayingLoadEvent = false; |
| 267 document().decrementLoadEventDelayCount(); | 270 document().decrementLoadEventDelayCount(); |
| 268 } | 271 } |
| 269 | 272 |
| 270 // Only try to persist a plugin widget we actually own. | 273 // Only try to persist a plugin FrameViewBase we actually own. |
| 271 Widget* plugin = ownedWidget(); | 274 FrameViewBase* plugin = ownedWidget(); |
| 272 if (plugin && context.performingReattach) { | 275 if (plugin && context.performingReattach) { |
| 273 setPersistedPluginWidget(releaseWidget()); | 276 setPersistedPluginWidget(releaseWidget()); |
| 274 } else { | 277 } else { |
| 275 // Clear the widget; will trigger disposal of it with Oilpan. | 278 // Clear the FrameViewBase; will trigger disposal of it with Oilpan. |
| 276 setWidget(nullptr); | 279 setWidget(nullptr); |
| 277 } | 280 } |
| 278 | 281 |
| 279 resetInstance(); | 282 resetInstance(); |
| 280 | 283 |
| 281 HTMLFrameOwnerElement::detachLayoutTree(context); | 284 HTMLFrameOwnerElement::detachLayoutTree(context); |
| 282 } | 285 } |
| 283 | 286 |
| 284 LayoutObject* HTMLPlugInElement::createLayoutObject( | 287 LayoutObject* HTMLPlugInElement::createLayoutObject( |
| 285 const ComputedStyle& style) { | 288 const ComputedStyle& style) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 315 | 318 |
| 316 SharedPersistent<v8::Object>* HTMLPlugInElement::pluginWrapper() { | 319 SharedPersistent<v8::Object>* HTMLPlugInElement::pluginWrapper() { |
| 317 LocalFrame* frame = document().frame(); | 320 LocalFrame* frame = document().frame(); |
| 318 if (!frame) | 321 if (!frame) |
| 319 return nullptr; | 322 return nullptr; |
| 320 | 323 |
| 321 // If the host dynamically turns off JavaScript (or Java) we will still | 324 // If the host dynamically turns off JavaScript (or Java) we will still |
| 322 // return the cached allocated Bindings::Instance. Not supporting this | 325 // return the cached allocated Bindings::Instance. Not supporting this |
| 323 // edge-case is OK. | 326 // edge-case is OK. |
| 324 if (!m_pluginWrapper) { | 327 if (!m_pluginWrapper) { |
| 325 Widget* plugin; | 328 FrameViewBase* plugin; |
| 326 | 329 |
| 327 if (m_persistedPluginWidget) | 330 if (m_persistedPluginWidget) |
| 328 plugin = m_persistedPluginWidget.get(); | 331 plugin = m_persistedPluginWidget.get(); |
| 329 else | 332 else |
| 330 plugin = pluginWidget(); | 333 plugin = pluginWidget(); |
| 331 | 334 |
| 332 if (plugin) | 335 if (plugin) |
| 333 m_pluginWrapper = frame->script().createPluginWrapper(plugin); | 336 m_pluginWrapper = frame->script().createPluginWrapper(plugin); |
| 334 } | 337 } |
| 335 return m_pluginWrapper.get(); | 338 return m_pluginWrapper.get(); |
| 336 } | 339 } |
| 337 | 340 |
| 338 Widget* HTMLPlugInElement::pluginWidget() const { | 341 FrameViewBase* HTMLPlugInElement::pluginWidget() const { |
| 339 if (LayoutPart* layoutPart = layoutPartForJSBindings()) | 342 if (LayoutPart* layoutPart = layoutPartForJSBindings()) |
| 340 return layoutPart->widget(); | 343 return layoutPart->widget(); |
| 341 return nullptr; | 344 return nullptr; |
| 342 } | 345 } |
| 343 | 346 |
| 344 bool HTMLPlugInElement::isPresentationAttribute( | 347 bool HTMLPlugInElement::isPresentationAttribute( |
| 345 const QualifiedName& name) const { | 348 const QualifiedName& name) const { |
| 346 if (name == widthAttr || name == heightAttr || name == vspaceAttr || | 349 if (name == widthAttr || name == heightAttr || name == vspaceAttr || |
| 347 name == hspaceAttr || name == alignAttr) | 350 name == hspaceAttr || name == alignAttr) |
| 348 return true; | 351 return true; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 // code in EventHandler; these code paths should be united. | 386 // code in EventHandler; these code paths should be united. |
| 384 | 387 |
| 385 LayoutObject* r = layoutObject(); | 388 LayoutObject* r = layoutObject(); |
| 386 if (!r || !r->isLayoutPart()) | 389 if (!r || !r->isLayoutPart()) |
| 387 return; | 390 return; |
| 388 if (r->isEmbeddedObject()) { | 391 if (r->isEmbeddedObject()) { |
| 389 if (LayoutEmbeddedItem(toLayoutEmbeddedObject(r)) | 392 if (LayoutEmbeddedItem(toLayoutEmbeddedObject(r)) |
| 390 .showsUnavailablePluginIndicator()) | 393 .showsUnavailablePluginIndicator()) |
| 391 return; | 394 return; |
| 392 } | 395 } |
| 393 Widget* widget = toLayoutPart(r)->widget(); | 396 FrameViewBase* frameViewBase = toLayoutPart(r)->widget(); |
| 394 if (!widget) | 397 if (!frameViewBase) |
| 395 return; | 398 return; |
| 396 widget->handleEvent(event); | 399 frameViewBase->handleEvent(event); |
| 397 if (event->defaultHandled()) | 400 if (event->defaultHandled()) |
| 398 return; | 401 return; |
| 399 HTMLFrameOwnerElement::defaultEventHandler(event); | 402 HTMLFrameOwnerElement::defaultEventHandler(event); |
| 400 } | 403 } |
| 401 | 404 |
| 402 LayoutPart* HTMLPlugInElement::layoutPartForJSBindings() const { | 405 LayoutPart* HTMLPlugInElement::layoutPartForJSBindings() const { |
| 403 // Needs to load the plugin immediatedly because this function is called | 406 // Needs to load the plugin immediatedly because this function is called |
| 404 // when JavaScript code accesses the plugin. | 407 // when JavaScript code accesses the plugin. |
| 405 // FIXME: Check if dispatching events here is safe. | 408 // FIXME: Check if dispatching events here is safe. |
| 406 document().updateStyleAndLayoutIgnorePendingStylesheets( | 409 document().updateStyleAndLayoutIgnorePendingStylesheets( |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 521 m_loadedUrl = url; | 524 m_loadedUrl = url; |
| 522 | 525 |
| 523 if (m_persistedPluginWidget) { | 526 if (m_persistedPluginWidget) { |
| 524 setWidget(m_persistedPluginWidget.release()); | 527 setWidget(m_persistedPluginWidget.release()); |
| 525 } else { | 528 } else { |
| 526 bool loadManually = | 529 bool loadManually = |
| 527 document().isPluginDocument() && !document().containsPlugins(); | 530 document().isPluginDocument() && !document().containsPlugins(); |
| 528 LocalFrameClient::DetachedPluginPolicy policy = | 531 LocalFrameClient::DetachedPluginPolicy policy = |
| 529 requireLayoutObject ? LocalFrameClient::FailOnDetachedPlugin | 532 requireLayoutObject ? LocalFrameClient::FailOnDetachedPlugin |
| 530 : LocalFrameClient::AllowDetachedPlugin; | 533 : LocalFrameClient::AllowDetachedPlugin; |
| 531 Widget* widget = frame->loader().client()->createPlugin( | 534 FrameViewBase* frameViewBase = frame->loader().client()->createPlugin( |
| 532 this, url, paramNames, paramValues, mimeType, loadManually, policy); | 535 this, url, paramNames, paramValues, mimeType, loadManually, policy); |
| 533 if (!widget) { | 536 if (!frameViewBase) { |
| 534 if (!layoutItem.isNull() && | 537 if (!layoutItem.isNull() && |
| 535 !layoutItem.showsUnavailablePluginIndicator()) { | 538 !layoutItem.showsUnavailablePluginIndicator()) { |
| 536 m_pluginIsAvailable = false; | 539 m_pluginIsAvailable = false; |
| 537 layoutItem.setPluginAvailability(LayoutEmbeddedObject::PluginMissing); | 540 layoutItem.setPluginAvailability(LayoutEmbeddedObject::PluginMissing); |
| 538 } | 541 } |
| 539 return false; | 542 return false; |
| 540 } | 543 } |
| 541 | 544 |
| 542 if (!layoutItem.isNull()) | 545 if (!layoutItem.isNull()) |
| 543 setWidget(widget); | 546 setWidget(frameViewBase); |
| 544 else | 547 else |
| 545 setPersistedPluginWidget(widget); | 548 setPersistedPluginWidget(frameViewBase); |
| 546 } | 549 } |
| 547 | 550 |
| 548 document().setContainsPlugins(); | 551 document().setContainsPlugins(); |
| 549 // TODO(esprehn): WebPluginContainerImpl::setWebLayer also schedules a | 552 // TODO(esprehn): WebPluginContainerImpl::setWebLayer also schedules a |
| 550 // compositing update, do we need both? | 553 // compositing update, do we need both? |
| 551 setNeedsCompositingUpdate(); | 554 setNeedsCompositingUpdate(); |
| 552 // Make sure any input event handlers introduced by the plugin are taken into | 555 // Make sure any input event handlers introduced by the plugin are taken into |
| 553 // account. | 556 // account. |
| 554 if (Page* page = document().frame()->page()) { | 557 if (Page* page = document().frame()->page()) { |
| 555 if (ScrollingCoordinator* scrollingCoordinator = | 558 if (ScrollingCoordinator* scrollingCoordinator = |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 | 649 |
| 647 void HTMLPlugInElement::lazyReattachIfNeeded() { | 650 void HTMLPlugInElement::lazyReattachIfNeeded() { |
| 648 if (!useFallbackContent() && needsWidgetUpdate() && layoutObject() && | 651 if (!useFallbackContent() && needsWidgetUpdate() && layoutObject() && |
| 649 !isImageType()) { | 652 !isImageType()) { |
| 650 lazyReattachIfAttached(); | 653 lazyReattachIfAttached(); |
| 651 setPersistedPluginWidget(nullptr); | 654 setPersistedPluginWidget(nullptr); |
| 652 } | 655 } |
| 653 } | 656 } |
| 654 | 657 |
| 655 } // namespace blink | 658 } // namespace blink |
| OLD | NEW |