summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp')
-rw-r--r--Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp146
1 files changed, 146 insertions, 0 deletions
diff --git a/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp b/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp
new file mode 100644
index 000000000..a7a9f4aee
--- /dev/null
+++ b/Source/WebCore/rendering/RenderSnapshottedPlugIn.cpp
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "RenderSnapshottedPlugIn.h"
+
+#include "Cursor.h"
+#include "FrameLoaderClient.h"
+#include "FrameView.h"
+#include "Gradient.h"
+#include "HTMLPlugInImageElement.h"
+#include "MouseEvent.h"
+#include "PaintInfo.h"
+#include "Path.h"
+
+namespace WebCore {
+
+RenderSnapshottedPlugIn::RenderSnapshottedPlugIn(HTMLPlugInImageElement* element)
+ : RenderEmbeddedObject(element)
+ , m_snapshotResource(RenderImageResource::create())
+{
+ m_snapshotResource->initialize(this);
+}
+
+RenderSnapshottedPlugIn::~RenderSnapshottedPlugIn()
+{
+ ASSERT(m_snapshotResource);
+ m_snapshotResource->shutdown();
+}
+
+HTMLPlugInImageElement* RenderSnapshottedPlugIn::plugInImageElement() const
+{
+ return static_cast<HTMLPlugInImageElement*>(node());
+}
+
+void RenderSnapshottedPlugIn::updateSnapshot(PassRefPtr<Image> image)
+{
+ // Zero-size plugins will have no image.
+ if (!image)
+ return;
+
+ m_snapshotResource->setCachedImage(new CachedImage(image.get()));
+ repaint();
+}
+
+void RenderSnapshottedPlugIn::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
+{
+ if (plugInImageElement()->displayState() < HTMLPlugInElement::Playing) {
+ RenderReplaced::paint(paintInfo, paintOffset);
+ return;
+ }
+
+ RenderEmbeddedObject::paint(paintInfo, paintOffset);
+}
+
+void RenderSnapshottedPlugIn::paintReplaced(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
+{
+ if (plugInImageElement()->displayState() < HTMLPlugInElement::Playing) {
+ paintReplacedSnapshot(paintInfo, paintOffset);
+ theme()->paintPlugInSnapshotOverlay(this, paintInfo, paintOffset);
+ return;
+ }
+
+ RenderEmbeddedObject::paintReplaced(paintInfo, paintOffset);
+}
+
+void RenderSnapshottedPlugIn::paintReplacedSnapshot(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
+{
+ // This code should be similar to RenderImage::paintReplaced() and RenderImage::paintIntoRect().
+ LayoutUnit cWidth = contentWidth();
+ LayoutUnit cHeight = contentHeight();
+ if (!cWidth || !cHeight)
+ return;
+
+ RefPtr<Image> image = m_snapshotResource->image();
+ if (!image || image->isNull())
+ return;
+
+ GraphicsContext* context = paintInfo.context;
+#if PLATFORM(MAC)
+ if (style()->highlight() != nullAtom && !context->paintingDisabled())
+ paintCustomHighlight(toPoint(paintOffset - location()), style()->highlight(), true);
+#endif
+
+ LayoutSize contentSize(cWidth, cHeight);
+ LayoutPoint contentLocation = 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.get(), image.get(), alignedRect.size());
+ context->drawImage(image.get(), style()->colorSpace(), alignedRect, CompositeSourceOver, shouldRespectImageOrientation(), useLowQualityScaling);
+}
+
+CursorDirective RenderSnapshottedPlugIn::getCursor(const LayoutPoint& point, Cursor& overrideCursor) const
+{
+ if (plugInImageElement()->displayState() < HTMLPlugInElement::Playing) {
+ overrideCursor = handCursor();
+ return SetCursor;
+ }
+ return RenderEmbeddedObject::getCursor(point, overrideCursor);
+}
+
+void RenderSnapshottedPlugIn::handleEvent(Event* event)
+{
+ if (!event->isMouseEvent())
+ return;
+
+ MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
+ if (event->type() == eventNames().clickEvent && mouseEvent->button() == LeftButton) {
+ plugInImageElement()->setDisplayState(HTMLPlugInElement::Playing);
+ if (widget()) {
+ if (Frame* frame = document()->frame())
+ frame->loader()->client()->recreatePlugin(widget());
+ repaint();
+ }
+ event->setDefaultHandled();
+ }
+}
+
+} // namespace WebCore