普通文本  |  172行  |  5.26 KB

// Copyright (c) 2011 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/test/perf_time_logger.h"
#include "base/win/scoped_comptr.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;
  }

  base::win::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);
  base::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};
  base::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);
  base::win::ScopedComPtr<IDispatch> disp;
  HRESULT hr = host.QueryControl(disp.Receive());
  EXPECT_HRESULT_SUCCEEDED(hr);
  disp.Release();
  perf_create.Done();
}