| Index: chrome_frame/test/perf/silverlight.cc
|
| ===================================================================
|
| --- chrome_frame/test/perf/silverlight.cc (revision 0)
|
| +++ chrome_frame/test/perf/silverlight.cc (revision 0)
|
| @@ -0,0 +1,165 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +#include <atlbase.h>
|
| +#include <atlwin.h>
|
| +#include <atlhost.h>
|
| +#include "base/scoped_comptr_win.h"
|
| +#include "chrome_frame/test/perf/chrome_frame_perftest.h"
|
| +
|
| +interface IXcpControlDownloadCallback;
|
| +interface __declspec(uuid("1B36028E-B491-4bb2-8584-8A9E0A677D6E"))
|
| +IXcpControlHost : public IUnknown {
|
| + typedef enum {
|
| + XcpHostOption_FreezeOnInitialFrame = 0x001,
|
| + XcpHostOption_DisableFullScreen = 0x002,
|
| + XcpHostOption_DisableManagedExecution = 0x008,
|
| + XcpHostOption_EnableCrossDomainDownloads = 0x010,
|
| + XcpHostOption_UseCustomAppDomain = 0x020,
|
| + XcpHostOption_DisableNetworking = 0x040,
|
| + XcpHostOption_DisableScriptCallouts = 0x080,
|
| + XcpHostOption_EnableHtmlDomAccess = 0x100,
|
| + XcpHostOption_EnableScriptableObjectAccess = 0x200,
|
| + } XcpHostOptions;
|
| +
|
| + STDMETHOD(GetHostOptions)(DWORD* pdwOptions) PURE;
|
| + STDMETHOD(NotifyLoaded()) PURE;
|
| + STDMETHOD(NotifyError)(BSTR bstrError, BSTR bstrSource,
|
| + long nLine, long nColumn) PURE;
|
| + STDMETHOD(InvokeHandler)(BSTR bstrName, VARIANT varArg1, VARIANT varArg2,
|
| + VARIANT* pvarResult) PURE;
|
| + STDMETHOD(GetBaseUrl)(BSTR* pbstrUrl) PURE;
|
| + STDMETHOD(GetNamedSource)(BSTR bstrSourceName, BSTR* pbstrSource) PURE;
|
| + STDMETHOD(DownloadUrl)(BSTR bstrUrl, IXcpControlDownloadCallback* pCallback,
|
| + IStream** ppStream) PURE;
|
| +};
|
| +
|
| +// Not templatized, to trade execution speed vs typing
|
| +class IXcpControlHostImpl : public IXcpControlHost {
|
| + public:
|
| + STDMETHOD(GetHostOptions)(DWORD* pdwOptions) {
|
| + return E_NOTIMPL;
|
| + }
|
| +
|
| + STDMETHOD(NotifyLoaded()) {
|
| + return E_NOTIMPL;
|
| + }
|
| +
|
| + STDMETHOD(NotifyError)(BSTR bstrError, BSTR bstrSource,
|
| + long nLine, long nColumn) {
|
| + return E_NOTIMPL;
|
| + }
|
| +
|
| + STDMETHOD(InvokeHandler)(BSTR bstrName, VARIANT varArg1, VARIANT varArg2,
|
| + VARIANT* pvarResult) {
|
| + return E_NOTIMPL;
|
| + }
|
| +
|
| + STDMETHOD(GetBaseUrl)(BSTR* pbstrUrl) {
|
| + return E_NOTIMPL;
|
| + }
|
| +
|
| + STDMETHOD(GetNamedSource)(BSTR bstrSourceName, BSTR* pbstrSource) {
|
| + return E_NOTIMPL;
|
| + }
|
| +
|
| + STDMETHOD(DownloadUrl)(BSTR bstrUrl, IXcpControlDownloadCallback* pCallback,
|
| + IStream** ppStream) {
|
| + return E_NOTIMPL;
|
| + }
|
| +};
|
| +
|
| +// Silverlight container. Supports do-nothing implementation of IXcpControlHost.
|
| +// Should be extended to do some real movie-or-something download.
|
| +class SilverlightContainer :
|
| + public IServiceProviderImpl<SilverlightContainer>,
|
| + public IXcpControlHostImpl,
|
| + public CWindowImpl<SilverlightContainer, CWindow, CWinTraits<
|
| + WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
| + WS_EX_APPWINDOW | WS_EX_WINDOWEDGE> >,
|
| + public CComObjectRootEx<CComSingleThreadModel> {
|
| + public:
|
| + DECLARE_WND_CLASS_EX(L"Silverlight_container", 0, 0)
|
| + BEGIN_COM_MAP(SilverlightContainer)
|
| + COM_INTERFACE_ENTRY(IServiceProvider)
|
| + COM_INTERFACE_ENTRY(IXcpControlHost)
|
| + END_COM_MAP()
|
| +
|
| + BEGIN_SERVICE_MAP(SilverlightContainer)
|
| + SERVICE_ENTRY(__uuidof(IXcpControlHost))
|
| + END_SERVICE_MAP()
|
| +
|
| + BEGIN_MSG_MAP(ChromeFrameActiveXContainer)
|
| + MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
|
| + END_MSG_MAP()
|
| +
|
| + LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL& handled) {
|
| + host_.Release();
|
| + return 0;
|
| + }
|
| +
|
| + virtual void OnFinalMessage(HWND ) {
|
| + }
|
| +
|
| + static const wchar_t* GetWndCaption() {
|
| + return L"Silverlight Container";
|
| + }
|
| +
|
| + HRESULT CreateWndAndHost(RECT* r) {
|
| + Create(NULL, r);
|
| + ShowWindow(SW_SHOWDEFAULT);
|
| +
|
| + CComPtr<IUnknown> spUnkContainer;
|
| + HRESULT hr = CAxHostWindow::_CreatorClass::CreateInstance(NULL,
|
| + __uuidof(IAxWinHostWindow), reinterpret_cast<void**>(&host_));
|
| + if (SUCCEEDED(hr)) {
|
| + CComPtr<IObjectWithSite> p;
|
| + hr = host_.QueryInterface(&p);
|
| + if (SUCCEEDED(hr)) {
|
| + p->SetSite(GetUnknown());
|
| + }
|
| + }
|
| + return hr;
|
| + }
|
| +
|
| + HRESULT CreateControl() {
|
| + HRESULT hr = host_->CreateControl(L"AgControl.AgControl", m_hWnd, NULL);
|
| + EXPECT_HRESULT_SUCCEEDED(hr);
|
| + return hr;
|
| + }
|
| +
|
| + ScopedComPtr<IAxWinHostWindow> host_;
|
| +};
|
| +
|
| +// Create and in-place Silverlight control. Should be extended to do something
|
| +// more meaningful.
|
| +TEST(ChromeFramePerf, DISABLED_HostSilverlight2) {
|
| + SimpleModule module;
|
| + AtlAxWinInit();
|
| + CComObjectStackEx<SilverlightContainer> wnd;
|
| + RECT rc = {0, 0, 800, 600};
|
| + wnd.CreateWndAndHost(&rc);
|
| + PerfTimeLogger perf_create("Create Silverlight Control2");
|
| + wnd.CreateControl();
|
| + perf_create.Done();
|
| + wnd.DestroyWindow();
|
| +}
|
| +
|
| +// Simplest test - creates in-place Silverlight control.
|
| +TEST(ChromeFramePerf, DISABLED_HostSilverlight) {
|
| + SimpleModule module;
|
| + AtlAxWinInit();
|
| + CAxWindow host;
|
| + RECT rc = {0, 0, 800, 600};
|
| + PerfTimeLogger perf_create("Create Silverlight Control");
|
| + host.Create(NULL, rc, L"AgControl.AgControl",
|
| + WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
| + WS_EX_APPWINDOW | WS_EX_WINDOWEDGE);
|
| + EXPECT_TRUE(host.m_hWnd != NULL);
|
| + ScopedComPtr<IDispatch> disp;
|
| + HRESULT hr = host.QueryControl(disp.Receive());
|
| + EXPECT_HRESULT_SUCCEEDED(hr);
|
| + disp.Release();
|
| + perf_create.Done();
|
| +}
|
| +
|
|
|