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