15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/com_message_event.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <atlbase.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <atlcom.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To allow the unit test read-only access to check protected member variables.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FriendlyComMessageEvent : public ComMessageEvent {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline IHTMLEventObj* basic_event() { return basic_event_; }
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ATL_NO_VTABLE MockDumbContainer :
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public CComObjectRoot,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public IOleContainer {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DECLARE_NOT_AGGREGATABLE(MockDumbContainer)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BEGIN_COM_MAP(MockDumbContainer)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COM_INTERFACE_ENTRY(IParseDisplayName)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COM_INTERFACE_ENTRY(IOleContainer)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  END_COM_MAP()
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHOD(ParseDisplayName)(IBindCtx*, LPOLESTR, ULONG*, IMoniker**) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return E_NOTIMPL;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHOD(EnumObjects)(DWORD, IEnumUnknown**) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return E_NOTIMPL;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHOD(LockContainer)(BOOL) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return E_NOTIMPL;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ComMessageEvent, WithDumbContainer) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CComObject<MockDumbContainer>* container_obj = NULL;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CComObject<MockDumbContainer>::CreateInstance(&container_obj);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedComPtr<IOleContainer> container(container_obj);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(!container);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CComObject<FriendlyComMessageEvent>* event_obj = NULL;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CComObject<FriendlyComMessageEvent>::CreateInstance(&event_obj);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedComPtr<IUnknown> event_ref(event_obj);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = event_obj->Initialize(container, "hi", "http://www.foo.com/",
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      "message");
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(result);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(!event_obj->basic_event());
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mock object to mimic a "smart" container, e.g. IE, that will
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be able to return an IHTMLDocument2 and 4, and from which you
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// can get an IHTMLEventObj implementation.  Doubles as a mock
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IHTMLEventObj implementation.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ATL_NO_VTABLE MockSmartContainer :
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public CComObjectRoot,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public IOleContainer,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public IHTMLDocument2,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public IHTMLDocument4,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public IHTMLEventObj {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DECLARE_NOT_AGGREGATABLE(MockSmartContainer)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BEGIN_COM_MAP(MockSmartContainer)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COM_INTERFACE_ENTRY_IID(IID_IDispatch, IHTMLEventObj)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COM_INTERFACE_ENTRY(IParseDisplayName)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COM_INTERFACE_ENTRY(IOleContainer)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COM_INTERFACE_ENTRY(IHTMLDocument)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COM_INTERFACE_ENTRY(IHTMLDocument2)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COM_INTERFACE_ENTRY(IHTMLDocument4)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COM_INTERFACE_ENTRY(IHTMLEventObj)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  END_COM_MAP()
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const DISPID kDispId = 424242;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const long kResultValue = 42;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only method we actually implement from IHTMLDocument4, to give
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // out the mock IHTMLEventObj.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHOD(createEventObject)(VARIANT*, IHTMLEventObj** event_obj) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetUnknown()->QueryInterface(event_obj);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dummy IDispatch implementation for unit testing, to validate
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // passthrough semantics.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHOD(GetIDsOfNames)(REFIID iid, LPOLESTR* names, UINT num_names,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           LCID lcid, DISPID* disp_ids) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(num_names == 1);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disp_ids[0] = kDispId;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHOD(Invoke)(DISPID id, REFIID iid, LCID lcid, WORD flags,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DISPPARAMS* disp_params, VARIANT* var_result,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EXCEPINFO* excep_info, UINT* arg_error) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var_result->vt = VT_I4;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var_result->lVal = kResultValue;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do-nothing implementation of the rest of the interface methods.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To make this less verbose, define a macro here and undefine it
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // at the end of the list.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define STDMETHODNOTIMP(method, parameters) \
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STDMETHOD(method) parameters { \
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED(); \
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return E_NOTIMPL; \
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IDispatch
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(GetTypeInfoCount, (UINT*));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(GetTypeInfo, (UINT, LCID, ITypeInfo**));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IParseDisplayName
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(ParseDisplayName, (IBindCtx*, LPOLESTR, ULONG*, IMoniker**));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IOleContainer
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(EnumObjects, (DWORD, IEnumUnknown**));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(LockContainer, (BOOL));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IHTMLDocument
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_Script, (IDispatch**));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IHTMLDocument2
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_all, (IHTMLElementCollection**));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_body, (IHTMLElement**));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_activeElement, (IHTMLElement**));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_images, (IHTMLElementCollection**));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_applets, (IHTMLElementCollection**));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_links, (IHTMLElementCollection**));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_forms, (IHTMLElementCollection**));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_anchors, (IHTMLElementCollection**));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_title, (BSTR));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_title, (BSTR*));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_scripts, (IHTMLElementCollection**));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_designMode, (BSTR));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_designMode, (BSTR*));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_selection, (IHTMLSelectionObject**));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_readyState, (BSTR*));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_frames, (IHTMLFramesCollection2**));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_embeds, (IHTMLElementCollection**));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_plugins, (IHTMLElementCollection**));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_alinkColor, (VARIANT));
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_alinkColor, (VARIANT*));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_bgColor, (VARIANT));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_bgColor, (VARIANT*));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_fgColor, (VARIANT));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_fgColor, (VARIANT*));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_linkColor, (VARIANT));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_linkColor, (VARIANT*));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_vlinkColor, (VARIANT));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_vlinkColor, (VARIANT*));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_referrer, (BSTR*));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_location, (IHTMLLocation**));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_lastModified, (BSTR*));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_URL, (BSTR));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_URL, (BSTR*));
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_domain, (BSTR));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_domain, (BSTR*));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_cookie, (BSTR));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_cookie, (BSTR*));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_expando, (VARIANT_BOOL));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_expando, (VARIANT_BOOL*));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_charset, (BSTR));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_charset, (BSTR*));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_defaultCharset, (BSTR));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_defaultCharset, (BSTR*));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_mimeType, (BSTR*));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_fileSize, (BSTR*));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_fileCreatedDate, (BSTR*));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_fileModifiedDate, (BSTR*));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_fileUpdatedDate, (BSTR*));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_security, (BSTR*));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_protocol, (BSTR*));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_nameProp, (BSTR*));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(write, (SAFEARRAY*));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(writeln, (SAFEARRAY*));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(open, (BSTR, VARIANT, VARIANT, VARIANT, IDispatch**));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(close, ());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(clear, ());
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(queryCommandSupported, (BSTR, VARIANT_BOOL*));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(queryCommandEnabled, (BSTR, VARIANT_BOOL*));
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(queryCommandState, (BSTR, VARIANT_BOOL*));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(queryCommandIndeterm, (BSTR, VARIANT_BOOL*));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(queryCommandText, (BSTR, BSTR*));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(queryCommandValue, (BSTR, VARIANT*));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(execCommand, (BSTR, VARIANT_BOOL, VARIANT, VARIANT_BOOL*));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(execCommandShowHelp, (BSTR, VARIANT_BOOL*));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(createElement, (BSTR, IHTMLElement**));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onhelp, (VARIANT));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onhelp, (VARIANT*));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onclick, (VARIANT));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onclick, (VARIANT*));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_ondblclick, (VARIANT));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_ondblclick, (VARIANT*));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onkeyup, (VARIANT));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onkeyup, (VARIANT*));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onkeydown, (VARIANT));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onkeydown, (VARIANT*));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onkeypress, (VARIANT));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onkeypress, (VARIANT*));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onmouseup, (VARIANT));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onmouseup, (VARIANT*));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onmousedown, (VARIANT));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onmousedown, (VARIANT*));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onmousemove, (VARIANT));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onmousemove, (VARIANT*));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onmouseout, (VARIANT));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onmouseout, (VARIANT*));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onmouseover, (VARIANT));
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onmouseover, (VARIANT*));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onreadystatechange, (VARIANT));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onreadystatechange, (VARIANT*));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onafterupdate, (VARIANT));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onafterupdate, (VARIANT*));
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onrowexit, (VARIANT));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onrowexit, (VARIANT*));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onrowenter, (VARIANT));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onrowenter, (VARIANT*));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_ondragstart, (VARIANT));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_ondragstart, (VARIANT*));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onselectstart, (VARIANT));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onselectstart, (VARIANT*));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(elementFromPoint, (long, long, IHTMLElement**));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_parentWindow, (IHTMLWindow2**));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_styleSheets, (IHTMLStyleSheetsCollection**));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onbeforeupdate, (VARIANT));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onbeforeupdate, (VARIANT*));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onerrorupdate, (VARIANT));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onerrorupdate, (VARIANT*));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(toString, (BSTR*));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(createStyleSheet, (BSTR, long, IHTMLStyleSheet**));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IHTMLDocument4
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(focus, ());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(hasFocus, (VARIANT_BOOL*));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_onselectionchange, (VARIANT));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_onselectionchange, (VARIANT*));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_namespaces, (IDispatch**));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(createDocumentFromUrl, (BSTR, BSTR, IHTMLDocument2**));
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_media, (BSTR));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_media, (BSTR*));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(fireEvent, (BSTR, VARIANT*, VARIANT_BOOL*));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(createRenderStyle, (BSTR, IHTMLRenderStyle**));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_oncontrolselect, (VARIANT));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_oncontrolselect, (VARIANT*));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_URLUnencoded, (BSTR*));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IHTMLEventObj
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_srcElement, (IHTMLElement**))
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_altKey, (VARIANT_BOOL*));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_ctrlKey, (VARIANT_BOOL*));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_shiftKey, (VARIANT_BOOL*));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_returnValue, (VARIANT));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_returnValue, (VARIANT*));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_cancelBubble, (VARIANT_BOOL));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_cancelBubble, (VARIANT_BOOL*));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_fromElement, (IHTMLElement**));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_toElement, (IHTMLElement**));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(put_keyCode, (long));
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_keyCode, (long*));
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_button, (long*));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_type, (BSTR*));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_qualifier, (BSTR*));
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_reason, (long*));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_x, (long*));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_y, (long*));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_clientX, (long*));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_clientY, (long*));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_offsetX, (long*));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_offsetY, (long*));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_screenX, (long*));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_screenY, (long*));
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STDMETHODNOTIMP(get_srcFilter, (IDispatch**));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef STDMETHODNOTIMP
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ComMessageEvent, WithSmartContainer) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CComObject<MockSmartContainer>* container_obj = NULL;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CComObject<MockSmartContainer>::CreateInstance(&container_obj);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedComPtr<IOleContainer> container(container_obj);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(!container);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CComObject<FriendlyComMessageEvent>* event_obj = NULL;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CComObject<FriendlyComMessageEvent>::CreateInstance(&event_obj);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedComPtr<IUnknown> event_ref(event_obj);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool succeeded = event_obj->Initialize(container, "hi",
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         "http://www.foo.com/", "message");
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(succeeded);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(!event_obj->basic_event());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Name handled natively by CF's ComMessageEvent.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISPID dispid = -1;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LPOLESTR name = L"data";
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = event_obj->GetIDsOfNames(IID_IDispatch, &name, 1,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        LOCALE_USER_DEFAULT, &dispid);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_HRESULT_SUCCEEDED(hr);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(dispid, ComMessageEvent::DISPID_MESSAGE_EVENT_DATA);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Name not handled by CF's ComMessageEvent.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispid = -1;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = L"nothandledatallbyanyone";
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hr = event_obj->GetIDsOfNames(IID_IDispatch, &name, 1,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                LOCALE_USER_DEFAULT, &dispid);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_HRESULT_SUCCEEDED(hr);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(dispid, MockSmartContainer::kDispId);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoke function handled by ComMessageEvent.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CComDispatchDriver dispatcher(event_obj);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CComVariant result;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hr = dispatcher.GetProperty(ComMessageEvent::DISPID_MESSAGE_EVENT_DATA,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &result);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_HRESULT_SUCCEEDED(hr);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(result.vt, VT_BSTR);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(wcscmp(result.bstrVal, L"hi"), 0);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And now check passthrough.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result.Clear();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hr = dispatcher.GetProperty(MockSmartContainer::kDispId, &result);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_HRESULT_SUCCEEDED(hr);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(result.vt, VT_I4);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(result.lVal, MockSmartContainer::kResultValue);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
326