1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <atlbase.h> 6 #include <atlwin.h> 7 #include <atlhost.h> 8 9 #include "base/test/perf_time_logger.h" 10 #include "base/win/scoped_comptr.h" 11 #include "chrome_frame/test/perf/chrome_frame_perftest.h" 12 13 interface IXcpControlDownloadCallback; 14 interface __declspec(uuid("1B36028E-B491-4bb2-8584-8A9E0A677D6E")) 15 IXcpControlHost : public IUnknown { 16 typedef enum { 17 XcpHostOption_FreezeOnInitialFrame = 0x001, 18 XcpHostOption_DisableFullScreen = 0x002, 19 XcpHostOption_DisableManagedExecution = 0x008, 20 XcpHostOption_EnableCrossDomainDownloads = 0x010, 21 XcpHostOption_UseCustomAppDomain = 0x020, 22 XcpHostOption_DisableNetworking = 0x040, 23 XcpHostOption_DisableScriptCallouts = 0x080, 24 XcpHostOption_EnableHtmlDomAccess = 0x100, 25 XcpHostOption_EnableScriptableObjectAccess = 0x200, 26 } XcpHostOptions; 27 28 STDMETHOD(GetHostOptions)(DWORD* pdwOptions) PURE; 29 STDMETHOD(NotifyLoaded()) PURE; 30 STDMETHOD(NotifyError)(BSTR bstrError, BSTR bstrSource, 31 long nLine, long nColumn) PURE; 32 STDMETHOD(InvokeHandler)(BSTR bstrName, VARIANT varArg1, VARIANT varArg2, 33 VARIANT* pvarResult) PURE; 34 STDMETHOD(GetBaseUrl)(BSTR* pbstrUrl) PURE; 35 STDMETHOD(GetNamedSource)(BSTR bstrSourceName, BSTR* pbstrSource) PURE; 36 STDMETHOD(DownloadUrl)(BSTR bstrUrl, IXcpControlDownloadCallback* pCallback, 37 IStream** ppStream) PURE; 38 }; 39 40 // Not templatized, to trade execution speed vs typing 41 class IXcpControlHostImpl : public IXcpControlHost { 42 public: 43 STDMETHOD(GetHostOptions)(DWORD* pdwOptions) { 44 return E_NOTIMPL; 45 } 46 47 STDMETHOD(NotifyLoaded()) { 48 return E_NOTIMPL; 49 } 50 51 STDMETHOD(NotifyError)(BSTR bstrError, BSTR bstrSource, 52 long nLine, long nColumn) { 53 return E_NOTIMPL; 54 } 55 56 STDMETHOD(InvokeHandler)(BSTR bstrName, VARIANT varArg1, VARIANT varArg2, 57 VARIANT* pvarResult) { 58 return E_NOTIMPL; 59 } 60 61 STDMETHOD(GetBaseUrl)(BSTR* pbstrUrl) { 62 return E_NOTIMPL; 63 } 64 65 STDMETHOD(GetNamedSource)(BSTR bstrSourceName, BSTR* pbstrSource) { 66 return E_NOTIMPL; 67 } 68 69 STDMETHOD(DownloadUrl)(BSTR bstrUrl, IXcpControlDownloadCallback* pCallback, 70 IStream** ppStream) { 71 return E_NOTIMPL; 72 } 73 }; 74 75 // Silverlight container. Supports do-nothing implementation of IXcpControlHost. 76 // Should be extended to do some real movie-or-something download. 77 class SilverlightContainer 78 : public IServiceProviderImpl<SilverlightContainer>, 79 public IXcpControlHostImpl, 80 public CWindowImpl< 81 SilverlightContainer, 82 CWindow, 83 CWinTraits<WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN | 84 WS_CLIPSIBLINGS, 85 WS_EX_APPWINDOW | WS_EX_WINDOWEDGE> >, 86 public CComObjectRootEx<CComSingleThreadModel> { 87 public: 88 DECLARE_WND_CLASS_EX(L"Silverlight_container", 0, 0) 89 BEGIN_COM_MAP(SilverlightContainer) 90 COM_INTERFACE_ENTRY(IServiceProvider) 91 COM_INTERFACE_ENTRY(IXcpControlHost) 92 END_COM_MAP() 93 94 BEGIN_SERVICE_MAP(SilverlightContainer) 95 SERVICE_ENTRY(__uuidof(IXcpControlHost)) 96 END_SERVICE_MAP() 97 98 BEGIN_MSG_MAP(ChromeFrameActiveXContainer) 99 MESSAGE_HANDLER(WM_DESTROY, OnDestroy) 100 END_MSG_MAP() 101 102 LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL& handled) { 103 host_.Release(); 104 return 0; 105 } 106 107 virtual void OnFinalMessage(HWND ) { 108 } 109 110 static const wchar_t* GetWndCaption() { 111 return L"Silverlight Container"; 112 } 113 114 HRESULT CreateWndAndHost(RECT* r) { 115 Create(NULL, r); 116 ShowWindow(SW_SHOWDEFAULT); 117 118 CComPtr<IUnknown> spUnkContainer; 119 HRESULT hr = CAxHostWindow::_CreatorClass::CreateInstance(NULL, 120 __uuidof(IAxWinHostWindow), reinterpret_cast<void**>(&host_)); 121 if (SUCCEEDED(hr)) { 122 CComPtr<IObjectWithSite> p; 123 hr = host_.QueryInterface(&p); 124 if (SUCCEEDED(hr)) { 125 p->SetSite(GetUnknown()); 126 } 127 } 128 return hr; 129 } 130 131 HRESULT CreateControl() { 132 HRESULT hr = host_->CreateControl(L"AgControl.AgControl", m_hWnd, NULL); 133 EXPECT_HRESULT_SUCCEEDED(hr); 134 return hr; 135 } 136 137 base::win::ScopedComPtr<IAxWinHostWindow> host_; 138 }; 139 140 // Create and in-place Silverlight control. Should be extended to do something 141 // more meaningful. 142 TEST(ChromeFramePerf, DISABLED_HostSilverlight2) { 143 SimpleModule module; 144 AtlAxWinInit(); 145 CComObjectStackEx<SilverlightContainer> wnd; 146 RECT rc = {0, 0, 800, 600}; 147 wnd.CreateWndAndHost(&rc); 148 base::PerfTimeLogger perf_create("Create Silverlight Control2"); 149 wnd.CreateControl(); 150 perf_create.Done(); 151 wnd.DestroyWindow(); 152 } 153 154 // Simplest test - creates in-place Silverlight control. 155 TEST(ChromeFramePerf, DISABLED_HostSilverlight) { 156 SimpleModule module; 157 AtlAxWinInit(); 158 CAxWindow host; 159 RECT rc = {0, 0, 800, 600}; 160 base::PerfTimeLogger perf_create("Create Silverlight Control"); 161 host.Create(NULL, rc, L"AgControl.AgControl", 162 WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 163 WS_EX_APPWINDOW | WS_EX_WINDOWEDGE); 164 EXPECT_TRUE(host.m_hWnd != NULL); 165 base::win::ScopedComPtr<IDispatch> disp; 166 HRESULT hr = host.QueryControl(disp.Receive()); 167 EXPECT_HRESULT_SUCCEEDED(hr); 168 disp.Release(); 169 perf_create.Done(); 170 } 171 172