diff --git a/embedding/browser/activex/src/plugin/LegacyPlugin.cpp b/embedding/browser/activex/src/plugin/LegacyPlugin.cpp index 3bf7bf068ab1..272313578b28 100644 --- a/embedding/browser/activex/src/plugin/LegacyPlugin.cpp +++ b/embedding/browser/activex/src/plugin/LegacyPlugin.cpp @@ -596,6 +596,7 @@ NPError NewControl(const char *pluginType, return NPERR_GENERIC_ERROR; } +#ifdef XPC_IDISPATCH_SUPPORT nsEventSinkInstance *pSink = NULL; nsEventSinkInstance::CreateInstance(&pSink); if (pSink) @@ -606,10 +607,10 @@ NPError NewControl(const char *pluginType, pSite->GetControlUnknown(&control); pSink->SubscribeToEvents(control); } - + pData->pControlEventSink = pSink; +#endif pData->nType = itControl; pData->pControlSite = pSite; - pData->pControlEventSink = pSink; return NPERR_NO_ERROR; } @@ -708,11 +709,13 @@ NPP_Destroy(NPP instance, NPSavedData** save) pSite->Detach(); pSite->Release(); } +#ifdef XPC_IDISPATCH_SUPPORT if (pData->pControlEventSink) { pData->pControlEventSink->UnsubscribeFromEvents(); pData->pControlEventSink->Release(); } +#endif #ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT if (pData->pScriptingPeer) { diff --git a/embedding/browser/activex/src/plugin/LegacyPlugin.h b/embedding/browser/activex/src/plugin/LegacyPlugin.h index cdd96f5d129f..85cba9073984 100644 --- a/embedding/browser/activex/src/plugin/LegacyPlugin.h +++ b/embedding/browser/activex/src/plugin/LegacyPlugin.h @@ -63,7 +63,9 @@ struct PluginInstanceData { CActiveScriptSiteInstance *pScriptSite; struct { CControlSiteInstance *pControlSite; +#ifdef XPC_IDISPATCH_SUPPORT nsEventSinkInstance *pControlEventSink; +#endif }; }; char *szUrl; diff --git a/embedding/browser/activex/src/plugin/MozActiveX.rc b/embedding/browser/activex/src/plugin/MozActiveX.rc index 21254d0c58a9..410230478a3d 100644 --- a/embedding/browser/activex/src/plugin/MozActiveX.rc +++ b/embedding/browser/activex/src/plugin/MozActiveX.rc @@ -48,8 +48,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,3 - PRODUCTVERSION 1,0,0,3 + FILEVERSION 1,0,0,4 + PRODUCTVERSION 1,0,0,4 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -69,7 +69,7 @@ BEGIN VALUE "FileDescription", "Mozilla ActiveX control and plugin module\0" VALUE "FileExtents", "*.ocx|*.ocx|*.axs\0" VALUE "FileOpenName", "ActiveX (*.ocx)|ActiveX (*.ocx)|ActiveScript(*.axs)\0" - VALUE "FileVersion", "1, 0, 0, 3\0" + VALUE "FileVersion", "1, 0, 0, 4\0" VALUE "InternalName", "NPMOZAX\0" VALUE "LegalCopyright", "Copyright 1999\0" VALUE "LegalTrademarks", "\0" @@ -77,7 +77,7 @@ BEGIN VALUE "OriginalFilename", "NPMOZAX.DLL\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "Mozilla ActiveX control and plugin support\0" - VALUE "ProductVersion", "1, 0, 0, 3\0" + VALUE "ProductVersion", "1, 0, 0, 4\0" VALUE "SpecialBuild", "\0" END END diff --git a/embedding/browser/activex/src/plugin/StdAfx.h b/embedding/browser/activex/src/plugin/StdAfx.h index 2a6db28be740..15c18a992615 100644 --- a/embedding/browser/activex/src/plugin/StdAfx.h +++ b/embedding/browser/activex/src/plugin/StdAfx.h @@ -56,8 +56,10 @@ #define USE_PLUGIN +// Uncomment if you want to say what is QI'ing for what +//#define _ATL_DEBUG_QI + // ATL headers -#define _ATL_DEBUG_QI #include //You may derive a class from CComModule and use it if you want to override //something, but do not change the name of _Module diff --git a/embedding/browser/activex/src/plugin/XPConnect.cpp b/embedding/browser/activex/src/plugin/XPConnect.cpp index 26608a56bdb0..884c0f6b79fb 100644 --- a/embedding/browser/activex/src/plugin/XPConnect.cpp +++ b/embedding/browser/activex/src/plugin/XPConnect.cpp @@ -56,13 +56,17 @@ #include "nsIDOMNodeList.h" #include "nsIDOMElement.h" #include "nsIDOMEventReceiver.h" +#include "nsIDOMWindow.h" +#include "nsIInterfaceRequestorUtils.h" #include "nsIEventListenerManager.h" #include "nsGUIEvent.h" -#include "nsIScriptEventHandler.h" +#include "nsIScriptEventManager.h" #include "jsapi.h" +#ifdef XPC_IDISPATCH_SUPPORT #include "nsIDispatchSupport.h" +#endif #include "LegacyPlugin.h" #include "XPConnect.h" @@ -631,6 +635,7 @@ nsScriptablePeer::SetProperty(const char *propertyName, nsIVariant *propertyValu /////////////////////////////////////////////////////////////////////////////// +#ifdef XPC_IDISPATCH_SUPPORT HRESULT nsEventSink::InternalInvoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { @@ -735,6 +740,8 @@ nsEventSink::InternalInvoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wF ATLTRACE(_T(");\n")); } #endif + m_spEventSinkTypeInfo->ReleaseFuncDesc(pFuncDesc); + pFuncDesc = NULL; nsCOMPtr element; NPN_GetValue(mPlugin->pPluginInstance, NPNVDOMElement, (void *) &element); @@ -751,102 +758,69 @@ nsEventSink::InternalInvoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wF return S_OK; } - nsAutoString eventName(bstrName.m_str); - - // TODO Turn VARIANT args into js objects -#if 0 - // Fire event to DOM 2 event listeners - nsCOMPtr eventReceiver = do_QueryInterface(element); - if (eventReceiver) - { - // Get the event manager - nsCOMPtr eventManager; - eventReceiver->GetListenerManager(getter_AddRefs(eventManager)); - if (eventManager) - { - nsStringKey key(eventName); - nsEvent event; - event.message = NS_USER_DEFINED_EVENT; - event.userType = &key; - - // Fire the event! - nsCOMPtr domEvent; - nsEventStatus eventStatus; - nsresult rv = eventManager->HandleEvent(nsnull, &event, getter_AddRefs(domEvent), - eventReceiver, NS_EVENT_FLAG_INIT, &eventStatus); - } - } -#endif + nsDependentString eventName(bstrName.m_str); nsresult rv; nsCOMPtr domdoc; nsCOMPtr scriptElements; - // This outer loop is used for error handling... - do { - // Get a list of all SCRIPT elements in the document. - rv = element->GetOwnerDocument(getter_AddRefs(domdoc)); - if (NS_FAILED(rv)) break; + // Fire the script event handler... + nsCOMPtr window; + NPN_GetValue(mPlugin->pPluginInstance, NPNVDOMWindow, (void *)&window); + + nsCOMPtr eventManager(do_GetInterface(window)); + if (!eventManager) return S_OK; - rv = domdoc->GetElementsByTagName(NS_LITERAL_STRING("script"), - getter_AddRefs(scriptElements)); - if (NS_FAILED(rv)) break; + nsCOMPtr handler; - // Get the number of script elements in the current document... - PRUint32 count = 0; - rv = scriptElements->GetLength(&count); - if (NS_FAILED(rv)) break; + eventManager->FindEventHandler(id, eventName, pDispParams->cArgs, getter_AddRefs(handler)); + if (!handler) + { + return S_OK; + } - // - // Iterate over all of the SCRIPT elements looking for a handler. - // - // Walk the list backwards in order to pick up the most recently - // defined script handler (if more than one is present)... - // - nsDependentString eventName(bstrName.m_str); - nsCOMPtr node; - nsCOMPtr handler; + // Create a list of arguments to pass along + // + // This array is created on the stack if the number of arguments + // less than kMaxArgsOnStack. Otherwise, the array is heap + // allocated. + // + const int kMaxArgsOnStack = 10; - while (count--) + PRUint32 argc = pDispParams->cArgs; + jsval *args = nsnull; + jsval stackArgs[kMaxArgsOnStack]; + + // Heap allocate the jsval array if it is too big to fit on + // the stack (ie. more than kMaxArgsOnStack arguments) + if (argc > kMaxArgsOnStack) + { + args = new jsval[argc]; + if (!args) return S_OK; + } + else if (argc) + { + // Use the jsval array on the stack... + args = stackArgs; + } + + if (argc) + { + nsCOMPtr disp(do_GetService("@mozilla.org/nsdispatchsupport;1")); + for (UINT i = 0; i < argc; i++) { - rv = scriptElements->Item(count, getter_AddRefs(node)); - if (NS_FAILED(rv)) break; - - handler = do_QueryInterface(node, &rv); - if (NS_FAILED(rv)) continue; - - PRBool bFound; - rv = handler->IsSameEvent(id, eventName, pDispParams->cArgs, &bFound); - if (NS_FAILED(rv)) break; - - if (bFound) - { - // Create a list of arguments to pass along. - jsval *args = nsnull; - if (pDispParams->cArgs > 0) - { - args = new jsval[pDispParams->cArgs]; - if (!args) break; - nsCOMPtr disp(do_GetService("@mozilla.org/nsdispatchsupport;1")); - for (UINT i = 0; i < pDispParams->cArgs; i++) - { - // For some bizarre reason, arguments are listed backwards - disp->COMVariant2JSVal(&pDispParams->rgvarg[pDispParams->cArgs - 1 - i], &args[i]); - } - } - - // Fire the Event. - handler->Invoke(element, args, pDispParams->cArgs); - if (args) - { - // TODO cleanup jsval or are these things garbage collected somehow? - delete[]args; - } - break; - } + disp->COMVariant2JSVal(&pDispParams->rgvarg[i], &args[i]); } - } while (0); - // Errors just fall of the end of the do..while + } + + // Fire the Event. + eventManager->InvokeEventHandler(handler, element, args, argc); + + // Free the jsvals if they were heap allocated... + if (args != stackArgs) + { + delete [] args; + } // TODO Turn js objects for out params back into VARIANTS @@ -859,10 +833,9 @@ nsEventSink::InternalInvoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wF pExcepInfo->wCode = 0; } - m_spEventSinkTypeInfo->ReleaseFuncDesc(pFuncDesc); - return S_OK; } +#endif /////////////////////////////////////////////////////////////////////////////// diff --git a/embedding/browser/activex/src/plugin/XPConnect.h b/embedding/browser/activex/src/plugin/XPConnect.h index 52df3f1a005d..36bb229864f8 100644 --- a/embedding/browser/activex/src/plugin/XPConnect.h +++ b/embedding/browser/activex/src/plugin/XPConnect.h @@ -121,6 +121,7 @@ public: virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr); }; +#ifdef XPC_IDISPATCH_SUPPORT class nsEventSink : public CControlEventSink { public: @@ -130,6 +131,7 @@ public: }; typedef CComObject nsEventSinkInstance; +#endif extern void xpc_AddRef(); extern void xpc_Release();