Fix for bug 27775. Introduced idl keyword 'replaceable' and marked some of the newer window properties with it. Fixes pages like www.oracle.com that have define window-scoped variables with the same name. r=rginda, a=chofmann

This commit is contained in:
vidur%netscape.com 2000-02-22 22:08:36 +00:00
parent 6ad008c507
commit e5b64e43ae
9 changed files with 394 additions and 75 deletions

View File

@ -9,8 +9,8 @@
readonly attribute History history; readonly attribute History history;
readonly attribute Window parent; readonly attribute Window parent;
readonly attribute Window top; readonly attribute Window top;
readonly attribute Window content; readonly replaceable attribute Window content;
readonly attribute xpidl nsISidebar sidebar; readonly replaceable attribute xpidl nsISidebar sidebar;
readonly attribute BarProp menubar; readonly attribute BarProp menubar;
readonly attribute BarProp toolbar; readonly attribute BarProp toolbar;
readonly attribute BarProp locationbar; readonly attribute BarProp locationbar;
@ -20,7 +20,7 @@
readonly attribute BarProp directories; readonly attribute BarProp directories;
readonly attribute boolean closed; readonly attribute boolean closed;
readonly attribute WindowCollection frames; readonly attribute WindowCollection frames;
readonly attribute xpidl nsIControllers controllers; readonly replaceable attribute xpidl nsIControllers controllers;
attribute Window opener; attribute Window opener;
attribute wstring status; attribute wstring status;
attribute wstring defaultStatus; attribute wstring defaultStatus;

View File

@ -272,42 +272,6 @@ GetWindowProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
} }
break; break;
} }
case WINDOW_CONTENT:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_CONTENT, PR_FALSE);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, rv);
}
nsIDOMWindow* prop;
nsresult result = NS_OK;
result = a->GetContent(&prop);
if (NS_SUCCEEDED(result)) {
// get the js object
nsJSUtils::nsConvertObjectToJSVal((nsISupports *)prop, cx, obj, vp);
}
else {
return nsJSUtils::nsReportError(cx, obj, result);
}
break;
}
case WINDOW_SIDEBAR:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_SIDEBAR, PR_FALSE);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, rv);
}
nsISidebar* prop;
nsresult result = NS_OK;
result = a->GetSidebar(&prop);
if (NS_SUCCEEDED(result)) {
// get the js object; n.b., this will do a release on 'prop'
nsJSUtils::nsConvertXPCObjectToJSVal(prop, NS_GET_IID(nsISidebar), cx, obj, vp);
}
else {
return nsJSUtils::nsReportError(cx, obj, result);
}
break;
}
case WINDOW_MENUBAR: case WINDOW_MENUBAR:
{ {
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_MENUBAR, PR_FALSE); rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_MENUBAR, PR_FALSE);
@ -469,24 +433,6 @@ GetWindowProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
} }
break; break;
} }
case WINDOW_CONTROLLERS:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_CONTROLLERS, PR_FALSE);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, rv);
}
nsIControllers* prop;
nsresult result = NS_OK;
result = a->GetControllers(&prop);
if (NS_SUCCEEDED(result)) {
// get the js object; n.b., this will do a release on 'prop'
nsJSUtils::nsConvertXPCObjectToJSVal(prop, NS_GET_IID(nsIControllers), cx, obj, vp);
}
else {
return nsJSUtils::nsReportError(cx, obj, result);
}
break;
}
case WINDOW_OPENER: case WINDOW_OPENER:
{ {
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_OPENER, PR_FALSE); rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_OPENER, PR_FALSE);
@ -978,6 +924,219 @@ SetWindowProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
return PR_TRUE; return PR_TRUE;
} }
/***********************************************************************/
//
// content Property Getter
//
PR_STATIC_CALLBACK(JSBool)
WindowcontentGetter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
nsIDOMWindow *a = (nsIDOMWindow*)nsJSUtils::nsGetNativeThis(cx, obj);
// If there's no private data, this must be the prototype, so ignore
if (nsnull == a) {
return JS_TRUE;
}
nsresult rv;
NS_WITH_SERVICE(nsIScriptSecurityManager, secMan,
NS_SCRIPTSECURITYMANAGER_PROGID, &rv);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_SECMAN_ERR);
}
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_CONTENT, PR_FALSE);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, rv);
}
nsIDOMWindow* prop;
nsresult result = NS_OK;
result = a->GetContent(&prop);
if (NS_SUCCEEDED(result)) {
// get the js object
nsJSUtils::nsConvertObjectToJSVal((nsISupports *)prop, cx, obj, vp);
}
else {
return nsJSUtils::nsReportError(cx, obj, result);
}
return PR_TRUE;
}
/***********************************************************************/
//
// content Property Setter
//
PR_STATIC_CALLBACK(JSBool)
WindowcontentSetter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
nsIDOMWindow *a = (nsIDOMWindow*)nsJSUtils::nsGetNativeThis(cx, obj);
// If there's no private data, this must be the prototype, so ignore
if (nsnull == a) {
return JS_TRUE;
}
nsresult rv;
NS_WITH_SERVICE(nsIScriptSecurityManager, secMan,
NS_SCRIPTSECURITYMANAGER_PROGID, &rv);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_SECMAN_ERR);
}
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_CONTENT, PR_TRUE);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, rv);
}
JS_DefineProperty(cx, obj, "content", *vp, nsnull, nsnull, JSPROP_ENUMERATE);
return PR_TRUE;
}
/***********************************************************************/
//
// sidebar Property Getter
//
PR_STATIC_CALLBACK(JSBool)
WindowsidebarGetter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
nsIDOMWindow *a = (nsIDOMWindow*)nsJSUtils::nsGetNativeThis(cx, obj);
// If there's no private data, this must be the prototype, so ignore
if (nsnull == a) {
return JS_TRUE;
}
nsresult rv;
NS_WITH_SERVICE(nsIScriptSecurityManager, secMan,
NS_SCRIPTSECURITYMANAGER_PROGID, &rv);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_SECMAN_ERR);
}
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_SIDEBAR, PR_FALSE);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, rv);
}
nsISidebar* prop;
nsresult result = NS_OK;
result = a->GetSidebar(&prop);
if (NS_SUCCEEDED(result)) {
// get the js object; n.b., this will do a release on 'prop'
nsJSUtils::nsConvertXPCObjectToJSVal(prop, NS_GET_IID(nsISidebar), cx, obj, vp);
}
else {
return nsJSUtils::nsReportError(cx, obj, result);
}
return PR_TRUE;
}
/***********************************************************************/
//
// sidebar Property Setter
//
PR_STATIC_CALLBACK(JSBool)
WindowsidebarSetter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
nsIDOMWindow *a = (nsIDOMWindow*)nsJSUtils::nsGetNativeThis(cx, obj);
// If there's no private data, this must be the prototype, so ignore
if (nsnull == a) {
return JS_TRUE;
}
nsresult rv;
NS_WITH_SERVICE(nsIScriptSecurityManager, secMan,
NS_SCRIPTSECURITYMANAGER_PROGID, &rv);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_SECMAN_ERR);
}
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_SIDEBAR, PR_TRUE);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, rv);
}
JS_DefineProperty(cx, obj, "sidebar", *vp, nsnull, nsnull, JSPROP_ENUMERATE);
return PR_TRUE;
}
/***********************************************************************/
//
// controllers Property Getter
//
PR_STATIC_CALLBACK(JSBool)
WindowcontrollersGetter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
nsIDOMWindow *a = (nsIDOMWindow*)nsJSUtils::nsGetNativeThis(cx, obj);
// If there's no private data, this must be the prototype, so ignore
if (nsnull == a) {
return JS_TRUE;
}
nsresult rv;
NS_WITH_SERVICE(nsIScriptSecurityManager, secMan,
NS_SCRIPTSECURITYMANAGER_PROGID, &rv);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_SECMAN_ERR);
}
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_CONTROLLERS, PR_FALSE);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, rv);
}
nsIControllers* prop;
nsresult result = NS_OK;
result = a->GetControllers(&prop);
if (NS_SUCCEEDED(result)) {
// get the js object; n.b., this will do a release on 'prop'
nsJSUtils::nsConvertXPCObjectToJSVal(prop, NS_GET_IID(nsIControllers), cx, obj, vp);
}
else {
return nsJSUtils::nsReportError(cx, obj, result);
}
return PR_TRUE;
}
/***********************************************************************/
//
// controllers Property Setter
//
PR_STATIC_CALLBACK(JSBool)
WindowcontrollersSetter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
nsIDOMWindow *a = (nsIDOMWindow*)nsJSUtils::nsGetNativeThis(cx, obj);
// If there's no private data, this must be the prototype, so ignore
if (nsnull == a) {
return JS_TRUE;
}
nsresult rv;
NS_WITH_SERVICE(nsIScriptSecurityManager, secMan,
NS_SCRIPTSECURITYMANAGER_PROGID, &rv);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_SECMAN_ERR);
}
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_WINDOW_CONTROLLERS, PR_TRUE);
if (NS_FAILED(rv)) {
return nsJSUtils::nsReportError(cx, obj, rv);
}
JS_DefineProperty(cx, obj, "controllers", *vp, nsnull, nsnull, JSPROP_ENUMERATE);
return PR_TRUE;
}
// //
// Window finalizer // Window finalizer
@ -2800,8 +2959,8 @@ static JSPropertySpec WindowProperties[] =
{"history", WINDOW_HISTORY, JSPROP_ENUMERATE | JSPROP_READONLY}, {"history", WINDOW_HISTORY, JSPROP_ENUMERATE | JSPROP_READONLY},
{"parent", WINDOW_PARENT, JSPROP_ENUMERATE | JSPROP_READONLY}, {"parent", WINDOW_PARENT, JSPROP_ENUMERATE | JSPROP_READONLY},
{"top", WINDOW_TOP, JSPROP_ENUMERATE | JSPROP_READONLY}, {"top", WINDOW_TOP, JSPROP_ENUMERATE | JSPROP_READONLY},
{"content", WINDOW_CONTENT, JSPROP_ENUMERATE | JSPROP_READONLY}, {"content", WINDOW_CONTENT, JSPROP_ENUMERATE, WindowcontentGetter, WindowcontentSetter},
{"sidebar", WINDOW_SIDEBAR, JSPROP_ENUMERATE | JSPROP_READONLY}, {"sidebar", WINDOW_SIDEBAR, JSPROP_ENUMERATE, WindowsidebarGetter, WindowsidebarSetter},
{"menubar", WINDOW_MENUBAR, JSPROP_ENUMERATE | JSPROP_READONLY}, {"menubar", WINDOW_MENUBAR, JSPROP_ENUMERATE | JSPROP_READONLY},
{"toolbar", WINDOW_TOOLBAR, JSPROP_ENUMERATE | JSPROP_READONLY}, {"toolbar", WINDOW_TOOLBAR, JSPROP_ENUMERATE | JSPROP_READONLY},
{"locationbar", WINDOW_LOCATIONBAR, JSPROP_ENUMERATE | JSPROP_READONLY}, {"locationbar", WINDOW_LOCATIONBAR, JSPROP_ENUMERATE | JSPROP_READONLY},
@ -2811,7 +2970,7 @@ static JSPropertySpec WindowProperties[] =
{"directories", WINDOW_DIRECTORIES, JSPROP_ENUMERATE | JSPROP_READONLY}, {"directories", WINDOW_DIRECTORIES, JSPROP_ENUMERATE | JSPROP_READONLY},
{"closed", WINDOW_CLOSED, JSPROP_ENUMERATE | JSPROP_READONLY}, {"closed", WINDOW_CLOSED, JSPROP_ENUMERATE | JSPROP_READONLY},
{"frames", WINDOW_FRAMES, JSPROP_ENUMERATE | JSPROP_READONLY}, {"frames", WINDOW_FRAMES, JSPROP_ENUMERATE | JSPROP_READONLY},
{"controllers", WINDOW_CONTROLLERS, JSPROP_ENUMERATE | JSPROP_READONLY}, {"controllers", WINDOW_CONTROLLERS, JSPROP_ENUMERATE, WindowcontrollersGetter, WindowcontrollersSetter},
{"opener", WINDOW_OPENER, JSPROP_ENUMERATE}, {"opener", WINDOW_OPENER, JSPROP_ENUMERATE},
{"status", WINDOW_STATUS, JSPROP_ENUMERATE}, {"status", WINDOW_STATUS, JSPROP_ENUMERATE},
{"defaultStatus", WINDOW_DEFAULTSTATUS, JSPROP_ENUMERATE}, {"defaultStatus", WINDOW_DEFAULTSTATUS, JSPROP_ENUMERATE},

View File

@ -39,6 +39,7 @@ IdlAttribute::IdlAttribute()
{ {
mReadOnly = 0; mReadOnly = 0;
mIsNoScript = 0; mIsNoScript = 0;
mReplaceable = 0;
} }
IdlAttribute::~IdlAttribute() IdlAttribute::~IdlAttribute()
@ -66,3 +67,15 @@ IdlAttribute::SetIsNoScript(int aIsNoScript)
{ {
mIsNoScript = aIsNoScript; mIsNoScript = aIsNoScript;
} }
int
IdlAttribute::GetReplaceable()
{
return mReplaceable;
}
void
IdlAttribute::SetReplaceable(int aReplaceable)
{
mReplaceable = aReplaceable;
}

View File

@ -30,6 +30,7 @@ class IdlAttribute : public IdlVariable {
private: private:
int mReadOnly; int mReadOnly;
int mIsNoScript; int mIsNoScript;
int mReplaceable;
public: public:
IdlAttribute(); IdlAttribute();
@ -40,6 +41,9 @@ public:
int GetIsNoScript(); int GetIsNoScript();
void SetIsNoScript(int aIsNoScript); void SetIsNoScript(int aIsNoScript);
int GetReplaceable();
void SetReplaceable(int aReplaceable);
}; };
#ifdef XP_MAC #ifdef XP_MAC

View File

@ -309,6 +309,7 @@ void IdlParser::ParseInterfaceBody(IdlSpecification &aSpecification, IdlInterfac
break; break;
case READONLY_TOKEN: case READONLY_TOKEN:
case ATTRIBUTE_TOKEN: case ATTRIBUTE_TOKEN:
case REPLACEABLE_TOKEN:
aInterface.AddAttribute(ParseAttribute(aSpecification, token->id)); aInterface.AddAttribute(ParseAttribute(aSpecification, token->id));
break; break;
default: default:
@ -561,7 +562,7 @@ IdlAttribute* IdlParser::MaybeParseAttribute(IdlSpecification &aSpecification, i
isNoScript = 1; isNoScript = 1;
TrimComments(); TrimComments();
token = mScanner->PeekToken(); token = mScanner->PeekToken();
if ((token->id != READONLY_TOKEN) && (token->id != ATTRIBUTE_TOKEN)) { if ((token->id != READONLY_TOKEN) && (token->id != ATTRIBUTE_TOKEN) && (token->id != REPLACEABLE_TOKEN)) {
return NULL; return NULL;
} }
mScanner->NextToken(); mScanner->NextToken();
@ -572,23 +573,32 @@ IdlAttribute* IdlParser::MaybeParseAttribute(IdlSpecification &aSpecification, i
} }
/** /**
* attr_dcl = [ "readonly" ] "attribute" param_type_spec identifier * attr_dcl = [ "readonly" ] [ "replaceable" ] "attribute" param_type_spec identifier
* param_type_spec = base_type_spec / string_type / scoped_name * param_type_spec = base_type_spec / string_type / scoped_name
*/ */
IdlAttribute* IdlParser::ParseAttribute(IdlSpecification &aSpecification, int aTokenID, int aIsNoScript) IdlAttribute* IdlParser::ParseAttribute(IdlSpecification &aSpecification, int aTokenID, int aIsNoScript)
{ {
Token *token; Token *token;
int isReadOnly = 0; int isReadOnly = 0;
int isReplaceable = 0;
// if it was a readonly keyword read the next keyword while (aTokenID != ATTRIBUTE_TOKEN) {
if (READONLY_TOKEN == aTokenID) { // if it was a readonly keyword read the next keyword
isReadOnly = 1; if (READONLY_TOKEN == aTokenID) {
TrimComments(); isReadOnly = 1;
token = mScanner->NextToken(); TrimComments();
aTokenID = token->id; token = mScanner->NextToken();
} aTokenID = token->id;
if (ATTRIBUTE_TOKEN != aTokenID) { }
throw AttributeParsingException("Missing attribute specifier."); else if (REPLACEABLE_TOKEN == aTokenID) {
isReplaceable = 1;
TrimComments();
token = mScanner->NextToken();
aTokenID = token->id;
}
else {
throw AttributeParsingException("Unknown attribute specifier.");
}
} }
TrimComments(); TrimComments();
@ -596,6 +606,7 @@ IdlAttribute* IdlParser::ParseAttribute(IdlSpecification &aSpecification, int aT
IdlAttribute *attrObj = new IdlAttribute(); IdlAttribute *attrObj = new IdlAttribute();
attrObj->SetIsNoScript(aIsNoScript); attrObj->SetIsNoScript(aIsNoScript);
attrObj->SetReadOnly(isReadOnly); attrObj->SetReadOnly(isReadOnly);
attrObj->SetReplaceable(isReplaceable);
// this must be the attribute type // this must be the attribute type
token = mScanner->NextToken(); token = mScanner->NextToken();

View File

@ -947,6 +947,33 @@ void IdlScanner::RKeywords(char *aCurrentPos, Token *aToken)
aToken->SetToken(RAISES_TOKEN); aToken->SetToken(RAISES_TOKEN);
} }
} }
else if (c != EOF && c == 'p' && (*aCurrentPos++ = c) && (c = mInputFile->get()) &&
c != EOF && c == 'l' && (*aCurrentPos++ = c) && (c = mInputFile->get()) &&
c != EOF && c == 'a' && (*aCurrentPos++ = c) && (c = mInputFile->get()) &&
c != EOF && c == 'c' && (*aCurrentPos++ = c) && (c = mInputFile->get()) &&
c != EOF && c == 'e' && (*aCurrentPos++ = c) && (c = mInputFile->get()) &&
c != EOF && c == 'a' && (*aCurrentPos++ = c) && (c = mInputFile->get()) &&
c != EOF && c == 'b' && (*aCurrentPos++ = c) && (c = mInputFile->get()) &&
c != EOF && c == 'l' && (*aCurrentPos++ = c) && (c = mInputFile->get()) &&
c != EOF && c == 'e' && (*aCurrentPos++ = c)) {
// if terminated is a keyword
c = mInputFile->get();
if (c != EOF) {
if (isalpha(c) || isdigit(c) || c == '_') {
// more characters, it must be an identifier
*aCurrentPos++ = c;
Identifier(aCurrentPos, aToken);
}
else {
// it is a keyword
aToken->SetToken(REPLACEABLE_TOKEN);
mInputFile->putback(c);
}
}
else {
aToken->SetToken(REPLACEABLE_TOKEN);
}
}
else { else {
// it must be an identifier // it must be an identifier
KeywordMismatch(c, aCurrentPos, aToken); KeywordMismatch(c, aCurrentPos, aToken);

View File

@ -79,6 +79,7 @@ enum EIDLTokenType {
VOID_TOKEN, VOID_TOKEN,
NOSCRIPT_TOKEN, NOSCRIPT_TOKEN,
UNKNOWN_TOKEN, UNKNOWN_TOKEN,
REPLACEABLE_TOKEN,
// constant values // constant values
INTEGER_CONSTANT = 1000, INTEGER_CONSTANT = 1000,
STRING_CONSTANT STRING_CONSTANT

View File

@ -80,6 +80,7 @@ JSStubGen::Generate(char *aFileName,
GeneratePropertySlots(aSpec); GeneratePropertySlots(aSpec);
GeneratePropertyFunc(aSpec, PR_TRUE); GeneratePropertyFunc(aSpec, PR_TRUE);
GeneratePropertyFunc(aSpec, PR_FALSE); GeneratePropertyFunc(aSpec, PR_FALSE);
GenerateCustomPropertyFuncs(aSpec);
GenerateFinalize(aSpec); GenerateFinalize(aSpec);
GenerateEnumerate(aSpec); GenerateEnumerate(aSpec);
GenerateResolve(aSpec); GenerateResolve(aSpec);
@ -610,7 +611,7 @@ JSStubGen::GeneratePropertyFunc(IdlSpecification &aSpec, PRBool aIsGetter)
strcpy(attr_name, attr->GetName()); strcpy(attr_name, attr->GetName());
StrUpr(attr_name); StrUpr(attr_name);
if (attr->GetIsNoScript() || (!aIsGetter && (attr->GetReadOnly()))) { if (attr->GetIsNoScript() || attr->GetReplaceable() || (!aIsGetter && (attr->GetReadOnly()))) {
continue; continue;
} }
@ -977,6 +978,98 @@ JSStubGen::GeneratePropSetter(ofstream *file,
*file << buf; *file << buf;
} }
static const char kCustomPropFuncBeginStr[] = "\n"
"/***********************************************************************/\n"
"//\n"
"// %s Property %ster\n"
"//\n"
"PR_STATIC_CALLBACK(JSBool)\n"
"%s%s%ster(JSContext *cx, JSObject *obj, jsval id, jsval *vp)\n"
"{\n"
" nsIDOM%s *a = (nsIDOM%s*)nsJSUtils::nsGetNativeThis(cx, obj);\n"
"\n"
" // If there's no private data, this must be the prototype, so ignore\n"
" if (nsnull == a) {\n"
" return JS_TRUE;\n"
" }\n"
"\n"
" nsresult rv;\n"
" NS_WITH_SERVICE(nsIScriptSecurityManager, secMan,\n"
" NS_SCRIPTSECURITYMANAGER_PROGID, &rv);\n"
" if (NS_FAILED(rv)) {\n"
" return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_SECMAN_ERR);\n"
" }\n"
"\n"
" rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_%s_%s, %s);\n"
" if (NS_FAILED(rv)) {\n"
" return nsJSUtils::nsReportError(cx, obj, rv);\n"
" }\n"
"\n";
static const char kCustomPropGetterFuncEndStr[] = "\n"
" return PR_TRUE;\n"
"}\n";
static const char kCustomPropSetterFuncEndStr[] = "\n"
" JS_DefineProperty(cx, obj, \"%s\", *vp, nsnull, nsnull, JSPROP_ENUMERATE);\n"
" return PR_TRUE;\n"
"}\n";
void
JSStubGen::GenerateCustomPropertyFuncs(IdlSpecification &aSpec)
{
char buf[1024];
ofstream *file = GetFile();
IdlInterface *primary_iface = aSpec.GetInterfaceAt(0);
PRBool any = PR_FALSE;
static char* get_str = "Get";
static char* set_str = "Set";
int i, icount = aSpec.InterfaceCount();
for (i = 0; i < icount; i++) {
IdlInterface *iface = aSpec.GetInterfaceAt(i);
char iface_name[128];
char iface_name_upper[128];
strcpy(iface_name, iface->GetName());
strcpy(iface_name_upper, iface->GetName());
StrUpr(iface_name_upper);
int a, acount = iface->AttributeCount();
for (a = 0; a < acount; a++) {
IdlAttribute *attr = iface->GetAttributeAt(a);
if (attr->GetReplaceable()) {
char attr_name[128];
char attr_name_upper[128];
strcpy(attr_name, attr->GetName());
strcpy(attr_name_upper, attr->GetName());
StrUpr(attr_name_upper);
sprintf(buf, kCustomPropFuncBeginStr, attr_name,
get_str, iface_name, attr_name, get_str,
iface_name, iface_name, iface_name_upper, attr_name_upper,
"PR_FALSE");
*file << buf;
GeneratePropGetter(file, *iface, *attr,
iface == primary_iface ? JSSTUBGEN_PRIMARY : JSSTUBGEN_NONPRIMARY);
*file << kCustomPropGetterFuncEndStr;
sprintf(buf, kCustomPropFuncBeginStr, attr_name,
set_str, iface_name, attr_name, set_str,
iface_name, iface_name, iface_name_upper, attr_name_upper,
"PR_TRUE");
*file << buf;
sprintf(buf, kCustomPropSetterFuncEndStr, attr_name);
*file << buf;
}
}
}
}
static const char kFinalizeStr[] = static const char kFinalizeStr[] =
"\n\n//\n" "\n\n//\n"
"// %s finalizer\n" "// %s finalizer\n"
@ -1508,6 +1601,9 @@ static const char kPropSpecEntryStr[] =
static const char kPropSpecReadOnlyStr[] = " | JSPROP_READONLY"; static const char kPropSpecReadOnlyStr[] = " | JSPROP_READONLY";
static const char kPropSpecEntryReplaceableStr[] =
" {\"%s\", %s_%s, JSPROP_ENUMERATE, %s%sGetter, %s%sSetter},\n";
static const char kPropSpecEndStr[] = static const char kPropSpecEndStr[] =
" {0}\n" " {0}\n"
"};\n"; "};\n";
@ -1542,9 +1638,16 @@ JSStubGen::GenerateClassProperties(IdlSpecification &aSpec)
strcpy(attr_name, attr->GetName()); strcpy(attr_name, attr->GetName());
StrUpr(attr_name); StrUpr(attr_name);
sprintf(buf, kPropSpecEntryStr, attr->GetName(), if (attr->GetReplaceable()) {
iface_name, attr_name, sprintf(buf, kPropSpecEntryReplaceableStr, attr->GetName(),
attr->GetReadOnly() ? kPropSpecReadOnlyStr : ""); iface_name, attr_name, iface->GetName(), attr->GetName(),
iface->GetName(), attr->GetName());
}
else {
sprintf(buf, kPropSpecEntryStr, attr->GetName(),
iface_name, attr_name,
attr->GetReadOnly() ? kPropSpecReadOnlyStr : "");
}
*file << buf; *file << buf;
} }
} }

View File

@ -71,6 +71,7 @@ protected:
void GenerateDefPtrs(IdlSpecification &aSpec); void GenerateDefPtrs(IdlSpecification &aSpec);
void GeneratePropertySlots(IdlSpecification &aSpec); void GeneratePropertySlots(IdlSpecification &aSpec);
void GeneratePropertyFunc(IdlSpecification &aSpec, PRBool aIsGetter); void GeneratePropertyFunc(IdlSpecification &aSpec, PRBool aIsGetter);
void GenerateCustomPropertyFuncs(IdlSpecification &aSpec);
void GenerateFinalize(IdlSpecification &aSpec); void GenerateFinalize(IdlSpecification &aSpec);
void GenerateEnumerate(IdlSpecification &aSpec); void GenerateEnumerate(IdlSpecification &aSpec);
void GenerateResolve(IdlSpecification &aSpec); void GenerateResolve(IdlSpecification &aSpec);