diff --git a/mozilla/content/html/document/src/nsHTMLDocument.cpp b/mozilla/content/html/document/src/nsHTMLDocument.cpp index 49d275881d7..1ea45d26db6 100644 --- a/mozilla/content/html/document/src/nsHTMLDocument.cpp +++ b/mozilla/content/html/document/src/nsHTMLDocument.cpp @@ -2304,11 +2304,55 @@ nsresult nsHTMLDocument::WriteCommon(const nsAReadableString& aText, PRBool aNewlineTerminate) { - nsresult rv; - nsCOMPtr xpc(do_GetService(nsIXPConnect::GetCID(), &rv)); + nsresult rv = NS_OK; + + if (!mParser) { + rv = Open(); + if (NS_FAILED(rv)) { + return rv; + } + } + + const nsAReadableString *text_to_write = &aText; + nsAutoString string_buffer; + + if (aNewlineTerminate) { + string_buffer.Assign(aText); + string_buffer.Append((PRUnichar)'\n'); + + text_to_write = &string_buffer; + } + + mWriteLevel++; + rv = mParser->Parse(*text_to_write, NS_GENERATE_PARSER_KEY(), + NS_ConvertASCIItoUCS2("text/html"), PR_FALSE, + (!mIsWriting || (mWriteLevel > 1))); + mWriteLevel--; + + return rv; +} + +NS_IMETHODIMP +nsHTMLDocument::Write(const nsAReadableString& aText) +{ + return WriteCommon(aText, PR_FALSE); +} + +NS_IMETHODIMP +nsHTMLDocument::Writeln(const nsAReadableString& aText) +{ + return WriteCommon(aText, PR_TRUE); +} + +nsresult +nsHTMLDocument::ScriptWriteCommon(PRBool aNewlineTerminate) +{ + nsCOMPtr xpc(do_GetService(nsIXPConnect::GetCID())); nsCOMPtr ncc; + nsresult rv = NS_OK; + if (xpc) { rv = xpc->GetCurrentNativeCallContext(getter_AddRefs(ncc)); NS_ENSURE_SUCCESS(rv, rv); @@ -2356,9 +2400,6 @@ nsHTMLDocument::WriteCommon(const nsAReadableString& aText, } } - const nsAReadableString *text_to_write = &aText; - nsAutoString string_buffer; - if (ncc) { // We're called from C++, concatenate the extra arguments into // string_buffer @@ -2366,20 +2407,29 @@ nsHTMLDocument::WriteCommon(const nsAReadableString& aText, ncc->GetArgc(&argc); + JSContext *cx = nsnull; + rv = ncc->GetJSContext(&cx); + NS_ENSURE_SUCCESS(rv, rv); + + jsval *argv = nsnull; + ncc->GetArgvPtr(&argv); + NS_ENSURE_TRUE(argv, NS_ERROR_UNEXPECTED); + + if (argc == 1) { + JSString *jsstr = JS_ValueToString(cx, argv[0]); + NS_ENSURE_TRUE(jsstr, NS_ERROR_OUT_OF_MEMORY); + + nsLiteralString str(NS_REINTERPRET_CAST(const PRUnichar *, + ::JS_GetStringChars(jsstr)), + ::JS_GetStringLength(jsstr)); + + return WriteCommon(str, aNewlineTerminate); + } + if (argc > 1) { - string_buffer.Assign(aText); - text_to_write = &string_buffer; - - JSContext *cx = nsnull; - rv = ncc->GetJSContext(&cx); - NS_ENSURE_SUCCESS(rv, rv); - - jsval *argv = nsnull; - ncc->GetArgvPtr(&argv); - NS_ENSURE_TRUE(argv, NS_ERROR_UNEXPECTED); - - for (i = 1; i < argc; i++) { + nsAutoString string_buffer; + for (i = 0; i < argc; i++) { JSString *str = JS_ValueToString(cx, argv[i]); NS_ENSURE_TRUE(str, NS_ERROR_OUT_OF_MEMORY); @@ -2387,48 +2437,29 @@ nsHTMLDocument::WriteCommon(const nsAReadableString& aText, ::JS_GetStringChars(str)), ::JS_GetStringLength(str)); } + + return WriteCommon(string_buffer, aNewlineTerminate); } } - if (!mParser) { - rv = Open(); - if (NS_FAILED(rv)) { - return rv; - } - } - - - if (aNewlineTerminate) { - if (string_buffer.IsEmpty()) { - string_buffer.Assign(aText); - } - - text_to_write = &string_buffer; - - string_buffer.Append((PRUnichar)'\n'); - } - - mWriteLevel++; - rv = mParser->Parse(*text_to_write, NS_GENERATE_PARSER_KEY(), - NS_ConvertASCIItoUCS2("text/html"), PR_FALSE, - (!mIsWriting || (mWriteLevel > 1))); - mWriteLevel--; - - return rv; + // No arguments... + return WriteCommon(nsString(), aNewlineTerminate); } NS_IMETHODIMP -nsHTMLDocument::Write(const nsAReadableString& aText) +nsHTMLDocument::Write() { - return WriteCommon(aText, PR_FALSE); + return ScriptWriteCommon(PR_FALSE); } -NS_IMETHODIMP -nsHTMLDocument::Writeln(const nsAReadableString& aText) + +NS_IMETHODIMP +nsHTMLDocument::Writeln() { - return WriteCommon(aText, PR_TRUE); + return ScriptWriteCommon(PR_TRUE); } + nsIContent * nsHTMLDocument::MatchId(nsIContent *aContent, const nsAReadableString& aId) { diff --git a/mozilla/content/html/document/src/nsHTMLDocument.h b/mozilla/content/html/document/src/nsHTMLDocument.h index fa20d4d20a0..f4b7a50df02 100644 --- a/mozilla/content/html/document/src/nsHTMLDocument.h +++ b/mozilla/content/html/document/src/nsHTMLDocument.h @@ -187,6 +187,7 @@ protected: nsresult WriteCommon(const nsAReadableString& aText, PRBool aNewlineTerminate); + nsresult ScriptWriteCommon(PRBool aNewlineTerminate); nsresult OpenCommon(nsIURI* aUrl); nsIHTMLStyleSheet* mAttrStyleSheet; diff --git a/mozilla/dom/public/idl/html/nsIDOMHTMLDocument.idl b/mozilla/dom/public/idl/html/nsIDOMHTMLDocument.idl index 89befaa9ef3..36cb35b7950 100644 --- a/mozilla/dom/public/idl/html/nsIDOMHTMLDocument.idl +++ b/mozilla/dom/public/idl/html/nsIDOMHTMLDocument.idl @@ -41,7 +41,13 @@ interface nsIDOMHTMLDocument : nsIDOMDocument [noscript] void open(); void close(); - void write(in DOMString text); - void writeln(in DOMString text); + + // The methods write() and writeln() must be callable from JS with + // no arguments for backwards compatibility, thus they are marked + // [noscript] here. The JS versions of these methods are defined in + // nsIDOMNSHTMLDocument. + [noscript] void write(in DOMString text); + [noscript] void writeln(in DOMString text); + nsIDOMNodeList getElementsByName(in DOMString elementName); }; diff --git a/mozilla/dom/public/idl/html/nsIDOMNSHTMLDocument.idl b/mozilla/dom/public/idl/html/nsIDOMNSHTMLDocument.idl index e3f0e5f5f9e..968e129b1b7 100644 --- a/mozilla/dom/public/idl/html/nsIDOMNSHTMLDocument.idl +++ b/mozilla/dom/public/idl/html/nsIDOMNSHTMLDocument.idl @@ -40,7 +40,9 @@ interface nsIDOMNSHTMLDocument : nsISupports DOMString getSelection(); - nsIDOMDocument open(/* ... */); + nsIDOMDocument open(); + void write(); + void writeln(); void clear(); void captureEvents(in long eventFlags);