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