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