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);