NOT PART OF BUILD. Add dispatch tearoff

This commit is contained in:
locka%iol.ie 2002-10-07 21:41:04 +00:00
Родитель fb84d9cdf4
Коммит 0ffa86e89b
4 изменённых файлов: 91 добавлений и 10 удалений

Просмотреть файл

@ -113,6 +113,48 @@ NPError NewScript(const char *pluginType,
return NPERR_GENERIC_ERROR;
}
static BOOL WillHandleCLSID(const CLSID &clsid)
{
if (::IsEqualCLSID(clsid, CLSID_NULL))
{
return FALSE;
}
const BOOL kRestrictControls = FALSE;
if (!kRestrictControls)
{
return TRUE;
}
// Check if the CLSID belongs to a limited number the plugin is prepared to support
CRegKey key;
if (key.Open(HKEY_LOCAL_MACHINE, _T("Software\\Mozilla\\ActiveX\\CLSID"), KEY_READ) != ERROR_SUCCESS)
{
return FALSE;
}
// Enumerate CLSIDs looking for this one
int i = 0;
do {
USES_CONVERSION;
TCHAR szCLSID[64];
const DWORD nLength = sizeof(szCLSID) / sizeof(szCLSID[0]);
if (::RegEnumKey(key, i++, szCLSID, nLength) != ERROR_SUCCESS)
{
break;
}
szCLSID[nLength - 1] = TCHAR('\0');
CLSID clsidToCompare = GUID_NULL;
if (SUCCEEDED(::CLSIDFromString(T2OLE(szCLSID), &clsidToCompare)) &&
::IsEqualCLSID(clsid, clsidToCompare))
{
return TRUE;
}
} while (1);
return FALSE;
}
NPError NewControl(const char *pluginType,
PluginInstanceData *pData,
uint16 mode,
@ -248,8 +290,8 @@ NPError NewControl(const char *pluginType,
}
}
// Make sure we got a CLSID
if (::IsEqualCLSID(clsid, CLSID_NULL))
// Make sure we got a CLSID we can handle
if (!WillHandleCLSID(clsid))
{
return NPERR_GENERIC_ERROR;
}

Просмотреть файл

@ -98,9 +98,14 @@ MOZ_ACTIVEX_PLUGIN_XPCONNECT = 1
# WMP support needs XPConnect
ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT
# MOZ_ACTIVEX_PLUGIN_WMPSUPPORT = 1
# Path to the WMP SDK
ifdef MOZ_ACTIVEX_PLUGIN_WMPSUPPORT
WMP_SDK = C:/m/WMSDK/WMPSDK9
endif
endif
###############################################################################
@ -178,6 +183,10 @@ endif
ifdef MOZ_ACTIVEX_PLUGIN_XPCONNECT
DEFINES += -DMOZ_ACTIVEX_PLUGIN_XPCONNECT -DXPCOM_GLUE
ifdef XPC_IDISPATCH_SUPPORT
DEFINES += -DXPC_IDISPATCH_SUPPORT
endif
EXTRA_DSO_LDOPTS = \
$(DIST)/lib/$(LIB_PREFIX)string_s.$(LIB_SUFFIX) \
$(DIST)/lib/$(LIB_PREFIX)string_obsolete_s.$(LIB_SUFFIX) \

Просмотреть файл

@ -329,7 +329,6 @@ END_COM_MAP()
/* [out][retval] */ BSTR *p)
{
*p = NULL;
#if 0
nsCOMPtr<nsIDOMWindow> window;
NPN_GetValue(mData->pPluginInstance, NPNVDOMWindow, (void *) &window);
if (window)
@ -349,7 +348,6 @@ END_COM_MAP()
}
}
}
#endif
return E_FAIL;
}

Просмотреть файл

@ -85,11 +85,33 @@ nsScriptablePeer::~nsScriptablePeer()
NS_IMPL_ADDREF(nsScriptablePeer)
NS_IMPL_RELEASE(nsScriptablePeer)
NS_INTERFACE_MAP_BEGIN(nsScriptablePeer)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIClassInfo)
NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
NS_INTERFACE_MAP_ENTRY(nsIMozAxPlugin)
NS_INTERFACE_MAP_END
// Custom QueryInterface impl to deal with the IDispatch tearoff
NS_IMETHODIMP
nsScriptablePeer::QueryInterface(const nsIID & aIID, void **aInstancePtr)
{
NS_ASSERTION(aInstancePtr, "QueryInterface requires a non-NULL destination!");
if (!aInstancePtr)
return NS_ERROR_NULL_POINTER;
*aInstancePtr = nsnull;
nsISupports* foundInterface = nsnull;
if (aIID.Equals(NS_GET_IID(nsISupports)))
foundInterface = NS_STATIC_CAST(nsISupports *, NS_STATIC_CAST(nsIClassInfo *, this));
else if (aIID.Equals(NS_GET_IID(nsIClassInfo)))
foundInterface = NS_STATIC_CAST(nsIClassInfo*, this);
else if (aIID.Equals(NS_GET_IID(nsIMozAxPlugin)))
foundInterface = NS_STATIC_CAST(nsIMozAxPlugin*, this);
else if (memcmp(&aIID, &__uuidof(IDispatch), sizeof(nsID)) == 0)
{
HRESULT hr = mTearOff->QueryInterface(__uuidof(IDispatch), aInstancePtr);
if (SUCCEEDED(hr)) return NS_OK;
return E_FAIL;
}
NS_IF_ADDREF(foundInterface);
*aInstancePtr = foundInterface;
return (*aInstancePtr) ? NS_OK : NS_NOINTERFACE;
}
HRESULT
nsScriptablePeer::GetIDispatch(IDispatch **pdisp)
@ -712,7 +734,7 @@ nsEventSink::InternalInvoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wF
// TODO Turn js return code into VARIANT
// TODO handle js exception and fill in exception info
// TODO handle js exception and fill in exception info (do we care?)
}
if (pExcepInfo)
@ -861,6 +883,9 @@ CLSID xpc_GetCLSIDForType(const char *mimeType)
nsScriptablePeer *
xpc_GetPeerForCLSID(const CLSID &clsid)
{
#ifdef XPC_IDISPATCH_SUPPORT
return new nsScriptablePeer();
#else
// TODO remove me
#ifdef MOZ_ACTIVEX_PLUGIN_WMPSUPPORT
if (::IsEqualCLSID(clsid, kWindowsMediaPlayer))
@ -869,11 +894,17 @@ xpc_GetPeerForCLSID(const CLSID &clsid)
}
#endif
return new nsScriptablePeer();
#endif
}
nsIID
xpc_GetIIDForCLSID(const CLSID &clsid)
{
#ifdef XPC_IDISPATCH_SUPPORT
nsIID iid;
memcpy(&iid, &_uuidof(IDispatch), sizeof(iid));
return iid;
#else
// TODO remove me
#ifdef MOZ_ACTIVEX_PLUGIN_WMPSUPPORT
if (::IsEqualCLSID(clsid, kWindowsMediaPlayer))
@ -882,6 +913,7 @@ xpc_GetIIDForCLSID(const CLSID &clsid)
}
#endif
return NS_GET_IID(nsIMozAxPlugin);
#endif
}
// Called by NPP_GetValue to provide the scripting values