void HTMLPlugInImageElement::restartSimilarPlugIns() { // Restart any other snapshotted plugins in the page with the same origin. Note that they // may be in different frames, so traverse from the top of the document. String plugInOrigin = m_loadedUrl.host(); String mimeType = loadedMimeType(); HTMLPlugInImageElementList similarPlugins; if (!document()->page()) return; for (Frame* frame = document()->page()->mainFrame(); frame; frame = frame->tree()->traverseNext()) { if (!frame->loader()->subframeLoader()->containsPlugins()) continue; if (!frame->document()) continue; RefPtr<NodeList> plugIns = frame->document()->getElementsByTagName(embedTag.localName()); if (plugIns) addPlugInsFromNodeListMatchingPlugInOrigin(similarPlugins, plugIns, plugInOrigin, mimeType); plugIns = frame->document()->getElementsByTagName(objectTag.localName()); if (plugIns) addPlugInsFromNodeListMatchingPlugInOrigin(similarPlugins, plugIns, plugInOrigin, mimeType); } for (size_t i = 0, length = similarPlugins.size(); i < length; ++i) { HTMLPlugInImageElement* plugInToRestart = similarPlugins[i].get(); if (plugInToRestart->displayState() <= HTMLPlugInElement::DisplayingSnapshot) { LOG(Plugins, "%p Plug-in looks similar to a restarted plug-in. Restart.", plugInToRestart); plugInToRestart->setDisplayState(Playing); plugInToRestart->restartSnapshottedPlugIn(); } plugInToRestart->m_snapshotDecision = NeverSnapshot; } }
void RenderEmbeddedObject::layout() { StackStats::LayoutCheckPoint layoutCheckPoint; ASSERT(needsLayout()); LayoutSize oldSize = contentBoxRect().size(); updateLogicalWidth(); updateLogicalHeight(); RenderPart::layout(); m_overflow.clear(); addVisualEffectOverflow(); updateLayerTransform(); bool wasMissingWidget = false; if (!widget() && frameView() && canHaveWidget()) { wasMissingWidget = true; frameView()->addWidgetToUpdate(this); } setNeedsLayout(false); LayoutSize newSize = contentBoxRect().size(); if (!wasMissingWidget && newSize.width() >= oldSize.width() && newSize.height() >= oldSize.height()) { Element* element = toElement(node()); if (element && element->isPluginElement() && toHTMLPlugInElement(element)->isPlugInImageElement()) { HTMLPlugInImageElement* plugInImageElement = toHTMLPlugInImageElement(element); if (plugInImageElement->displayState() > HTMLPlugInElement::DisplayingSnapshot && plugInImageElement->snapshotDecision() == HTMLPlugInImageElement::MaySnapshotWhenResized && document()->view()) { plugInImageElement->setNeedsCheckForSizeChange(); document()->view()->addWidgetToUpdate(this); } } } if (!canHaveChildren()) return; // This code copied from RenderMedia::layout(). RenderObject* child = m_children.firstChild(); if (!child) return; RenderBox* childBox = toRenderBox(child); if (!childBox) return; if (newSize == oldSize && !childBox->needsLayout()) return; // When calling layout() on a child node, a parent must either push a LayoutStateMaintainter, or // instantiate LayoutStateDisabler. Since using a LayoutStateMaintainer is slightly more efficient, // and this method will be called many times per second during playback, use a LayoutStateMaintainer: LayoutStateMaintainer statePusher(view(), this, locationOffset(), hasTransform() || hasReflection() || style()->isFlippedBlocksWritingMode()); childBox->setLocation(LayoutPoint(borderLeft(), borderTop()) + LayoutSize(paddingLeft(), paddingTop())); childBox->style()->setHeight(Length(newSize.height(), Fixed)); childBox->style()->setWidth(Length(newSize.width(), Fixed)); childBox->setNeedsLayout(true, MarkOnlyThis); childBox->layout(); setChildNeedsLayout(false); statePusher.pop(); }