зеркало из https://github.com/mozilla/gecko-dev.git
NOT PART OF BUILD. Add dispatch tearoff
This commit is contained in:
Родитель
fb84d9cdf4
Коммит
0ffa86e89b
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче