Backing out bug 614058, bug 609272, bug 478445, bug 499628, bug 605296, bug 608914 and bug 614724 due to potentially causing bug 615736 CLOSED TREE. a=backout

This commit is contained in:
Dave Townsend 2010-12-01 11:01:56 -08:00
parent ad5534594c
commit 7a0e0a5cd9
32 changed files with 461 additions and 527 deletions

View File

@ -242,8 +242,8 @@ interface nsIXMLHttpRequest : nsISupports
*/
[optional_argc] void open(in AUTF8String method, in AUTF8String url,
[optional] in boolean async,
[optional,Undefined(Empty)] in DOMString user,
[optional,Undefined(Empty)] in DOMString password);
[optional] in DOMString user,
[optional] in DOMString password);
/**
* Sends the request. If the request is asynchronous, returns

View File

@ -445,8 +445,9 @@ nsAttrValue::ToString(nsAString& aResult) const
#endif
case eFloatValue:
{
aResult.Truncate();
aResult.AppendFloat(GetFloatValue());
nsAutoString str;
str.AppendFloat(GetFloatValue());
aResult = str;
break;
}
default:

View File

@ -4351,18 +4351,7 @@ nsDocument::CreateElementNS(const nsAString& aNamespaceURI,
nsIDOMElement** aReturn)
{
*aReturn = nsnull;
nsCOMPtr<nsIContent> content;
nsresult rv = CreateElementNS(aNamespaceURI, aQualifiedName,
getter_AddRefs(content));
NS_ENSURE_SUCCESS(rv, rv);
return CallQueryInterface(content, aReturn);
}
nsresult
nsDocument::CreateElementNS(const nsAString& aNamespaceURI,
const nsAString& aQualifiedName,
nsIContent** aReturn)
{
nsCOMPtr<nsINodeInfo> nodeInfo;
nsresult rv = nsContentUtils::GetNodeInfoFromQName(aNamespaceURI,
aQualifiedName,
@ -4370,9 +4359,13 @@ nsDocument::CreateElementNS(const nsAString& aNamespaceURI,
getter_AddRefs(nodeInfo));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIContent> content;
PRInt32 ns = nodeInfo->NamespaceID();
return NS_NewElement(aReturn, nodeInfo->NamespaceID(),
nodeInfo.forget(), NOT_FROM_PARSER);
rv = NS_NewElement(getter_AddRefs(content), ns, nodeInfo.forget(),
NOT_FROM_PARSER);
NS_ENSURE_SUCCESS(rv, rv);
return CallQueryInterface(content, aReturn);
}
NS_IMETHODIMP

View File

@ -859,9 +859,6 @@ public:
nsresult CreateElement(const nsAString& aTagName,
nsIContent** aReturn);
nsresult CreateElementNS(const nsAString& aNamespaceURI,
const nsAString& aQualifiedName,
nsIContent** aReturn);
nsresult CreateTextNode(const nsAString& aData, nsIContent** aReturn);

View File

@ -1095,6 +1095,19 @@ nsIContent::IsEqual(nsIContent* aOther)
return PR_FALSE;
}
}
// Child nodes count.
PRUint32 childCount = GetChildCount();
if (childCount != element2->GetChildCount()) {
return PR_FALSE;
}
// Iterate over child nodes.
for (PRUint32 i = 0; i < childCount; ++i) {
if (!GetChildAt(i)->IsEqual(element2->GetChildAt(i))) {
return PR_FALSE;
}
}
} else {
// Node value check.
nsCOMPtr<nsIDOMNode> domNode1 = do_QueryInterface(this);
@ -1107,18 +1120,6 @@ nsIContent::IsEqual(nsIContent* aOther)
}
}
// Child nodes count.
PRUint32 childCount = GetChildCount();
if (childCount != aOther->GetChildCount()) {
return PR_FALSE;
}
// Iterate over child nodes.
for (PRUint32 i = 0; i < childCount; ++i) {
if (!GetChildAt(i)->IsEqual(aOther->GetChildAt(i))) {
return PR_FALSE;
}
}
return PR_TRUE;
}

View File

@ -370,17 +370,17 @@ _TEST_FILES2 = \
file_CSP_main.html \
file_CSP_main.html^headers^ \
file_CSP_main.js \
test_CSP_frameancestors.html \
file_CSP_frameancestors.sjs \
file_CSP_frameancestors_main.html \
file_CSP_frameancestors_main.js \
test_CSP_inlinescript.html \
file_CSP_inlinescript_main.html \
file_CSP_inlinescript_main.html^headers^ \
test_CSP_evalscript.html \
file_CSP_evalscript_main.html \
file_CSP_evalscript_main.html^headers^ \
file_CSP_evalscript_main.js \
test_CSP_frameancestors.html \
file_CSP_frameancestors.sjs \
file_CSP_frameancestors_main.html \
file_CSP_frameancestors_main.js \
test_CSP_inlinescript.html \
file_CSP_inlinescript_main.html \
file_CSP_inlinescript_main.html^headers^ \
test_CSP_evalscript.html \
file_CSP_evalscript_main.html \
file_CSP_evalscript_main.html^headers^ \
file_CSP_evalscript_main.js \
test_bug540854.html \
bug540854.sjs \
test_bug548463.html \
@ -444,7 +444,6 @@ _TEST_FILES2 = \
test_bug605982.html \
test_bug606729.html \
test_treewalker_nextsibling.xml \
test_bug614058.html \
$(NULL)
# This test fails on the Mac for some reason

View File

@ -16,11 +16,7 @@ window.addEventListener("message", function(e) {
var res = {
didFail: false,
events: [],
progressEvents: 0,
status: 0,
responseText: "",
responseXML: null,
sendThrew: false
progressEvents: 0
};
var xhr = new XMLHttpRequest();
@ -76,28 +72,14 @@ window.addEventListener("message", function(e) {
sendData = req.body;
res.events.push("opening");
// Allow passign in falsy usernames/passwords so we can test them
try {
xhr.open(req.method, req.url, true,
("username" in req) ? req.username : "",
("password" in req) ? req.password : "aa");
} catch (ex) {
res.didFail = true;
post(e, res);
}
xhr.open(req.method, req.url, true);
for (header in req.headers) {
xhr.setRequestHeader(header, req.headers[header]);
}
res.events.push("sending");
try {
xhr.send(sendData);
} catch (ex) {
res.didFail = true;
res.sendThrew = true;
post(e, res);
}
xhr.send(sendData);
}, false);

View File

@ -49,37 +49,6 @@ function runTest() {
noAllowPreflight: 1,
},
// undefined username
{ pass: 1,
method: "GET",
noAllowPreflight: 1,
username: undefined
},
// undefined username and password
{ pass: 1,
method: "GET",
noAllowPreflight: 1,
username: undefined,
password: undefined
},
// nonempty username
{ pass: 0,
method: "GET",
noAllowPreflight: 1,
username: "user",
},
// nonempty password
// XXXbz this passes for now, because we ignore passwords
// without usernames in most cases.
{ pass: 1,
method: "GET",
noAllowPreflight: 1,
password: "password",
},
// Default allowed headers
{ pass: 1,
method: "GET",
@ -588,14 +557,6 @@ function runTest() {
"&requestMethod=" + test.method;
}
if ("username" in test) {
req.username = test.username;
}
if ("password" in test) {
req.password = test.password;
}
if (test.noAllowPreflight)
req.url += "&noAllowPreflight";
@ -692,11 +653,9 @@ function runTest() {
"wrong responseXML in test for " + test.toSource());
is(res.responseText, "",
"wrong responseText in test for " + test.toSource());
if (!res.sendThrew) {
is(res.events.join(","),
"opening,rs1,sending,rs1,loadstart,rs2,rs4,error",
"wrong events in test for " + test.toSource());
}
is(res.events.join(","),
"opening,rs1,sending,rs1,loadstart,rs2,rs4,error",
"wrong events in test for " + test.toSource());
is(res.progressEvents, 0,
"wrong events in test for " + test.toSource());
if (test.responseHeaders) {

View File

@ -1,30 +0,0 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=614058
-->
<head>
<title>Test for Bug 614058</title>
<script type="application/javascript" src="/MochiKit/packed.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=614058">Mozilla Bug 614058</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script type="application/javascript">
/** Test for Bug 614058 **/
var f1 = document.createDocumentFragment();
f2 = f1.cloneNode(true);
f1.appendChild(document.createElement("foo"));
is(f1.isEqualNode(f2), false, "Fragments have different kids!");
</script>
</pre>
</body>
</html>

View File

@ -948,7 +948,9 @@ nsCanvasRenderingContext2D::StyleColorToString(const nscolor& aColor, nsAString&
NS_GET_G(aColor),
NS_GET_B(aColor)),
aStr);
aStr.AppendFloat(nsStyleUtil::ColorComponentToFloat(NS_GET_A(aColor)));
nsString tmp;
tmp.AppendFloat(nsStyleUtil::ColorComponentToFloat(NS_GET_A(aColor)));
aStr.Append(tmp);
aStr.Append(')');
}
}
@ -2799,11 +2801,9 @@ nsCanvasRenderingContext2D::DrawOrMeasureText(const nsAString& aRawText,
gfxContextPathAutoSaveRestore pathSR(mThebes, PR_FALSE);
// back up and clear path if stroking
if (aOp == nsCanvasRenderingContext2D::TEXT_DRAW_OPERATION_STROKE) {
// back up path if stroking
if (aOp == nsCanvasRenderingContext2D::TEXT_DRAW_OPERATION_STROKE)
pathSR.Save();
mThebes->NewPath();
}
// doUseIntermediateSurface is mutually exclusive to op == STROKE
else {
if (doUseIntermediateSurface) {

View File

@ -122,8 +122,9 @@ nsSVGNumber2::SetBaseValueString(const nsAString &aValueAsString,
void
nsSVGNumber2::GetBaseValueString(nsAString & aValueAsString)
{
aValueAsString.Truncate();
aValueAsString.AppendFloat(mBaseVal);
nsAutoString s;
s.AppendFloat(mBaseVal);
aValueAsString.Assign(s);
}
void

View File

@ -103,7 +103,6 @@ members = [
'nsIDOMDocument.getElementById',
'nsIDOMDocument.createDocumentFragment',
'nsIDOMDocument.createElement',
'nsIDOMDocument.createElementNS',
'nsIDOMDocument.importNode',
'nsIDOMDocument.createTextNode',
'nsIDOMElement.removeAttributeNS',
@ -428,6 +427,8 @@ members = [
# nsIXMLHttpRequest.channel is not used on the web, and more
# importantly relies on the CAPS check that quickstubs don't make.
'-nsIXMLHttpRequest.channel',
# nsIXMLHttpRequest.open uses the JS stack
'-nsIXMLHttpRequest.open',
# various XHR things use ACString and AUTF8String and [cstring]
# which quickstubs don't handle as return values (or at all in the
# case of AUTF8String) yet.
@ -908,11 +909,6 @@ customMethodCalls = {
'code': ' nsCOMPtr<nsIContent> result;\n'
' rv = self->CreateElement(arg0, getter_AddRefs(result));'
},
'nsIDOMDocument_CreateElementNS': {
'thisType': 'nsDocument',
'code': ' nsCOMPtr<nsIContent> result;\n'
' rv = self->CreateElementNS(arg0, arg1, getter_AddRefs(result));'
},
'nsIDOMDocument_CreateTextNode': {
'thisType': 'nsDocument',
'code': ' nsCOMPtr<nsIContent> result;\n'

View File

@ -496,11 +496,6 @@ argumentUnboxingTemplates = {
" if (!${name}.IsValid())\n"
" return JS_FALSE;\n",
'[utf8string]':
" xpc_qsAUTF8String ${name}(cx, ${argVal}, ${argPtr});\n"
" if (!${name}.IsValid())\n"
" return JS_FALSE;\n",
'[jsval]':
" jsval ${name} = ${argVal};\n"
}
@ -585,7 +580,7 @@ def writeArgumentUnboxing(f, i, name, type, haveCcx, optional, rvdeclared,
" }\n")
return True
warn("Unable to unbox argument of type %s (native type %s)" % (type.name, typeName))
warn("Unable to unbox argument of type %s" % type.name)
if i is None:
src = '*vp'
else:
@ -1136,7 +1131,7 @@ traceableArgumentConversionTemplates = {
" XPCReadableJSStringWrapper ${name}(${argVal});\n",
'[domstring]':
" XPCReadableJSStringWrapper ${name}(${argVal});\n",
'[utf8string]':
'[cstring]':
" NS_ConvertUTF16toUTF8 ${name}("
"(const PRUnichar *)JS_GetStringChars(${argVal}), "
"JS_GetStringLength(${argVal}));\n",

View File

@ -694,28 +694,83 @@ xpc_qsDOMString::xpc_qsDOMString(JSContext *cx, jsval v, jsval *pval,
StringificationBehavior nullBehavior,
StringificationBehavior undefinedBehavior)
{
typedef implementation_type::char_traits traits;
// From the T_DOMSTRING case in XPCConvert::JSData2Native.
JSString *s = InitOrStringify<traits>(cx, v, pval, nullBehavior,
undefinedBehavior);
if (!s)
return;
typedef implementation_type::char_traits traits;
JSString *s;
const PRUnichar *chars;
size_t len;
size_t len = s->length();
const PRUnichar* chars =
(len == 0 ? traits::sEmptyBuffer :
reinterpret_cast<const PRUnichar*>(JS_GetStringChars(s)));
if(JSVAL_IS_STRING(v))
{
s = JSVAL_TO_STRING(v);
}
else
{
StringificationBehavior behavior = eStringify;
if(JSVAL_IS_NULL(v))
{
behavior = nullBehavior;
}
else if(JSVAL_IS_VOID(v))
{
behavior = undefinedBehavior;
}
// If pval is null, that means the argument was optional and
// not passed; turn those into void strings if they're
// supposed to be stringified.
if (behavior != eStringify || !pval)
{
// Here behavior == eStringify implies !pval, so both eNull and
// eStringify should end up with void strings.
(new(mBuf) implementation_type(
traits::sEmptyBuffer, PRUint32(0)))->SetIsVoid(behavior != eEmpty);
mValid = JS_TRUE;
return;
}
s = JS_ValueToString(cx, v);
if(!s)
{
mValid = JS_FALSE;
return;
}
*pval = STRING_TO_JSVAL(s); // Root the new string.
}
len = s->length();
chars = (len == 0 ? traits::sEmptyBuffer :
reinterpret_cast<const PRUnichar*>(JS_GetStringChars(s)));
new(mBuf) implementation_type(chars, len);
mValid = JS_TRUE;
}
xpc_qsACString::xpc_qsACString(JSContext *cx, jsval v, jsval *pval)
{
typedef implementation_type::char_traits traits;
// From the T_CSTRING case in XPCConvert::JSData2Native.
JSString *s = InitOrStringify<traits>(cx, v, pval, eNull, eNull);
if (!s)
return;
JSString *s;
if(JSVAL_IS_STRING(v))
{
s = JSVAL_TO_STRING(v);
}
else
{
if(JSVAL_IS_NULL(v) || JSVAL_IS_VOID(v))
{
(new(mBuf) implementation_type())->SetIsVoid(PR_TRUE);
mValid = JS_TRUE;
return;
}
s = JS_ValueToString(cx, v);
if(!s)
{
mValid = JS_FALSE;
return;
}
*pval = STRING_TO_JSVAL(s); // Root the new string.
}
JSAutoByteString bytes(cx, s);
if(!bytes)
@ -728,22 +783,6 @@ xpc_qsACString::xpc_qsACString(JSContext *cx, jsval v, jsval *pval)
mValid = JS_TRUE;
}
xpc_qsAUTF8String::xpc_qsAUTF8String(JSContext *cx, jsval v, jsval *pval)
{
typedef nsCharTraits<PRUnichar> traits;
// From the T_UTF8STRING case in XPCConvert::JSData2Native.
JSString *s = InitOrStringify<traits>(cx, v, pval, eNull, eNull);
if (!s)
return;
size_t len = s->length();
const PRUnichar* chars =
reinterpret_cast<const PRUnichar*>(JS_GetStringChars(s));
new(mBuf) implementation_type(chars, len);
mValid = JS_TRUE;
}
static nsresult
getNative(nsISupports *idobj,
QITableEntry* entries,

View File

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
@ -313,6 +313,33 @@ public:
return *Ptr();
}
protected:
/*
* Neither field is initialized; that is left to the derived class
* constructor. However, the destructor destroys the string object
* stored in mBuf, if mValid is true.
*/
void *mBuf[JS_HOWMANY(sizeof(implementation_type), sizeof(void *))];
JSBool mValid;
};
/**
* Class for converting a jsval to DOMString.
*
* xpc_qsDOMString arg0(cx, &argv[0]);
* if (!arg0.IsValid())
* return JS_FALSE;
*
* The second argument to the constructor is an in-out parameter. It must
* point to a rooted jsval, such as a JSNative argument or return value slot.
* The value in the jsval on entry is converted to a string. The constructor
* may overwrite that jsval with a string value, to protect the characters of
* the string from garbage collection. The caller must leave the jsval alone
* for the lifetime of the xpc_qsDOMString.
*/
class xpc_qsDOMString : public xpc_qsBasicString<nsAString, nsDependentString>
{
public:
/* Enum that defines how JS |null| and |undefined| should be treated. See
* the WebIDL specification. eStringify means convert to the string "null"
* or "undefined" respectively, via the standard JS ToString() operation;
@ -333,88 +360,6 @@ public:
eDefaultUndefinedBehavior = eStringify
};
protected:
/*
* Neither field is initialized; that is left to the derived class
* constructor. However, the destructor destroys the string object
* stored in mBuf, if mValid is true.
*/
void *mBuf[JS_HOWMANY(sizeof(implementation_type), sizeof(void *))];
JSBool mValid;
/*
* If null is returned, then we either failed or fully initialized
* |this|; in either case the caller should return immediately
* without doing anything else. Otherwise, the JSString* created
* from |v| will be returned. It'll be rooted, as needed, in
* *pval. nullBehavior and undefinedBehavior control what happens
* when |v| is JSVAL_IS_NULL and JSVAL_IS_VOID respectively.
*/
template<class traits>
JSString* InitOrStringify(JSContext* cx, jsval v, jsval* pval,
StringificationBehavior nullBehavior,
StringificationBehavior undefinedBehavior) {
JSString *s;
if(JSVAL_IS_STRING(v))
{
s = JSVAL_TO_STRING(v);
}
else
{
StringificationBehavior behavior = eStringify;
if(JSVAL_IS_NULL(v))
{
behavior = nullBehavior;
}
else if(JSVAL_IS_VOID(v))
{
behavior = undefinedBehavior;
}
// If pval is null, that means the argument was optional and
// not passed; turn those into void strings if they're
// supposed to be stringified.
if (behavior != eStringify || !pval)
{
// Here behavior == eStringify implies !pval, so both eNull and
// eStringify should end up with void strings.
(new(mBuf) implementation_type(
traits::sEmptyBuffer, PRUint32(0)))->
SetIsVoid(behavior != eEmpty);
mValid = JS_TRUE;
return nsnull;
}
s = JS_ValueToString(cx, v);
if(!s)
{
mValid = JS_FALSE;
return nsnull;
}
*pval = STRING_TO_JSVAL(s); // Root the new string.
}
return s;
}
};
/**
* Class for converting a jsval to DOMString.
*
* xpc_qsDOMString arg0(cx, &argv[0]);
* if (!arg0.IsValid())
* return JS_FALSE;
*
* The second argument to the constructor is an in-out parameter. It must
* point to a rooted jsval, such as a JSNative argument or return value slot.
* The value in the jsval on entry is converted to a string. The constructor
* may overwrite that jsval with a string value, to protect the characters of
* the string from garbage collection. The caller must leave the jsval alone
* for the lifetime of the xpc_qsDOMString.
*/
class xpc_qsDOMString : public xpc_qsBasicString<nsAString, nsDependentString>
{
public:
xpc_qsDOMString(JSContext *cx, jsval v, jsval *pval,
StringificationBehavior nullBehavior,
StringificationBehavior undefinedBehavior);
@ -442,16 +387,6 @@ public:
xpc_qsACString(JSContext *cx, jsval v, jsval *pval);
};
/**
* And similar for AUTF8String.
*/
class xpc_qsAUTF8String :
public xpc_qsBasicString<nsACString, NS_ConvertUTF16toUTF8>
{
public:
xpc_qsAUTF8String(JSContext* cx, jsval v, jsval *pval);
};
struct xpc_qsSelfRef
{
xpc_qsSelfRef() : ptr(nsnull) {}

View File

@ -2468,7 +2468,8 @@ nsCSSFrameConstructor::ConstructDocElementFrame(Element* aDocEle
*aNewFrame = frameItems.FirstChild();
NS_ASSERTION(frameItems.OnlyChild(), "multiple root element frames");
} else {
contentFrame = NS_NewBlockFormattingContext(mPresShell, styleContext);
contentFrame = NS_NewBlockFrame(mPresShell, styleContext,
NS_BLOCK_FLOAT_MGR|NS_BLOCK_MARGIN_ROOT);
if (!contentFrame)
return NS_ERROR_OUT_OF_MEMORY;
nsFrameItems frameItems;
@ -3708,11 +3709,6 @@ nsCSSFrameConstructor::ConstructFrameFromItemInternal(FrameConstructionItem& aIt
CHECK_ONLY_ONE_BIT(FCDATA_FUNC_IS_FULL_CTOR, FCDATA_ALLOW_BLOCK_STYLES);
CHECK_ONLY_ONE_BIT(FCDATA_MAY_NEED_SCROLLFRAME, FCDATA_FORCE_VIEW);
#undef CHECK_ONLY_ONE_BIT
NS_ASSERTION(!(bits & FCDATA_FORCED_NON_SCROLLABLE_BLOCK) ||
((bits & FCDATA_FUNC_IS_FULL_CTOR) &&
data->mFullConstructor ==
&nsCSSFrameConstructor::ConstructNonScrollableBlock),
"Unexpected FCDATA_FORCED_NON_SCROLLABLE_BLOCK flag");
// Don't create a subdocument frame for iframes if we're creating extra frames
if (aState.mCreatingExtraFrames && aItem.mContent->IsHTML() &&
@ -4369,25 +4365,20 @@ nsCSSFrameConstructor::FindDisplayData(const nsStyleDisplay* aDisplay,
"Shouldn't propagate scroll in paginated contexts");
// If the frame is a block-level frame and is scrollable, then wrap it in a
// scroll frame.
// scroll frame. Except we don't want to do that for paginated contexts for
// frames that are block-outside and aren't frames for native anonymous stuff.
// The condition on skipping scrollframe construction in the
// paginated case needs to match code in ConstructNonScrollableBlock
// and in nsFrame::ApplyPaginatedOverflowClipping.
// XXX Ignore tables for the time being
// XXXbz it would be nice to combine this with the other block
// case... Think about how do do this?
if (aDisplay->IsBlockInside() &&
aDisplay->IsScrollableOverflow() &&
!propagatedScrollToViewport) {
// Except we don't want to do that for paginated contexts for
// frames that are block-outside and aren't frames for native
// anonymous stuff.
if (mPresShell->GetPresContext()->IsPaginated() &&
aDisplay->IsBlockOutside() &&
!aContent->IsInNativeAnonymousSubtree()) {
static const FrameConstructionData sForcedNonScrollableBlockData =
FULL_CTOR_FCDATA(FCDATA_FORCED_NON_SCROLLABLE_BLOCK,
&nsCSSFrameConstructor::ConstructNonScrollableBlock);
return &sForcedNonScrollableBlockData;
}
!propagatedScrollToViewport &&
(!mPresShell->GetPresContext()->IsPaginated() ||
!aDisplay->IsBlockOutside() ||
aContent->IsInNativeAnonymousSubtree())) {
static const FrameConstructionData sScrollableBlockData =
FULL_CTOR_FCDATA(0, &nsCSSFrameConstructor::ConstructScrollableBlock);
return &sScrollableBlockData;
@ -4513,20 +4504,22 @@ nsCSSFrameConstructor::ConstructNonScrollableBlock(nsFrameConstructorState& aSta
{
nsStyleContext* const styleContext = aItem.mStyleContext;
// We want a block formatting context root in paginated contexts for
// every block that would be scrollable in a non-paginated context.
// We mark our blocks with a bit here if this condition is true, so
// we can check it later in nsFrame::ApplyPaginatedOverflowClipping.
PRBool clipPaginatedOverflow =
(aItem.mFCData->mBits & FCDATA_FORCED_NON_SCROLLABLE_BLOCK) != 0;
if (aDisplay->IsAbsolutelyPositioned() ||
aDisplay->IsFloating() ||
NS_STYLE_DISPLAY_INLINE_BLOCK == aDisplay->mDisplay ||
clipPaginatedOverflow) {
// This check just needs to be the same as the check for using scrollable
// blocks in FindDisplayData and the check for clipping in
// nsFrame::ApplyPaginatedOverflowClipping; we want a block formatting
// context root in paginated contexts for every block that would be
// scrollable in a non-paginated context. Note that IsPaginated()
// implies that no propagation to viewport has taken place, so we don't
// need to check for propagation here.
(mPresShell->GetPresContext()->IsPaginated() &&
aDisplay->IsBlockInside() &&
aDisplay->IsScrollableOverflow() &&
aDisplay->IsBlockOutside() &&
!aItem.mContent->IsInNativeAnonymousSubtree())) {
*aNewFrame = NS_NewBlockFormattingContext(mPresShell, styleContext);
if (clipPaginatedOverflow) {
(*aNewFrame)->AddStateBits(NS_BLOCK_CLIP_PAGINATED_OVERFLOW);
}
} else {
*aNewFrame = NS_NewBlockFrame(mPresShell, styleContext);
}

View File

@ -728,10 +728,6 @@ private:
This can be used with or without FCDATA_FUNC_IS_FULL_CTOR.
The child items might still need table pseudo processing. */
#define FCDATA_USE_CHILD_ITEMS 0x20000
/* If FCDATA_FORCED_NON_SCROLLABLE_BLOCK is set, then this block
would have been scrollable but has been forced to be
non-scrollable due to being in a paginated context. */
#define FCDATA_FORCED_NON_SCROLLABLE_BLOCK 0x40000
/* Structure representing information about how a frame should be
constructed. */

View File

@ -378,7 +378,7 @@ protected:
nsLineList::iterator* aEndIterator,
PRBool* aInOverflowLines);
void SetFlags(nsFrameState aFlags) {
void SetFlags(PRUint32 aFlags) {
mState &= ~NS_BLOCK_FLAGS_MASK;
mState |= aFlags;
}

View File

@ -1231,13 +1231,20 @@ static inline PRBool ApplyOverflowHiddenClipping(nsIFrame* aFrame,
static inline PRBool ApplyPaginatedOverflowClipping(nsIFrame* aFrame,
const nsStyleDisplay* aDisp)
{
// If we're paginated and aFrame is a block, and it has
// NS_BLOCK_CLIP_PAGINATED_OVERFLOW set, then we want to clip our
// overflow.
// These conditions on aDisp need to match the conditions for which in
// non-paginated contexts we'd create a scrollframe for a block but in a
// paginated context we don't. See nsCSSFrameConstructor::FindDisplayData
// for the relevant conditions. These conditions must also match those in
// nsCSSFrameConstructor::ConstructNonScrollableBlock for creating block
// formatting context roots for forced-to-be-no-longer scrollable blocks in
// paginated contexts.
return
aFrame->PresContext()->IsPaginated() &&
aDisp->IsBlockInside() &&
aDisp->IsScrollableOverflow() &&
aDisp->IsBlockOutside() &&
aFrame->GetType() == nsGkAtoms::blockFrame &&
(aFrame->GetStateBits() & NS_BLOCK_CLIP_PAGINATED_OVERFLOW) != 0;
!aFrame->GetContent()->IsInNativeAnonymousSubtree();
}
static PRBool ApplyOverflowClipping(nsDisplayListBuilder* aBuilder,

View File

@ -62,10 +62,6 @@ class nsTableColFrame;
* Additional frame-state bits used by nsBlockFrame
* See the meanings at http://www.mozilla.org/newlayout/doc/block-and-line.html
*
* NS_BLOCK_CLIP_PAGINATED_OVERFLOW is only set in paginated prescontexts, on
* blocks which were forced to not have scrollframes but still need to clip
* the display of their kids.
*
* NS_BLOCK_HAS_FIRST_LETTER_STYLE means that the block has first-letter style,
* even if it has no actual first-letter frame among its descendants.
*
@ -76,7 +72,6 @@ class nsTableColFrame;
*/
#define NS_BLOCK_MARGIN_ROOT NS_FRAME_STATE_BIT(22)
#define NS_BLOCK_FLOAT_MGR NS_FRAME_STATE_BIT(23)
#define NS_BLOCK_CLIP_PAGINATED_OVERFLOW NS_FRAME_STATE_BIT(28)
#define NS_BLOCK_HAS_FIRST_LETTER_STYLE NS_FRAME_STATE_BIT(29)
#define NS_BLOCK_FRAME_HAS_OUTSIDE_BULLET NS_FRAME_STATE_BIT(30)
#define NS_BLOCK_HAS_FIRST_LETTER_CHILD NS_FRAME_STATE_BIT(31)
@ -84,7 +79,6 @@ class nsTableColFrame;
// next-in-flows and are not private to blocks
#define NS_BLOCK_FLAGS_MASK (NS_BLOCK_MARGIN_ROOT | \
NS_BLOCK_FLOAT_MGR | \
NS_BLOCK_CLIP_PAGINATED_OVERFLOW | \
NS_BLOCK_HAS_FIRST_LETTER_STYLE | \
NS_BLOCK_FRAME_HAS_OUTSIDE_BULLET | \
NS_BLOCK_HAS_FIRST_LETTER_CHILD)

View File

@ -1,4 +0,0 @@
<!DOCTYPE html>
<html class="reftest-print">
This text should show up
</html>

View File

@ -1,4 +0,0 @@
<!DOCTYPE html>
<html class="reftest-print" style="height: 0; overflow: hidden">
This text should show up
</html>

View File

@ -1541,7 +1541,6 @@ fails-if(!haveTestPlugin) == 599476.html 599476-ref.html
== 604737.html 604737-ref.html
== 605138-1.html 605138-1-ref.html
== 605157-1.xhtml 605157-1-ref.xhtml
== 609272-1.html 609272-1-ref.html
== 608636-1.html 608636-1-ref.html
== 613433-1.html 613433-1-ref.html
== 613433-1.html 613433-2-ref.html

View File

@ -39,5 +39,3 @@ asserts-if(cocoaWidget,0-2) == size-change-1.html size-change-1-ref.html
== text-bidi-rtl-test.html text-bidi-rtl-ref.html
!= text-font-lang.html text-font-lang-notref.html
== strokeText-path.html strokeText-path-ref.html

View File

@ -1,23 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript"><!--
window.onload = function () {
var canvas = document.getElementById('testCanvas'),
context = canvas.getContext('2d');
// draw some text
context.font = 'bold 40px sans-serif';
context.strokeText("Hello world!", 10, 50);
};
// --></script>
</head>
<body>
<p>You should see only see "Hello world!" below, without any additional
line. JavaScript is required.</p>
<p><canvas id="testCanvas" width="400" height="300">You need Canvas
support.</canvas></p>
</body>
</html>

View File

@ -1,33 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript"><!--
window.onload = function () {
var canvas = document.getElementById('testCanvas'),
context = canvas.getContext('2d');
// draw a path
context.beginPath();
context.moveTo(10, 10);
context.lineTo(200, 10);
context.lineTo(200, 200);
context.stroke();
context.closePath();
context.clearRect(0, 0, canvas.width, canvas.height);
// draw some text
context.font = 'bold 40px sans-serif';
context.strokeText("Hello world!", 10, 50);
};
// --></script>
</head>
<body>
<p>You should see only see "Hello world!" below, without any additional
line. JavaScript is required.</p>
<p><canvas id="testCanvas" width="400" height="300">You need Canvas
support.</canvas></p>
</body>
</html>

View File

@ -468,7 +468,10 @@ nsMediaQuery::AppendToString(nsAString& aString) const
break;
case nsMediaFeature::eResolution:
{
aString.AppendFloat(expr.mValue.GetFloatValue());
nsAutoString buffer;
buffer.AppendFloat(expr.mValue.GetFloatValue());
aString.Append(buffer);
buffer.Truncate();
if (expr.mValue.GetUnit() == eCSSUnit_Inch) {
aString.AppendLiteral("dpi");
} else {

View File

@ -769,7 +769,9 @@ nsCSSValue::AppendToString(nsCSSProperty aProperty, nsAString& aResult) const
css::SerializeCalc(*this, ops);
}
else if (eCSSUnit_Integer == unit) {
aResult.AppendInt(GetIntValue(), 10);
nsAutoString tmpStr;
tmpStr.AppendInt(GetIntValue(), 10);
aResult.Append(tmpStr);
}
else if (eCSSUnit_Enumerated == unit) {
if (eCSSProperty_text_decoration == aProperty) {
@ -830,25 +832,28 @@ nsCSSValue::AppendToString(nsCSSProperty aProperty, nsAString& aResult) const
// round-tripping of all other rgba() values.
aResult.AppendLiteral("transparent");
} else {
nsAutoString tmpStr;
PRUint8 a = NS_GET_A(color);
if (a < 255) {
aResult.AppendLiteral("rgba(");
tmpStr.AppendLiteral("rgba(");
} else {
aResult.AppendLiteral("rgb(");
tmpStr.AppendLiteral("rgb(");
}
NS_NAMED_LITERAL_STRING(comma, ", ");
aResult.AppendInt(NS_GET_R(color), 10);
aResult.Append(comma);
aResult.AppendInt(NS_GET_G(color), 10);
aResult.Append(comma);
aResult.AppendInt(NS_GET_B(color), 10);
tmpStr.AppendInt(NS_GET_R(color), 10);
tmpStr.Append(comma);
tmpStr.AppendInt(NS_GET_G(color), 10);
tmpStr.Append(comma);
tmpStr.AppendInt(NS_GET_B(color), 10);
if (a < 255) {
aResult.Append(comma);
aResult.AppendFloat(nsStyleUtil::ColorComponentToFloat(a));
tmpStr.Append(comma);
tmpStr.AppendFloat(nsStyleUtil::ColorComponentToFloat(a));
}
aResult.Append(PRUnichar(')'));
tmpStr.Append(PRUnichar(')'));
aResult.Append(tmpStr);
}
}
else if (eCSSUnit_URL == unit || eCSSUnit_Image == unit) {
@ -866,10 +871,14 @@ nsCSSValue::AppendToString(nsCSSProperty aProperty, nsAString& aResult) const
aResult.Append(NS_LITERAL_STRING(")"));
}
else if (eCSSUnit_Percent == unit) {
aResult.AppendFloat(GetPercentValue() * 100.0f);
nsAutoString tmpStr;
tmpStr.AppendFloat(GetPercentValue() * 100.0f);
aResult.Append(tmpStr);
}
else if (eCSSUnit_Percent < unit) { // length unit
aResult.AppendFloat(GetFloatValue());
nsAutoString tmpStr;
tmpStr.AppendFloat(GetFloatValue());
aResult.Append(tmpStr);
}
else if (eCSSUnit_Gradient == unit) {
nsCSSValueGradient* gradient = GetGradientValue();

View File

@ -384,6 +384,34 @@ class nsTString_CharT : public nsTSubstring_CharT
NS_COM void AppendWithConversion( const nsTAString_IncompatibleCharT& aString );
NS_COM void AppendWithConversion( const incompatible_char_type* aData, PRInt32 aLength=-1 );
using nsTSubstring_CharT::AppendInt;
/**
* Append the given integer to this string
* @param aInteger The integer to append
* @param aRadix The radix to use; can be 8, 10 or 16.
* @deprecated Use AppendInt( PRInt32 aInteger ) or
* AppendInt( PRUint32 aInteger, PRInt32 aRadix = 10 )
*/
NS_COM void AppendInt( PRInt32 aInteger, PRInt32 aRadix ); //radix=8,10 or 16
/**
* Append the given 64-bit integer to this string.
* @param aInteger The integer to append
* @param aRadix The radix to use; can be 8, 10 or 16.
* @deprecated Use AppendInt( PRInt64 aInteger ) or
* AppendInt( PRUint64 aInteger, PRInt32 aRadix = 10 )
*/
NS_COM void AppendInt( PRInt64 aInteger, PRInt32 aRadix );
/**
* Append the given float to this string
*/
NS_COM void AppendFloat( float aFloat );
NS_COM void AppendFloat( double aFloat );
#endif // !MOZ_STRING_WITH_OBSOLETE_API

View File

@ -418,17 +418,6 @@ class nsTSubstring_CharT
AppendPrintf( fmt, aInteger );
}
/**
* Append the given float to this string
*/
void AppendFloat( float aFloat )
{ DoAppendFloat(aFloat, 6); }
void AppendFloat( double aFloat )
{ DoAppendFloat(aFloat, 15); }
private:
NS_COM void NS_FASTCALL DoAppendFloat( double aFloat, int digits );
public:
// AppendLiteral must ONLY be applied to an actual literal string.
// Do not attempt to use it with a regular char* pointer, or with a char
// array variable. Use AppendASCII for those.

View File

@ -51,6 +51,7 @@
#include "nsCRT.h"
#include "nsUTF8Utils.h"
#include "prdtoa.h"
#include "prprf.h"
/* ***** BEGIN RICKG BLOCK *****
*
@ -799,6 +800,99 @@ RFindCharInSet( const CharT* data, PRUint32 dataLen, const SetCharT* set )
return kNotFound;
}
/**
* This is a copy of |PR_cnvtf| with a bug fixed. (The second argument
* of PR_dtoa is 2 rather than 1.)
*
* XXX(darin): if this is the right thing, then why wasn't it fixed in NSPR?!?
*/
void
Modified_cnvtf(char *buf, int bufsz, int prcsn, double fval)
{
PRIntn decpt, sign, numdigits;
char *num, *nump;
char *bufp = buf;
char *endnum;
/* If anything fails, we store an empty string in 'buf' */
num = (char*)malloc(bufsz);
if (num == NULL) {
buf[0] = '\0';
return;
}
if (PR_dtoa(fval, 2, prcsn, &decpt, &sign, &endnum, num, bufsz)
== PR_FAILURE) {
buf[0] = '\0';
goto done;
}
numdigits = endnum - num;
nump = num;
/*
* The NSPR code had a fancy way of checking that we weren't dealing
* with -0.0 or -NaN, but I'll just use < instead.
* XXX Should we check !isnan(fval) as well? Is it portable? We
* probably don't need to bother since NAN isn't portable.
*/
if (sign && fval < 0.0f) {
*bufp++ = '-';
}
if (decpt == 9999) {
while ((*bufp++ = *nump++) != 0) {} /* nothing to execute */
goto done;
}
if (decpt > (prcsn+1) || decpt < -(prcsn-1) || decpt < -5) {
*bufp++ = *nump++;
if (numdigits != 1) {
*bufp++ = '.';
}
while (*nump != '\0') {
*bufp++ = *nump++;
}
*bufp++ = 'e';
PR_snprintf(bufp, bufsz - (bufp - buf), "%+d", decpt-1);
}
else if (decpt >= 0) {
if (decpt == 0) {
*bufp++ = '0';
}
else {
while (decpt--) {
if (*nump != '\0') {
*bufp++ = *nump++;
}
else {
*bufp++ = '0';
}
}
}
if (*nump != '\0') {
*bufp++ = '.';
while (*nump != '\0') {
*bufp++ = *nump++;
}
}
*bufp++ = '\0';
}
else if (decpt < 0) {
*bufp++ = '0';
*bufp++ = '.';
while (decpt++) {
*bufp++ = '0';
}
while (*nump != '\0') {
*bufp++ = *nump++;
}
*bufp++ = '\0';
}
done:
free(num);
}
/**
* this method changes the meaning of |offset| and |count|:
*
@ -1077,4 +1171,133 @@ nsString::AppendWithConversion( const nsACString& aData )
AppendASCIItoUTF16(aData, *this);
}
/**
* nsTString::AppendInt
*/
void
nsCString::AppendInt( PRInt32 aInteger, PRInt32 aRadix )
{
char buf[20];
const char* fmt;
switch (aRadix) {
case 8:
fmt = "%o";
break;
case 10:
fmt = "%d";
break;
default:
NS_ASSERTION(aRadix == 16, "Invalid radix!");
fmt = "%x";
}
PR_snprintf(buf, sizeof(buf), fmt, aInteger);
Append(buf);
}
void
nsString::AppendInt( PRInt32 aInteger, PRInt32 aRadix )
{
char buf[20];
const char* fmt;
switch (aRadix) {
case 8:
fmt = "%o";
break;
case 10:
fmt = "%d";
break;
default:
NS_ASSERTION(aRadix == 16, "Invalid radix!");
fmt = "%x";
}
PR_snprintf(buf, sizeof(buf), fmt, aInteger);
AppendASCIItoUTF16(buf, *this);
}
void
nsCString::AppendInt( PRInt64 aInteger, PRInt32 aRadix )
{
char buf[30];
const char* fmt;
switch (aRadix) {
case 8:
fmt = "%llo";
break;
case 10:
fmt = "%lld";
break;
default:
NS_ASSERTION(aRadix == 16, "Invalid radix!");
fmt = "%llx";
}
PR_snprintf(buf, sizeof(buf), fmt, aInteger);
Append(buf);
}
void
nsString::AppendInt( PRInt64 aInteger, PRInt32 aRadix )
{
char buf[30];
const char* fmt;
switch (aRadix) {
case 8:
fmt = "%llo";
break;
case 10:
fmt = "%lld";
break;
default:
NS_ASSERTION(aRadix == 16, "Invalid radix!");
fmt = "%llx";
}
PR_snprintf(buf, sizeof(buf), fmt, aInteger);
AppendASCIItoUTF16(buf, *this);
}
/**
* nsTString::AppendFloat
*/
void
nsCString::AppendFloat( float aFloat )
{
char buf[40];
// Use Modified_cnvtf, which is locale-insensitive, instead of the
// locale-sensitive PR_snprintf or sprintf(3)
Modified_cnvtf(buf, sizeof(buf), 6, aFloat);
Append(buf);
}
void
nsString::AppendFloat( float aFloat )
{
char buf[40];
// Use Modified_cnvtf, which is locale-insensitive, instead of the
// locale-sensitive PR_snprintf or sprintf(3)
Modified_cnvtf(buf, sizeof(buf), 6, aFloat);
AppendWithConversion(buf);
}
void
nsCString::AppendFloat( double aFloat )
{
char buf[40];
// Use Modified_cnvtf, which is locale-insensitive, instead of the
// locale-sensitive PR_snprintf or sprintf(3)
Modified_cnvtf(buf, sizeof(buf), 15, aFloat);
Append(buf);
}
void
nsString::AppendFloat( double aFloat )
{
char buf[40];
// Use Modified_cnvtf, which is locale-insensitive, instead of the
// locale-sensitive PR_snprintf or sprintf(3)
Modified_cnvtf(buf, sizeof(buf), 15, aFloat);
AppendWithConversion(buf);
}
#endif // !MOZ_STRING_WITH_OBSOLETE_API

View File

@ -35,7 +35,6 @@
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "prdtoa.h"
#ifdef XPCOM_STRING_CONSTRUCTOR_OUT_OF_LINE
nsTSubstring_CharT::nsTSubstring_CharT( char_type *data, size_type length,
@ -743,111 +742,3 @@ void nsTSubstring_CharT::AppendPrintf( const char* format, ...)
AppendASCII(buf, len);
va_end(ap);
}
/* hack to make sure we define Modified_cnvtf only once */
#ifdef CharT_is_PRUnichar
/**
* This is a copy of |PR_cnvtf| with a bug fixed. (The second argument
* of PR_dtoa is 2 rather than 1.)
*
* XXX(darin): if this is the right thing, then why wasn't it fixed in NSPR?!?
*/
static void
Modified_cnvtf(char *buf, int bufsz, int prcsn, double fval)
{
PRIntn decpt, sign, numdigits;
char *num, *nump;
char *bufp = buf;
char *endnum;
/* If anything fails, we store an empty string in 'buf' */
num = (char*)malloc(bufsz);
if (num == NULL) {
buf[0] = '\0';
return;
}
if (PR_dtoa(fval, 2, prcsn, &decpt, &sign, &endnum, num, bufsz)
== PR_FAILURE) {
buf[0] = '\0';
goto done;
}
numdigits = endnum - num;
nump = num;
/*
* The NSPR code had a fancy way of checking that we weren't dealing
* with -0.0 or -NaN, but I'll just use < instead.
* XXX Should we check !isnan(fval) as well? Is it portable? We
* probably don't need to bother since NAN isn't portable.
*/
if (sign && fval < 0.0f) {
*bufp++ = '-';
}
if (decpt == 9999) {
while ((*bufp++ = *nump++) != 0) {} /* nothing to execute */
goto done;
}
if (decpt > (prcsn+1) || decpt < -(prcsn-1) || decpt < -5) {
*bufp++ = *nump++;
if (numdigits != 1) {
*bufp++ = '.';
}
while (*nump != '\0') {
*bufp++ = *nump++;
}
*bufp++ = 'e';
PR_snprintf(bufp, bufsz - (bufp - buf), "%+d", decpt-1);
}
else if (decpt >= 0) {
if (decpt == 0) {
*bufp++ = '0';
}
else {
while (decpt--) {
if (*nump != '\0') {
*bufp++ = *nump++;
}
else {
*bufp++ = '0';
}
}
}
if (*nump != '\0') {
*bufp++ = '.';
while (*nump != '\0') {
*bufp++ = *nump++;
}
}
*bufp++ = '\0';
}
else if (decpt < 0) {
*bufp++ = '0';
*bufp++ = '.';
while (decpt++) {
*bufp++ = '0';
}
while (*nump != '\0') {
*bufp++ = *nump++;
}
*bufp++ = '\0';
}
done:
free(num);
}
#endif /* CharT_is_PRUnichar */
void
nsTSubstring_CharT::DoAppendFloat( double aFloat, int digits )
{
char buf[40];
// Use Modified_cnvtf, which is locale-insensitive, instead of the
// locale-sensitive PR_snprintf or sprintf(3)
Modified_cnvtf(buf, sizeof(buf), digits, aFloat);
AppendASCII(buf);
}