Make XULControllers wrappable from unprivileged script, but don't let such

script actually do anything with it.  Bug 326248, r=mrbkap, sr=jst
This commit is contained in:
bzbarsky%mit.edu 2006-02-23 03:17:11 +00:00
Родитель b3b3381f83
Коммит 7e74a76712
5 изменённых файлов: 96 добавлений и 2 удалений

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

@ -101,7 +101,9 @@ NS_NewXULControllers(nsISupports* aOuter, REFNSIID aIID, void** aResult)
// QueryInterface implementation for nsXULControllers
NS_INTERFACE_MAP_BEGIN(nsXULControllers)
NS_INTERFACE_MAP_ENTRY(nsIControllers)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_ENTRY(nsISecurityCheckedComponent)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIControllers)
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(XULControllers)
NS_INTERFACE_MAP_END
@ -293,3 +295,54 @@ nsXULControllers::GetControllerCount(PRUint32 *_retval)
*_retval = mControllers.Count();
return NS_OK;
}
// nsISecurityCheckedComponent implementation
static char* cloneAllAccess()
{
static const char allAccess[] = "AllAccess";
return (char*)nsMemory::Clone(allAccess, sizeof(allAccess));
}
static char* cloneUniversalXPConnect()
{
static const char universalXPConnect[] = "UniversalXPConnect";
return (char*)nsMemory::Clone(universalXPConnect, sizeof(universalXPConnect));
}
NS_IMETHODIMP
nsXULControllers::CanCreateWrapper(const nsIID * iid, char **_retval)
{
*_retval = cloneAllAccess();
return *_retval ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
NS_IMETHODIMP
nsXULControllers::CanCallMethod(const nsIID * iid, const PRUnichar *methodName,
char **_retval)
{
// OK if you're cool enough
*_retval = cloneUniversalXPConnect();
return *_retval ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
NS_IMETHODIMP
nsXULControllers::CanGetProperty(const nsIID * iid,
const PRUnichar *propertyName,
char **_retval)
{
// OK if you're cool enough
*_retval = cloneUniversalXPConnect();
return *_retval ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
NS_IMETHODIMP
nsXULControllers::CanSetProperty(const nsIID * iid,
const PRUnichar *propertyName,
char **_retval)
{
// OK if you're cool enough
*_retval = cloneUniversalXPConnect();
return *_retval ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}

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

@ -50,6 +50,7 @@
#include "nsWeakPtr.h"
#include "nsIControllers.h"
#include "nsISupportsArray.h"
#include "nsISecurityCheckedComponent.h"
class nsIDOMXULCommandDispatcher;
@ -83,7 +84,8 @@ protected:
NS_IMETHODIMP NS_NewXULControllers(nsISupports* aOuter, REFNSIID aIID, void** aResult);
class nsXULControllers : public nsIControllers
class nsXULControllers : public nsIControllers,
public nsISecurityCheckedComponent
{
public:
friend NS_IMETHODIMP
@ -91,6 +93,7 @@ public:
NS_DECL_ISUPPORTS
NS_DECL_NSICONTROLLERS
NS_DECL_NSISECURITYCHECKEDCOMPONENT
protected:
nsXULControllers();

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

@ -181,6 +181,9 @@ enum nsDOMClassInfoID {
eDOMClassInfo_XULNodeList_id,
eDOMClassInfo_XULNamedNodeMap_id,
eDOMClassInfo_XULAttr_id,
#endif
eDOMClassInfo_XULControllers_id,
#ifdef MOZ_XUL
eDOMClassInfo_BoxObject_id,
eDOMClassInfo_TreeSelection_id,
eDOMClassInfo_TreeContentView_id,

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

@ -800,6 +800,8 @@ static nsDOMClassInfoData sClassInfoData[] = {
NS_DEFINE_CLASSINFO_DATA_WITH_NAME(XULAttr, Attr, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
#endif
NS_DEFINE_CLASSINFO_DATA(XULControllers, nsNonDOMObjectSH,
DEFAULT_SCRIPTABLE_FLAGS)
#ifdef MOZ_XUL
NS_DEFINE_CLASSINFO_DATA(BoxObject, nsDOMGenericSH,
DEFAULT_SCRIPTABLE_FLAGS)
@ -2362,6 +2364,10 @@ nsDOMClassInfo::Init()
DOM_CLASSINFO_MAP_END
#endif
DOM_CLASSINFO_MAP_BEGIN_NO_CLASS_IF(XULControllers, nsIControllers)
DOM_CLASSINFO_MAP_ENTRY(nsIControllers)
DOM_CLASSINFO_MAP_END
#ifdef MOZ_XUL
DOM_CLASSINFO_MAP_BEGIN(BoxObject, nsIBoxObject)
DOM_CLASSINFO_MAP_ENTRY(nsIBoxObject)
@ -9591,3 +9597,12 @@ nsDOMConstructorSH::HasInstance(nsIXPConnectWrappedNative *wrapper,
return wrapped->HasInstance(wrapper, cx, obj, val, bp, _retval);
}
NS_IMETHODIMP
nsNonDOMObjectSH::GetFlags(PRUint32 *aFlags)
{
// This is NOT a DOM Object. Use this helper class for cases when you need
// to do something like implement nsISecurityCheckedComponent in a meaningful
// way.
*aFlags = nsIClassInfo::MAIN_THREAD_ONLY;
}

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

@ -1527,6 +1527,26 @@ public:
}
};
class nsNonDOMObjectSH : public nsDOMGenericSH
{
protected:
nsNonDOMObjectSH(nsDOMClassInfoData* aData) : nsDOMGenericSH(aData)
{
}
virtual ~nsNonDOMObjectSH()
{
}
public:
NS_IMETHOD GetFlags(PRUint32 *aFlags);
static nsIClassInfo *doCreate(nsDOMClassInfoData* aData)
{
return new nsNonDOMObjectSH(aData);
}
};
void InvalidateContextAndWrapperCache();