15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 32f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPluginContainerImpl.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h" 3619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "platform/exported/WrappedResourceResponse.h" 37f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebElement.h" 38f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebInputEvent.h" 39f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPlugin.h" 40f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebViewClient.h" 41f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ChromeClientImpl.h" 42f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ScrollbarGroup.h" 43f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebDataSourceImpl.h" 44f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebInputEventConversion.h" 45f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h" 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptController.h" 4876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/HTMLNames.h" 4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/clipboard/Clipboard.h" 5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/clipboard/DataObject.h" 5106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/GestureEvent.h" 5206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/KeyboardEvent.h" 5306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/MouseEvent.h" 5406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/TouchEvent.h" 5506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/WheelEvent.h" 56f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "core/frame/FrameView.h" 57f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "core/frame/LocalFrame.h" 5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormElement.h" 5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLPlugInElement.h" 6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FormState.h" 6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoadRequest.h" 6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h" 6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h" 6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/scrolling/ScrollingCoordinator.h" 659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/plugins/PluginOcclusionSupport.h" 6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestResult.h" 6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderBox.h" 685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/rendering/RenderLayer.h" 691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/HostWindow.h" 7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/KeyboardCodes.h" 711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformGestureEvent.h" 721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/UserGestureIndicator.h" 73a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h" 74a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayer.h" 75a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollAnimator.h" 76a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollView.h" 77a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollbarTheme.h" 785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/Platform.h" 795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebClipboard.h" 805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebCompositorSupport.h" 8151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/WebCursorInfo.h" 825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebDragData.h" 835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebExternalTextureLayer.h" 845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebRect.h" 855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebString.h" 865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebURL.h" 875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebURLError.h" 885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebURLRequest.h" 895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebVector.h" 90f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPrintParams.h" 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore; 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink { 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Public methods -------------------------------------------------------------- 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::setFrameRect(const IntRect& frameRect) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Widget::setFrameRect(frameRect); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reportGeometry(); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::paint(GraphicsContext* gc, const IntRect& damageRect) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (gc->updatingControlTints() && m_scrollbarGroup) { 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See comment in FrameView::updateControlTints(). 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_scrollbarGroup->horizontalScrollbar()) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_scrollbarGroup->horizontalScrollbar()->invalidate(); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_scrollbarGroup->verticalScrollbar()) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_scrollbarGroup->verticalScrollbar()->invalidate(); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (gc->paintingDisabled()) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!parent()) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Don't paint anything if the plugin doesn't intersect the damage rect. 12153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!frameRect().intersects(damageRect)) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gc->save(); 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(parent()->isFrameView()); 1271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ScrollView* view = toScrollView(parent()); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The plugin is positioned in window coordinates, so it needs to be painted 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in window coordinates. 131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IntPoint origin = view->contentsToWindow(IntPoint(0, 0)); 132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) gc->translate(static_cast<float>(-origin.x()), static_cast<float>(-origin.y())); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) WebCanvas* canvas = gc->canvas(); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) IntRect windowRect = view->contentsToWindow(damageRect); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->paint(canvas, windowRect); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gc->restore(); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::invalidateRect(const IntRect& rect) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!parent()) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* renderer = toRenderBox(m_element->renderer()); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect dirtyRect = rect; 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dirtyRect.move(renderer->borderLeft() + renderer->paddingLeft(), 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) renderer->borderTop() + renderer->paddingTop()); 1525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) renderer->invalidatePaintRectangle(dirtyRect); 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::setFocus(bool focused) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Widget::setFocus(focused); 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->updateFocus(focused); 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::show() 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setSelfVisible(true); 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->updateVisibility(true); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Widget::show(); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::hide() 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setSelfVisible(false); 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->updateVisibility(false); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Widget::hide(); 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::handleEvent(Event* event) 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_webPlugin->acceptsInputEvents()) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<WebPluginContainerImpl> protector(this); 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The events we pass are defined at: 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://devedge-temp.mozilla.org/library/manuals/2002/plugin/1.0/structures5.html#1000000 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Don't take the documentation as truth, however. There are many cases 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // where mozilla behaves differently than the spec. 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event->isMouseEvent()) 188591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch handleMouseEvent(toMouseEvent(event)); 1891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) else if (event->isWheelEvent()) 1901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) handleWheelEvent(toWheelEvent(event)); 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (event->isKeyboardEvent()) 192591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch handleKeyboardEvent(toKeyboardEvent(event)); 1931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) else if (event->isTouchEvent()) 19406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) handleTouchEvent(toTouchEvent(event)); 1951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) else if (event->isGestureEvent()) 1961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) handleGestureEvent(toGestureEvent(event)); 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: it would be cleaner if Widget::handleEvent returned true/false and 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // HTMLPluginElement called setDefaultHandled or defaultEventHandler. 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!event->defaultHandled()) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_element->Node::defaultEventHandler(event); 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::frameRectsChanged() 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Widget::frameRectsChanged(); 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reportGeometry(); 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::widgetPositionsUpdated() 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Widget::widgetPositionsUpdated(); 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reportGeometry(); 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 216c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)void WebPluginContainerImpl::eventListenersRemoved() 217c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){ 218c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) // We're no longer registered to receive touch events, so don't try to remove 219c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) // the touch event handlers in our destructor. 220c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) m_touchEventRequestType = TouchEventRequestTypeNone; 221c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)} 222c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::setParentVisible(bool parentVisible) 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We override this function to make sure that geometry updates are sent 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // over to the plugin. For e.g. when a plugin is instantiated it does not 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // have a valid parent. As a result the first geometry update from webkit 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is ignored. This function is called when the plugin eventually gets a 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // parent. 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isParentVisible() == parentVisible) 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // No change. 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Widget::setParentVisible(parentVisible); 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isSelfVisible()) 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // This widget has explicitely been marked as not visible. 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->updateVisibility(isVisible()); 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebPluginContainerImpl::setParent(Widget* widget) 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We override this function so that if the plugin is windowed, we can call 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NPP_SetWindow at the first possible moment. This ensures that 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NPP_SetWindow is called before the manual load data is sent to a plugin. 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If this order is reversed, Flash won't load videos. 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) Widget::setParent(widget); 2491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (widget) 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reportGeometry(); 251a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch else if (m_webPlugin) 252a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch m_webPlugin->containerDidDetachFromParent(); 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::setPlugin(WebPlugin* plugin) 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (plugin != m_webPlugin) { 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_element->resetInstance(); 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin = plugin; 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float WebPluginContainerImpl::deviceScaleFactor() 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Page* page = m_element->document().page(); 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page) 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 1.0; 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return page->deviceScaleFactor(); 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float WebPluginContainerImpl::pageScaleFactor() 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Page* page = m_element->document().page(); 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page) 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 1.0; 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return page->pageScaleFactor(); 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float WebPluginContainerImpl::pageZoomFactor() 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = m_element->document().frame(); 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 1.0; 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return frame->pageZoomFactor(); 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebPluginContainerImpl::setWebLayer(WebLayer* layer) 288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_webLayer == layer) 290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_webLayer) 2935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) GraphicsLayer::unregisterContentsLayer(m_webLayer); 294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (layer) 2955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) GraphicsLayer::registerContentsLayer(layer); 2965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // If either of the layers is null we need to switch between hardware 2985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // and software compositing. 2995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) bool needsCompositingUpdate = !m_webLayer || !layer; 3005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_webLayer = layer; 3025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 3035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!needsCompositingUpdate) 3045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 3055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 3065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_element->setNeedsCompositingUpdate(); 3075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Being composited or not affects the self painting layer bit 3085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // on the RenderLayer. 3095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (RenderPart* renderer = m_element->renderPart()) { 3105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ASSERT(renderer->hasLayer()); 3115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) renderer->layer()->updateSelfPaintingLayer(); 3125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginContainerImpl::supportsPaginatedPrint() const 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_webPlugin->supportsPaginatedPrint(); 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginContainerImpl::isPrintScalingDisabled() const 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_webPlugin->isPrintScalingDisabled(); 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int WebPluginContainerImpl::printBegin(const WebPrintParams& printParams) const 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_webPlugin->printBegin(printParams); 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginContainerImpl::printPage(int pageNumber, 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebCore::GraphicsContext* gc) 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 33310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (gc->paintingDisabled()) 33410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return true; 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gc->save(); 33681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) WebCanvas* canvas = gc->canvas(); 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool ret = m_webPlugin->printPage(pageNumber, canvas); 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gc->restore(); 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ret; 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::printEnd() 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->printEnd(); 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::copy() 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_webPlugin->hasSelection()) 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) blink::Platform::current()->clipboard()->writeHTML(m_webPlugin->selectionAsMarkup(), WebURL(), m_webPlugin->selectionAsText(), false); 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool WebPluginContainerImpl::executeEditCommand(const WebString& name) 35653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 35753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_webPlugin->executeEditCommand(name)) 35853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return true; 35953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 360521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (name != "Copy") 36153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return false; 36253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 36353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) copy(); 36453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return true; 36553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 36653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 3675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)bool WebPluginContainerImpl::executeEditCommand(const WebString& name, const WebString& value) 3685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 3695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return m_webPlugin->executeEditCommand(name, value); 3705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 3715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebElement WebPluginContainerImpl::element() 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebElement(m_element); 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::invalidate() 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Widget::invalidate(); 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::invalidateRect(const WebRect& rect) 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) invalidateRect(static_cast<IntRect>(rect)); 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::scrollRect(int dx, int dy, const WebRect& rect) 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Widget* parentWidget = parent(); 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parentWidget->isFrameView()) { 391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FrameView* parentFrameView = toFrameView(parentWidget); 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!parentFrameView->isOverlapped()) { 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect damageRect = convertToContainingWindow(static_cast<IntRect>(rect)); 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntSize scrollDelta(dx, dy); 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // scroll() only uses the second rectangle, clipRect, and ignores the first 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // rectangle. 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parent()->hostWindow()->scroll(scrollDelta, damageRect, damageRect); 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Use slow scrolling instead. 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) invalidateRect(rect); 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::reportGeometry() 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!parent()) 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect windowRect, clipRect; 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<IntRect> cutOutRects; 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) calculateGeometry(frameRect(), windowRect, clipRect, cutOutRects); 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->updateGeometry(windowRect, clipRect, cutOutRects, isVisible()); 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_scrollbarGroup) { 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_scrollbarGroup->scrollAnimator()->contentsResized(); 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_scrollbarGroup->setFrameRect(frameRect()); 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void WebPluginContainerImpl::allowScriptObjects() 42493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 42593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 42693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::clearScriptObjects() 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 429d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = m_element->document().frame(); 430e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (!frame) 431e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return; 432f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame->script().cleanupScriptObjectsForPlugin(this); 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NPObject* WebPluginContainerImpl::scriptableObjectForElement() 4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_element->getNPObject(); 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebPluginContainerImpl::executeScriptURL(const WebURL& url, bool popupsAllowed) 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 442d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = m_element->document().frame(); 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebString(); 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const KURL& kurl = url; 4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(kurl.protocolIs("javascript")); 4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String script = decodeURLEscapeSequences( 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) kurl.string().substring(strlen("javascript:"))); 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) UserGestureIndicator gestureIndicator(popupsAllowed ? DefinitelyProcessingNewUserGesture : PossiblyProcessingUserGesture); 4535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) v8::HandleScope handleScope(toIsolate(frame)); 4545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) v8::Local<v8::Value> result = frame->script().executeScriptInMainWorldAndReturnValue(ScriptSourceCode(script)); 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Failure is reported as a null string. 4575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (result.IsEmpty() || !result->IsString()) 4585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return WebString(); 4595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return toCoreString(v8::Handle<v8::String>::Cast(result)); 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::loadFrameRequest(const WebURLRequest& request, const WebString& target, bool notifyNeeded, void* notifyData) 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 464d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = m_element->document().frame(); 465f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (!frame || !frame->loader().documentLoader()) 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // FIXME: send a notification in this case? 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (notifyNeeded) { 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: This is a bit of hack to allow us to observe completion of 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // our frame request. It would be better to evolve FrameLoader to 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // support a completion callback instead. 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<WebPluginLoadObserver> observer = adoptPtr(new WebPluginLoadObserver(this, request.url(), notifyData)); 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Calling get here is dangerous! What if observer is freed? 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pluginLoadObservers.append(observer.get()); 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebDataSourceImpl::setNextPluginLoadObserver(observer.release()); 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 47809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) FrameLoadRequest frameRequest(frame->document(), request.toResourceRequest(), target); 479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) UserGestureIndicator gestureIndicator(request.hasUserGesture() ? DefinitelyProcessingNewUserGesture : PossiblyProcessingUserGesture); 480f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame->loader().load(frameRequest); 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::zoomLevelChanged(double zoomLevel) 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) WebViewImpl* view = WebViewImpl::fromPage(m_element->document().frame()->page()); 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) view->fullFramePluginZoomLevelChanged(zoomLevel); 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginContainerImpl::isRectTopmost(const WebRect& rect) 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 491d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = m_element->document().frame(); 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // hitTestResultAtPoint() takes a padding rectangle. 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: We'll be off by 1 when the width or height is even. 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect documentRect(x() + rect.x, y() + rect.y, rect.width, rect.height); 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutPoint center = documentRect.center(); 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make the rect we're checking (the point surrounded by padding rects) contained inside the requested rect. (Note that -1/2 is 0.) 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutSize padding((documentRect.width() - 1) / 2, (documentRect.height() - 1) / 2); 50119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) HitTestResult result = frame->eventHandler().hitTestResultAtPoint(center, HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent, padding); 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const HitTestResult::NodeSet& nodes = result.rectBasedTestResult(); 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (nodes.size() != 1) 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 505e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return nodes.first().get() == m_element; 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 508926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebPluginContainerImpl::requestTouchEventType(TouchEventRequestType requestType) 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 510926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_touchEventRequestType == requestType) 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 513926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (requestType != TouchEventRequestTypeNone && m_touchEventRequestType == TouchEventRequestTypeNone) 5141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_element->document().didAddTouchEventHandler(m_element); 515926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (requestType == TouchEventRequestTypeNone && m_touchEventRequestType != TouchEventRequestTypeNone) 5161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_element->document().didRemoveTouchEventHandler(m_element); 517926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_touchEventRequestType = requestType; 518926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 519926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 520926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebPluginContainerImpl::setWantsWheelEvents(bool wantsWheelEvents) 521926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 522926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_wantsWheelEvents == wantsWheelEvents) 523926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 524926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_wantsWheelEvents = wantsWheelEvents; 5258abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (Page* page = m_element->document().page()) { 526926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator()) { 527926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (parent() && parent()->isFrameView()) 52819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) scrollingCoordinator->notifyLayoutUpdated(); 529926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 530926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 531926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 532926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebPoint WebPluginContainerImpl::windowToLocalPoint(const WebPoint& point) 534926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 5351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ScrollView* view = toScrollView(parent()); 536926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!view) 537926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return point; 538926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebPoint windowPoint = view->windowToContents(point); 539926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return roundedIntPoint(m_element->renderer()->absoluteToLocal(LayoutPoint(windowPoint), UseTransforms)); 5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)WebPoint WebPluginContainerImpl::localToWindowPoint(const WebPoint& point) 5435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 5441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ScrollView* view = toScrollView(parent()); 5455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!view) 5465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return point; 5475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) IntPoint absolutePoint = roundedIntPoint(m_element->renderer()->localToAbsolute(LayoutPoint(point), UseTransforms)); 5485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return view->contentsToWindow(absolutePoint); 5495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 5505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::didReceiveResponse(const ResourceResponse& response) 5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make sure that the plugin receives window geometry before data, or else 5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // plugins misbehave. 5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) frameRectsChanged(); 5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WrappedResourceResponse urlResponse(response); 5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->didReceiveResponse(urlResponse); 5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::didReceiveData(const char *data, int dataLength) 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->didReceiveData(data, dataLength); 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::didFinishLoading() 5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->didFinishLoading(); 5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::didFailLoading(const ResourceError& error) 5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->didFailLoading(error); 5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebLayer* WebPluginContainerImpl::platformLayer() const 57753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 57853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return m_webLayer; 57953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 58053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NPObject* WebPluginContainerImpl::scriptableObject() 5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_webPlugin->scriptableObject(); 5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginContainerImpl::getFormValue(String& value) 5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebString webValue; 5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_webPlugin->getFormValue(webValue)) { 5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value = webValue; 5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginContainerImpl::supportsKeyboardFocus() const 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_webPlugin->supportsKeyboardFocus(); 5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 601a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)bool WebPluginContainerImpl::supportsInputMethod() const 602a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){ 603a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return m_webPlugin->supportsInputMethod(); 604a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)} 605a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginContainerImpl::canProcessDrag() const 6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_webPlugin->canProcessDrag(); 6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebPluginContainerImpl::wantsWheelEvents() 612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_wantsWheelEvents; 614926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 615926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::willDestroyPluginLoadObserver(WebPluginLoadObserver* observer) 6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t pos = m_pluginLoadObservers.find(observer); 61906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (pos == kNotFound) 6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pluginLoadObservers.remove(pos); 6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ScrollbarGroup* WebPluginContainerImpl::scrollbarGroup() 6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_scrollbarGroup) 6278abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_scrollbarGroup = adoptPtr(new ScrollbarGroup(m_element->document().frame()->view(), frameRect())); 6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_scrollbarGroup.get(); 6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::willStartLiveResize() 6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_scrollbarGroup) 6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_scrollbarGroup->willStartLiveResize(); 6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::willEndLiveResize() 6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_scrollbarGroup) 6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_scrollbarGroup->willEndLiveResize(); 6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebPluginContainerImpl::paintCustomOverhangArea(GraphicsContext* context, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect) 6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) context->save(); 6465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) context->setFillColor(Color(0xCC, 0xCC, 0xCC)); 6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) context->fillRect(intersection(horizontalOverhangArea, dirtyRect)); 6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) context->fillRect(intersection(verticalOverhangArea, dirtyRect)); 6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) context->restore(); 6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Private methods ------------------------------------------------------------- 6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebPluginContainerImpl::WebPluginContainerImpl(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin) 65653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) : m_element(element) 6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_webPlugin(webPlugin) 658926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_webLayer(0) 659926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_touchEventRequestType(TouchEventRequestTypeNone) 660926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_wantsWheelEvents(false) 6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebPluginContainerImpl::~WebPluginContainerImpl() 6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (m_touchEventRequestType != TouchEventRequestTypeNone) 6671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_element->document().didRemoveTouchEventHandler(m_element); 6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < m_pluginLoadObservers.size(); ++i) 6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pluginLoadObservers[i]->clearPluginContainer(); 6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->destroy(); 672926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_webLayer) 6735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) GraphicsLayer::unregisterContentsLayer(m_webLayer); 6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::handleMouseEvent(MouseEvent* event) 6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(parent()->isFrameView()); 6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event->isDragEvent()) { 6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_webPlugin->canProcessDrag()) 6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) handleDragEvent(event); 6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We cache the parent FrameView here as the plugin widget could be deleted 6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in the call to HandleEvent. See http://b/issue?id=1362948 688926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FrameView* parentView = toFrameView(parent()); 6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebMouseEventBuilder webEvent(this, m_element->renderer(), *event); 6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webEvent.type == WebInputEvent::Undefined) 6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (event->type() == EventTypeNames::mousedown) 695926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) focusPlugin(); 6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_scrollbarGroup) { 6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This needs to be set before the other callbacks in this scope, since 6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the scroll animator class might query the position in response. 7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_scrollbarGroup->setLastMousePosition(IntPoint(event->x(), event->y())); 7011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (event->type() == EventTypeNames::mousemove) 7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_scrollbarGroup->scrollAnimator()->mouseMovedInContentArea(); 7031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) else if (event->type() == EventTypeNames::mouseover) 7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_scrollbarGroup->scrollAnimator()->mouseEnteredContentArea(); 7051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) else if (event->type() == EventTypeNames::mouseout) 7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_scrollbarGroup->scrollAnimator()->mouseExitedContentArea(); 7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebCursorInfo cursorInfo; 71007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (m_webPlugin->handleInputEvent(webEvent, cursorInfo)) 7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event->setDefaultHandled(); 7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A windowless plugin can change the cursor in response to a mouse move 7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // event. We need to reflect the changed cursor in the frame view as the 7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // mouse is moved in the boundaries of the windowless plugin. 7168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Page* page = parentView->frame().page(); 7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page) 7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 71909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) toChromeClientImpl(page->chrome().client()).setCursorForPlugin(cursorInfo); 7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::handleDragEvent(MouseEvent* event) 7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(event->isDragEvent()); 7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebDragStatus dragStatus = WebDragStatusUnknown; 7271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (event->type() == EventTypeNames::dragenter) 7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dragStatus = WebDragStatusEnter; 7291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) else if (event->type() == EventTypeNames::dragleave) 7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dragStatus = WebDragStatusLeave; 7311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) else if (event->type() == EventTypeNames::dragover) 7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dragStatus = WebDragStatusOver; 7331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) else if (event->type() == EventTypeNames::drop) 7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dragStatus = WebDragStatusDrop; 7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (dragStatus == WebDragStatusUnknown) 7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) Clipboard* clipboard = event->dataTransfer(); 740d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WebDragData dragData(clipboard->dataObject()); 7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebDragOperationsMask dragOperationMask = static_cast<WebDragOperationsMask>(clipboard->sourceOperation()); 7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebPoint dragScreenLocation(event->screenX(), event->screenY()); 7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebPoint dragLocation(event->absoluteLocation().x() - location().x(), event->absoluteLocation().y() - location().y()); 7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webPlugin->handleDragStatusUpdate(dragStatus, dragData, dragOperationMask, dragLocation, dragScreenLocation); 7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::handleWheelEvent(WheelEvent* event) 7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebMouseWheelEventBuilder webEvent(this, m_element->renderer(), *event); 7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webEvent.type == WebInputEvent::Undefined) 7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebCursorInfo cursorInfo; 75507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (m_webPlugin->handleInputEvent(webEvent, cursorInfo)) 7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event->setDefaultHandled(); 7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::handleKeyboardEvent(KeyboardEvent* event) 7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebKeyboardEventBuilder webEvent(*event); 7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webEvent.type == WebInputEvent::Undefined) 7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webEvent.type == WebInputEvent::KeyDown) { 7668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX) 7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webEvent.modifiers == WebInputEvent::MetaKey 7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else 7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webEvent.modifiers == WebInputEvent::ControlKey 7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && webEvent.windowsKeyCode == VKEY_C 7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Only copy if there's a selection, so that we only ever do this 7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for Pepper plugins that support copying. Windowless NPAPI 7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // plugins will get the event as before. 7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && m_webPlugin->hasSelection()) { 7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) copy(); 7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event->setDefaultHandled(); 7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebInputEvent* currentInputEvent = WebViewImpl::currentInputEvent(); 7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Copy stashed info over, and only copy here in order not to interfere 7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the ctrl-c logic above. 7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (currentInputEvent 7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && WebInputEvent::isKeyboardEventType(currentInputEvent->type)) { 7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) webEvent.modifiers |= currentInputEvent->modifiers & 7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (WebInputEvent::CapsLockOn | WebInputEvent::NumLockOn); 7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // Give the client a chance to issue edit comamnds. 7938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) WebViewImpl* view = WebViewImpl::fromPage(m_element->document().frame()->page()); 7945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (m_webPlugin->supportsEditCommands() && view->client()) 7955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) view->client()->handleCurrentKeyboardEvent(); 7965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebCursorInfo cursorInfo; 79807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (m_webPlugin->handleInputEvent(webEvent, cursorInfo)) 7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event->setDefaultHandled(); 8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::handleTouchEvent(TouchEvent* event) 8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 804926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) switch (m_touchEventRequestType) { 805926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case TouchEventRequestTypeNone: 806926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 807926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case TouchEventRequestTypeRaw: { 808926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebTouchEventBuilder webEvent(this, m_element->renderer(), *event); 809926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (webEvent.type == WebInputEvent::Undefined) 810926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 811926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 8121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (event->type() == EventTypeNames::touchstart) 813926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) focusPlugin(); 814926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 815926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebCursorInfo cursorInfo; 81607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (m_webPlugin->handleInputEvent(webEvent, cursorInfo)) 817926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) event->setDefaultHandled(); 818926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // FIXME: Can a plugin change the cursor from a touch-event callback? 819926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 820926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 821926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case TouchEventRequestTypeSynthesizedMouse: 822926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) synthesizeMouseEventIfPossible(event); 8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 824926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 825926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 826926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 827926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static inline bool gestureScrollHelper(ScrollbarGroup* scrollbarGroup, ScrollDirection positiveDirection, ScrollDirection negativeDirection, float delta) 828926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 829926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!delta) 830926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 831926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) float absDelta = delta > 0 ? delta : -delta; 832926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return scrollbarGroup->scroll(delta < 0 ? negativeDirection : positiveDirection, ScrollByPrecisePixel, absDelta); 833926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 834926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 835926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebPluginContainerImpl::handleGestureEvent(GestureEvent* event) 836926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 837926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebGestureEventBuilder webEvent(this, m_element->renderer(), *event); 8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webEvent.type == WebInputEvent::Undefined) 8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 8405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (event->type() == EventTypeNames::gesturetapdown) 8415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) focusPlugin(); 8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebCursorInfo cursorInfo; 843926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_webPlugin->handleInputEvent(webEvent, cursorInfo)) { 8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event->setDefaultHandled(); 845926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 846926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 847926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 848926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (webEvent.type == WebInputEvent::GestureScrollUpdate || webEvent.type == WebInputEvent::GestureScrollUpdateWithoutPropagation) { 849926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_scrollbarGroup) 850926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 851926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (gestureScrollHelper(m_scrollbarGroup.get(), ScrollLeft, ScrollRight, webEvent.data.scrollUpdate.deltaX)) 852926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) event->setDefaultHandled(); 853926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (gestureScrollHelper(m_scrollbarGroup.get(), ScrollUp, ScrollDown, webEvent.data.scrollUpdate.deltaY)) 854926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) event->setDefaultHandled(); 855926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Can a plugin change the cursor from a touch-event callback? 8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 859926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebPluginContainerImpl::synthesizeMouseEventIfPossible(TouchEvent* event) 8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 861926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebMouseEventBuilder webEvent(this, m_element->renderer(), *event); 8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webEvent.type == WebInputEvent::Undefined) 8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 864926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebCursorInfo cursorInfo; 86607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (m_webPlugin->handleInputEvent(webEvent, cursorInfo)) 8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event->setDefaultHandled(); 868926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 869926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 870926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebPluginContainerImpl::focusPlugin() 871926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 872d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame& containingFrame = toFrameView(parent())->frame(); 8738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (Page* currentPage = containingFrame.page()) 8748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) currentPage->focusController().setFocusedElement(m_element, &containingFrame); 875926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else 8768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) containingFrame.document()->setFocusedElement(m_element); 8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebPluginContainerImpl::calculateGeometry(const IntRect& frameRect, 8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect& windowRect, 8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect& clipRect, 8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<IntRect>& cutOutRects) 8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) windowRect = toScrollView(parent())->contentsToWindow(frameRect); 8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Calculate a clip-rect so that we don't overlap the scrollbars, etc. 8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clipRect = windowClipRect(); 8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clipRect.move(-windowRect.x(), -windowRect.y()); 8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) getPluginOcclusions(m_element, this->parent(), frameRect, cutOutRects); 8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Convert to the plugin position. 8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < cutOutRects.size(); i++) 8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cutOutRects[i].move(-frameRect.x(), -frameRect.y()); 8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebCore::IntRect WebPluginContainerImpl::windowClipRect() const 8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Start by clipping to our bounds. 8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect clipRect = 9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) convertToContainingWindow(IntRect(0, 0, width(), height())); 9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 902d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // document().renderView() can be 0 when we receive messages from the 9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // plugins while we are destroying a frame. 9041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // FIXME: Can we just check m_element->document().isActive() ? 905d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (m_element->renderer()->document().renderView()) { 9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Take our element and get the clip rect from the enclosing layer and 9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // frame view. 9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clipRect.intersect( 909d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_element->document().view()->windowClipRectForFrameOwner(m_element)); 9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return clipRect; 9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 915a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochbool WebPluginContainerImpl::pluginShouldPersist() const 916a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{ 917a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return m_webPlugin->shouldPersist(); 918a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 919a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 92051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink 921