123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672 |
- /*
- * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
- * (C) 2000 Simon Hausmann <hausmann@kde.org>
- * (C) 2000 Stefan Schimanski (1Stein@gmx.de)
- * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
- #include "config.h"
- #include "RenderEmbeddedObject.h"
- #include "CSSValueKeywords.h"
- #include "Chrome.h"
- #include "ChromeClient.h"
- #include "Cursor.h"
- #include "EventHandler.h"
- #include "Font.h"
- #include "FontSelector.h"
- #include "Frame.h"
- #include "FrameLoaderClient.h"
- #include "GraphicsContext.h"
- #include "HTMLEmbedElement.h"
- #include "HTMLIFrameElement.h"
- #include "HTMLNames.h"
- #include "HTMLObjectElement.h"
- #include "HTMLParamElement.h"
- #include "HTMLPlugInElement.h"
- #include "HitTestResult.h"
- #include "LocalizedStrings.h"
- #include "MIMETypeRegistry.h"
- #include "MouseEvent.h"
- #include "Page.h"
- #include "PaintInfo.h"
- #include "Path.h"
- #include "PlatformMouseEvent.h"
- #include "PluginViewBase.h"
- #include "RenderLayer.h"
- #include "RenderTheme.h"
- #include "RenderView.h"
- #include "RenderWidgetProtector.h"
- #include "Settings.h"
- #include "Text.h"
- #include "TextRun.h"
- #include <wtf/StackStats.h>
- #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
- #include "HTMLMediaElement.h"
- #endif
- namespace WebCore {
- using namespace HTMLNames;
- static const float replacementTextRoundedRectHeight = 22;
- static const float replacementTextRoundedRectLeftTextMargin = 10;
- static const float replacementTextRoundedRectRightTextMargin = 10;
- static const float replacementTextRoundedRectRightTextMarginWithArrow = 5;
- static const float replacementTextRoundedRectRadius = 11;
- static const float replacementArrowLeftMargin = -4;
- static const float replacementArrowPadding = 4;
- static const float replacementArrowCirclePadding = 3;
- static const Color& replacementTextRoundedRectPressedColor()
- {
- static const Color pressed(105, 105, 105, 242);
- return pressed;
- }
- static const Color& replacementTextRoundedRectColor()
- {
- static const Color standard(125, 125, 125, 242);
- return standard;
- }
- static const Color& replacementTextColor()
- {
- static const Color standard(240, 240, 240, 255);
- return standard;
- }
- static const Color& unavailablePluginBorderColor()
- {
- static const Color standard(255, 255, 255, 216);
- return standard;
- }
- RenderEmbeddedObject::RenderEmbeddedObject(Element* element)
- : RenderPart(element)
- , m_hasFallbackContent(false)
- , m_isPluginUnavailable(false)
- , m_isUnavailablePluginIndicatorHidden(false)
- , m_unavailablePluginIndicatorIsPressed(false)
- , m_mouseDownWasInUnavailablePluginIndicator(false)
- {
- view()->frameView()->setIsVisuallyNonEmpty();
- }
- RenderEmbeddedObject::~RenderEmbeddedObject()
- {
- if (frameView())
- frameView()->removeWidgetToUpdate(this);
- }
- #if USE(ACCELERATED_COMPOSITING)
- bool RenderEmbeddedObject::requiresLayer() const
- {
- if (RenderPart::requiresLayer())
- return true;
-
- return allowsAcceleratedCompositing();
- }
- bool RenderEmbeddedObject::allowsAcceleratedCompositing() const
- {
- return widget() && widget()->isPluginViewBase() && toPluginViewBase(widget())->platformLayer();
- }
- #endif
- static String unavailablePluginReplacementText(RenderEmbeddedObject::PluginUnavailabilityReason pluginUnavailabilityReason)
- {
- switch (pluginUnavailabilityReason) {
- case RenderEmbeddedObject::PluginMissing:
- return missingPluginText();
- case RenderEmbeddedObject::PluginCrashed:
- return crashedPluginText();
- case RenderEmbeddedObject::PluginBlockedByContentSecurityPolicy:
- return blockedPluginByContentSecurityPolicyText();
- case RenderEmbeddedObject::InsecurePluginVersion:
- return insecurePluginVersionText();
- }
- ASSERT_NOT_REACHED();
- return String();
- }
- static bool shouldUnavailablePluginMessageBeButton(Document* document, RenderEmbeddedObject::PluginUnavailabilityReason pluginUnavailabilityReason)
- {
- Page* page = document->page();
- return page && page->chrome().client()->shouldUnavailablePluginMessageBeButton(pluginUnavailabilityReason);
- }
- void RenderEmbeddedObject::setPluginUnavailabilityReason(PluginUnavailabilityReason pluginUnavailabilityReason)
- {
- setPluginUnavailabilityReasonWithDescription(pluginUnavailabilityReason, unavailablePluginReplacementText(pluginUnavailabilityReason));
- }
- void RenderEmbeddedObject::setPluginUnavailabilityReasonWithDescription(PluginUnavailabilityReason pluginUnavailabilityReason, const String& description)
- {
- ASSERT(!m_isPluginUnavailable);
- m_isPluginUnavailable = true;
- m_pluginUnavailabilityReason = pluginUnavailabilityReason;
- if (description.isEmpty())
- m_unavailablePluginReplacementText = unavailablePluginReplacementText(pluginUnavailabilityReason);
- else
- m_unavailablePluginReplacementText = description;
- }
- void RenderEmbeddedObject::setUnavailablePluginIndicatorIsPressed(bool pressed)
- {
- if (m_unavailablePluginIndicatorIsPressed == pressed)
- return;
- m_unavailablePluginIndicatorIsPressed = pressed;
- repaint();
- }
- void RenderEmbeddedObject::paintSnapshotImage(PaintInfo& paintInfo, const LayoutPoint& paintOffset, Image* image)
- {
- LayoutUnit cWidth = contentWidth();
- LayoutUnit cHeight = contentHeight();
- if (!cWidth || !cHeight)
- return;
- GraphicsContext* context = paintInfo.context;
- LayoutSize contentSize(cWidth, cHeight);
- LayoutPoint contentLocation = location() + paintOffset;
- contentLocation.move(borderLeft() + paddingLeft(), borderTop() + paddingTop());
- LayoutRect rect(contentLocation, contentSize);
- IntRect alignedRect = pixelSnappedIntRect(rect);
- if (alignedRect.width() <= 0 || alignedRect.height() <= 0)
- return;
- bool useLowQualityScaling = shouldPaintAtLowQuality(context, image, image, alignedRect.size());
- context->drawImage(image, style()->colorSpace(), alignedRect, CompositeSourceOver, shouldRespectImageOrientation(), useLowQualityScaling);
- }
- void RenderEmbeddedObject::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
- {
- Element* element = toElement(node());
- if (!element || !element->isPluginElement())
- return;
- HTMLPlugInElement* plugInElement = toHTMLPlugInElement(element);
- if (plugInElement->displayState() > HTMLPlugInElement::DisplayingSnapshot) {
- RenderPart::paintContents(paintInfo, paintOffset);
- if (!plugInElement->isRestartedPlugin())
- return;
- }
- if (!plugInElement->isPlugInImageElement())
- return;
- Image* snapshot = toHTMLPlugInImageElement(plugInElement)->snapshotImage();
- if (snapshot)
- paintSnapshotImage(paintInfo, paintOffset, snapshot);
- }
- void RenderEmbeddedObject::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
- {
- Page* page = 0;
- if (Frame* frame = this->frame())
- page = frame->page();
- if (isPluginUnavailable()) {
- if (page && paintInfo.phase == PaintPhaseForeground)
- page->addRelevantUnpaintedObject(this, visualOverflowRect());
- RenderReplaced::paint(paintInfo, paintOffset);
- return;
- }
- if (page && paintInfo.phase == PaintPhaseForeground)
- page->addRelevantRepaintedObject(this, visualOverflowRect());
- RenderPart::paint(paintInfo, paintOffset);
- }
- static void drawReplacementArrow(GraphicsContext* context, const FloatRect& insideRect)
- {
- GraphicsContextStateSaver stateSaver(*context);
- FloatRect rect(insideRect);
- rect.inflate(-replacementArrowPadding);
- FloatPoint center(rect.center());
- FloatPoint arrowTip(rect.maxX(), center.y());
- context->setStrokeThickness(2);
- context->setLineCap(RoundCap);
- context->setLineJoin(RoundJoin);
- Path path;
- path.moveTo(FloatPoint(rect.x(), center.y()));
- path.addLineTo(arrowTip);
- path.addLineTo(FloatPoint(center.x(), rect.y()));
- path.moveTo(arrowTip);
- path.addLineTo(FloatPoint(center.x(), rect.maxY()));
- context->strokePath(path);
- }
- void RenderEmbeddedObject::paintReplaced(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
- {
- if (!showsUnavailablePluginIndicator())
- return;
- if (paintInfo.phase == PaintPhaseSelection)
- return;
- GraphicsContext* context = paintInfo.context;
- if (context->paintingDisabled())
- return;
- FloatRect contentRect;
- FloatRect indicatorRect;
- FloatRect replacementTextRect;
- FloatRect arrowRect;
- Font font;
- TextRun run("");
- float textWidth;
- if (!getReplacementTextGeometry(paintOffset, contentRect, indicatorRect, replacementTextRect, arrowRect, font, run, textWidth))
- return;
- Path background;
- background.addRoundedRect(indicatorRect, FloatSize(replacementTextRoundedRectRadius, replacementTextRoundedRectRadius));
- GraphicsContextStateSaver stateSaver(*context);
- context->clip(contentRect);
- context->setFillColor(m_unavailablePluginIndicatorIsPressed ? replacementTextRoundedRectPressedColor() : replacementTextRoundedRectColor(), style()->colorSpace());
- context->fillPath(background);
- Path strokePath;
- FloatRect strokeRect(indicatorRect);
- strokeRect.inflate(1);
- strokePath.addRoundedRect(strokeRect, FloatSize(replacementTextRoundedRectRadius + 1, replacementTextRoundedRectRadius + 1));
- context->setStrokeColor(unavailablePluginBorderColor(), style()->colorSpace());
- context->setStrokeThickness(2);
- context->strokePath(strokePath);
- const FontMetrics& fontMetrics = font.fontMetrics();
- float labelX = roundf(replacementTextRect.location().x() + replacementTextRoundedRectLeftTextMargin);
- float labelY = roundf(replacementTextRect.location().y() + (replacementTextRect.size().height() - fontMetrics.height()) / 2 + fontMetrics.ascent());
- context->setFillColor(replacementTextColor(), style()->colorSpace());
- context->drawBidiText(font, run, FloatPoint(labelX, labelY));
- if (shouldUnavailablePluginMessageBeButton(document(), m_pluginUnavailabilityReason)) {
- arrowRect.inflate(-replacementArrowCirclePadding);
- context->beginTransparencyLayer(1.0);
- context->setFillColor(replacementTextColor(), style()->colorSpace());
- context->fillEllipse(arrowRect);
- context->setCompositeOperation(CompositeClear);
- drawReplacementArrow(context, arrowRect);
- context->endTransparencyLayer();
- }
- }
- void RenderEmbeddedObject::setUnavailablePluginIndicatorIsHidden(bool hidden)
- {
- m_isUnavailablePluginIndicatorHidden = hidden;
- repaint();
- }
- bool RenderEmbeddedObject::getReplacementTextGeometry(const LayoutPoint& accumulatedOffset, FloatRect& contentRect, FloatRect& indicatorRect, FloatRect& replacementTextRect, FloatRect& arrowRect, Font& font, TextRun& run, float& textWidth) const
- {
- bool includesArrow = shouldUnavailablePluginMessageBeButton(document(), m_pluginUnavailabilityReason);
- contentRect = contentBoxRect();
- contentRect.moveBy(roundedIntPoint(accumulatedOffset));
- FontDescription fontDescription;
- RenderTheme::defaultTheme()->systemFont(CSSValueWebkitSmallControl, fontDescription);
- fontDescription.setWeight(FontWeightBold);
- Settings* settings = document()->settings();
- ASSERT(settings);
- if (!settings)
- return false;
- fontDescription.setRenderingMode(settings->fontRenderingMode());
- fontDescription.setComputedSize(12);
- font = Font(fontDescription, 0, 0);
- font.update(0);
- run = TextRun(m_unavailablePluginReplacementText);
- textWidth = font.width(run);
- replacementTextRect.setSize(FloatSize(textWidth + replacementTextRoundedRectLeftTextMargin + (includesArrow ? replacementTextRoundedRectRightTextMarginWithArrow : replacementTextRoundedRectRightTextMargin), replacementTextRoundedRectHeight));
- float x = (contentRect.size().width() / 2 - replacementTextRect.size().width() / 2) + contentRect.location().x();
- float y = (contentRect.size().height() / 2 - replacementTextRect.size().height() / 2) + contentRect.location().y();
- replacementTextRect.setLocation(FloatPoint(x, y));
- indicatorRect = replacementTextRect;
- // Expand the background rect to include the arrow, if it will be used.
- if (includesArrow) {
- arrowRect = indicatorRect;
- arrowRect.setX(ceilf(arrowRect.maxX() + replacementArrowLeftMargin));
- arrowRect.setWidth(arrowRect.height());
- indicatorRect.unite(arrowRect);
- }
- return true;
- }
- LayoutRect RenderEmbeddedObject::unavailablePluginIndicatorBounds(const LayoutPoint& accumulatedOffset) const
- {
- FloatRect contentRect;
- FloatRect indicatorRect;
- FloatRect replacementTextRect;
- FloatRect arrowRect;
- Font font;
- TextRun run("", 0);
- float textWidth;
- if (getReplacementTextGeometry(accumulatedOffset, contentRect, indicatorRect, replacementTextRect, arrowRect, font, run, textWidth))
- return LayoutRect(indicatorRect);
- return LayoutRect();
- }
- bool RenderEmbeddedObject::isReplacementObscured() const
- {
- // Return whether or not the replacement content for blocked plugins is accessible to the user.
- // Check the opacity of each layer containing the element or its ancestors.
- float opacity = 1.0;
- for (RenderLayer* layer = enclosingLayer(); layer; layer = layer->parent()) {
- RenderLayerModelObject* renderer = layer->renderer();
- RenderStyle* style = renderer->style();
- opacity *= style->opacity();
- if (opacity < 0.1)
- return true;
- }
- // Calculate the absolute rect for the blocked plugin replacement text.
- IntRect absoluteBoundingBox = absoluteBoundingBoxRect();
- LayoutPoint absoluteLocation(absoluteBoundingBox.location());
- LayoutRect rect = unavailablePluginIndicatorBounds(absoluteLocation);
- if (rect.isEmpty())
- return true;
- RenderView* docRenderer = document()->renderView();
- ASSERT(docRenderer);
- if (!docRenderer)
- return true;
-
- HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::IgnoreClipping | HitTestRequest::DisallowShadowContent);
- HitTestResult result;
- HitTestLocation location;
-
- LayoutUnit x = rect.x();
- LayoutUnit y = rect.y();
- LayoutUnit width = rect.width();
- LayoutUnit height = rect.height();
-
- // Hit test the center and near the corners of the replacement text to ensure
- // it is visible and is not masked by other elements.
- bool hit = false;
- location = LayoutPoint(x + width / 2, y + height / 2);
- hit = docRenderer->hitTest(request, location, result);
- if (!hit || result.innerNode() != node())
- return true;
-
- location = LayoutPoint(x, y);
- hit = docRenderer->hitTest(request, location, result);
- if (!hit || result.innerNode() != node())
- return true;
-
- location = LayoutPoint(x + width, y);
- hit = docRenderer->hitTest(request, location, result);
- if (!hit || result.innerNode() != node())
- return true;
-
- location = LayoutPoint(x + width, y + height);
- hit = docRenderer->hitTest(request, location, result);
- if (!hit || result.innerNode() != node())
- return true;
-
- location = LayoutPoint(x, y + height);
- hit = docRenderer->hitTest(request, location, result);
- if (!hit || result.innerNode() != node())
- return true;
- return false;
- }
- 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();
- }
- void RenderEmbeddedObject::viewCleared()
- {
- // This is required for <object> elements whose contents are rendered by WebCore (e.g. src="foo.html").
- if (node() && widget() && widget()->isFrameView()) {
- FrameView* view = toFrameView(widget());
- int marginWidth = -1;
- int marginHeight = -1;
- if (node()->hasTagName(iframeTag)) {
- HTMLIFrameElement* frame = toHTMLIFrameElement(node());
- marginWidth = frame->marginWidth();
- marginHeight = frame->marginHeight();
- }
- if (marginWidth != -1)
- view->setMarginWidth(marginWidth);
- if (marginHeight != -1)
- view->setMarginHeight(marginHeight);
- }
- }
- bool RenderEmbeddedObject::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction hitTestAction)
- {
- if (!RenderPart::nodeAtPoint(request, result, locationInContainer, accumulatedOffset, hitTestAction))
- return false;
- if (!widget() || !widget()->isPluginViewBase())
- return true;
- PluginViewBase* view = toPluginViewBase(widget());
- IntPoint roundedPoint = locationInContainer.roundedPoint();
- if (Scrollbar* horizontalScrollbar = view->horizontalScrollbar()) {
- if (horizontalScrollbar->shouldParticipateInHitTesting() && horizontalScrollbar->frameRect().contains(roundedPoint)) {
- result.setScrollbar(horizontalScrollbar);
- return true;
- }
- }
- if (Scrollbar* verticalScrollbar = view->verticalScrollbar()) {
- if (verticalScrollbar->shouldParticipateInHitTesting() && verticalScrollbar->frameRect().contains(roundedPoint)) {
- result.setScrollbar(verticalScrollbar);
- return true;
- }
- }
- return true;
- }
- bool RenderEmbeddedObject::scroll(ScrollDirection direction, ScrollGranularity granularity, float, Node**)
- {
- if (!widget() || !widget()->isPluginViewBase())
- return false;
- return toPluginViewBase(widget())->scroll(direction, granularity);
- }
- bool RenderEmbeddedObject::logicalScroll(ScrollLogicalDirection direction, ScrollGranularity granularity, float multiplier, Node** stopNode)
- {
- // Plugins don't expose a writing direction, so assuming horizontal LTR.
- return scroll(logicalToPhysical(direction, true, false), granularity, multiplier, stopNode);
- }
- bool RenderEmbeddedObject::isInUnavailablePluginIndicator(const LayoutPoint& point) const
- {
- FloatRect contentRect;
- FloatRect indicatorRect;
- FloatRect replacementTextRect;
- FloatRect arrowRect;
- Font font;
- TextRun run("");
- float textWidth;
- return getReplacementTextGeometry(IntPoint(), contentRect, indicatorRect, replacementTextRect, arrowRect, font, run, textWidth)
- && indicatorRect.contains(point);
- }
- bool RenderEmbeddedObject::isInUnavailablePluginIndicator(MouseEvent* event) const
- {
- return isInUnavailablePluginIndicator(roundedLayoutPoint(absoluteToLocal(event->absoluteLocation(), UseTransforms)));
- }
- void RenderEmbeddedObject::handleUnavailablePluginIndicatorEvent(Event* event)
- {
- if (!shouldUnavailablePluginMessageBeButton(document(), m_pluginUnavailabilityReason))
- return;
- if (!event->isMouseEvent())
- return;
- MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
- HTMLPlugInElement* element = toHTMLPlugInElement(node());
- if (event->type() == eventNames().mousedownEvent && static_cast<MouseEvent*>(event)->button() == LeftButton) {
- m_mouseDownWasInUnavailablePluginIndicator = isInUnavailablePluginIndicator(mouseEvent);
- if (m_mouseDownWasInUnavailablePluginIndicator) {
- if (Frame* frame = document()->frame()) {
- frame->eventHandler()->setCapturingMouseEventsNode(element);
- element->setIsCapturingMouseEvents(true);
- }
- setUnavailablePluginIndicatorIsPressed(true);
- }
- event->setDefaultHandled();
- }
- if (event->type() == eventNames().mouseupEvent && static_cast<MouseEvent*>(event)->button() == LeftButton) {
- if (m_unavailablePluginIndicatorIsPressed) {
- if (Frame* frame = document()->frame()) {
- frame->eventHandler()->setCapturingMouseEventsNode(0);
- element->setIsCapturingMouseEvents(false);
- }
- setUnavailablePluginIndicatorIsPressed(false);
- }
- if (m_mouseDownWasInUnavailablePluginIndicator && isInUnavailablePluginIndicator(mouseEvent)) {
- if (Page* page = document()->page())
- page->chrome().client()->unavailablePluginButtonClicked(element, m_pluginUnavailabilityReason);
- }
- m_mouseDownWasInUnavailablePluginIndicator = false;
- event->setDefaultHandled();
- }
- if (event->type() == eventNames().mousemoveEvent) {
- setUnavailablePluginIndicatorIsPressed(m_mouseDownWasInUnavailablePluginIndicator && isInUnavailablePluginIndicator(mouseEvent));
- event->setDefaultHandled();
- }
- }
- CursorDirective RenderEmbeddedObject::getCursor(const LayoutPoint& point, Cursor& cursor) const
- {
- if (showsUnavailablePluginIndicator() && shouldUnavailablePluginMessageBeButton(document(), m_pluginUnavailabilityReason) && isInUnavailablePluginIndicator(point)) {
- cursor = handCursor();
- return SetCursor;
- }
- return RenderPart::getCursor(point, cursor);
- }
- bool RenderEmbeddedObject::canHaveChildren() const
- {
- #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
- if (!node())
- return false;
- if (toElement(node())->isMediaElement())
- return true;
- #endif
- if (isSnapshottedPlugIn())
- return true;
- return false;
- }
- }
|