Added noscript qualifier to HTMLDocument::Open, Write and Writeln and moved the JS-specific versions over to NSHTMLDocument.

This commit is contained in:
vidur%netscape.com 1999-05-28 00:18:48 +00:00
parent 20cf0c3a50
commit f6bc249d9d
9 changed files with 480 additions and 297 deletions

View File

@ -73,7 +73,7 @@ const PRInt32 kBackward = 1;
#endif
// XXX Used to control whether we implement document.layers
//#define NS_IMPLEMENT_DOCUMENT_LAYERS
#define NS_IMPLEMENT_DOCUMENT_LAYERS
static NS_DEFINE_IID(kIWebShellIID, NS_IWEB_SHELL_IID);
static NS_DEFINE_IID(kIDocumentIID, NS_IDOCUMENT_IID);
@ -1229,67 +1229,97 @@ nsHTMLDocument::GetSourceDocumentURL(JSContext* cx,
return result;
}
NS_IMETHODIMP
nsHTMLDocument::Open(JSContext *cx, jsval *argv, PRUint32 argc)
// XXX TBI: accepting arguments to the open method.
nsresult
nsHTMLDocument::OpenCommon(nsIURL* aSourceURL)
{
nsresult result = NS_OK;
// The open occurred after the document finished loading.
// So we reset the document and create a new one.
if (nsnull == mParser) {
nsIURL* sourceURL;
result = Reset(aSourceURL);
if (NS_OK == result) {
static NS_DEFINE_IID(kCParserIID, NS_IPARSER_IID);
static NS_DEFINE_IID(kCParserCID, NS_PARSER_IID);
// XXX The URL of the newly created document will match
// that of the source document. Is this right?
result = GetSourceDocumentURL(cx, &sourceURL);
// Recover if we had a problem obtaining the source URL
if (nsnull == sourceURL) {
result = NS_NewURL(&sourceURL, "about:blank");
}
result = nsComponentManager::CreateInstance(kCParserCID,
nsnull,
kCParserIID,
(void **)&mParser);
mIsWriting = 1;
if (NS_SUCCEEDED(result)) {
result = Reset(sourceURL);
if (NS_OK == result) {
static NS_DEFINE_IID(kCParserIID, NS_IPARSER_IID);
static NS_DEFINE_IID(kCParserCID, NS_PARSER_IID);
nsIHTMLContentSink* sink;
nsIWebShell* webShell = nsnull;
result = nsComponentManager::CreateInstance(kCParserCID,
nsnull,
kCParserIID,
(void **)&mParser);
mIsWriting = 1;
if (NS_OK == result) {
nsIHTMLContentSink* sink;
nsIWebShell* webShell = nsnull;
// Get the webshell of our primary presentation shell
nsIPresShell* shell = (nsIPresShell*) mPresShells.ElementAt(0);
if (nsnull != shell) {
nsCOMPtr<nsIPresContext> cx;
shell->GetPresContext(getter_AddRefs(cx));
nsISupports* container;
if (NS_OK == cx->GetContainer(&container)) {
if (nsnull != container) {
container->QueryInterface(kIWebShellIID, (void**) &webShell);
}
// Get the webshell of our primary presentation shell
nsIPresShell* shell = (nsIPresShell*) mPresShells.ElementAt(0);
if (nsnull != shell) {
nsCOMPtr<nsIPresContext> cx;
shell->GetPresContext(getter_AddRefs(cx));
nsISupports* container;
if (NS_OK == cx->GetContainer(&container)) {
if (nsnull != container) {
container->QueryInterface(kIWebShellIID, (void**) &webShell);
}
}
}
result = NS_NewHTMLContentSink(&sink, this, sourceURL, webShell);
NS_IF_RELEASE(webShell);
result = NS_NewHTMLContentSink(&sink, this, aSourceURL, webShell);
NS_IF_RELEASE(webShell);
if (NS_OK == result) {
nsIDTD* theDTD=0;
NS_NewNavHTMLDTD(&theDTD);
mParser->RegisterDTD(theDTD);
mParser->SetContentSink(sink);
NS_RELEASE(sink);
}
if (NS_OK == result) {
nsIDTD* theDTD=0;
NS_NewNavHTMLDTD(&theDTD);
mParser->RegisterDTD(theDTD);
mParser->SetContentSink(sink);
NS_RELEASE(sink);
}
}
NS_RELEASE(sourceURL);
}
}
return result;
}
NS_IMETHODIMP
nsHTMLDocument::Open()
{
nsresult result = NS_OK;
nsIURL* sourceURL;
// XXX For the non-script Open case, we have to make
// up a URL.
result = NS_NewURL(&sourceURL, "about:blank");
if (NS_SUCCEEDED(result)) {
result = OpenCommon(sourceURL);
NS_RELEASE(sourceURL);
}
return result;
}
NS_IMETHODIMP
nsHTMLDocument::Open(JSContext *cx, jsval *argv, PRUint32 argc)
{
nsresult result = NS_OK;
nsIURL* sourceURL;
// XXX The URL of the newly created document will match
// that of the source document. Is this right?
result = GetSourceDocumentURL(cx, &sourceURL);
// Recover if we had a problem obtaining the source URL
if (nsnull == sourceURL) {
result = NS_NewURL(&sourceURL, "about:blank");
}
if (NS_SUCCEEDED(result)) {
result = OpenCommon(sourceURL);
NS_RELEASE(sourceURL);
}
return result;
}
@ -1313,14 +1343,56 @@ nsHTMLDocument::Close()
}
nsresult
nsHTMLDocument::WriteCommon(JSContext *cx,
jsval *argv,
PRUint32 argc,
nsHTMLDocument::WriteCommon(const nsString& aText,
PRBool aNewlineTerminate)
{
nsresult result = NS_OK;
// XXX Right now, we only deal with inline document.writes
if (nsnull == mParser) {
result = Open();
if (NS_OK != result) {
return result;
}
}
nsAutoString str(aText);
if (aNewlineTerminate) {
str.Append('\n');
}
mWriteLevel++;
result = mParser->Parse(str, NS_GENERATE_PARSER_KEY(),
"text/html", PR_FALSE,
(!mIsWriting || (mWriteLevel > 1)));
mWriteLevel--;
if (NS_OK != result) {
return result;
}
return result;
}
NS_IMETHODIMP
nsHTMLDocument::Write(const nsString& aText)
{
return WriteCommon(aText, PR_FALSE);
}
NS_IMETHODIMP
nsHTMLDocument::Writeln(const nsString& aText)
{
return WriteCommon(aText, PR_TRUE);
}
nsresult
nsHTMLDocument::ScriptWriteCommon(JSContext *cx,
jsval *argv,
PRUint32 argc,
PRBool aNewlineTerminate)
{
nsresult result = NS_OK;
if (nsnull == mParser) {
result = Open(cx, argv, argc);
if (NS_OK != result) {
@ -1360,13 +1432,13 @@ nsHTMLDocument::WriteCommon(JSContext *cx,
NS_IMETHODIMP
nsHTMLDocument::Write(JSContext *cx, jsval *argv, PRUint32 argc)
{
return WriteCommon(cx, argv, argc, PR_FALSE);
return ScriptWriteCommon(cx, argv, argc, PR_FALSE);
}
NS_IMETHODIMP
nsHTMLDocument::Writeln(JSContext *cx, jsval *argv, PRUint32 argc)
{
return WriteCommon(cx, argv, argc, PR_TRUE);
return ScriptWriteCommon(cx, argv, argc, PR_TRUE);
}
nsIContent *

View File

@ -178,11 +178,13 @@ protected:
nsresult GetBodyElement(nsIDOMHTMLBodyElement** aBody);
virtual nsresult Reset(nsIURL *aURL);
nsresult WriteCommon(JSContext *cx,
jsval *argv,
PRUint32 argc,
nsresult WriteCommon(const nsString& aText,
PRBool aNewlineTerminate);
nsresult ScriptWriteCommon(JSContext *cx,
jsval *argv,
PRUint32 argc,
PRBool aNewlineTerminate);
nsresult OpenCommon(nsIURL* aUrl);
nsIHTMLStyleSheet* mAttrStyleSheet;
nsIHTMLCSSStyleSheet* mStyleAttrStyleSheet;

View File

@ -106,17 +106,17 @@ public:
#define NS_FORWARD_IDOMNSEVENT(_to) \
NS_IMETHOD GetLayerX(PRInt32* aLayerX) { return _to##GetLayerX(aLayerX); } \
NS_IMETHOD SetLayerX(PRInt32 aLayerX) { return _to##SetLayerX(aLayerX); } \
NS_IMETHOD GetLayerY(PRInt32* aLayerY) { return _to##GetLayerY(aLayerY); } \
NS_IMETHOD SetLayerY(PRInt32 aLayerY) { return _to##SetLayerY(aLayerY); } \
NS_IMETHOD GetPageX(PRInt32* aPageX) { return _to##GetPageX(aPageX); } \
NS_IMETHOD SetPageX(PRInt32 aPageX) { return _to##SetPageX(aPageX); } \
NS_IMETHOD GetPageY(PRInt32* aPageY) { return _to##GetPageY(aPageY); } \
NS_IMETHOD SetPageY(PRInt32 aPageY) { return _to##SetPageY(aPageY); } \
NS_IMETHOD GetWhich(PRUint32* aWhich) { return _to##GetWhich(aWhich); } \
NS_IMETHOD SetWhich(PRUint32 aWhich) { return _to##SetWhich(aWhich); } \
NS_IMETHOD GetRc(nsIDOMRenderingContext** aRc) { return _to##GetRc(aRc); } \
NS_IMETHOD GetLayerX(PRInt32* aLayerX) { return _to GetLayerX(aLayerX); } \
NS_IMETHOD SetLayerX(PRInt32 aLayerX) { return _to SetLayerX(aLayerX); } \
NS_IMETHOD GetLayerY(PRInt32* aLayerY) { return _to GetLayerY(aLayerY); } \
NS_IMETHOD SetLayerY(PRInt32 aLayerY) { return _to SetLayerY(aLayerY); } \
NS_IMETHOD GetPageX(PRInt32* aPageX) { return _to GetPageX(aPageX); } \
NS_IMETHOD SetPageX(PRInt32 aPageX) { return _to SetPageX(aPageX); } \
NS_IMETHOD GetPageY(PRInt32* aPageY) { return _to GetPageY(aPageY); } \
NS_IMETHOD SetPageY(PRInt32 aPageY) { return _to SetPageY(aPageY); } \
NS_IMETHOD GetWhich(PRUint32* aWhich) { return _to GetWhich(aWhich); } \
NS_IMETHOD SetWhich(PRUint32 aWhich) { return _to SetWhich(aWhich); } \
NS_IMETHOD GetRc(nsIDOMRenderingContext** aRc) { return _to GetRc(aRc); } \
#endif // nsIDOMNSEvent_h__

View File

@ -24,7 +24,6 @@
#include "nsString.h"
#include "nsIScriptContext.h"
#include "nsIDOMDocument.h"
#include "jsapi.h"
class nsIDOMElement;
class nsIDOMHTMLElement;
@ -64,13 +63,13 @@ public:
NS_IMETHOD GetCookie(nsString& aCookie)=0;
NS_IMETHOD SetCookie(const nsString& aCookie)=0;
NS_IMETHOD Open(JSContext *cx, jsval *argv, PRUint32 argc)=0;
NS_IMETHOD Open()=0;
NS_IMETHOD Close()=0;
NS_IMETHOD Write(JSContext *cx, jsval *argv, PRUint32 argc)=0;
NS_IMETHOD Write(const nsString& aText)=0;
NS_IMETHOD Writeln(JSContext *cx, jsval *argv, PRUint32 argc)=0;
NS_IMETHOD Writeln(const nsString& aText)=0;
NS_IMETHOD GetElementById(const nsString& aElementId, nsIDOMElement** aReturn)=0;
@ -93,10 +92,10 @@ public:
NS_IMETHOD GetAnchors(nsIDOMHTMLCollection** aAnchors); \
NS_IMETHOD GetCookie(nsString& aCookie); \
NS_IMETHOD SetCookie(const nsString& aCookie); \
NS_IMETHOD Open(JSContext *cx, jsval *argv, PRUint32 argc); \
NS_IMETHOD Open(); \
NS_IMETHOD Close(); \
NS_IMETHOD Write(JSContext *cx, jsval *argv, PRUint32 argc); \
NS_IMETHOD Writeln(JSContext *cx, jsval *argv, PRUint32 argc); \
NS_IMETHOD Write(const nsString& aText); \
NS_IMETHOD Writeln(const nsString& aText); \
NS_IMETHOD GetElementById(const nsString& aElementId, nsIDOMElement** aReturn); \
NS_IMETHOD GetElementsByName(const nsString& aElementName, nsIDOMNodeList** aReturn); \
@ -117,10 +116,10 @@ public:
NS_IMETHOD GetAnchors(nsIDOMHTMLCollection** aAnchors) { return _to GetAnchors(aAnchors); } \
NS_IMETHOD GetCookie(nsString& aCookie) { return _to GetCookie(aCookie); } \
NS_IMETHOD SetCookie(const nsString& aCookie) { return _to SetCookie(aCookie); } \
NS_IMETHOD Open(JSContext *cx, jsval *argv, PRUint32 argc) { return _to Open(cx, argv, argc); } \
NS_IMETHOD Open() { return _to Open(); } \
NS_IMETHOD Close() { return _to Close(); } \
NS_IMETHOD Write(JSContext *cx, jsval *argv, PRUint32 argc) { return _to Write(cx, argv, argc); } \
NS_IMETHOD Writeln(JSContext *cx, jsval *argv, PRUint32 argc) { return _to Writeln(cx, argv, argc); } \
NS_IMETHOD Write(const nsString& aText) { return _to Write(aText); } \
NS_IMETHOD Writeln(const nsString& aText) { return _to Writeln(aText); } \
NS_IMETHOD GetElementById(const nsString& aElementId, nsIDOMElement** aReturn) { return _to GetElementById(aElementId, aReturn); } \
NS_IMETHOD GetElementsByName(const nsString& aElementName, nsIDOMNodeList** aReturn) { return _to GetElementsByName(aElementName, aReturn); } \

View File

@ -23,6 +23,7 @@
#include "nsISupports.h"
#include "nsString.h"
#include "nsIScriptContext.h"
#include "jsapi.h"
class nsIDOMElement;
class nsIDOMHTMLCollection;
@ -61,6 +62,12 @@ public:
NS_IMETHOD GetSelection(nsString& aReturn)=0;
NS_IMETHOD NamedItem(const nsString& aName, nsIDOMElement** aReturn)=0;
NS_IMETHOD Open(JSContext *cx, jsval *argv, PRUint32 argc)=0;
NS_IMETHOD Write(JSContext *cx, jsval *argv, PRUint32 argc)=0;
NS_IMETHOD Writeln(JSContext *cx, jsval *argv, PRUint32 argc)=0;
};
@ -81,6 +88,9 @@ public:
NS_IMETHOD GetPlugins(nsIDOMHTMLCollection** aPlugins); \
NS_IMETHOD GetSelection(nsString& aReturn); \
NS_IMETHOD NamedItem(const nsString& aName, nsIDOMElement** aReturn); \
NS_IMETHOD Open(JSContext *cx, jsval *argv, PRUint32 argc); \
NS_IMETHOD Write(JSContext *cx, jsval *argv, PRUint32 argc); \
NS_IMETHOD Writeln(JSContext *cx, jsval *argv, PRUint32 argc); \
@ -101,6 +111,9 @@ public:
NS_IMETHOD GetPlugins(nsIDOMHTMLCollection** aPlugins) { return _to GetPlugins(aPlugins); } \
NS_IMETHOD GetSelection(nsString& aReturn) { return _to GetSelection(aReturn); } \
NS_IMETHOD NamedItem(const nsString& aName, nsIDOMElement** aReturn) { return _to NamedItem(aName, aReturn); } \
NS_IMETHOD Open(JSContext *cx, jsval *argv, PRUint32 argc) { return _to Open(cx, argv, argc); } \
NS_IMETHOD Write(JSContext *cx, jsval *argv, PRUint32 argc) { return _to Write(cx, argv, argc); } \
NS_IMETHOD Writeln(JSContext *cx, jsval *argv, PRUint32 argc) { return _to Writeln(cx, argv, argc); } \
#endif // nsIDOMNSHTMLDocument_h__

View File

@ -13,10 +13,11 @@
readonly attribute HTMLCollection forms;
readonly attribute HTMLCollection anchors;
attribute DOMString cookie;
void open(/* ... */);
noscript void open();
void close();
void write(/* ... */);
void writeln(/* ... */);
noscript void write(in DOMString text);
noscript void writeln(in DOMString text);
Element getElementById(in DOMString elementId);
NodeList getElementsByName(in DOMString elementName);
};
@ -38,4 +39,8 @@
wstring getSelection();
Element namedItem(in wstring name);
void open(/* ... */);
void write(/* ... */);
void writeln(/* ... */);
};

View File

@ -782,54 +782,6 @@ ResolveHTMLDocument(JSContext *cx, JSObject *obj, jsval id)
}
//
// Native method Open
//
PR_STATIC_CALLBACK(JSBool)
HTMLDocumentOpen(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsIDOMHTMLDocument *nativeThis = (nsIDOMHTMLDocument*)JS_GetPrivate(cx, obj);
JSBool rBool = JS_FALSE;
*rval = JSVAL_NULL;
nsIScriptContext *scriptCX = (nsIScriptContext *)JS_GetContextPrivate(cx);
nsIScriptSecurityManager *secMan;
if (NS_OK == scriptCX->GetSecurityManager(&secMan)) {
PRBool ok;
secMan->CheckScriptAccess(scriptCX, obj, "htmldocument.open", &ok);
if (!ok) {
//Need to throw error here
return JS_FALSE;
}
NS_RELEASE(secMan);
}
else {
return JS_FALSE;
}
// If there's no private data, this must be the prototype, so ignore
if (nsnull == nativeThis) {
return JS_TRUE;
}
if (argc >= 0) {
if (NS_OK != nativeThis->Open(cx, argv+0, argc-0)) {
return JS_FALSE;
}
*rval = JSVAL_VOID;
}
else {
JS_ReportError(cx, "Function open requires 0 parameters");
return JS_FALSE;
}
return JS_TRUE;
}
//
// Native method Close
//
@ -845,7 +797,7 @@ HTMLDocumentClose(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
nsIScriptSecurityManager *secMan;
if (NS_OK == scriptCX->GetSecurityManager(&secMan)) {
PRBool ok;
secMan->CheckScriptAccess(scriptCX, obj, "htmldocument.close", &ok);
secMan->CheckScriptAccess(scriptCX, obj, "htmldocument.open", &ok);
if (!ok) {
//Need to throw error here
return JS_FALSE;
@ -878,102 +830,6 @@ HTMLDocumentClose(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
}
//
// Native method Write
//
PR_STATIC_CALLBACK(JSBool)
HTMLDocumentWrite(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsIDOMHTMLDocument *nativeThis = (nsIDOMHTMLDocument*)JS_GetPrivate(cx, obj);
JSBool rBool = JS_FALSE;
*rval = JSVAL_NULL;
nsIScriptContext *scriptCX = (nsIScriptContext *)JS_GetContextPrivate(cx);
nsIScriptSecurityManager *secMan;
if (NS_OK == scriptCX->GetSecurityManager(&secMan)) {
PRBool ok;
secMan->CheckScriptAccess(scriptCX, obj, "htmldocument.write", &ok);
if (!ok) {
//Need to throw error here
return JS_FALSE;
}
NS_RELEASE(secMan);
}
else {
return JS_FALSE;
}
// If there's no private data, this must be the prototype, so ignore
if (nsnull == nativeThis) {
return JS_TRUE;
}
if (argc >= 0) {
if (NS_OK != nativeThis->Write(cx, argv+0, argc-0)) {
return JS_FALSE;
}
*rval = JSVAL_VOID;
}
else {
JS_ReportError(cx, "Function write requires 0 parameters");
return JS_FALSE;
}
return JS_TRUE;
}
//
// Native method Writeln
//
PR_STATIC_CALLBACK(JSBool)
HTMLDocumentWriteln(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsIDOMHTMLDocument *nativeThis = (nsIDOMHTMLDocument*)JS_GetPrivate(cx, obj);
JSBool rBool = JS_FALSE;
*rval = JSVAL_NULL;
nsIScriptContext *scriptCX = (nsIScriptContext *)JS_GetContextPrivate(cx);
nsIScriptSecurityManager *secMan;
if (NS_OK == scriptCX->GetSecurityManager(&secMan)) {
PRBool ok;
secMan->CheckScriptAccess(scriptCX, obj, "htmldocument.writeln", &ok);
if (!ok) {
//Need to throw error here
return JS_FALSE;
}
NS_RELEASE(secMan);
}
else {
return JS_FALSE;
}
// If there's no private data, this must be the prototype, so ignore
if (nsnull == nativeThis) {
return JS_TRUE;
}
if (argc >= 0) {
if (NS_OK != nativeThis->Writeln(cx, argv+0, argc-0)) {
return JS_FALSE;
}
*rval = JSVAL_VOID;
}
else {
JS_ReportError(cx, "Function writeln requires 0 parameters");
return JS_FALSE;
}
return JS_TRUE;
}
//
// Native method GetElementById
//
@ -991,7 +847,7 @@ HTMLDocumentGetElementById(JSContext *cx, JSObject *obj, uintN argc, jsval *argv
nsIScriptSecurityManager *secMan;
if (NS_OK == scriptCX->GetSecurityManager(&secMan)) {
PRBool ok;
secMan->CheckScriptAccess(scriptCX, obj, "htmldocument.getelementbyid", &ok);
secMan->CheckScriptAccess(scriptCX, obj, "htmldocument.close", &ok);
if (!ok) {
//Need to throw error here
return JS_FALSE;
@ -1043,7 +899,7 @@ HTMLDocumentGetElementsByName(JSContext *cx, JSObject *obj, uintN argc, jsval *a
nsIScriptSecurityManager *secMan;
if (NS_OK == scriptCX->GetSecurityManager(&secMan)) {
PRBool ok;
secMan->CheckScriptAccess(scriptCX, obj, "htmldocument.getelementsbyname", &ok);
secMan->CheckScriptAccess(scriptCX, obj, "htmldocument.write", &ok);
if (!ok) {
//Need to throw error here
return JS_FALSE;
@ -1100,7 +956,7 @@ NSHTMLDocumentGetSelection(JSContext *cx, JSObject *obj, uintN argc, jsval *argv
nsIScriptSecurityManager *secMan;
if (NS_OK == scriptCX->GetSecurityManager(&secMan)) {
PRBool ok;
secMan->CheckScriptAccess(scriptCX, obj, "nshtmldocument.getselection", &ok);
secMan->CheckScriptAccess(scriptCX, obj, "htmldocument.writeln", &ok);
if (!ok) {
//Need to throw error here
return JS_FALSE;
@ -1156,7 +1012,7 @@ NSHTMLDocumentNamedItem(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, j
nsIScriptSecurityManager *secMan;
if (NS_OK == scriptCX->GetSecurityManager(&secMan)) {
PRBool ok;
secMan->CheckScriptAccess(scriptCX, obj, "nshtmldocument.nameditem", &ok);
secMan->CheckScriptAccess(scriptCX, obj, "htmldocument.getelementbyid", &ok);
if (!ok) {
//Need to throw error here
return JS_FALSE;
@ -1191,6 +1047,168 @@ NSHTMLDocumentNamedItem(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, j
}
//
// Native method Open
//
PR_STATIC_CALLBACK(JSBool)
NSHTMLDocumentOpen(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsIDOMHTMLDocument *privateThis = (nsIDOMHTMLDocument*)JS_GetPrivate(cx, obj);
nsIDOMNSHTMLDocument *nativeThis = nsnull;
if (NS_OK != privateThis->QueryInterface(kINSHTMLDocumentIID, (void **)&nativeThis)) {
JS_ReportError(cx, "Object must be of type NSHTMLDocument");
return JS_FALSE;
}
JSBool rBool = JS_FALSE;
*rval = JSVAL_NULL;
nsIScriptContext *scriptCX = (nsIScriptContext *)JS_GetContextPrivate(cx);
nsIScriptSecurityManager *secMan;
if (NS_OK == scriptCX->GetSecurityManager(&secMan)) {
PRBool ok;
secMan->CheckScriptAccess(scriptCX, obj, "htmldocument.getelementsbyname", &ok);
if (!ok) {
//Need to throw error here
return JS_FALSE;
}
NS_RELEASE(secMan);
}
else {
return JS_FALSE;
}
// If there's no private data, this must be the prototype, so ignore
if (nsnull == nativeThis) {
return JS_TRUE;
}
if (argc >= 0) {
if (NS_OK != nativeThis->Open(cx, argv+0, argc-0)) {
return JS_FALSE;
}
*rval = JSVAL_VOID;
}
else {
JS_ReportError(cx, "Function open requires 0 parameters");
return JS_FALSE;
}
return JS_TRUE;
}
//
// Native method Write
//
PR_STATIC_CALLBACK(JSBool)
NSHTMLDocumentWrite(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsIDOMHTMLDocument *privateThis = (nsIDOMHTMLDocument*)JS_GetPrivate(cx, obj);
nsIDOMNSHTMLDocument *nativeThis = nsnull;
if (NS_OK != privateThis->QueryInterface(kINSHTMLDocumentIID, (void **)&nativeThis)) {
JS_ReportError(cx, "Object must be of type NSHTMLDocument");
return JS_FALSE;
}
JSBool rBool = JS_FALSE;
*rval = JSVAL_NULL;
nsIScriptContext *scriptCX = (nsIScriptContext *)JS_GetContextPrivate(cx);
nsIScriptSecurityManager *secMan;
if (NS_OK == scriptCX->GetSecurityManager(&secMan)) {
PRBool ok;
secMan->CheckScriptAccess(scriptCX, obj, "nshtmldocument.getselection", &ok);
if (!ok) {
//Need to throw error here
return JS_FALSE;
}
NS_RELEASE(secMan);
}
else {
return JS_FALSE;
}
// If there's no private data, this must be the prototype, so ignore
if (nsnull == nativeThis) {
return JS_TRUE;
}
if (argc >= 0) {
if (NS_OK != nativeThis->Write(cx, argv+0, argc-0)) {
return JS_FALSE;
}
*rval = JSVAL_VOID;
}
else {
JS_ReportError(cx, "Function write requires 0 parameters");
return JS_FALSE;
}
return JS_TRUE;
}
//
// Native method Writeln
//
PR_STATIC_CALLBACK(JSBool)
NSHTMLDocumentWriteln(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsIDOMHTMLDocument *privateThis = (nsIDOMHTMLDocument*)JS_GetPrivate(cx, obj);
nsIDOMNSHTMLDocument *nativeThis = nsnull;
if (NS_OK != privateThis->QueryInterface(kINSHTMLDocumentIID, (void **)&nativeThis)) {
JS_ReportError(cx, "Object must be of type NSHTMLDocument");
return JS_FALSE;
}
JSBool rBool = JS_FALSE;
*rval = JSVAL_NULL;
nsIScriptContext *scriptCX = (nsIScriptContext *)JS_GetContextPrivate(cx);
nsIScriptSecurityManager *secMan;
if (NS_OK == scriptCX->GetSecurityManager(&secMan)) {
PRBool ok;
secMan->CheckScriptAccess(scriptCX, obj, "nshtmldocument.nameditem", &ok);
if (!ok) {
//Need to throw error here
return JS_FALSE;
}
NS_RELEASE(secMan);
}
else {
return JS_FALSE;
}
// If there's no private data, this must be the prototype, so ignore
if (nsnull == nativeThis) {
return JS_TRUE;
}
if (argc >= 0) {
if (NS_OK != nativeThis->Writeln(cx, argv+0, argc-0)) {
return JS_FALSE;
}
*rval = JSVAL_VOID;
}
else {
JS_ReportError(cx, "Function writeln requires 0 parameters");
return JS_FALSE;
}
return JS_TRUE;
}
/***********************************************************************/
//
// class for HTMLDocument
@ -1243,14 +1261,14 @@ static JSPropertySpec HTMLDocumentProperties[] =
//
static JSFunctionSpec HTMLDocumentMethods[] =
{
{"open", HTMLDocumentOpen, 0},
{"close", HTMLDocumentClose, 0},
{"write", HTMLDocumentWrite, 0},
{"writeln", HTMLDocumentWriteln, 0},
{"getElementById", HTMLDocumentGetElementById, 1},
{"getElementsByName", HTMLDocumentGetElementsByName, 1},
{"getSelection", NSHTMLDocumentGetSelection, 0},
{"namedItem", NSHTMLDocumentNamedItem, 1},
{"open", NSHTMLDocumentOpen, 0},
{"write", NSHTMLDocumentWrite, 0},
{"writeln", NSHTMLDocumentWriteln, 0},
{0}
};

View File

@ -73,7 +73,7 @@ const PRInt32 kBackward = 1;
#endif
// XXX Used to control whether we implement document.layers
//#define NS_IMPLEMENT_DOCUMENT_LAYERS
#define NS_IMPLEMENT_DOCUMENT_LAYERS
static NS_DEFINE_IID(kIWebShellIID, NS_IWEB_SHELL_IID);
static NS_DEFINE_IID(kIDocumentIID, NS_IDOCUMENT_IID);
@ -1229,67 +1229,97 @@ nsHTMLDocument::GetSourceDocumentURL(JSContext* cx,
return result;
}
NS_IMETHODIMP
nsHTMLDocument::Open(JSContext *cx, jsval *argv, PRUint32 argc)
// XXX TBI: accepting arguments to the open method.
nsresult
nsHTMLDocument::OpenCommon(nsIURL* aSourceURL)
{
nsresult result = NS_OK;
// The open occurred after the document finished loading.
// So we reset the document and create a new one.
if (nsnull == mParser) {
nsIURL* sourceURL;
result = Reset(aSourceURL);
if (NS_OK == result) {
static NS_DEFINE_IID(kCParserIID, NS_IPARSER_IID);
static NS_DEFINE_IID(kCParserCID, NS_PARSER_IID);
// XXX The URL of the newly created document will match
// that of the source document. Is this right?
result = GetSourceDocumentURL(cx, &sourceURL);
// Recover if we had a problem obtaining the source URL
if (nsnull == sourceURL) {
result = NS_NewURL(&sourceURL, "about:blank");
}
result = nsComponentManager::CreateInstance(kCParserCID,
nsnull,
kCParserIID,
(void **)&mParser);
mIsWriting = 1;
if (NS_SUCCEEDED(result)) {
result = Reset(sourceURL);
if (NS_OK == result) {
static NS_DEFINE_IID(kCParserIID, NS_IPARSER_IID);
static NS_DEFINE_IID(kCParserCID, NS_PARSER_IID);
nsIHTMLContentSink* sink;
nsIWebShell* webShell = nsnull;
result = nsComponentManager::CreateInstance(kCParserCID,
nsnull,
kCParserIID,
(void **)&mParser);
mIsWriting = 1;
if (NS_OK == result) {
nsIHTMLContentSink* sink;
nsIWebShell* webShell = nsnull;
// Get the webshell of our primary presentation shell
nsIPresShell* shell = (nsIPresShell*) mPresShells.ElementAt(0);
if (nsnull != shell) {
nsCOMPtr<nsIPresContext> cx;
shell->GetPresContext(getter_AddRefs(cx));
nsISupports* container;
if (NS_OK == cx->GetContainer(&container)) {
if (nsnull != container) {
container->QueryInterface(kIWebShellIID, (void**) &webShell);
}
// Get the webshell of our primary presentation shell
nsIPresShell* shell = (nsIPresShell*) mPresShells.ElementAt(0);
if (nsnull != shell) {
nsCOMPtr<nsIPresContext> cx;
shell->GetPresContext(getter_AddRefs(cx));
nsISupports* container;
if (NS_OK == cx->GetContainer(&container)) {
if (nsnull != container) {
container->QueryInterface(kIWebShellIID, (void**) &webShell);
}
}
}
result = NS_NewHTMLContentSink(&sink, this, sourceURL, webShell);
NS_IF_RELEASE(webShell);
result = NS_NewHTMLContentSink(&sink, this, aSourceURL, webShell);
NS_IF_RELEASE(webShell);
if (NS_OK == result) {
nsIDTD* theDTD=0;
NS_NewNavHTMLDTD(&theDTD);
mParser->RegisterDTD(theDTD);
mParser->SetContentSink(sink);
NS_RELEASE(sink);
}
if (NS_OK == result) {
nsIDTD* theDTD=0;
NS_NewNavHTMLDTD(&theDTD);
mParser->RegisterDTD(theDTD);
mParser->SetContentSink(sink);
NS_RELEASE(sink);
}
}
NS_RELEASE(sourceURL);
}
}
return result;
}
NS_IMETHODIMP
nsHTMLDocument::Open()
{
nsresult result = NS_OK;
nsIURL* sourceURL;
// XXX For the non-script Open case, we have to make
// up a URL.
result = NS_NewURL(&sourceURL, "about:blank");
if (NS_SUCCEEDED(result)) {
result = OpenCommon(sourceURL);
NS_RELEASE(sourceURL);
}
return result;
}
NS_IMETHODIMP
nsHTMLDocument::Open(JSContext *cx, jsval *argv, PRUint32 argc)
{
nsresult result = NS_OK;
nsIURL* sourceURL;
// XXX The URL of the newly created document will match
// that of the source document. Is this right?
result = GetSourceDocumentURL(cx, &sourceURL);
// Recover if we had a problem obtaining the source URL
if (nsnull == sourceURL) {
result = NS_NewURL(&sourceURL, "about:blank");
}
if (NS_SUCCEEDED(result)) {
result = OpenCommon(sourceURL);
NS_RELEASE(sourceURL);
}
return result;
}
@ -1313,14 +1343,56 @@ nsHTMLDocument::Close()
}
nsresult
nsHTMLDocument::WriteCommon(JSContext *cx,
jsval *argv,
PRUint32 argc,
nsHTMLDocument::WriteCommon(const nsString& aText,
PRBool aNewlineTerminate)
{
nsresult result = NS_OK;
// XXX Right now, we only deal with inline document.writes
if (nsnull == mParser) {
result = Open();
if (NS_OK != result) {
return result;
}
}
nsAutoString str(aText);
if (aNewlineTerminate) {
str.Append('\n');
}
mWriteLevel++;
result = mParser->Parse(str, NS_GENERATE_PARSER_KEY(),
"text/html", PR_FALSE,
(!mIsWriting || (mWriteLevel > 1)));
mWriteLevel--;
if (NS_OK != result) {
return result;
}
return result;
}
NS_IMETHODIMP
nsHTMLDocument::Write(const nsString& aText)
{
return WriteCommon(aText, PR_FALSE);
}
NS_IMETHODIMP
nsHTMLDocument::Writeln(const nsString& aText)
{
return WriteCommon(aText, PR_TRUE);
}
nsresult
nsHTMLDocument::ScriptWriteCommon(JSContext *cx,
jsval *argv,
PRUint32 argc,
PRBool aNewlineTerminate)
{
nsresult result = NS_OK;
if (nsnull == mParser) {
result = Open(cx, argv, argc);
if (NS_OK != result) {
@ -1360,13 +1432,13 @@ nsHTMLDocument::WriteCommon(JSContext *cx,
NS_IMETHODIMP
nsHTMLDocument::Write(JSContext *cx, jsval *argv, PRUint32 argc)
{
return WriteCommon(cx, argv, argc, PR_FALSE);
return ScriptWriteCommon(cx, argv, argc, PR_FALSE);
}
NS_IMETHODIMP
nsHTMLDocument::Writeln(JSContext *cx, jsval *argv, PRUint32 argc)
{
return WriteCommon(cx, argv, argc, PR_TRUE);
return ScriptWriteCommon(cx, argv, argc, PR_TRUE);
}
nsIContent *

View File

@ -178,11 +178,13 @@ protected:
nsresult GetBodyElement(nsIDOMHTMLBodyElement** aBody);
virtual nsresult Reset(nsIURL *aURL);
nsresult WriteCommon(JSContext *cx,
jsval *argv,
PRUint32 argc,
nsresult WriteCommon(const nsString& aText,
PRBool aNewlineTerminate);
nsresult ScriptWriteCommon(JSContext *cx,
jsval *argv,
PRUint32 argc,
PRBool aNewlineTerminate);
nsresult OpenCommon(nsIURL* aUrl);
nsIHTMLStyleSheet* mAttrStyleSheet;
nsIHTMLCSSStyleSheet* mStyleAttrStyleSheet;