LayoutUnit RenderSVGRoot::computeReplacedLogicalWidth(bool includeMaxWidth) const { LayoutUnit replacedWidth = RenderBox::computeReplacedLogicalWidth(includeMaxWidth); Frame* frame = node() && node()->document() ? node()->document()->frame() : 0; if (!frame) return computeIntrinsicWidth(replacedWidth); // If our frame has an owner renderer, we're embedded through eg. object/embed. RenderPart* ownerRenderer = frame->ownerRenderer(); if (!ownerRenderer) return computeIntrinsicWidth(replacedWidth); RenderStyle* ownerRendererStyle = ownerRenderer->style(); ASSERT(ownerRendererStyle); ASSERT(frame->contentRenderer()); Length ownerWidth = ownerRendererStyle->width(); if (ownerWidth.isAuto()) return replacedWidth; // Spec: http://dev.w3.org/SVG/profiles/1.1F2/publish/coords.html#ViewportSpace // The SVG user agent negotiates with its parent user agent to determine the viewport into which the SVG user agent can render // the document. In some circumstances, SVG content will be embedded (by reference or inline) within a containing document. // This containing document might include attributes, properties and/or other parameters (explicit or implicit) which specify // or provide hints about the dimensions of the viewport for the SVG content. SVG content itself optionally can provide // information about the appropriate viewport region for the content via the ‘width’ and ‘height’ XML attributes on the // outermost svg element. The negotiation process uses any information provided by the containing document and the SVG // content itself to choose the viewport location and size. // The ‘width’ attribute on the outermost svg element establishes the viewport's width, unless the following conditions are met: // * the SVG content is a separately stored resource that is embedded by reference (such as the ‘object’ element in XHTML [XHTML]), // or the SVG content is embedded inline within a containing document; // * and the referencing element or containing document is styled using CSS [CSS2] or XSL [XSL]; // * and there are CSS-compatible positioning properties ([CSS2], section 9.3) specified on the referencing element // (e.g., the ‘object’ element) or on the containing document's outermost svg element that are sufficient to establish // the width of the viewport. // // Under these conditions, the positioning properties establish the viewport's width. return ownerRenderer->computeReplacedLogicalWidthRespectingMinMaxWidth(ownerRenderer->computeReplacedLogicalWidthUsing(ownerWidth), includeMaxWidth); }
PassRefPtr<Widget> SubframeLoader::loadMediaPlayerProxyPlugin(Node* node, const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues) { ASSERT(node->hasTagName(videoTag) || isHTMLAudioElement(node)); KURL completedURL; if (!url.isEmpty()) completedURL = completeURL(url); if (!m_frame->document()->securityOrigin()->canDisplay(completedURL)) { FrameLoader::reportLocalLoadFailed(m_frame, completedURL.string()); return 0; } if (!m_frame->document()->contentSecurityPolicy()->allowMediaFromSource(completedURL)) return 0; HTMLMediaElement* mediaElement = toHTMLMediaElement(node); RenderPart* renderer = toRenderPart(node->renderer()); IntSize size; if (renderer) size = roundedIntSize(LayoutSize(renderer->contentWidth(), renderer->contentHeight())); else if (mediaElement->isVideo()) size = RenderVideo::defaultSize(); if (!m_frame->loader().mixedContentChecker().canRunInsecureContent(m_frame->document()->securityOrigin(), completedURL)) return 0; RefPtr<Widget> widget = m_frame->loader().client().createMediaPlayerProxyPlugin(size, mediaElement, completedURL, paramNames, paramValues, "application/x-media-element-proxy-plugin"); if (widget && renderer) { renderer->setWidget(widget); renderer->node()->setNeedsStyleRecalc(SyntheticStyleChange); } m_containsPlugins = true; return widget ? widget.release() : 0; }
PassRefPtr<Widget> SubframeLoader::loadMediaPlayerProxyPlugin(Node* node, const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues) { ASSERT(node->hasTagName(videoTag) || node->hasTagName(audioTag)); if (!m_frame->script()->xssAuditor()->canLoadObject(url.string())) return 0; KURL completedURL; if (!url.isEmpty()) completedURL = completeURL(url); if (!m_frame->document()->securityOrigin()->canDisplay(completedURL)) { FrameLoader::reportLocalLoadFailed(m_frame, completedURL.string()); return 0; } HTMLMediaElement* mediaElement = static_cast<HTMLMediaElement*>(node); RenderPart* renderer = toRenderPart(node->renderer()); IntSize size; if (renderer) size = IntSize(renderer->contentWidth(), renderer->contentHeight()); else if (mediaElement->isVideo()) size = RenderVideo::defaultSize(); m_frame->loader()->checkIfRunInsecureContent(m_frame->document()->securityOrigin(), completedURL); RefPtr<Widget> widget = m_frame->loader()->client()->createMediaPlayerProxyPlugin(size, mediaElement, completedURL, paramNames, paramValues, "application/x-media-element-proxy-plugin"); if (widget && renderer) { renderer->setWidget(widget); renderer->node()->setNeedsStyleRecalc(SyntheticStyleChange); } m_containsPlugins = true; return widget ? widget.release() : 0; }
FrameView::~FrameView() { if (d->m_postLayoutTasksTimer.isActive()) { d->m_postLayoutTasksTimer.stop(); d->m_scheduledEvents.clear(); d->m_enqueueEvents = 0; } resetScrollbars(); ASSERT(m_refCount == 0); ASSERT(d->m_scheduledEvents.isEmpty()); ASSERT(!d->m_enqueueEvents); if (m_frame) { ASSERT(m_frame->view() != this || !m_frame->document() || !m_frame->contentRenderer()); RenderPart* renderer = m_frame->ownerRenderer(); if (renderer && renderer->widget() == this) renderer->setWidget(0); } delete d; d = 0; }