OLD | NEW |
| (Empty) |
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 | |
OLD | NEW |