1d0825bca7fe65beaee391d30da42e937db621564Steve Block/* 2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 3d0825bca7fe65beaee391d30da42e937db621564Steve Block * (C) 2000 Simon Hausmann <hausmann@kde.org> 4d0825bca7fe65beaee391d30da42e937db621564Steve Block * (C) 2000 Stefan Schimanski (1Stein@gmx.de) 5d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved. 6d0825bca7fe65beaee391d30da42e937db621564Steve Block * 7d0825bca7fe65beaee391d30da42e937db621564Steve Block * This library is free software; you can redistribute it and/or 8d0825bca7fe65beaee391d30da42e937db621564Steve Block * modify it under the terms of the GNU Library General Public 9d0825bca7fe65beaee391d30da42e937db621564Steve Block * License as published by the Free Software Foundation; either 10d0825bca7fe65beaee391d30da42e937db621564Steve Block * version 2 of the License, or (at your option) any later version. 11d0825bca7fe65beaee391d30da42e937db621564Steve Block * 12d0825bca7fe65beaee391d30da42e937db621564Steve Block * This library is distributed in the hope that it will be useful, 13d0825bca7fe65beaee391d30da42e937db621564Steve Block * but WITHOUT ANY WARRANTY; without even the implied warranty of 14d0825bca7fe65beaee391d30da42e937db621564Steve Block * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15d0825bca7fe65beaee391d30da42e937db621564Steve Block * Library General Public License for more details. 16d0825bca7fe65beaee391d30da42e937db621564Steve Block * 17d0825bca7fe65beaee391d30da42e937db621564Steve Block * You should have received a copy of the GNU Library General Public License 18d0825bca7fe65beaee391d30da42e937db621564Steve Block * along with this library; see the file COPYING.LIB. If not, write to 19d0825bca7fe65beaee391d30da42e937db621564Steve Block * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 20d0825bca7fe65beaee391d30da42e937db621564Steve Block * Boston, MA 02110-1301, USA. 21d0825bca7fe65beaee391d30da42e937db621564Steve Block * 22d0825bca7fe65beaee391d30da42e937db621564Steve Block */ 23d0825bca7fe65beaee391d30da42e937db621564Steve Block 24d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "config.h" 25d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "RenderEmbeddedObject.h" 26d0825bca7fe65beaee391d30da42e937db621564Steve Block 27e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "Chrome.h" 28e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "ChromeClient.h" 29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "CSSValueKeywords.h" 30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Font.h" 31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FontSelector.h" 32d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "Frame.h" 33d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "FrameLoaderClient.h" 34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "GraphicsContext.h" 35d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "HTMLEmbedElement.h" 36d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "HTMLIFrameElement.h" 37d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "HTMLNames.h" 38d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "HTMLObjectElement.h" 39d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "HTMLParamElement.h" 40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "LocalizedStrings.h" 41d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "MIMETypeRegistry.h" 42e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "MouseEvent.h" 43d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "Page.h" 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PaintInfo.h" 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Path.h" 46967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "PluginViewBase.h" 47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RenderTheme.h" 48d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "RenderView.h" 49d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "RenderWidgetProtector.h" 50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Settings.h" 51d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "Text.h" 52ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "TextRun.h" 53d0825bca7fe65beaee391d30da42e937db621564Steve Block 54d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 55d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "HTMLVideoElement.h" 56d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 57d0825bca7fe65beaee391d30da42e937db621564Steve Block 58d0825bca7fe65beaee391d30da42e937db621564Steve Blocknamespace WebCore { 59d0825bca7fe65beaee391d30da42e937db621564Steve Block 60d0825bca7fe65beaee391d30da42e937db621564Steve Blockusing namespace HTMLNames; 61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const float replacementTextRoundedRectHeight = 18; 63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const float replacementTextRoundedRectLeftRightTextMargin = 6; 64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const float replacementTextRoundedRectOpacity = 0.20f; 65e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkestatic const float replacementTextPressedRoundedRectOpacity = 0.65f; 66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const float replacementTextRoundedRectRadius = 5; 67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const float replacementTextTextOpacity = 0.55f; 68e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkestatic const float replacementTextPressedTextOpacity = 0.65f; 69d0825bca7fe65beaee391d30da42e937db621564Steve Block 70e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkestatic const Color& replacementTextRoundedRectPressedColor() 71e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 72e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke static const Color lightGray(205, 205, 205); 73e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return lightGray; 74e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 75e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 76d0825bca7fe65beaee391d30da42e937db621564Steve BlockRenderEmbeddedObject::RenderEmbeddedObject(Element* element) 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block : RenderPart(element) 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_hasFallbackContent(false) 79ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block , m_showsMissingPluginIndicator(false) 80e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke , m_missingPluginIndicatorIsPressed(false) 81e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke , m_mouseDownWasInMissingPluginIndicator(false) 82d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 83d0825bca7fe65beaee391d30da42e937db621564Steve Block view()->frameView()->setIsVisuallyNonEmpty(); 8468513a70bcd92384395513322f1b801e7bf9c729Steve Block#if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 8568513a70bcd92384395513322f1b801e7bf9c729Steve Block if (element->hasTagName(videoTag) || element->hasTagName(audioTag)) 8668513a70bcd92384395513322f1b801e7bf9c729Steve Block setHasIntrinsicSize(); 8768513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif 88d0825bca7fe65beaee391d30da42e937db621564Steve Block} 89d0825bca7fe65beaee391d30da42e937db621564Steve Block 90d0825bca7fe65beaee391d30da42e937db621564Steve BlockRenderEmbeddedObject::~RenderEmbeddedObject() 91d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 92d0825bca7fe65beaee391d30da42e937db621564Steve Block if (frameView()) 93d0825bca7fe65beaee391d30da42e937db621564Steve Block frameView()->removeWidgetToUpdate(this); 94d0825bca7fe65beaee391d30da42e937db621564Steve Block} 95d0825bca7fe65beaee391d30da42e937db621564Steve Block 96d0825bca7fe65beaee391d30da42e937db621564Steve Block#if USE(ACCELERATED_COMPOSITING) 97d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool RenderEmbeddedObject::requiresLayer() const 98d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (RenderPart::requiresLayer()) 100d0825bca7fe65beaee391d30da42e937db621564Steve Block return true; 101d0825bca7fe65beaee391d30da42e937db621564Steve Block 102d0825bca7fe65beaee391d30da42e937db621564Steve Block return allowsAcceleratedCompositing(); 103d0825bca7fe65beaee391d30da42e937db621564Steve Block} 104d0825bca7fe65beaee391d30da42e937db621564Steve Block 105d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool RenderEmbeddedObject::allowsAcceleratedCompositing() const 106d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 107967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return widget() && widget()->isPluginViewBase() && static_cast<PluginViewBase*>(widget())->platformLayer(); 108d0825bca7fe65beaee391d30da42e937db621564Steve Block} 109d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 110d0825bca7fe65beaee391d30da42e937db621564Steve Block 111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderEmbeddedObject::setShowsMissingPluginIndicator() 112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 113ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block ASSERT(m_replacementText.isEmpty()); 114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_replacementText = missingPluginText(); 115ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block m_showsMissingPluginIndicator = true; 116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 117d0825bca7fe65beaee391d30da42e937db621564Steve Block 118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderEmbeddedObject::setShowsCrashedPluginIndicator() 119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 120ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block ASSERT(m_replacementText.isEmpty()); 121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_replacementText = crashedPluginText(); 122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickbool RenderEmbeddedObject::pluginCrashedOrWasMissing() const 1255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 1265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return !m_replacementText.isNull(); 1275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 1285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 129e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid RenderEmbeddedObject::setMissingPluginIndicatorIsPressed(bool pressed) 130e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 131e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (m_missingPluginIndicatorIsPressed == pressed) 132e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return; 133e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 134e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke m_missingPluginIndicatorIsPressed = pressed; 135e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke repaint(); 136e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 137e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderEmbeddedObject::paint(PaintInfo& paintInfo, int tx, int ty) 139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 1405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (pluginCrashedOrWasMissing()) { 141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RenderReplaced::paint(paintInfo, tx, ty); 142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 143d0825bca7fe65beaee391d30da42e937db621564Steve Block } 144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RenderPart::paint(paintInfo, tx, ty); 146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderEmbeddedObject::paintReplaced(PaintInfo& paintInfo, int tx, int ty) 149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 15068513a70bcd92384395513322f1b801e7bf9c729Steve Block if (!pluginCrashedOrWasMissing()) 151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (paintInfo.phase == PaintPhaseSelection) 154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GraphicsContext* context = paintInfo.context; 157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (context->paintingDisabled()) 158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 160e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke FloatRect contentRect; 161e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke Path path; 162e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke FloatRect replacementTextRect; 163e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke Font font; 164e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke TextRun run(""); 165e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke float textWidth; 166e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (!getReplacementTextGeometry(tx, ty, contentRect, path, replacementTextRect, font, run, textWidth)) 167e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return; 168e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 169e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke context->save(); 170e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke context->clip(contentRect); 171e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke context->setAlpha(m_missingPluginIndicatorIsPressed ? replacementTextPressedRoundedRectOpacity : replacementTextRoundedRectOpacity); 172e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke context->setFillColor(m_missingPluginIndicatorIsPressed ? replacementTextRoundedRectPressedColor() : Color::white, style()->colorSpace()); 173f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch context->fillPath(path); 174e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 1752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block const FontMetrics& fontMetrics = font.fontMetrics(); 176e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke float labelX = roundf(replacementTextRect.location().x() + (replacementTextRect.size().width() - textWidth) / 2); 1772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block float labelY = roundf(replacementTextRect.location().y() + (replacementTextRect.size().height() - fontMetrics.height()) / 2 + fontMetrics.ascent()); 178e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke context->setAlpha(m_missingPluginIndicatorIsPressed ? replacementTextPressedTextOpacity : replacementTextTextOpacity); 179e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke context->setFillColor(Color::black, style()->colorSpace()); 180e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke context->drawBidiText(font, run, FloatPoint(labelX, labelY)); 181e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke context->restore(); 182e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 183e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 184e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkebool RenderEmbeddedObject::getReplacementTextGeometry(int tx, int ty, FloatRect& contentRect, Path& path, FloatRect& replacementTextRect, Font& font, TextRun& run, float& textWidth) 185e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 186e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke contentRect = contentBoxRect(); 187e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke contentRect.move(tx, ty); 188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block FontDescription fontDescription; 190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RenderTheme::defaultTheme()->systemFont(CSSValueWebkitSmallControl, fontDescription); 191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fontDescription.setWeight(FontWeightBold); 192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Settings* settings = document()->settings(); 193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(settings); 194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!settings) 195e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return false; 196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fontDescription.setRenderingMode(settings->fontRenderingMode()); 197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block fontDescription.setComputedSize(fontDescription.specifiedSize()); 198e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke font = Font(fontDescription, 0, 0); 199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block font.update(0); 200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 201e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke run = TextRun(m_replacementText.characters(), m_replacementText.length()); 20281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch textWidth = font.width(run); 203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block replacementTextRect.setSize(FloatSize(textWidth + replacementTextRoundedRectLeftRightTextMargin * 2, replacementTextRoundedRectHeight)); 205e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke float x = (contentRect.size().width() / 2 - replacementTextRect.size().width() / 2) + contentRect.location().x(); 206e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke float y = (contentRect.size().height() / 2 - replacementTextRect.size().height() / 2) + contentRect.location().y(); 207e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke replacementTextRect.setLocation(FloatPoint(x, y)); 208e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 209a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch path.addRoundedRect(replacementTextRect, FloatSize(replacementTextRoundedRectRadius, replacementTextRoundedRectRadius)); 210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 211e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return true; 212d0825bca7fe65beaee391d30da42e937db621564Steve Block} 213d0825bca7fe65beaee391d30da42e937db621564Steve Block 214d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderEmbeddedObject::layout() 215d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 216d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(needsLayout()); 217d0825bca7fe65beaee391d30da42e937db621564Steve Block 218bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen computeLogicalWidth(); 219bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen computeLogicalHeight(); 220d0825bca7fe65beaee391d30da42e937db621564Steve Block 221d0825bca7fe65beaee391d30da42e937db621564Steve Block RenderPart::layout(); 222d0825bca7fe65beaee391d30da42e937db621564Steve Block 223d0825bca7fe65beaee391d30da42e937db621564Steve Block m_overflow.clear(); 224d0825bca7fe65beaee391d30da42e937db621564Steve Block addShadowOverflow(); 225d0825bca7fe65beaee391d30da42e937db621564Steve Block 226f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch updateLayerTransform(); 227f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 228d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!widget() && frameView()) 229d0825bca7fe65beaee391d30da42e937db621564Steve Block frameView()->addWidgetToUpdate(this); 230d0825bca7fe65beaee391d30da42e937db621564Steve Block 231d0825bca7fe65beaee391d30da42e937db621564Steve Block setNeedsLayout(false); 232d0825bca7fe65beaee391d30da42e937db621564Steve Block} 233d0825bca7fe65beaee391d30da42e937db621564Steve Block 234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderEmbeddedObject::viewCleared() 235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // This is required for <object> elements whose contents are rendered by WebCore (e.g. src="foo.html"). 237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (node() && widget() && widget()->isFrameView()) { 238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block FrameView* view = static_cast<FrameView*>(widget()); 239cad810f21b803229eb11403f9209855525a25d57Steve Block int marginWidth = -1; 240cad810f21b803229eb11403f9209855525a25d57Steve Block int marginHeight = -1; 241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (node()->hasTagName(iframeTag)) { 242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block HTMLIFrameElement* frame = static_cast<HTMLIFrameElement*>(node()); 243cad810f21b803229eb11403f9209855525a25d57Steve Block marginWidth = frame->marginWidth(); 244cad810f21b803229eb11403f9209855525a25d57Steve Block marginHeight = frame->marginHeight(); 245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 246cad810f21b803229eb11403f9209855525a25d57Steve Block if (marginWidth != -1) 247cad810f21b803229eb11403f9209855525a25d57Steve Block view->setMarginWidth(marginWidth); 248cad810f21b803229eb11403f9209855525a25d57Steve Block if (marginHeight != -1) 249cad810f21b803229eb11403f9209855525a25d57Steve Block view->setMarginHeight(marginHeight); 250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 252e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 253e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkebool RenderEmbeddedObject::isInMissingPluginIndicator(MouseEvent* event) 254e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 255e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke FloatRect contentRect; 256e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke Path path; 257e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke FloatRect replacementTextRect; 258e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke Font font; 259e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke TextRun run(""); 260e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke float textWidth; 261e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (!getReplacementTextGeometry(0, 0, contentRect, path, replacementTextRect, font, run, textWidth)) 262e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return false; 263e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 264e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return path.contains(absoluteToLocal(event->absoluteLocation(), false, true)); 265e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 266e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 267e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid RenderEmbeddedObject::handleMissingPluginIndicatorEvent(Event* event) 268e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 269e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (Page* page = document()->page()) { 270e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (!page->chrome()->client()->shouldMissingPluginMessageBeButton()) 271e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return; 272e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 273e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 274e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (!event->isMouseEvent()) 275e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return; 276e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 277e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); 278e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke HTMLPlugInElement* element = static_cast<HTMLPlugInElement*>(node()); 279e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (event->type() == eventNames().mousedownEvent && static_cast<MouseEvent*>(event)->button() == LeftButton) { 280e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke m_mouseDownWasInMissingPluginIndicator = isInMissingPluginIndicator(mouseEvent); 281e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (m_mouseDownWasInMissingPluginIndicator) { 282e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (Frame* frame = document()->frame()) { 283e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke frame->eventHandler()->setCapturingMouseEventsNode(element); 284e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke element->setIsCapturingMouseEvents(true); 285e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 286e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke setMissingPluginIndicatorIsPressed(true); 287e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 288e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke event->setDefaultHandled(); 289e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 290e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (event->type() == eventNames().mouseupEvent && static_cast<MouseEvent*>(event)->button() == LeftButton) { 291e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (m_missingPluginIndicatorIsPressed) { 292e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (Frame* frame = document()->frame()) { 293e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke frame->eventHandler()->setCapturingMouseEventsNode(0); 294e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke element->setIsCapturingMouseEvents(false); 295e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 296e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke setMissingPluginIndicatorIsPressed(false); 297e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 298e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (m_mouseDownWasInMissingPluginIndicator && isInMissingPluginIndicator(mouseEvent)) { 299e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (Page* page = document()->page()) 300e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke page->chrome()->client()->missingPluginButtonClicked(element); 301e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 302e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke m_mouseDownWasInMissingPluginIndicator = false; 303e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke event->setDefaultHandled(); 304e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 305e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (event->type() == eventNames().mousemoveEvent) { 306e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke setMissingPluginIndicatorIsPressed(m_mouseDownWasInMissingPluginIndicator && isInMissingPluginIndicator(mouseEvent)); 307e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke event->setDefaultHandled(); 308e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 309e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 311d0825bca7fe65beaee391d30da42e937db621564Steve Block} 312