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