bool RenderThemeChromiumSkia::paintSearchFieldResultsDecoration(RenderObject* magnifierObject, const PaintInfo& paintInfo, const IntRect& r) { // Get the renderer of <input> element. if (!magnifierObject->node()) return false; Node* input = magnifierObject->node()->shadowHost(); RenderObject* baseRenderer = input ? input->renderer() : magnifierObject; if (!baseRenderer->isBox()) return false; RenderBox* inputRenderBox = toRenderBox(baseRenderer); LayoutRect inputContentBox = inputRenderBox->contentBoxRect(); // Make sure the scaled decoration stays square and will fit in its parent's box. LayoutUnit magnifierSize = std::min(inputContentBox.width(), std::min<LayoutUnit>(inputContentBox.height(), r.height())); // Calculate decoration's coordinates relative to the input element. // Center the decoration vertically. Round up though, so if it has to be one pixel off-center, it will // be one pixel closer to the bottom of the field. This tends to look better with the text. LayoutRect magnifierRect(magnifierObject->offsetFromAncestorContainer(inputRenderBox).width(), inputContentBox.y() + (inputContentBox.height() - magnifierSize + 1) / 2, magnifierSize, magnifierSize); IntRect paintingRect = convertToPaintingRect(inputRenderBox, magnifierObject, magnifierRect, r); DEFINE_STATIC_REF(Image, magnifierImage, (Image::loadPlatformResource("searchMagnifier"))); paintInfo.context->drawImage(magnifierImage, paintingRect); return false; }
int HTMLImageElement::height(bool ignorePendingStylesheets) { if (!renderer()) { // check the attribute first for an explicit pixel value bool ok; int height = getAttribute(heightAttr).toInt(&ok); if (ok) return height; // if the image is available, use its height if (m_imageLoader.image()) return m_imageLoader.image()->imageSizeForRenderer(renderer(), 1.0f).height(); } if (ignorePendingStylesheets) document().updateLayoutIgnorePendingStylesheets(); else document().updateLayout(); RenderBox* box = renderBox(); if (!box) return 0; LayoutRect contentRect = box->contentBoxRect(); return adjustForAbsoluteZoom(snappedIntRect(contentRect).height(), *box); }
bool RenderThemeQt::paintSearchFieldCancelButton(RenderObject* o, const PaintInfo& pi, const IntRect& r) { // Logic copied from RenderThemeChromium.cpp. // Get the renderer of <input> element. Node* input = o->node()->shadowHost(); if (!input) input = o->node(); if (!input->renderer()->isBox()) return false; RenderBox* inputRenderBox = toRenderBox(input->renderer()); IntRect inputContentBox = pixelSnappedIntRect(inputRenderBox->contentBoxRect()); // Make sure the scaled button stays square and will fit in its parent's box. int cancelButtonSize = qMin(inputContentBox.width(), qMin(inputContentBox.height(), r.height())); // Calculate cancel button's coordinates relative to the input element. // Center the button vertically. Round up though, so if it has to be one pixel off-center, it will // be one pixel closer to the bottom of the field. This tends to look better with the text. IntRect cancelButtonRect(o->offsetFromAncestorContainer(inputRenderBox).width(), inputContentBox.y() + (inputContentBox.height() - cancelButtonSize + 1) / 2, cancelButtonSize, cancelButtonSize); IntRect paintingRect = convertToPaintingRect(inputRenderBox, o, cancelButtonRect, r); static Image* cancelImage = Image::loadPlatformResource("searchCancelButton").leakRef(); static Image* cancelPressedImage = Image::loadPlatformResource("searchCancelButtonPressed").leakRef(); pi.context->drawImage(isPressed(o) ? cancelPressedImage : cancelImage, o->style()->colorSpace(), paintingRect); return false; }
bool RenderThemeChromiumSkia::paintSearchFieldCancelButton(RenderObject* cancelButtonObject, const PaintInfo& paintInfo, const IntRect& r) { // Get the renderer of <input> element. Node* input = cancelButtonObject->node()->shadowHost(); RenderObject* baseRenderer = input ? input->renderer() : cancelButtonObject; if (!baseRenderer->isBox()) return false; RenderBox* inputRenderBox = toRenderBox(baseRenderer); LayoutRect inputContentBox = inputRenderBox->contentBoxRect(); // Make sure the scaled button stays square and will fit in its parent's box. LayoutUnit cancelButtonSize = std::min(inputContentBox.width(), std::min<LayoutUnit>(inputContentBox.height(), r.height())); // Calculate cancel button's coordinates relative to the input element. // Center the button vertically. Round up though, so if it has to be one pixel off-center, it will // be one pixel closer to the bottom of the field. This tends to look better with the text. LayoutRect cancelButtonRect(cancelButtonObject->offsetFromAncestorContainer(inputRenderBox).width(), inputContentBox.y() + (inputContentBox.height() - cancelButtonSize + 1) / 2, cancelButtonSize, cancelButtonSize); IntRect paintingRect = convertToPaintingRect(inputRenderBox, cancelButtonObject, cancelButtonRect, r); static Image* cancelImage = Image::loadPlatformResource("searchCancel").leakRef(); static Image* cancelPressedImage = Image::loadPlatformResource("searchCancelPressed").leakRef(); paintInfo.context->drawImage(isPressed(cancelButtonObject) ? cancelPressedImage : cancelImage, cancelButtonObject->style()->colorSpace(), paintingRect); return false; }
static inline void appendZoomableSubtargets(Node* node, SubtargetGeometryList& subtargets) { RenderBox* renderer = toRenderBox(node->renderer()); ASSERT(renderer); Vector<FloatQuad> quads; FloatRect borderBoxRect = renderer->borderBoxRect(); FloatRect contentBoxRect = renderer->contentBoxRect(); quads.append(renderer->localToAbsoluteQuad(borderBoxRect)); if (borderBoxRect != contentBoxRect) quads.append(renderer->localToAbsoluteQuad(contentBoxRect)); // FIXME: For RenderBlocks, add column boxes and content boxes cleared for floats. Vector<FloatQuad>::const_iterator it = quads.begin(); const Vector<FloatQuad>::const_iterator end = quads.end(); for (; it != end; ++it) subtargets.append(SubtargetGeometry(node, *it)); }
bool RenderInputSpeech::paintInputFieldSpeechButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect) { Element* element = object->node()->isElementNode() ? toElement(object->node()) : 0; if (!element || !element->isInputFieldSpeechButtonElement()) return false; // Get the renderer of <input> element. Node* input = object->node()->shadowHost(); if (!input->renderer()->isBox()) return false; RenderBox* inputRenderBox = toRenderBox(input->renderer()); LayoutRect inputContentBox = inputRenderBox->contentBoxRect(); // Make sure the scaled button stays square and will fit in its parent's box. LayoutUnit buttonSize = std::min(inputContentBox.width(), std::min<LayoutUnit>(inputContentBox.height(), rect.height())); // Calculate button's coordinates relative to the input element. // Center the button vertically. Round up though, so if it has to be one pixel off-center, it will // be one pixel closer to the bottom of the field. This tends to look better with the text. LayoutRect buttonRect(object->offsetFromAncestorContainer(inputRenderBox).width(), inputContentBox.y() + (inputContentBox.height() - buttonSize + 1) / 2, buttonSize, buttonSize); // Compute an offset between the part renderer and the input renderer. LayoutSize offsetFromInputRenderer = -(object->offsetFromAncestorContainer(inputRenderBox)); // Move the rect into partRenderer's coords. buttonRect.move(offsetFromInputRenderer); // Account for the local drawing offset. buttonRect.moveBy(rect.location()); DEFINE_STATIC_LOCAL(RefPtr<Image>, imageStateNormal, (Image::loadPlatformResource("inputSpeech"))); DEFINE_STATIC_LOCAL(RefPtr<Image>, imageStateRecording, (Image::loadPlatformResource("inputSpeechRecording"))); DEFINE_STATIC_LOCAL(RefPtr<Image>, imageStateWaiting, (Image::loadPlatformResource("inputSpeechWaiting"))); InputFieldSpeechButtonElement* speechButton = toInputFieldSpeechButtonElement(element); Image* image = imageStateNormal.get(); if (speechButton->state() == InputFieldSpeechButtonElement::Recording) image = imageStateRecording.get(); else if (speechButton->state() == InputFieldSpeechButtonElement::Recognizing) image = imageStateWaiting.get(); paintInfo.context->drawImage(image, object->style()->colorSpace(), pixelSnappedIntRect(buttonRect)); return false; }
bool RenderThemeChromiumSkia::paintSearchFieldResultsButton(RenderObject* magnifierObject, const RenderObject::PaintInfo& paintInfo, const IntRect& r) { // Get the renderer of <input> element. Node* input = magnifierObject->node()->shadowAncestorNode(); if (!input->renderer()->isBox()) return false; RenderBox* inputRenderBox = toRenderBox(input->renderer()); IntRect inputContentBox = inputRenderBox->contentBoxRect(); // Make sure the scaled decoration will fit in its parent's box. int magnifierHeight = std::min(inputContentBox.height(), r.height()); int magnifierWidth = std::min(inputContentBox.width(), static_cast<int>(magnifierHeight * defaultSearchFieldResultsButtonWidth / defaultSearchFieldResultsDecorationSize)); IntRect magnifierRect(magnifierObject->offsetFromAncestorContainer(inputRenderBox).width(), inputContentBox.y() + (inputContentBox.height() - magnifierHeight + 1) / 2, magnifierWidth, magnifierHeight); IntRect paintingRect = convertToPaintingRect(inputRenderBox, magnifierObject, magnifierRect, r); static Image* magnifierImage = Image::loadPlatformResource("searchMagnifierResults").releaseRef(); paintInfo.context->drawImage(magnifierImage, magnifierObject->style()->colorSpace(), paintingRect); return false; }
int HTMLImageElement::width(bool ignorePendingStylesheets) { if (!renderer()) { // check the attribute first for an explicit pixel value bool ok; int width = getAttribute(widthAttr).toInt(&ok); if (ok) return width; // if the image is available, use its width if (m_imageLoader.image()) return m_imageLoader.image()->imageSizeForRenderer(renderer(), 1.0f).width(); } if (ignorePendingStylesheets) document()->updateLayoutIgnorePendingStylesheets(); else document()->updateLayout(); RenderBox* box = renderBox(); return box ? adjustForAbsoluteZoom(box->contentBoxRect().pixelSnappedWidth(), box) : 0; }
void HTMLPlugInImageElement::subframeLoaderWillCreatePlugIn(const KURL& url) { if (!document()->page() || !document()->page()->settings()->plugInSnapshottingEnabled()) return; bool inMainFrame = document()->frame() == document()->page()->mainFrame(); if (document()->isPluginDocument() && inMainFrame) { LOG(Plugins, "%p Plug-in document in main frame", this); return; } if (ScriptController::processingUserGesture()) { LOG(Plugins, "%p Script is processing user gesture, set to play", this); return; } if (m_createdDuringUserGesture) { LOG(Plugins, "%p Plug-in was created when processing user gesture, set to play", this); return; } double lastKnownUserGestureTimestamp = document()->lastHandledUserGestureTimestamp(); if (!inMainFrame && document()->page()->mainFrame() && document()->page()->mainFrame()->document()) lastKnownUserGestureTimestamp = std::max(lastKnownUserGestureTimestamp, document()->page()->mainFrame()->document()->lastHandledUserGestureTimestamp()); if (currentTime() - lastKnownUserGestureTimestamp < autostartSoonAfterUserGestureThreshold) { LOG(Plugins, "%p Plug-in was created shortly after a user gesture, set to play", this); return; } RenderBox* renderEmbeddedObject = toRenderBox(renderer()); Length styleWidth = renderEmbeddedObject->style()->width(); Length styleHeight = renderEmbeddedObject->style()->height(); LayoutRect contentBoxRect = renderEmbeddedObject->contentBoxRect(); int contentWidth = contentBoxRect.width(); int contentHeight = contentBoxRect.height(); int contentArea = contentWidth * contentHeight; IntSize visibleViewSize = document()->frame()->view()->visibleSize(); int visibleArea = visibleViewSize.width() * visibleViewSize.height(); if (inMainFrame && styleWidth.isPercent() && (styleWidth.percent() == 100) && styleHeight.isPercent() && (styleHeight.percent() == 100) && (static_cast<float>(contentArea) / visibleArea > sizingFullPageAreaRatioThreshold)) { LOG(Plugins, "%p Plug-in is top level full page, set to play", this); return; } if (contentWidth <= sizingTinyDimensionThreshold || contentHeight <= sizingTinyDimensionThreshold) { LOG(Plugins, "%p Plug-in is %dx%d, set to play", this, contentWidth, contentHeight); return; } if (!document()->page() || !document()->page()->plugInClient()) { setDisplayState(WaitingForSnapshot); return; } LOG(Plugins, "%p Plug-in URL: %s", this, m_url.utf8().data()); LOG(Plugins, " loaded URL: %s", url.string().utf8().data()); m_plugInOriginHash = PlugInOriginHash::hash(this, url); if (m_plugInOriginHash && document()->page()->plugInClient()->isAutoStartOrigin(m_plugInOriginHash)) { LOG(Plugins, "%p Plug-in hash %x is auto-start, set to play", this, m_plugInOriginHash); return; } LOG(Plugins, "%p Plug-in hash %x is %dx%d, origin is not auto-start, set to wait for snapshot", this, m_plugInOriginHash, contentWidth, contentHeight); // We may have got to this point by restarting a snapshotted plug-in, in which case we don't want to // reset the display state. if (displayState() != PlayingWithPendingMouseClick) setDisplayState(WaitingForSnapshot); }
void HTMLPlugInImageElement::subframeLoaderWillCreatePlugIn(const KURL& url) { LOG(Plugins, "%p Plug-in URL: %s", this, m_url.utf8().data()); LOG(Plugins, " Loaded URL: %s", url.string().utf8().data()); m_loadedUrl = url; m_plugInWasCreated = false; m_deferredPromotionToPrimaryPlugIn = false; if (!document()->page() || !document()->page()->settings()->plugInSnapshottingEnabled()) { m_snapshotDecision = NeverSnapshot; return; } if (displayState() == Restarting) { LOG(Plugins, "%p Plug-in is explicitly restarting", this); m_snapshotDecision = NeverSnapshot; setDisplayState(Playing); return; } if (displayState() == RestartingWithPendingMouseClick) { LOG(Plugins, "%p Plug-in is explicitly restarting but also waiting for a click", this); m_snapshotDecision = NeverSnapshot; return; } if (m_snapshotDecision == NeverSnapshot) { LOG(Plugins, "%p Plug-in is blessed, allow it to start", this); return; } bool inMainFrame = document()->frame() == document()->page()->mainFrame(); if (document()->isPluginDocument() && inMainFrame) { LOG(Plugins, "%p Plug-in document in main frame", this); m_snapshotDecision = NeverSnapshot; return; } if (ScriptController::processingUserGesture()) { LOG(Plugins, "%p Script is currently processing user gesture, set to play", this); m_snapshotDecision = NeverSnapshot; return; } if (m_createdDuringUserGesture) { LOG(Plugins, "%p Plug-in was created when processing user gesture, set to play", this); m_snapshotDecision = NeverSnapshot; return; } if (documentHadRecentUserGesture(document())) { LOG(Plugins, "%p Plug-in was created shortly after a user gesture, set to play", this); m_snapshotDecision = NeverSnapshot; return; } if (document()->page()->settings()->snapshotAllPlugIns()) { LOG(Plugins, "%p Plug-in forced to snapshot by user preference", this); m_snapshotDecision = Snapshotted; setDisplayState(WaitingForSnapshot); return; } if (document()->page()->settings()->autostartOriginPlugInSnapshottingEnabled() && document()->page()->plugInClient() && document()->page()->plugInClient()->shouldAutoStartFromOrigin(document()->page()->mainFrame()->document()->baseURL().host(), url.host(), loadedMimeType())) { LOG(Plugins, "%p Plug-in from (%s, %s) is marked to auto-start, set to play", this, document()->page()->mainFrame()->document()->baseURL().host().utf8().data(), url.host().utf8().data()); m_snapshotDecision = NeverSnapshot; return; } RenderBox* renderEmbeddedObject = toRenderBox(renderer()); Length styleWidth = renderEmbeddedObject->style()->width(); Length styleHeight = renderEmbeddedObject->style()->height(); LayoutRect contentBoxRect = renderEmbeddedObject->contentBoxRect(); int contentWidth = contentBoxRect.width(); int contentHeight = contentBoxRect.height(); int contentArea = contentWidth * contentHeight; IntSize visibleViewSize = document()->frame()->view()->visibleSize(); int visibleArea = visibleViewSize.width() * visibleViewSize.height(); if (inMainFrame && styleWidth.isPercent() && (styleWidth.percent() == 100) && styleHeight.isPercent() && (styleHeight.percent() == 100) && (static_cast<float>(contentArea) / visibleArea > sizingFullPageAreaRatioThreshold)) { LOG(Plugins, "%p Plug-in is top level full page, set to play", this); m_snapshotDecision = NeverSnapshot; return; } if (contentWidth <= sizingTinyDimensionThreshold || contentHeight <= sizingTinyDimensionThreshold) { LOG(Plugins, "%p Plug-in is very small %dx%d, set to play", this, contentWidth, contentHeight); m_sizeWhenSnapshotted = IntSize(contentBoxRect.width().toInt(), contentBoxRect.height().toInt()); m_snapshotDecision = MaySnapshotWhenResized; return; } if (!document()->page()->plugInClient()) { LOG(Plugins, "%p There is no plug-in client. Set to wait for snapshot", this); m_snapshotDecision = NeverSnapshot; setDisplayState(WaitingForSnapshot); return; } LOG(Plugins, "%p Plug-in from (%s, %s) is not auto-start, sized at %dx%d, set to wait for snapshot", this, document()->page()->mainFrame()->document()->baseURL().host().utf8().data(), url.host().utf8().data(), contentWidth, contentHeight); m_snapshotDecision = Snapshotted; setDisplayState(WaitingForSnapshot); }
void updateSnapOffsetsForScrollableArea(ScrollableArea& scrollableArea, HTMLElement& scrollingElement, const RenderBox& scrollingElementBox, const RenderStyle& scrollingElementStyle) { if (scrollingElementStyle.scrollSnapType() == ScrollSnapType::None) { scrollableArea.clearHorizontalSnapOffsets(); scrollableArea.clearVerticalSnapOffsets(); return; } LayoutRect viewSize = scrollingElementBox.contentBoxRect(); LayoutUnit viewWidth = viewSize.width(); LayoutUnit viewHeight = viewSize.height(); LayoutUnit scrollWidth = scrollingElementBox.scrollWidth(); LayoutUnit scrollHeight = scrollingElementBox.scrollHeight(); bool canComputeHorizontalOffsets = scrollWidth > 0 && viewWidth > 0 && viewWidth < scrollWidth; bool canComputeVerticalOffsets = scrollHeight > 0 && viewHeight > 0 && viewHeight < scrollHeight; if (!canComputeHorizontalOffsets) scrollableArea.clearHorizontalSnapOffsets(); if (!canComputeVerticalOffsets) scrollableArea.clearVerticalSnapOffsets(); if (!canComputeHorizontalOffsets && !canComputeVerticalOffsets) return; Vector<LayoutUnit> horizontalSnapOffsetSubsequence; Vector<LayoutUnit> verticalSnapOffsetSubsequence; bool scrollSnapPointsXUsesElements = styleUsesElements(ScrollEventAxis::Horizontal, scrollingElementStyle); bool scrollSnapPointsYUsesElements = styleUsesElements(ScrollEventAxis::Vertical, scrollingElementStyle); if (scrollSnapPointsXUsesElements || scrollSnapPointsYUsesElements) { bool shouldAddHorizontalChildOffsets = scrollSnapPointsXUsesElements && canComputeHorizontalOffsets; bool shouldAddVerticalChildOffsets = scrollSnapPointsYUsesElements && canComputeVerticalOffsets; appendChildSnapOffsets(scrollingElement, shouldAddHorizontalChildOffsets, horizontalSnapOffsetSubsequence, shouldAddVerticalChildOffsets, verticalSnapOffsetSubsequence); } if (scrollingElementStyle.scrollSnapPointsX() && !scrollSnapPointsXUsesElements && canComputeHorizontalOffsets) { for (auto& snapLength : scrollingElementStyle.scrollSnapPointsX()->offsets) horizontalSnapOffsetSubsequence.append(valueForLength(snapLength, viewWidth)); } if (scrollingElementStyle.scrollSnapPointsY() && !scrollSnapPointsYUsesElements && canComputeVerticalOffsets) { for (auto& snapLength : scrollingElementStyle.scrollSnapPointsY()->offsets) verticalSnapOffsetSubsequence.append(valueForLength(snapLength, viewHeight)); } if (canComputeHorizontalOffsets) { auto horizontalSnapOffsets = std::make_unique<Vector<LayoutUnit>>(); updateFromStyle(*horizontalSnapOffsets, scrollingElementStyle, ScrollEventAxis::Horizontal, viewWidth, scrollWidth, horizontalSnapOffsetSubsequence); if (horizontalSnapOffsets->isEmpty()) scrollableArea.clearHorizontalSnapOffsets(); else scrollableArea.setHorizontalSnapOffsets(WTF::move(horizontalSnapOffsets)); } if (canComputeVerticalOffsets) { auto verticalSnapOffsets = std::make_unique<Vector<LayoutUnit>>(); updateFromStyle(*verticalSnapOffsets, scrollingElementStyle, ScrollEventAxis::Vertical, viewHeight, scrollHeight, verticalSnapOffsetSubsequence); if (verticalSnapOffsets->isEmpty()) scrollableArea.clearVerticalSnapOffsets(); else scrollableArea.setVerticalSnapOffsets(WTF::move(verticalSnapOffsets)); } }
void HTMLPlugInImageElement::subframeLoaderWillCreatePlugIn(const KURL& url) { LOG(Plugins, "%p Plug-in URL: %s", this, m_url.utf8().data()); LOG(Plugins, " Loaded URL: %s", url.string().utf8().data()); m_loadedUrl = url; if (!document()->page() || !document()->page()->settings()->plugInSnapshottingEnabled()) return; if (displayState() == Restarting) { setDisplayState(Playing); LOG(Plugins, "%p Plug-in is explicitly restarting", this); return; } if (displayState() == RestartingWithPendingMouseClick) { LOG(Plugins, "%p Plug-in is explicitly restarting but also waiting for a click", this); return; } bool inMainFrame = document()->frame() == document()->page()->mainFrame(); if (document()->isPluginDocument() && inMainFrame) { LOG(Plugins, "%p Plug-in document in main frame", this); return; } if (ScriptController::processingUserGesture()) { LOG(Plugins, "%p Script is currently processing user gesture, set to play", this); return; } if (m_createdDuringUserGesture) { LOG(Plugins, "%p Plug-in was created when processing user gesture, set to play", this); return; } double lastKnownUserGestureTimestamp = document()->lastHandledUserGestureTimestamp(); if (!inMainFrame && document()->page()->mainFrame() && document()->page()->mainFrame()->document()) lastKnownUserGestureTimestamp = std::max(lastKnownUserGestureTimestamp, document()->page()->mainFrame()->document()->lastHandledUserGestureTimestamp()); if (currentTime() - lastKnownUserGestureTimestamp < autostartSoonAfterUserGestureThreshold) { LOG(Plugins, "%p Plug-in was created shortly after a user gesture, set to play", this); return; } RenderBox* renderEmbeddedObject = toRenderBox(renderer()); Length styleWidth = renderEmbeddedObject->style()->width(); Length styleHeight = renderEmbeddedObject->style()->height(); LayoutRect contentBoxRect = renderEmbeddedObject->contentBoxRect(); int contentWidth = contentBoxRect.width(); int contentHeight = contentBoxRect.height(); int contentArea = contentWidth * contentHeight; IntSize visibleViewSize = document()->frame()->view()->visibleSize(); int visibleArea = visibleViewSize.width() * visibleViewSize.height(); if (inMainFrame && styleWidth.isPercent() && (styleWidth.percent() == 100) && styleHeight.isPercent() && (styleHeight.percent() == 100) && (static_cast<float>(contentArea) / visibleArea > sizingFullPageAreaRatioThreshold)) { LOG(Plugins, "%p Plug-in is top level full page, set to play", this); return; } if (contentWidth <= sizingTinyDimensionThreshold || contentHeight <= sizingTinyDimensionThreshold) { LOG(Plugins, "%p Plug-in is very small %dx%d, set to play", this, contentWidth, contentHeight); return; } if (!document()->page()->plugInClient()) { setDisplayState(WaitingForSnapshot); return; } if (document()->page()->plugInClient()->shouldAutoStartFromOrigin(document()->page()->mainFrame()->document()->baseURL().host(), url.host(), loadedMimeType())) { LOG(Plugins, "%p Plug-in from (%s, %s) is marked to auto-start, set to play", this, document()->page()->mainFrame()->document()->baseURL().host().utf8().data(), url.host().utf8().data()); return; } LOG(Plugins, "%p Plug-in from (%s, %s) is not auto-start, sized at %dx%d, set to wait for snapshot", this, document()->page()->mainFrame()->document()->baseURL().host().utf8().data(), url.host().utf8().data(), contentWidth, contentHeight); setDisplayState(WaitingForSnapshot); }