1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2008 Apple Inc. All Rights Reserved. 3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Redistribution and use in source and binary forms, with or without 5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modification, are permitted provided that the following conditions 6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * are met: 7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 1. Redistributions of source code must retain the above copyright 8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * notice, this list of conditions and the following disclaimer. 9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 2. Redistributions in binary form must reproduce the above copyright 10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * notice, this list of conditions and the following disclaimer in the 11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * documentation and/or other materials provided with the distribution. 12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */ 25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h" 27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "EmbeddedWidget.h" 28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <WebCore/Document.h> 30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <WebCore/Element.h> 31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <WebCore/FrameView.h> 32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <WebCore/RenderObject.h> 33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "MemoryStream.h" 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WebError.h" 36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WebURLResponse.h" 37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace WebCore; 39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockPassRefPtr<EmbeddedWidget> EmbeddedWidget::create(IWebEmbeddedView* view, Element* element, HWND parentWindow, const IntSize& size) 41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RefPtr<EmbeddedWidget> widget = adoptRef(new EmbeddedWidget(view, element)); 43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block widget->createWindow(parentWindow, size); 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return widget.release(); 46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEmbeddedWidget::~EmbeddedWidget() 49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_window) 51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block DestroyWindow(m_window); 52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool EmbeddedWidget::createWindow(HWND parentWindow, const IntSize& size) 55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(!m_window); 57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block HWND window; 59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block SIZE pluginSize(size); 61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block HRESULT hr = m_view->createViewWindow((OLE_HANDLE)parentWindow, &pluginSize, (OLE_HANDLE*)&window); 63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (FAILED(hr) || !window) 65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_window = window; 68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EmbeddedWidget::invalidateRect(const IntRect& rect) 72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_window) 74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RECT r = rect; 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ::InvalidateRect(m_window, &r, false); 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EmbeddedWidget::setFrameRect(const IntRect& rect) 81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_element->document()->printing()) 83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (rect != frameRect()) 86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Widget::setFrameRect(rect); 87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block frameRectsChanged(); 89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EmbeddedWidget::frameRectsChanged() 92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!parent()) 94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(parent()->isFrameView()); 97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block FrameView* frameView = static_cast<FrameView*>(parent()); 98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block IntRect oldWindowRect = m_windowRect; 100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block IntRect oldClipRect = m_clipRect; 101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_windowRect = IntRect(frameView->contentsToWindow(frameRect().location()), frameRect().size()); 103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_clipRect = windowClipRect(); 104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_clipRect.move(-m_windowRect.x(), -m_windowRect.y()); 105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_window) 107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_windowRect == oldWindowRect && m_clipRect == oldClipRect) 110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block HRGN rgn; 113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // To prevent flashes while scrolling, we disable drawing during the window 115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // update process by clipping the window to the zero rect. 116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool clipToZeroRect = true; 118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (clipToZeroRect) { 120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block rgn = ::CreateRectRgn(0, 0, 0, 0); 121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ::SetWindowRgn(m_window, rgn, FALSE); 122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 1232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block rgn = ::CreateRectRgn(m_clipRect.x(), m_clipRect.y(), m_clipRect.maxX(), m_clipRect.maxY()); 124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ::SetWindowRgn(m_window, rgn, TRUE); 125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_windowRect != oldWindowRect) 128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ::MoveWindow(m_window, m_windowRect.x(), m_windowRect.y(), m_windowRect.width(), m_windowRect.height(), TRUE); 129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (clipToZeroRect) { 1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block rgn = ::CreateRectRgn(m_clipRect.x(), m_clipRect.y(), m_clipRect.maxX(), m_clipRect.maxY()); 132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ::SetWindowRgn(m_window, rgn, TRUE); 133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 13621939df44de1705786c545cd1bf519d47250322dBen Murdochvoid EmbeddedWidget::setFocus(bool focused) 137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 13821939df44de1705786c545cd1bf519d47250322dBen Murdoch if (m_window && focused) 139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block SetFocus(m_window); 140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 14121939df44de1705786c545cd1bf519d47250322dBen Murdoch Widget::setFocus(focused); 142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EmbeddedWidget::show() 145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_isVisible = true; 147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_attachedToWindow && m_window) 149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ShowWindow(m_window, SW_SHOWNA); 150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Widget::show(); 152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EmbeddedWidget::hide() 155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_isVisible = false; 157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_attachedToWindow && m_window) 159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ShowWindow(m_window, SW_HIDE); 160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Widget::hide(); 162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockIntRect EmbeddedWidget::windowClipRect() const 165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Start by clipping to our bounds. 167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block IntRect clipRect(m_windowRect); 168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Take our element and get the clip rect from the enclosing layer and frame view. 170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RenderLayer* layer = m_element->renderer()->enclosingLayer(); 171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block FrameView* parentView = m_element->document()->view(); 172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block clipRect.intersect(parentView->windowClipRectForLayer(layer, true)); 173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return clipRect; 175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EmbeddedWidget::setParent(ScrollView* parent) 178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Widget::setParent(parent); 180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_window) 182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (parent) 185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // If the embedded window or one of its children have the focus, we need to 188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // clear it to prevent the web view window from being focused because that can 189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // trigger a layout while the plugin element is being detached. 190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block HWND focusedWindow = ::GetFocus(); 191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_window == focusedWindow || ::IsChild(m_window, focusedWindow)) 192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ::SetFocus(0); 193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EmbeddedWidget::attachToWindow() 196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_attachedToWindow) 198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_attachedToWindow = true; 201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_isVisible && m_window) 202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ShowWindow(m_window, SW_SHOWNA); 203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EmbeddedWidget::detachFromWindow() 206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_attachedToWindow) 208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_isVisible && m_window) 211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ShowWindow(m_window, SW_HIDE); 212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_attachedToWindow = false; 213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EmbeddedWidget::didReceiveResponse(const ResourceResponse& response) 216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(m_view); 218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block COMPtr<IWebURLResponse> urlResponse(AdoptCOM, WebURLResponse::createInstance(response)); 220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_view->didReceiveResponse(urlResponse.get()); 221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EmbeddedWidget::didReceiveData(const char* data, int length) 224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block COMPtr<MemoryStream> stream = MemoryStream::createInstance(SharedBuffer::create(data, length)); 226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_view->didReceiveData(stream.get()); 227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EmbeddedWidget::didFinishLoading() 230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_view->didFinishLoading(); 232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EmbeddedWidget::didFail(const ResourceError& error) 235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block COMPtr<IWebError> webError(AdoptCOM, WebError::createInstance(error)); 237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_view->didFail(webError.get()); 238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 239