зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
b3b3381f83
Коммит
7e74a76712
|
@ -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();
|
||||
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче