Automerge with mc. no manual changes
|
@ -605,18 +605,6 @@ nsAccessible::GetChildren(nsIArray **aOutChildren)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
nsIAccessible *nsAccessible::NextChild(nsCOMPtr<nsIAccessible>& aAccessible)
|
||||
{
|
||||
nsCOMPtr<nsIAccessible> nextChild;
|
||||
if (!aAccessible) {
|
||||
GetFirstChild(getter_AddRefs(nextChild));
|
||||
}
|
||||
else {
|
||||
aAccessible->GetNextSibling(getter_AddRefs(nextChild));
|
||||
}
|
||||
return (aAccessible = nextChild);
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsAccessible::GetAllowsAnonChildAccessibles()
|
||||
{
|
||||
|
@ -931,8 +919,10 @@ nsAccessible::GetChildAtPoint(PRInt32 aX, PRInt32 aY, PRBool aDeepestChild,
|
|||
// where layout won't walk into things for us, such as image map areas and
|
||||
// sub documents (XXX: subdocuments should be handled by methods of
|
||||
// nsOuterDocAccessibles).
|
||||
nsCOMPtr<nsIAccessible> child;
|
||||
while (NextChild(child)) {
|
||||
PRInt32 childCount = GetChildCount();
|
||||
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
|
||||
nsAccessible *child = GetChildAt(childIdx);
|
||||
|
||||
PRInt32 childX, childY, childWidth, childHeight;
|
||||
child->GetBounds(&childX, &childY, &childWidth, &childHeight);
|
||||
if (aX >= childX && aX < childX + childWidth &&
|
||||
|
@ -2994,7 +2984,7 @@ void
|
|||
nsAccessible::TestChildCache(nsAccessible *aCachedChild)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
PRUint32 childCount = mChildren.Length();
|
||||
PRInt32 childCount = mChildren.Length();
|
||||
if (childCount == 0) {
|
||||
NS_ASSERTION(!mAreChildrenInitialized, "No children but initialized!");
|
||||
return;
|
||||
|
|
|
@ -350,10 +350,6 @@ protected:
|
|||
// helper method to verify frames
|
||||
static nsresult GetFullKeyName(const nsAString& aModifierName, const nsAString& aKeyName, nsAString& aStringOut);
|
||||
static nsresult GetTranslatedString(const nsAString& aKey, nsAString& aStringOut);
|
||||
|
||||
// nsCOMPtr<>& is useful here, because getter_AddRefs() nulls the comptr's value, and NextChild
|
||||
// depends on the passed-in comptr being null or already set to a child (finding the next sibling).
|
||||
nsIAccessible *NextChild(nsCOMPtr<nsIAccessible>& aAccessible);
|
||||
|
||||
already_AddRefed<nsIAccessible> GetNextWithState(nsIAccessible *aStart, PRUint32 matchState);
|
||||
|
||||
|
|
|
@ -322,23 +322,24 @@ nsHyperTextAccessible::GetPosAndText(PRInt32& aStartOffset, PRInt32& aEndOffset,
|
|||
*aEndAcc = nsnull;
|
||||
|
||||
nsIntRect unionRect;
|
||||
nsCOMPtr<nsIAccessible> accessible, lastAccessible;
|
||||
nsAccessible *lastAccessible = nsnull;
|
||||
|
||||
gfxSkipChars skipChars;
|
||||
gfxSkipCharsIterator iter;
|
||||
|
||||
// Loop through children and collect valid offsets, text and bounds
|
||||
// depending on what we need for out parameters
|
||||
while (NextChild(accessible)) {
|
||||
lastAccessible = accessible;
|
||||
nsRefPtr<nsAccessNode> accessNode = nsAccUtils::QueryAccessNode(accessible);
|
||||
// depending on what we need for out parameters.
|
||||
PRInt32 childCount = GetChildCount();
|
||||
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
|
||||
nsAccessible *childAcc = mChildren[childIdx];
|
||||
lastAccessible = childAcc;
|
||||
|
||||
nsIFrame *frame = accessNode->GetFrame();
|
||||
nsIFrame *frame = childAcc->GetFrame();
|
||||
if (!frame) {
|
||||
continue;
|
||||
}
|
||||
nsIFrame *primaryFrame = frame;
|
||||
if (nsAccUtils::IsText(accessible)) {
|
||||
if (nsAccUtils::IsText(childAcc)) {
|
||||
// We only need info up to rendered offset -- that is what we're
|
||||
// converting to content offset
|
||||
PRInt32 substringEndOffset = -1;
|
||||
|
@ -357,7 +358,7 @@ nsHyperTextAccessible::GetPosAndText(PRInt32& aStartOffset, PRInt32& aEndOffset,
|
|||
if (substringEndOffset < 0) {
|
||||
// XXX for non-textframe text like list bullets,
|
||||
// should go away after list bullet rewrite
|
||||
substringEndOffset = nsAccUtils::TextLength(accessible);
|
||||
substringEndOffset = nsAccUtils::TextLength(childAcc);
|
||||
}
|
||||
if (startOffset < substringEndOffset) {
|
||||
// Our start is within this substring
|
||||
|
@ -378,7 +379,7 @@ nsHyperTextAccessible::GetPosAndText(PRInt32& aStartOffset, PRInt32& aEndOffset,
|
|||
if (aEndFrame) {
|
||||
*aEndFrame = frame; // We ended in the current frame
|
||||
if (aEndAcc)
|
||||
NS_ADDREF(*aEndAcc = accessible);
|
||||
NS_ADDREF(*aEndAcc = childAcc);
|
||||
}
|
||||
if (substringEndOffset > endOffset) {
|
||||
// Need to stop before the end of the available text
|
||||
|
@ -392,9 +393,8 @@ nsHyperTextAccessible::GetPosAndText(PRInt32& aStartOffset, PRInt32& aEndOffset,
|
|||
*aText += '*'; // Show *'s only for password text
|
||||
}
|
||||
else {
|
||||
nsRefPtr<nsAccessible> acc(nsAccUtils::QueryAccessible(accessible));
|
||||
acc->AppendTextTo(*aText, startOffset,
|
||||
substringEndOffset - startOffset);
|
||||
childAcc->AppendTextTo(*aText, startOffset,
|
||||
substringEndOffset - startOffset);
|
||||
}
|
||||
}
|
||||
if (aBoundsRect) { // Caller wants the bounds of the text
|
||||
|
@ -406,7 +406,7 @@ nsHyperTextAccessible::GetPosAndText(PRInt32& aStartOffset, PRInt32& aEndOffset,
|
|||
startFrame = frame;
|
||||
aStartOffset = startOffset;
|
||||
if (aStartAcc)
|
||||
NS_ADDREF(*aStartAcc = accessible);
|
||||
NS_ADDREF(*aStartAcc = childAcc);
|
||||
}
|
||||
// We already started copying in this accessible's string,
|
||||
// for the next accessible we'll start at offset 0
|
||||
|
@ -448,7 +448,7 @@ nsHyperTextAccessible::GetPosAndText(PRInt32& aStartOffset, PRInt32& aEndOffset,
|
|||
startFrame = frame;
|
||||
aStartOffset = 0;
|
||||
if (aStartAcc)
|
||||
NS_ADDREF(*aStartAcc = accessible);
|
||||
NS_ADDREF(*aStartAcc = childAcc);
|
||||
}
|
||||
}
|
||||
-- endOffset;
|
||||
|
@ -483,15 +483,17 @@ NS_IMETHODIMP nsHyperTextAccessible::GetText(PRInt32 aStartOffset, PRInt32 aEndO
|
|||
*/
|
||||
NS_IMETHODIMP nsHyperTextAccessible::GetCharacterCount(PRInt32 *aCharacterCount)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aCharacterCount);
|
||||
*aCharacterCount = 0;
|
||||
if (!mDOMNode) {
|
||||
|
||||
if (IsDefunct())
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIAccessible> accessible;
|
||||
PRInt32 childCount = GetChildCount();
|
||||
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
|
||||
nsAccessible *childAcc = mChildren[childIdx];
|
||||
|
||||
while (NextChild(accessible)) {
|
||||
PRInt32 textLength = nsAccUtils::TextLength(accessible);
|
||||
PRInt32 textLength = nsAccUtils::TextLength(childAcc);
|
||||
NS_ENSURE_TRUE(textLength >= 0, nsnull);
|
||||
*aCharacterCount += textLength;
|
||||
}
|
||||
|
@ -596,15 +598,19 @@ nsresult nsHyperTextAccessible::DOMPointToHypertextOffset(nsIDOMNode* aNode, PRI
|
|||
}
|
||||
descendantAccessible = GetFirstAvailableAccessible(findNode);
|
||||
}
|
||||
|
||||
// From the descendant, go up and get the immediate child of this hypertext
|
||||
nsCOMPtr<nsIAccessible> childAccessible;
|
||||
while (descendantAccessible) {
|
||||
nsCOMPtr<nsIAccessible> parentAccessible;
|
||||
descendantAccessible->GetParent(getter_AddRefs(parentAccessible));
|
||||
if (this == parentAccessible) {
|
||||
childAccessible = descendantAccessible;
|
||||
nsRefPtr<nsAccessible> childAccAtOffset;
|
||||
nsRefPtr<nsAccessible> descendantAcc =
|
||||
nsAccUtils::QueryObject<nsAccessible>(descendantAccessible);
|
||||
|
||||
while (descendantAcc) {
|
||||
nsRefPtr<nsAccessible> parentAcc = descendantAcc->GetParent();
|
||||
if (parentAcc == this) {
|
||||
childAccAtOffset = descendantAcc;
|
||||
break;
|
||||
}
|
||||
|
||||
// This offset no longer applies because the passed-in text object is not a child
|
||||
// of the hypertext. This happens when there are nested hypertexts, e.g.
|
||||
// <div>abc<h1>def</h1>ghi</div>
|
||||
|
@ -622,29 +628,40 @@ nsresult nsHyperTextAccessible::DOMPointToHypertextOffset(nsIDOMNode* aNode, PRI
|
|||
// Make sure the offset lands on the embedded object character in order to indicate
|
||||
// the true inner offset is inside the subtree for that link
|
||||
addTextOffset =
|
||||
(nsAccUtils::TextLength(descendantAccessible) == static_cast<PRInt32>(addTextOffset)) ? 1 : 0;
|
||||
(nsAccUtils::TextLength(descendantAcc) == static_cast<PRInt32>(addTextOffset)) ? 1 : 0;
|
||||
}
|
||||
descendantAccessible = parentAccessible;
|
||||
}
|
||||
|
||||
descendantAcc.swap(parentAcc);
|
||||
}
|
||||
|
||||
// Loop through, adding offsets until we reach childAccessible
|
||||
// If childAccessible is null we will end up adding up the entire length of
|
||||
// the hypertext, which is good -- it just means our offset node
|
||||
// came after the last accessible child's node
|
||||
nsCOMPtr<nsIAccessible> accessible;
|
||||
while (NextChild(accessible) && accessible != childAccessible) {
|
||||
PRInt32 textLength = nsAccUtils::TextLength(accessible);
|
||||
PRInt32 childCount = GetChildCount();
|
||||
|
||||
PRInt32 childIdx = 0;
|
||||
nsAccessible *childAcc = nsnull;
|
||||
for (; childIdx < childCount; childIdx++) {
|
||||
childAcc = mChildren[childIdx];
|
||||
if (childAcc == childAccAtOffset)
|
||||
break;
|
||||
|
||||
PRInt32 textLength = nsAccUtils::TextLength(childAcc);
|
||||
NS_ENSURE_TRUE(textLength >= 0, nsnull);
|
||||
*aHyperTextOffset += textLength;
|
||||
}
|
||||
if (accessible) {
|
||||
|
||||
if (childIdx < childCount) {
|
||||
*aHyperTextOffset += addTextOffset;
|
||||
NS_ASSERTION(accessible == childAccessible, "These should be equal whenever we exit loop and accessible != nsnull");
|
||||
NS_ASSERTION(childAcc == childAccAtOffset,
|
||||
"These should be equal whenever we exit loop and childAcc != nsnull");
|
||||
|
||||
if (aFinalAccessible &&
|
||||
(NextChild(accessible) ||
|
||||
static_cast<PRInt32>(addTextOffset) < nsAccUtils::TextLength(childAccessible))) {
|
||||
(childIdx < childCount - 1 ||
|
||||
static_cast<PRInt32>(addTextOffset) < nsAccUtils::TextLength(childAccAtOffset))) {
|
||||
// If not at end of last text node, we will return the accessible we were in
|
||||
NS_ADDREF(*aFinalAccessible = childAccessible);
|
||||
NS_ADDREF(*aFinalAccessible = childAccAtOffset);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1277,13 +1294,12 @@ nsHyperTextAccessible::GetOffsetAtPoint(PRInt32 aX, PRInt32 aY,
|
|||
|
||||
// We have an point in an accessible child of this, now we need to add up the
|
||||
// offsets before it to what we already have
|
||||
nsCOMPtr<nsIAccessible> accessible;
|
||||
PRInt32 offset = 0;
|
||||
PRInt32 childCount = GetChildCount();
|
||||
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
|
||||
nsAccessible *childAcc = mChildren[childIdx];
|
||||
|
||||
while (NextChild(accessible)) {
|
||||
nsRefPtr<nsAccessNode> accessNode = nsAccUtils::QueryAccessNode(accessible);
|
||||
|
||||
nsIFrame *primaryFrame = accessNode->GetFrame();
|
||||
nsIFrame *primaryFrame = childAcc->GetFrame();
|
||||
NS_ENSURE_TRUE(primaryFrame, NS_ERROR_FAILURE);
|
||||
|
||||
nsIFrame *frame = primaryFrame;
|
||||
|
@ -1311,7 +1327,7 @@ nsHyperTextAccessible::GetOffsetAtPoint(PRInt32 aX, PRInt32 aY,
|
|||
}
|
||||
frame = frame->GetNextContinuation();
|
||||
}
|
||||
PRInt32 textLength = nsAccUtils::TextLength(accessible);
|
||||
PRInt32 textLength = nsAccUtils::TextLength(childAcc);
|
||||
NS_ENSURE_TRUE(textLength >= 0, NS_ERROR_FAILURE);
|
||||
offset += textLength;
|
||||
}
|
||||
|
@ -1325,14 +1341,13 @@ nsHyperTextAccessible::GetLinkCount(PRInt32 *aLinkCount)
|
|||
{
|
||||
NS_ENSURE_ARG_POINTER(aLinkCount);
|
||||
*aLinkCount = 0;
|
||||
if (!mDOMNode) {
|
||||
if (IsDefunct())
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIAccessible> accessible;
|
||||
|
||||
while (NextChild(accessible)) {
|
||||
if (nsAccUtils::IsEmbeddedObject(accessible))
|
||||
PRInt32 childCount = GetChildCount();
|
||||
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
|
||||
nsAccessible *childAcc = mChildren[childIdx];
|
||||
if (nsAccUtils::IsEmbeddedObject(childAcc))
|
||||
++*aLinkCount;
|
||||
}
|
||||
return NS_OK;
|
||||
|
@ -1349,10 +1364,12 @@ nsHyperTextAccessible::GetLink(PRInt32 aLinkIndex, nsIAccessibleHyperLink **aLin
|
|||
return NS_ERROR_FAILURE;
|
||||
|
||||
PRInt32 linkIndex = aLinkIndex;
|
||||
nsCOMPtr<nsIAccessible> accessible;
|
||||
while (NextChild(accessible)) {
|
||||
if (nsAccUtils::IsEmbeddedObject(accessible) && linkIndex-- == 0)
|
||||
return CallQueryInterface(accessible, aLink);
|
||||
|
||||
PRInt32 childCount = GetChildCount();
|
||||
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
|
||||
nsAccessible *childAcc = mChildren[childIdx];
|
||||
if (nsAccUtils::IsEmbeddedObject(childAcc) && linkIndex-- == 0)
|
||||
return CallQueryInterface(childAcc, aLink);
|
||||
}
|
||||
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
@ -1364,19 +1381,21 @@ nsHyperTextAccessible::GetLinkIndex(PRInt32 aCharIndex, PRInt32 *aLinkIndex)
|
|||
NS_ENSURE_ARG_POINTER(aLinkIndex);
|
||||
*aLinkIndex = -1; // API says this magic value means 'not found'
|
||||
|
||||
if (IsDefunct())
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
PRInt32 characterCount = 0;
|
||||
PRInt32 linkIndex = 0;
|
||||
if (!mDOMNode) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIAccessible> accessible;
|
||||
PRInt32 childCount = GetChildCount();
|
||||
for (PRInt32 childIdx = 0;
|
||||
childIdx < childCount && characterCount <= aCharIndex; childIdx++) {
|
||||
nsAccessible *childAcc = mChildren[childIdx];
|
||||
|
||||
while (NextChild(accessible) && characterCount <= aCharIndex) {
|
||||
PRUint32 role = nsAccUtils::Role(accessible);
|
||||
PRUint32 role = nsAccUtils::Role(childAcc);
|
||||
if (role == nsIAccessibleRole::ROLE_TEXT_LEAF ||
|
||||
role == nsIAccessibleRole::ROLE_STATICTEXT) {
|
||||
PRInt32 textLength = nsAccUtils::TextLength(accessible);
|
||||
PRInt32 textLength = nsAccUtils::TextLength(childAcc);
|
||||
NS_ENSURE_TRUE(textLength >= 0, NS_ERROR_FAILURE);
|
||||
characterCount += textLength;
|
||||
}
|
||||
|
|
|
@ -185,7 +185,7 @@ nsAccessibleWrap::FirePlatformEvent(nsAccEvent *aEvent)
|
|||
return NS_OK;
|
||||
|
||||
nsCOMPtr<nsIAccessible> accessible;
|
||||
nsresult rv = aEvent->GetAccessible(getter_AddRefs(accessible));
|
||||
aEvent->GetAccessible(getter_AddRefs(accessible));
|
||||
NS_ENSURE_STATE(accessible);
|
||||
|
||||
mozAccessible *nativeAcc = nil;
|
||||
|
@ -227,35 +227,34 @@ nsAccessibleWrap::GetUnignoredChildCount(PRBool aDeepCount)
|
|||
// if we're flat, we have no children.
|
||||
if (nsAccUtils::MustPrune(this))
|
||||
return 0;
|
||||
|
||||
PRInt32 childCount = 0;
|
||||
GetChildCount(&childCount);
|
||||
|
||||
nsCOMPtr<nsIAccessible> curAcc;
|
||||
|
||||
while (NextChild(curAcc)) {
|
||||
nsAccessibleWrap *childWrap = static_cast<nsAccessibleWrap*>(curAcc.get());
|
||||
|
||||
|
||||
PRInt32 resultChildCount = 0;
|
||||
|
||||
PRInt32 childCount = GetChildCount();
|
||||
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
|
||||
nsAccessibleWrap *childAcc =
|
||||
static_cast<nsAccessibleWrap*>(GetChildAt(childIdx));
|
||||
|
||||
// if the current child is not ignored, count it.
|
||||
if (!childWrap->IsIgnored())
|
||||
++childCount;
|
||||
|
||||
if (!childAcc->IsIgnored())
|
||||
++resultChildCount;
|
||||
|
||||
// if it's flat, we don't care to inspect its children.
|
||||
if (nsAccUtils::MustPrune(childWrap))
|
||||
if (nsAccUtils::MustPrune(childAcc))
|
||||
continue;
|
||||
|
||||
|
||||
if (aDeepCount) {
|
||||
// recursively count the unignored children of our children since it's a deep count.
|
||||
childCount += childWrap->GetUnignoredChildCount(PR_TRUE);
|
||||
resultChildCount += childAcc->GetUnignoredChildCount(PR_TRUE);
|
||||
} else {
|
||||
// no deep counting, but if the child is ignored, we want to substitute it for its
|
||||
// children.
|
||||
if (childWrap->IsIgnored())
|
||||
childCount += childWrap->GetUnignoredChildCount(PR_FALSE);
|
||||
if (childAcc->IsIgnored())
|
||||
resultChildCount += childAcc->GetUnignoredChildCount(PR_FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return childCount;
|
||||
return resultChildCount;
|
||||
}
|
||||
|
||||
// if we for some reason have no native accessible, we should be skipped over (and traversed)
|
||||
|
@ -269,19 +268,20 @@ nsAccessibleWrap::IsIgnored()
|
|||
void
|
||||
nsAccessibleWrap::GetUnignoredChildren(nsTArray<nsRefPtr<nsAccessibleWrap> > &aChildrenArray)
|
||||
{
|
||||
nsCOMPtr<nsIAccessible> curAcc;
|
||||
|
||||
// we're flat; there are no children.
|
||||
if (nsAccUtils::MustPrune(this))
|
||||
return;
|
||||
|
||||
while (NextChild(curAcc)) {
|
||||
nsAccessibleWrap *childWrap = static_cast<nsAccessibleWrap*>(curAcc.get());
|
||||
if (childWrap->IsIgnored()) {
|
||||
|
||||
PRInt32 childCount = GetChildCount();
|
||||
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
|
||||
nsAccessibleWrap *childAcc =
|
||||
static_cast<nsAccessibleWrap*>(GetChildAt(childIdx));
|
||||
|
||||
if (childAcc->IsIgnored()) {
|
||||
// element is ignored, so try adding its children as substitutes, if it has any.
|
||||
if (!nsAccUtils::MustPrune(childWrap)) {
|
||||
if (!nsAccUtils::MustPrune(childAcc)) {
|
||||
nsTArray<nsRefPtr<nsAccessibleWrap> > children;
|
||||
childWrap->GetUnignoredChildren(children);
|
||||
childAcc->GetUnignoredChildren(children);
|
||||
if (!children.IsEmpty()) {
|
||||
// add the found unignored descendants to the array.
|
||||
aChildrenArray.AppendElements(children);
|
||||
|
@ -289,7 +289,7 @@ nsAccessibleWrap::GetUnignoredChildren(nsTArray<nsRefPtr<nsAccessibleWrap> > &aC
|
|||
}
|
||||
} else
|
||||
// simply add the element, since it's not ignored.
|
||||
aChildrenArray.AppendElement(childWrap);
|
||||
aChildrenArray.AppendElement(childAcc);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -492,20 +492,21 @@ nsXULGroupboxAccessible::GetRelationByType(PRUint32 aRelationType,
|
|||
// The label for xul:groupbox is generated from xul:label that is
|
||||
// inside the anonymous content of the xul:caption.
|
||||
// The xul:label has an accessible object but the xul:caption does not
|
||||
nsCOMPtr<nsIAccessible> testLabelAccessible;
|
||||
while (NextChild(testLabelAccessible)) {
|
||||
if (nsAccUtils::Role(testLabelAccessible) == nsIAccessibleRole::ROLE_LABEL) {
|
||||
PRInt32 childCount = GetChildCount();
|
||||
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
|
||||
nsAccessible *childAcc = GetChildAt(childIdx);
|
||||
if (nsAccUtils::Role(childAcc) == nsIAccessibleRole::ROLE_LABEL) {
|
||||
// Ensure that it's our label
|
||||
// XXX: we'll fail if group accessible expose more than one relation
|
||||
// targets.
|
||||
nsCOMPtr<nsIAccessible> testGroupboxAccessible =
|
||||
nsRelUtils::GetRelatedAccessible(testLabelAccessible,
|
||||
nsRelUtils::GetRelatedAccessible(childAcc,
|
||||
nsIAccessibleRelation::RELATION_LABEL_FOR);
|
||||
|
||||
if (testGroupboxAccessible == this) {
|
||||
// The <label> points back to this groupbox
|
||||
return nsRelUtils::
|
||||
AddTarget(aRelationType, aRelation, testLabelAccessible);
|
||||
AddTarget(aRelationType, aRelation, childAcc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,6 +36,8 @@
|
|||
|
||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
var handleDroppedLink = null;
|
||||
|
||||
var XULBrowserWindow = {
|
||||
isBusy: false,
|
||||
setOverLink: function (link, b) {
|
||||
|
|
|
@ -22,7 +22,9 @@
|
|||
gOpenerWnd.SimpleTest.is(aExpected, aActual, aMsg);
|
||||
}
|
||||
|
||||
// Hack to make xul:tabbrowser work.
|
||||
// Hacks to make xul:tabbrowser work.
|
||||
var handleDroppedLink = null; // needed for tabbrowser usage
|
||||
|
||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||
var XULBrowserWindow = {
|
||||
isBusy: false,
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
|
||||
// Hack to make xul:tabbrowser work.
|
||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||
var handleDroppedLink = null;
|
||||
var XULBrowserWindow = {
|
||||
isBusy: false,
|
||||
setOverLink: function (link, b) {
|
||||
|
|
|
@ -411,7 +411,7 @@ var PlacesCommandHook = {
|
|||
|
||||
var parent = aParent != undefined ?
|
||||
aParent : PlacesUtils.unfiledBookmarksFolderId;
|
||||
var descAnno = { name: DESCRIPTION_ANNO, value: description };
|
||||
var descAnno = { name: PlacesUIUtils.DESCRIPTION_ANNO, value: description };
|
||||
var txn = PlacesUIUtils.ptm.createItem(uri, parent, -1,
|
||||
title, null, [descAnno]);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
|
|
|
@ -1097,16 +1097,14 @@ function HandleAppCommandEvent(evt) {
|
|||
function prepareForStartup() {
|
||||
gBrowser.addEventListener("DOMUpdatePageReport", gPopupBlockerObserver.onUpdatePageReport, false);
|
||||
|
||||
// Note: we need to listen to untrusted events, because the pluginfinder XBL
|
||||
// binding can't fire trusted ones (runs with page privileges).
|
||||
gBrowser.addEventListener("PluginNotFound", gMissingPluginInstaller.newMissingPlugin, true, true);
|
||||
gBrowser.addEventListener("PluginCrashed", gMissingPluginInstaller.pluginInstanceCrashed, true, true);
|
||||
gBrowser.addEventListener("PluginBlocklisted", gMissingPluginInstaller.newMissingPlugin, true, true);
|
||||
gBrowser.addEventListener("PluginOutdated", gMissingPluginInstaller.newMissingPlugin, true, true);
|
||||
gBrowser.addEventListener("PluginDisabled", gMissingPluginInstaller.newDisabledPlugin, true, true);
|
||||
gBrowser.addEventListener("NewPluginInstalled", gMissingPluginInstaller.refreshBrowser, false);
|
||||
gBrowser.addEventListener("PluginNotFound", gPluginHandler, true);
|
||||
gBrowser.addEventListener("PluginCrashed", gPluginHandler, true);
|
||||
gBrowser.addEventListener("PluginBlocklisted", gPluginHandler, true);
|
||||
gBrowser.addEventListener("PluginOutdated", gPluginHandler, true);
|
||||
gBrowser.addEventListener("PluginDisabled", gPluginHandler, true);
|
||||
gBrowser.addEventListener("NewPluginInstalled", gPluginHandler.newPluginInstalled, true);
|
||||
|
||||
Services.obs.addObserver(gMissingPluginInstaller.pluginCrashed, "plugin-crashed", false);
|
||||
Services.obs.addObserver(gPluginHandler.pluginCrashed, "plugin-crashed", false);
|
||||
|
||||
window.addEventListener("AppCommand", HandleAppCommandEvent, true);
|
||||
|
||||
|
@ -1400,7 +1398,7 @@ function BrowserShutdown()
|
|||
|
||||
Services.obs.removeObserver(gSessionHistoryObserver, "browser:purge-session-history");
|
||||
Services.obs.removeObserver(gXPInstallObserver, "xpinstall-install-blocked");
|
||||
Services.obs.removeObserver(gMissingPluginInstaller.pluginCrashed, "plugin-crashed");
|
||||
Services.obs.removeObserver(gPluginHandler.pluginCrashed, "plugin-crashed");
|
||||
|
||||
try {
|
||||
gBrowser.removeProgressListener(window.XULBrowserWindow);
|
||||
|
@ -2697,48 +2695,9 @@ function FillInHTMLTooltip(tipElement)
|
|||
}
|
||||
|
||||
var browserDragAndDrop = {
|
||||
getDragURLFromDataTransfer : function (dt)
|
||||
dragOver: function (aEvent, statusString)
|
||||
{
|
||||
var types = dt.types;
|
||||
for (var t = 0; t < types.length; t++) {
|
||||
var type = types[t];
|
||||
switch (type) {
|
||||
case "text/uri-list":
|
||||
var url = dt.getData("URL").replace(/^\s+|\s+$/g, "");
|
||||
return [url, url];
|
||||
case "text/plain":
|
||||
case "text/x-moz-text-internal":
|
||||
var url = dt.getData(type).replace(/^\s+|\s+$/g, "");
|
||||
return [url, url];
|
||||
case "text/x-moz-url":
|
||||
var split = dt.getData(type).split("\n");
|
||||
return [split[0], split[1]];
|
||||
}
|
||||
}
|
||||
|
||||
// For shortcuts, we want to check for the file type last, so that the
|
||||
// url pointed to in one of the url types is found first before the file
|
||||
// type, which points to the actual file.
|
||||
var file = dt.mozGetDataAt("application/x-moz-file", 0);
|
||||
if (file) {
|
||||
var name = file instanceof Ci.nsIFile ? file.leafName : "";
|
||||
var fileHandler = ContentAreaUtils.ioService
|
||||
.getProtocolHandler("file")
|
||||
.QueryInterface(Ci.nsIFileProtocolHandler);
|
||||
return [fileHandler.getURLSpecFromFile(file), name];
|
||||
}
|
||||
|
||||
return [ , ];
|
||||
},
|
||||
|
||||
dragOver : function (aEvent, statusString)
|
||||
{
|
||||
var types = aEvent.dataTransfer.types;
|
||||
if (types.contains("application/x-moz-file") ||
|
||||
types.contains("text/x-moz-url") ||
|
||||
types.contains("text/uri-list") ||
|
||||
types.contains("text/x-moz-text-internal") ||
|
||||
types.contains("text/plain")) {
|
||||
if (Services.droppedLinkHandler.canDropLink(aEvent, true)) {
|
||||
aEvent.preventDefault();
|
||||
|
||||
if (statusString) {
|
||||
|
@ -2746,9 +2705,10 @@ var browserDragAndDrop = {
|
|||
statusTextFld.label = gNavigatorBundle.getString(statusString);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
drop: function (aEvent, aName) Services.droppedLinkHandler.dropLink(aEvent, aName)
|
||||
}
|
||||
|
||||
var proxyIconDNDObserver = {
|
||||
onDragStart: function (aEvent, aXferData, aDragAction)
|
||||
|
@ -2771,8 +2731,7 @@ var proxyIconDNDObserver = {
|
|||
var homeButtonObserver = {
|
||||
onDrop: function (aEvent)
|
||||
{
|
||||
let url = browserDragAndDrop.getDragURLFromDataTransfer(aEvent.dataTransfer)[0];
|
||||
setTimeout(openHomeDialog, 0, url);
|
||||
setTimeout(openHomeDialog, 0, browserDragAndDrop.drop(aEvent, { }));
|
||||
},
|
||||
|
||||
onDragOver: function (aEvent)
|
||||
|
@ -2813,7 +2772,8 @@ function openHomeDialog(aURL)
|
|||
var bookmarksButtonObserver = {
|
||||
onDrop: function (aEvent)
|
||||
{
|
||||
let [url, name] = browserDragAndDrop.getDragURLFromDataTransfer(aEvent.dataTransfer);
|
||||
let name = { };
|
||||
let url = browserDragAndDrop.drop(aEvent, name);
|
||||
try {
|
||||
PlacesUIUtils.showMinimalAddBookmarkUI(makeURI(url), name);
|
||||
} catch(ex) { }
|
||||
|
@ -2846,11 +2806,10 @@ var newTabButtonObserver = {
|
|||
|
||||
onDrop: function (aEvent)
|
||||
{
|
||||
let url = browserDragAndDrop.getDragURLFromDataTransfer(aEvent.dataTransfer)[0];
|
||||
let url = browserDragAndDrop.drop(aEvent, { });
|
||||
var postData = {};
|
||||
url = getShortcutOrURI(url, postData);
|
||||
if (url) {
|
||||
nsDragAndDrop.dragDropSecurityCheck(aEvent, null, url);
|
||||
// allow third-party services to fixup this URL
|
||||
openNewTabWith(url, null, postData.value, aEvent, true);
|
||||
}
|
||||
|
@ -2869,11 +2828,10 @@ var newWindowButtonObserver = {
|
|||
},
|
||||
onDrop: function (aEvent)
|
||||
{
|
||||
let url = browserDragAndDrop.getDragURLFromDataTransfer(aEvent.dataTransfer)[0];
|
||||
let url = browserDragAndDrop.drop(aEvent, { });
|
||||
var postData = {};
|
||||
url = getShortcutOrURI(url, postData);
|
||||
if (url) {
|
||||
nsDragAndDrop.dragDropSecurityCheck(aEvent, null, url);
|
||||
// allow third-party services to fixup this URL
|
||||
openNewWindowWith(url, null, postData.value, true);
|
||||
}
|
||||
|
@ -2902,9 +2860,10 @@ var DownloadsButtonDNDObserver = {
|
|||
|
||||
onDrop: function (aEvent)
|
||||
{
|
||||
let [url, name] = browserDragAndDrop.getDragURLFromDataTransfer(aEvent.dataTransfer);
|
||||
nsDragAndDrop.dragDropSecurityCheck(aEvent, null, url);
|
||||
saveURL(url, name, null, true, true);
|
||||
let name = { };
|
||||
let url = browserDragAndDrop.drop(aEvent, name);
|
||||
if (url)
|
||||
saveURL(url, name, null, true, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5067,56 +5026,16 @@ function middleMousePaste(event)
|
|||
event.stopPropagation();
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that most of this routine has been moved into C++ in order to
|
||||
* be available for all <browser> tags as well as gecko embedding. See
|
||||
* mozilla/content/base/src/nsContentAreaDragDrop.cpp.
|
||||
*
|
||||
* Do not add any new fuctionality here other than what is needed for
|
||||
* a standalone product.
|
||||
*/
|
||||
function handleDroppedLink(event, url, name)
|
||||
{
|
||||
let postData = { };
|
||||
let uri = getShortcutOrURI(url, postData);
|
||||
if (uri)
|
||||
loadURI(uri, null, postData.value, false);
|
||||
|
||||
var contentAreaDNDObserver = {
|
||||
onDrop: function (aEvent)
|
||||
{
|
||||
if (aEvent.getPreventDefault())
|
||||
return;
|
||||
|
||||
var types = aEvent.dataTransfer.types;
|
||||
if (!types.contains("application/x-moz-file") &&
|
||||
!types.contains("text/x-moz-url") &&
|
||||
!types.contains("text/uri-list") &&
|
||||
!types.contains("text/plain")) {
|
||||
aEvent.preventDefault();
|
||||
return;
|
||||
}
|
||||
|
||||
let [url, name] = browserDragAndDrop.getDragURLFromDataTransfer(aEvent.dataTransfer);
|
||||
|
||||
// valid urls don't contain spaces ' '; if we have a space it
|
||||
// isn't a valid url, or if it's a javascript: or data: url,
|
||||
// bail out
|
||||
if (!url || !url.length || url.indexOf(" ", 0) != -1 ||
|
||||
/^\s*(javascript|data):/.test(url))
|
||||
return;
|
||||
|
||||
nsDragAndDrop.dragDropSecurityCheck(aEvent, null, url);
|
||||
|
||||
switch (document.documentElement.getAttribute('windowtype')) {
|
||||
case "navigator:browser":
|
||||
var postData = { };
|
||||
var uri = getShortcutOrURI(url, postData);
|
||||
loadURI(uri, null, postData.value, false);
|
||||
break;
|
||||
case "navigator:view-source":
|
||||
viewSource(url);
|
||||
break;
|
||||
}
|
||||
|
||||
// keep the event from being handled by the dragDrop listeners
|
||||
// built-in to gecko if they happen to be above us.
|
||||
aEvent.preventDefault();
|
||||
}
|
||||
// Keep the event from being handled by the dragDrop listeners
|
||||
// built-in to gecko if they happen to be above us.
|
||||
event.preventDefault();
|
||||
};
|
||||
|
||||
function MultiplexHandler(event)
|
||||
|
@ -5928,7 +5847,7 @@ function getPluginInfo(pluginElement)
|
|||
return {mimetype: tagMimetype, pluginsPage: pluginsPage};
|
||||
}
|
||||
|
||||
var gMissingPluginInstaller = {
|
||||
var gPluginHandler = {
|
||||
|
||||
get CrashSubmit() {
|
||||
delete this.CrashSubmit;
|
||||
|
@ -5955,6 +5874,16 @@ var gMissingPluginInstaller = {
|
|||
return newName;
|
||||
},
|
||||
|
||||
isTooSmall : function (plugin, overlay) {
|
||||
// Is the <object>'s size too small to hold what we want to show?
|
||||
let pluginRect = plugin.getBoundingClientRect();
|
||||
// XXX bug 446693. The text-shadow on the submitted-report text at
|
||||
// the bottom causes scrollHeight to be larger than it should be.
|
||||
let overflows = (overlay.scrollWidth > pluginRect.width) ||
|
||||
(overlay.scrollHeight - 5 > pluginRect.height);
|
||||
return overflows;
|
||||
},
|
||||
|
||||
addLinkClickCallback: function (linkNode, callbackName /*callbackArgs...*/) {
|
||||
// XXX just doing (callback)(arg) was giving a same-origin error. bug?
|
||||
let self = this;
|
||||
|
@ -5985,6 +5914,58 @@ var gMissingPluginInstaller = {
|
|||
true);
|
||||
},
|
||||
|
||||
handleEvent : function(event) {
|
||||
let self = gPluginHandler;
|
||||
let plugin = event.target;
|
||||
|
||||
// We're expecting the target to be a plugin.
|
||||
if (!(plugin instanceof Ci.nsIObjectLoadingContent))
|
||||
return;
|
||||
|
||||
switch (event.type) {
|
||||
case "PluginCrashed":
|
||||
self.pluginInstanceCrashed(plugin, event);
|
||||
break;
|
||||
|
||||
case "PluginNotFound":
|
||||
// For non-object plugin tags, register a click handler to install the
|
||||
// plugin. Object tags can, and often do, deal with that themselves,
|
||||
// so don't stomp on the page developers toes.
|
||||
if (!(plugin instanceof HTMLObjectElement))
|
||||
self.addLinkClickCallback(plugin, "installSinglePlugin");
|
||||
/* FALLTHRU */
|
||||
case "PluginBlocklisted":
|
||||
case "PluginOutdated":
|
||||
let hideBarPrefName = event.type == "PluginOutdated" ?
|
||||
"plugins.hide_infobar_for_outdated_plugin" :
|
||||
"plugins.hide_infobar_for_missing_plugin";
|
||||
if (gPrefService.getBoolPref(hideBarPrefName))
|
||||
return;
|
||||
|
||||
self.pluginUnavailable(plugin, event.type);
|
||||
break;
|
||||
|
||||
case "PluginDisabled":
|
||||
self.addLinkClickCallback(plugin, "managePlugins");
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
newPluginInstalled : function(event) {
|
||||
// browser elements are anonymous so we can't just use target.
|
||||
var browser = event.originalTarget;
|
||||
// clear the plugin list, now that at least one plugin has been installed
|
||||
browser.missingPlugins = null;
|
||||
|
||||
var notificationBox = gBrowser.getNotificationBox(browser);
|
||||
var notification = notificationBox.getNotificationWithValue("missing-plugins");
|
||||
if (notification)
|
||||
notificationBox.removeNotification(notification);
|
||||
|
||||
// reload the browser to make the new plugin show.
|
||||
browser.reload();
|
||||
},
|
||||
|
||||
// Callback for user clicking on a missing (unsupported) plugin.
|
||||
installSinglePlugin: function (aEvent) {
|
||||
var missingPluginsArray = {};
|
||||
|
@ -6022,51 +6003,27 @@ var gMissingPluginInstaller = {
|
|||
},
|
||||
|
||||
|
||||
|
||||
// event listener for missing/blocklisted/outdated plugins.
|
||||
newMissingPlugin: function (aEvent) {
|
||||
// Since we are expecting also untrusted events, make sure
|
||||
// that the target is a plugin
|
||||
if (!(aEvent.target instanceof Ci.nsIObjectLoadingContent))
|
||||
return;
|
||||
|
||||
// For broken non-object plugin tags, register a click handler so
|
||||
// that the user can click the plugin replacement to get the new
|
||||
// plugin. Object tags can, and often do, deal with that themselves,
|
||||
// so don't stomp on the page developers toes.
|
||||
|
||||
if (aEvent.type != "PluginBlocklisted" &&
|
||||
aEvent.type != "PluginOutdated" &&
|
||||
!(aEvent.target instanceof HTMLObjectElement)) {
|
||||
gMissingPluginInstaller.addLinkClickCallback(aEvent.target, "installSinglePlugin");
|
||||
}
|
||||
|
||||
let hideBarPrefName = aEvent.type == "PluginOutdated" ?
|
||||
"plugins.hide_infobar_for_outdated_plugin" :
|
||||
"plugins.hide_infobar_for_missing_plugin";
|
||||
if (gPrefService.getBoolPref(hideBarPrefName))
|
||||
return;
|
||||
|
||||
var browser = gBrowser.getBrowserForDocument(aEvent.target.ownerDocument
|
||||
pluginUnavailable: function (plugin, eventType) {
|
||||
let browser = gBrowser.getBrowserForDocument(plugin.ownerDocument
|
||||
.defaultView.top.document);
|
||||
if (!browser.missingPlugins)
|
||||
browser.missingPlugins = {};
|
||||
|
||||
var pluginInfo = getPluginInfo(aEvent.target);
|
||||
|
||||
var pluginInfo = getPluginInfo(plugin);
|
||||
browser.missingPlugins[pluginInfo.mimetype] = pluginInfo;
|
||||
|
||||
var notificationBox = gBrowser.getNotificationBox(browser);
|
||||
|
||||
// Should only display one of these warnings per page.
|
||||
// In order of priority, they are: outdated > missing > blocklisted
|
||||
let outdatedNotification = notificationBox.getNotificationWithValue("outdated-plugins");
|
||||
let blockedNotification = notificationBox.getNotificationWithValue("blocked-plugins");
|
||||
let missingNotification = notificationBox.getNotificationWithValue("missing-plugins");
|
||||
|
||||
// If there is already an outdated plugin notification then do nothing
|
||||
if (notificationBox.getNotificationWithValue("outdated-plugins"))
|
||||
if (outdatedNotification)
|
||||
return;
|
||||
var blockedNotification = notificationBox.getNotificationWithValue("blocked-plugins");
|
||||
var missingNotification = notificationBox.getNotificationWithValue("missing-plugins");
|
||||
var priority = notificationBox.PRIORITY_WARNING_MEDIUM;
|
||||
|
||||
function showBlocklistInfo() {
|
||||
var url = formatURL("extensions.blocklist.detailsURL", true);
|
||||
|
@ -6091,75 +6048,72 @@ var gMissingPluginInstaller = {
|
|||
}
|
||||
}
|
||||
|
||||
if (aEvent.type == "PluginBlocklisted") {
|
||||
let notifications = {
|
||||
PluginBlocklisted : {
|
||||
barID : "blocked-plugins",
|
||||
iconURL : "chrome://mozapps/skin/plugins/pluginBlocked-16.png",
|
||||
message : gNavigatorBundle.getString("blockedpluginsMessage.title"),
|
||||
buttons : [{
|
||||
label : gNavigatorBundle.getString("blockedpluginsMessage.infoButton.label"),
|
||||
accessKey : gNavigatorBundle.getString("blockedpluginsMessage.infoButton.accesskey"),
|
||||
popup : null,
|
||||
callback : showBlocklistInfo
|
||||
},
|
||||
{
|
||||
label : gNavigatorBundle.getString("blockedpluginsMessage.searchButton.label"),
|
||||
accessKey : gNavigatorBundle.getString("blockedpluginsMessage.searchButton.accesskey"),
|
||||
popup : null,
|
||||
callback : showOutdatedPluginsInfo
|
||||
}],
|
||||
},
|
||||
PluginOutdated : {
|
||||
barID : "outdated-plugins",
|
||||
iconURL : "chrome://mozapps/skin/plugins/pluginOutdated-16.png",
|
||||
message : gNavigatorBundle.getString("outdatedpluginsMessage.title"),
|
||||
buttons : [{
|
||||
label : gNavigatorBundle.getString("outdatedpluginsMessage.updateButton.label"),
|
||||
accessKey : gNavigatorBundle.getString("outdatedpluginsMessage.updateButton.accesskey"),
|
||||
popup : null,
|
||||
callback : showOutdatedPluginsInfo
|
||||
}],
|
||||
},
|
||||
PluginNotFound : {
|
||||
barID : "missing-plugins",
|
||||
iconURL : "chrome://mozapps/skin/plugins/pluginGeneric-16.png",
|
||||
message : gNavigatorBundle.getString("missingpluginsMessage.title"),
|
||||
buttons : [{
|
||||
label : gNavigatorBundle.getString("missingpluginsMessage.button.label"),
|
||||
accessKey : gNavigatorBundle.getString("missingpluginsMessage.button.accesskey"),
|
||||
popup : null,
|
||||
callback : showPluginsMissing
|
||||
}],
|
||||
}
|
||||
};
|
||||
|
||||
if (eventType == "PluginBlocklisted") {
|
||||
if (blockedNotification || missingNotification)
|
||||
return;
|
||||
|
||||
let iconURL = "chrome://mozapps/skin/plugins/pluginBlocked-16.png";
|
||||
let messageString = gNavigatorBundle.getString("blockedpluginsMessage.title");
|
||||
let buttons = [{
|
||||
label: gNavigatorBundle.getString("blockedpluginsMessage.infoButton.label"),
|
||||
accessKey: gNavigatorBundle.getString("blockedpluginsMessage.infoButton.accesskey"),
|
||||
popup: null,
|
||||
callback: showBlocklistInfo
|
||||
}, {
|
||||
label: gNavigatorBundle.getString("blockedpluginsMessage.searchButton.label"),
|
||||
accessKey: gNavigatorBundle.getString("blockedpluginsMessage.searchButton.accesskey"),
|
||||
popup: null,
|
||||
callback: showOutdatedPluginsInfo
|
||||
}];
|
||||
|
||||
notificationBox.appendNotification(messageString, "blocked-plugins",
|
||||
iconURL, priority, buttons);
|
||||
}
|
||||
else if (aEvent.type == "PluginOutdated") {
|
||||
else if (eventType == "PluginOutdated") {
|
||||
// Cancel any notification about blocklisting/missing plugins
|
||||
if (blockedNotification)
|
||||
blockedNotification.close();
|
||||
if (missingNotification)
|
||||
missingNotification.close();
|
||||
|
||||
let iconURL = "chrome://mozapps/skin/plugins/pluginOutdated-16.png";
|
||||
let messageString = gNavigatorBundle.getString("outdatedpluginsMessage.title");
|
||||
let buttons = [{
|
||||
label: gNavigatorBundle.getString("outdatedpluginsMessage.updateButton.label"),
|
||||
accessKey: gNavigatorBundle.getString("outdatedpluginsMessage.updateButton.accesskey"),
|
||||
popup: null,
|
||||
callback: showOutdatedPluginsInfo
|
||||
}];
|
||||
|
||||
notificationBox.appendNotification(messageString, "outdated-plugins",
|
||||
iconURL, priority, buttons);
|
||||
}
|
||||
else if (aEvent.type == "PluginNotFound") {
|
||||
else if (eventType == "PluginNotFound") {
|
||||
if (missingNotification)
|
||||
return;
|
||||
|
||||
// Cancel any notification about blocklisting plugins
|
||||
if (blockedNotification)
|
||||
blockedNotification.close();
|
||||
|
||||
let iconURL = "chrome://mozapps/skin/plugins/pluginGeneric-16.png";
|
||||
let messageString = gNavigatorBundle.getString("missingpluginsMessage.title");
|
||||
let buttons = [{
|
||||
label: gNavigatorBundle.getString("missingpluginsMessage.button.label"),
|
||||
accessKey: gNavigatorBundle.getString("missingpluginsMessage.button.accesskey"),
|
||||
popup: null,
|
||||
callback: showPluginsMissing
|
||||
}];
|
||||
|
||||
notificationBox.appendNotification(messageString, "missing-plugins",
|
||||
iconURL, priority, buttons);
|
||||
}
|
||||
},
|
||||
|
||||
newDisabledPlugin: function (aEvent) {
|
||||
// Since we are expecting also untrusted events, make sure
|
||||
// that the target is a plugin
|
||||
if (!(aEvent.target instanceof Ci.nsIObjectLoadingContent))
|
||||
return;
|
||||
|
||||
gMissingPluginInstaller.addLinkClickCallback(aEvent.target, "managePlugins");
|
||||
let notify = notifications[eventType];
|
||||
notificationBox.appendNotification(notify.message, notify.barID, notify.iconURL,
|
||||
notificationBox.PRIORITY_WARNING_MEDIUM,
|
||||
notify.buttons);
|
||||
},
|
||||
|
||||
// Crashed-plugin observer. Notified once per plugin crash, before events
|
||||
|
@ -6187,17 +6141,9 @@ var gMissingPluginInstaller = {
|
|||
|
||||
// Crashed-plugin event listener. Called for every instance of a
|
||||
// plugin in content.
|
||||
pluginInstanceCrashed: function (aEvent) {
|
||||
let self = gMissingPluginInstaller;
|
||||
|
||||
// Evil content could fire a fake event at us, ignore them.
|
||||
if (!aEvent.isTrusted)
|
||||
return;
|
||||
|
||||
pluginInstanceCrashed: function (plugin, aEvent) {
|
||||
// Ensure the plugin and event are of the right type.
|
||||
let plugin = aEvent.target;
|
||||
if (!(aEvent instanceof Ci.nsIDOMDataContainerEvent) ||
|
||||
!(plugin instanceof Ci.nsIObjectLoadingContent))
|
||||
if (!(aEvent instanceof Ci.nsIDOMDataContainerEvent))
|
||||
return;
|
||||
|
||||
let submittedReport = aEvent.getData("submittedCrashReport");
|
||||
|
@ -6209,7 +6155,7 @@ var gMissingPluginInstaller = {
|
|||
let browserDumpID = aEvent.getData("browserDumpID");
|
||||
|
||||
// Remap the plugin name to a more user-presentable form.
|
||||
pluginName = self.makeNicePluginName(pluginName, pluginFilename);
|
||||
pluginName = this.makeNicePluginName(pluginName, pluginFilename);
|
||||
|
||||
// Force a style flush, so that we ensure our binding is attached.
|
||||
plugin.clientTop;
|
||||
|
@ -6243,7 +6189,7 @@ var gMissingPluginInstaller = {
|
|||
// XXX can we make the link target actually be blank?
|
||||
let pleaseLink = doc.getAnonymousElementByAttribute(
|
||||
plugin, "class", "pleaseSubmitLink");
|
||||
self.addLinkClickCallback(pleaseLink, "submitReport",
|
||||
this.addLinkClickCallback(pleaseLink, "submitReport",
|
||||
pluginDumpID, browserDumpID);
|
||||
}
|
||||
|
||||
|
@ -6258,7 +6204,7 @@ var gMissingPluginInstaller = {
|
|||
let bottomLinks = doc.getAnonymousElementByAttribute(plugin, "class", "msg msgBottomLinks");
|
||||
bottomLinks.style.display = "block";
|
||||
let helpIcon = doc.getAnonymousElementByAttribute(plugin, "class", "helpIcon");
|
||||
self.addLinkClickCallback(helpIcon, "openHelpPage");
|
||||
this.addLinkClickCallback(helpIcon, "openHelpPage");
|
||||
|
||||
// If we're showing the link to manually trigger report submission, we'll
|
||||
// want to be able to update all the instances of the UI for this crash to
|
||||
|
@ -6299,17 +6245,12 @@ var gMissingPluginInstaller = {
|
|||
let browser = gBrowser.getBrowserForDocument(doc.defaultView.top.document);
|
||||
|
||||
let link = doc.getAnonymousElementByAttribute(plugin, "class", "reloadLink");
|
||||
self.addLinkClickCallback(link, "reloadPage", browser);
|
||||
this.addLinkClickCallback(link, "reloadPage", browser);
|
||||
|
||||
let notificationBox = gBrowser.getNotificationBox(browser);
|
||||
|
||||
// Is the <object>'s size too small to hold what we want to show?
|
||||
let pluginRect = plugin.getBoundingClientRect();
|
||||
// XXX bug 446693. The text-shadow on the submitted-report text at
|
||||
// the bottom causes scrollHeight to be larger than it should be.
|
||||
let isObjectTooSmall = (overlay.scrollWidth > pluginRect.width) ||
|
||||
(overlay.scrollHeight - 5 > pluginRect.height);
|
||||
if (isObjectTooSmall) {
|
||||
if (this.isTooSmall(plugin, overlay)) {
|
||||
// Hide the overlay's contents. Use visibility style, so that it
|
||||
// doesn't collapse down to 0x0.
|
||||
overlay.style.visibility = "hidden";
|
||||
|
@ -6356,7 +6297,7 @@ var gMissingPluginInstaller = {
|
|||
label: submitLabel,
|
||||
accessKey: submitKey,
|
||||
popup: null,
|
||||
callback: function() { gMissingPluginInstaller.submitReport(pluginDumpID, browserDumpID); },
|
||||
callback: function() { gPluginHandler.submitReport(pluginDumpID, browserDumpID); },
|
||||
};
|
||||
if (pluginDumpID)
|
||||
buttons.push(submitButton);
|
||||
|
@ -6370,27 +6311,11 @@ var gMissingPluginInstaller = {
|
|||
let link = notification.ownerDocument.createElementNS(XULNS, "label");
|
||||
link.className = "text-link";
|
||||
link.setAttribute("value", gNavigatorBundle.getString("crashedpluginsMessage.learnMore"));
|
||||
link.href = gMissingPluginInstaller.crashReportHelpURL;
|
||||
link.href = gPluginHandler.crashReportHelpURL;
|
||||
let description = notification.ownerDocument.getAnonymousElementByAttribute(notification, "anonid", "messageText");
|
||||
description.appendChild(link);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
refreshBrowser: function (aEvent) {
|
||||
// browser elements are anonymous so we can't just use target.
|
||||
var browser = aEvent.originalTarget;
|
||||
var notificationBox = gBrowser.getNotificationBox(browser);
|
||||
var notification = notificationBox.getNotificationWithValue("missing-plugins");
|
||||
|
||||
// clear the plugin list, now that at least one plugin has been installed
|
||||
browser.missingPlugins = null;
|
||||
if (notification) {
|
||||
// reset UI
|
||||
notificationBox.removeNotification(notification);
|
||||
}
|
||||
// reload the browser to make the new plugin show.
|
||||
browser.reload();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -665,7 +665,6 @@
|
|||
tabcontainer="tabbrowser-tabs"
|
||||
contentcontextmenu="contentAreaContextMenu"
|
||||
autocompletepopup="PopupAutoComplete"
|
||||
ondrop="contentAreaDNDObserver.onDrop(event)"
|
||||
onclick="return contentAreaClick(event, false);"/>
|
||||
</vbox>
|
||||
</hbox>
|
||||
|
@ -677,7 +676,7 @@
|
|||
#ifdef WINCE
|
||||
hidden="true"
|
||||
#endif
|
||||
ondrop="contentAreaDNDObserver.onDrop(event)">
|
||||
>
|
||||
<statusbarpanel id="statusbar-display" label="" flex="1"/>
|
||||
<statusbarpanel class="statusbarpanel-progress" collapsed="true" id="statusbar-progresspanel">
|
||||
<progressmeter class="progressmeter-statusbar" id="statusbar-icon" mode="normal" value="0"/>
|
||||
|
|
|
@ -278,6 +278,10 @@ function onLoadPageInfo()
|
|||
gStrings.mediaEmbed = gBundle.getString("mediaEmbed");
|
||||
gStrings.mediaLink = gBundle.getString("mediaLink");
|
||||
gStrings.mediaInput = gBundle.getString("mediaInput");
|
||||
#ifdef MOZ_MEDIA
|
||||
gStrings.mediaVideo = gBundle.getString("mediaVideo");
|
||||
gStrings.mediaAudio = gBundle.getString("mediaAudio");
|
||||
#endif
|
||||
|
||||
var args = "arguments" in window &&
|
||||
window.arguments.length >= 1 &&
|
||||
|
@ -621,6 +625,14 @@ function grabAll(elem)
|
|||
addImage(href, gStrings.mediaImg, "", elem, false);
|
||||
} catch (e) { }
|
||||
}
|
||||
#endif
|
||||
#ifdef MOZ_MEDIA
|
||||
else if (elem instanceof HTMLVideoElement) {
|
||||
addImage(elem.currentSrc, gStrings.mediaVideo, "", elem, false);
|
||||
}
|
||||
else if (elem instanceof HTMLAudioElement) {
|
||||
addImage(elem.currentSrc, gStrings.mediaAudio, "", elem, false);
|
||||
}
|
||||
#endif
|
||||
else if (elem instanceof HTMLLinkElement) {
|
||||
if (elem.rel && /\bicon\b/i.test(elem.rel))
|
||||
|
@ -813,6 +825,7 @@ function makePreview(row)
|
|||
var item = getSelectedImage(imageTree);
|
||||
var url = gImageView.data[row][COL_IMAGE_ADDRESS];
|
||||
var isBG = gImageView.data[row][COL_IMAGE_BG];
|
||||
var isAudo = false;
|
||||
|
||||
setItemValue("imageurltext", url);
|
||||
|
||||
|
@ -914,8 +927,8 @@ function makePreview(row)
|
|||
if (/^data:/.test(url) && /^image\//.test(mimeType))
|
||||
isProtocolAllowed = true;
|
||||
|
||||
var newImage = new Image();
|
||||
newImage.setAttribute("id", "thepreviewimage");
|
||||
var newImage = new Image;
|
||||
newImage.id = "thepreviewimage";
|
||||
var physWidth = 0, physHeight = 0;
|
||||
var width = 0, height = 0;
|
||||
|
||||
|
@ -956,6 +969,33 @@ function makePreview(row)
|
|||
document.getElementById("theimagecontainer").collapsed = false
|
||||
document.getElementById("brokenimagecontainer").collapsed = true;
|
||||
}
|
||||
#ifdef MOZ_MEDIA
|
||||
else if (item instanceof HTMLVideoElement && isProtocolAllowed) {
|
||||
newImage = document.createElementNS("http://www.w3.org/1999/xhtml", "video");
|
||||
newImage.id = "thepreviewimage";
|
||||
newImage.mozLoadFrom(item);
|
||||
newImage.controls = true;
|
||||
physWidth = item.videoWidth;
|
||||
physHeight = item.videoHeight;
|
||||
width = item.width != -1 ? item.width : physWidth;
|
||||
height = item.height != -1 ? item.height : physHeight;
|
||||
newImage.width = width;
|
||||
newImage.height = height;
|
||||
|
||||
document.getElementById("theimagecontainer").collapsed = false;
|
||||
document.getElementById("brokenimagecontainer").collapsed = true;
|
||||
}
|
||||
else if (item instanceof HTMLAudioElement && isProtocolAllowed) {
|
||||
newImage = new Audio;
|
||||
newImage.id = "thepreviewimage";
|
||||
newImage.src = url;
|
||||
newImage.controls = true;
|
||||
isAudo = true;
|
||||
|
||||
document.getElementById("theimagecontainer").collapsed = false;
|
||||
document.getElementById("brokenimagecontainer").collapsed = true;
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
// fallback image for protocols not allowed (e.g., data: or javascript:)
|
||||
// or elements not [yet] handled (e.g., object, embed).
|
||||
|
@ -964,7 +1004,7 @@ function makePreview(row)
|
|||
}
|
||||
|
||||
var imageSize = "";
|
||||
if (url) {
|
||||
if (url && !isAudo) {
|
||||
if (width != physWidth || height != physHeight) {
|
||||
imageSize = gBundle.getFormattedString("mediaDimensionsScaled",
|
||||
[formatNumber(physWidth),
|
||||
|
|
|
@ -75,10 +75,12 @@
|
|||
#ifdef CRH_DIALOG_TREE_VIEW
|
||||
<script type="application/javascript"
|
||||
src="chrome://global/content/globalOverlay.js"/>
|
||||
<script type="application/javascript"
|
||||
src="chrome://browser/content/places/utils.js"/>
|
||||
<script type="application/javascript"
|
||||
src="chrome://browser/content/places/treeView.js"/>
|
||||
<script type="application/javascript"><![CDATA[
|
||||
Components.utils.import("resource://gre/modules/utils.js");
|
||||
Components.utils.import("resource:///modules/PlacesUIUtils.jsm");
|
||||
]]></script>
|
||||
#endif
|
||||
|
||||
<script type="application/javascript"
|
||||
|
|
|
@ -1213,6 +1213,7 @@
|
|||
this.mTabFilters[position] = filter;
|
||||
|
||||
b._fastFind = this.fastFind;
|
||||
b.droppedLinkHandler = handleDroppedLink;
|
||||
|
||||
var uniqueId = "panel" + Date.now() + position;
|
||||
this.mPanelContainer.lastChild.id = uniqueId;
|
||||
|
@ -2269,6 +2270,7 @@
|
|||
this._autoScrollPopup.id = "autoscroller";
|
||||
this.appendChild(this._autoScrollPopup);
|
||||
this.mCurrentBrowser.setAttribute("autoscrollpopup", this._autoScrollPopup.id);
|
||||
this.mCurrentBrowser.droppedLinkHandler = handleDroppedLink;
|
||||
]]>
|
||||
</constructor>
|
||||
|
||||
|
|
|
@ -242,24 +242,31 @@ function test() {
|
|||
// Clear Today
|
||||
Sanitizer.prefs.setIntPref("timeSpan", 4);
|
||||
s.sanitize();
|
||||
|
||||
ok(!bhist.isVisited(makeURI("http://today.com")), "Pretend visit to today.com should now be deleted");
|
||||
|
||||
// Be careful. If we add our objectss just before midnight, and sanitize
|
||||
// runs immediately after, they won't be expired. This is expected, but
|
||||
// we should not test in that case. We cannot just test for opposite
|
||||
// condition because we could cross midnight just one moment after we
|
||||
// cache our time, then we would have an even worse random failure.
|
||||
var today = isToday(new Date(now_uSec/1000));
|
||||
if (today) {
|
||||
ok(!bhist.isVisited(makeURI("http://today.com")), "Pretend visit to today.com should now be deleted");
|
||||
ok(!formhist.nameExists("today"), "today form entry should be deleted");
|
||||
ok(!downloadExists(5555554), "'Today' download should now be deleted");
|
||||
}
|
||||
|
||||
ok(bhist.isVisited(makeURI("http://before-today.com")), "Pretend visit to before-today.com should still exist");
|
||||
|
||||
ok(!formhist.nameExists("today"), "today form entry should be deleted");
|
||||
ok(formhist.nameExists("b4today"), "b4today form entry should still exist");
|
||||
|
||||
ok(!downloadExists(5555554), "'Today' download should now be deleted");
|
||||
ok(downloadExists(5555550), "Year old download should still be present");
|
||||
|
||||
// Choose everything
|
||||
Sanitizer.prefs.setIntPref("timeSpan", 0);
|
||||
s.sanitize();
|
||||
|
||||
|
||||
ok(!bhist.isVisited(makeURI("http://before-today.com")), "Pretend visit to before-today.com should now be deleted");
|
||||
|
||||
ok(!formhist.nameExists("b4today"), "b4today form entry should be deleted");
|
||||
|
||||
|
||||
ok(!downloadExists(5555550), "Year old download should now be deleted");
|
||||
|
||||
}
|
||||
|
@ -595,3 +602,7 @@ function downloadExists(aID)
|
|||
stmt.finalize();
|
||||
return rows;
|
||||
}
|
||||
|
||||
function isToday(aDate) {
|
||||
return aDate.getDate() == new Date().getDate();
|
||||
}
|
||||
|
|
|
@ -303,14 +303,12 @@
|
|||
<method name="onDrop">
|
||||
<parameter name="aEvent"/>
|
||||
<body><![CDATA[
|
||||
aEvent.stopPropagation();
|
||||
var url = browserDragAndDrop.getDragURLFromDataTransfer(aEvent.dataTransfer)[0];
|
||||
let url = browserDragAndDrop.drop(aEvent, { })
|
||||
|
||||
// The URL bar automatically handles inputs with newline characters,
|
||||
// so we can get away with treating text/x-moz-url flavours as text/plain.
|
||||
if (url) {
|
||||
nsDragAndDrop.dragDropSecurityCheck(aEvent, null, url);
|
||||
|
||||
aEvent.preventDefault();
|
||||
this.value = url;
|
||||
SetPageProxyState("invalid");
|
||||
try {
|
||||
|
|
|
@ -50,6 +50,7 @@ const Cu = Components.utils;
|
|||
const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
||||
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
const PREF_EM_NEW_ADDONS_LIST = "extensions.newAddons";
|
||||
const PREF_PLUGINS_NOTIFYUSER = "plugins.update.notifyUser";
|
||||
|
@ -77,14 +78,6 @@ const BrowserGlueServiceFactory = {
|
|||
// Constructor
|
||||
|
||||
function BrowserGlue() {
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "_prefs",
|
||||
"@mozilla.org/preferences-service;1",
|
||||
"nsIPrefBranch");
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "_bundleService",
|
||||
"@mozilla.org/intl/stringbundle;1",
|
||||
"nsIStringBundleService");
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "_idleService",
|
||||
"@mozilla.org/widget/idleservice;1",
|
||||
"nsIIdleService");
|
||||
|
@ -97,17 +90,10 @@ function BrowserGlue() {
|
|||
XPCOMUtils.defineLazyGetter(this, "_sanitizer",
|
||||
function() {
|
||||
let sanitizerScope = {};
|
||||
Cc["@mozilla.org/moz/jssubscript-loader;1"].
|
||||
getService(Ci.mozIJSSubScriptLoader).
|
||||
loadSubScript("chrome://browser/content/sanitize.js", sanitizerScope);
|
||||
Services.scriptloader.loadSubScript("chrome://browser/content/sanitize.js", sanitizerScope);
|
||||
return sanitizerScope.Sanitizer;
|
||||
});
|
||||
|
||||
// The observer service is immediately used in _init(), so there's no reason
|
||||
// to have a getter.
|
||||
this._observerService = Cc["@mozilla.org/observer-service;1"].
|
||||
getService(Ci.nsIObserverService);
|
||||
|
||||
this._init();
|
||||
}
|
||||
|
||||
|
@ -128,12 +114,12 @@ BrowserGlue.prototype = {
|
|||
if (!this._saveSession && !aForce)
|
||||
return;
|
||||
|
||||
this._prefs.setBoolPref("browser.sessionstore.resume_session_once", true);
|
||||
Services.prefs.setBoolPref("browser.sessionstore.resume_session_once", true);
|
||||
|
||||
// This method can be called via [NSApplication terminate:] on Mac, which
|
||||
// ends up causing prefs not to be flushed to disk, so we need to do that
|
||||
// explicitly here. See bug 497652.
|
||||
this._prefs.QueryInterface(Ci.nsIPrefService).savePrefFile(null);
|
||||
Services.prefs.savePrefFile(null);
|
||||
},
|
||||
|
||||
// nsIObserver implementation
|
||||
|
@ -153,10 +139,8 @@ BrowserGlue.prototype = {
|
|||
break;
|
||||
case "browser:purge-session-history":
|
||||
// reset the console service's error buffer
|
||||
const cs = Cc["@mozilla.org/consoleservice;1"].
|
||||
getService(Ci.nsIConsoleService);
|
||||
cs.logStringMessage(null); // clear the console (in case it's open)
|
||||
cs.reset();
|
||||
Services.console.logStringMessage(null); // clear the console (in case it's open)
|
||||
Services.console.reset();
|
||||
break;
|
||||
case "quit-application-requested":
|
||||
this._onQuitRequest(subject, data);
|
||||
|
@ -184,10 +168,10 @@ BrowserGlue.prototype = {
|
|||
break;
|
||||
case "places-init-complete":
|
||||
this._initPlaces();
|
||||
this._observerService.removeObserver(this, "places-init-complete");
|
||||
Services.obs.removeObserver(this, "places-init-complete");
|
||||
this._isPlacesInitObserver = false;
|
||||
// no longer needed, since history was initialized completely.
|
||||
this._observerService.removeObserver(this, "places-database-locked");
|
||||
Services.obs.removeObserver(this, "places-database-locked");
|
||||
this._isPlacesLockedObserver = false;
|
||||
|
||||
// Now apply distribution customized bookmarks.
|
||||
|
@ -198,7 +182,7 @@ BrowserGlue.prototype = {
|
|||
this._isPlacesDatabaseLocked = true;
|
||||
// Stop observing, so further attempts to load history service
|
||||
// will not show the prompt.
|
||||
this._observerService.removeObserver(this, "places-database-locked");
|
||||
Services.obs.removeObserver(this, "places-database-locked");
|
||||
this._isPlacesLockedObserver = false;
|
||||
break;
|
||||
case "idle":
|
||||
|
@ -206,21 +190,20 @@ BrowserGlue.prototype = {
|
|||
this._backupBookmarks();
|
||||
break;
|
||||
case "distribution-customization-complete":
|
||||
this._observerService
|
||||
.removeObserver(this, "distribution-customization-complete");
|
||||
Services.obs.removeObserver(this, "distribution-customization-complete");
|
||||
// Customization has finished, we don't need the customizer anymore.
|
||||
delete this._distributionCustomizer;
|
||||
break;
|
||||
case "bookmarks-restore-success":
|
||||
case "bookmarks-restore-failed":
|
||||
this._observerService.removeObserver(this, "bookmarks-restore-success");
|
||||
this._observerService.removeObserver(this, "bookmarks-restore-failed");
|
||||
Services.obs.removeObserver(this, "bookmarks-restore-success");
|
||||
Services.obs.removeObserver(this, "bookmarks-restore-failed");
|
||||
if (topic == "bookmarks-restore-success" && data == "html-initial")
|
||||
this.ensurePlacesDefaultQueriesInitialized();
|
||||
break;
|
||||
case "browser-glue-test": // used by tests
|
||||
if (data == "post-update-notification") {
|
||||
if (this._prefs.prefHasUserValue("app.update.postupdate"))
|
||||
if (Services.prefs.prefHasUserValue("app.update.postupdate"))
|
||||
this._showUpdateNotification();
|
||||
break;
|
||||
}
|
||||
|
@ -231,48 +214,46 @@ BrowserGlue.prototype = {
|
|||
// initialization (called on application startup)
|
||||
_init: function BG__init() {
|
||||
// observer registration
|
||||
const osvr = this._observerService;
|
||||
osvr.addObserver(this, "xpcom-shutdown", false);
|
||||
osvr.addObserver(this, "prefservice:after-app-defaults", false);
|
||||
osvr.addObserver(this, "final-ui-startup", false);
|
||||
osvr.addObserver(this, "sessionstore-windows-restored", false);
|
||||
osvr.addObserver(this, "browser:purge-session-history", false);
|
||||
osvr.addObserver(this, "quit-application-requested", false);
|
||||
osvr.addObserver(this, "quit-application-granted", false);
|
||||
Services.obs.addObserver(this, "xpcom-shutdown", false);
|
||||
Services.obs.addObserver(this, "prefservice:after-app-defaults", false);
|
||||
Services.obs.addObserver(this, "final-ui-startup", false);
|
||||
Services.obs.addObserver(this, "sessionstore-windows-restored", false);
|
||||
Services.obs.addObserver(this, "browser:purge-session-history", false);
|
||||
Services.obs.addObserver(this, "quit-application-requested", false);
|
||||
Services.obs.addObserver(this, "quit-application-granted", false);
|
||||
#ifdef OBSERVE_LASTWINDOW_CLOSE_TOPICS
|
||||
osvr.addObserver(this, "browser-lastwindow-close-requested", false);
|
||||
osvr.addObserver(this, "browser-lastwindow-close-granted", false);
|
||||
Services.obs.addObserver(this, "browser-lastwindow-close-requested", false);
|
||||
Services.obs.addObserver(this, "browser-lastwindow-close-granted", false);
|
||||
#endif
|
||||
osvr.addObserver(this, "session-save", false);
|
||||
osvr.addObserver(this, "places-init-complete", false);
|
||||
Services.obs.addObserver(this, "session-save", false);
|
||||
Services.obs.addObserver(this, "places-init-complete", false);
|
||||
this._isPlacesInitObserver = true;
|
||||
osvr.addObserver(this, "places-database-locked", false);
|
||||
Services.obs.addObserver(this, "places-database-locked", false);
|
||||
this._isPlacesLockedObserver = true;
|
||||
osvr.addObserver(this, "distribution-customization-complete", false);
|
||||
Services.obs.addObserver(this, "distribution-customization-complete", false);
|
||||
},
|
||||
|
||||
// cleanup (called on application shutdown)
|
||||
_dispose: function BG__dispose() {
|
||||
// observer removal
|
||||
const osvr = this._observerService;
|
||||
osvr.removeObserver(this, "xpcom-shutdown");
|
||||
osvr.removeObserver(this, "prefservice:after-app-defaults");
|
||||
osvr.removeObserver(this, "final-ui-startup");
|
||||
osvr.removeObserver(this, "sessionstore-windows-restored");
|
||||
osvr.removeObserver(this, "browser:purge-session-history");
|
||||
osvr.removeObserver(this, "quit-application-requested");
|
||||
osvr.removeObserver(this, "quit-application-granted");
|
||||
// observer removal
|
||||
Services.obs.removeObserver(this, "xpcom-shutdown");
|
||||
Services.obs.removeObserver(this, "prefservice:after-app-defaults");
|
||||
Services.obs.removeObserver(this, "final-ui-startup");
|
||||
Services.obs.removeObserver(this, "sessionstore-windows-restored");
|
||||
Services.obs.removeObserver(this, "browser:purge-session-history");
|
||||
Services.obs.removeObserver(this, "quit-application-requested");
|
||||
Services.obs.removeObserver(this, "quit-application-granted");
|
||||
#ifdef OBSERVE_LASTWINDOW_CLOSE_TOPICS
|
||||
osvr.removeObserver(this, "browser-lastwindow-close-requested");
|
||||
osvr.removeObserver(this, "browser-lastwindow-close-granted");
|
||||
Services.obs.removeObserver(this, "browser-lastwindow-close-requested");
|
||||
Services.obs.removeObserver(this, "browser-lastwindow-close-granted");
|
||||
#endif
|
||||
osvr.removeObserver(this, "session-save");
|
||||
Services.obs.removeObserver(this, "session-save");
|
||||
if (this._isIdleObserver)
|
||||
this._idleService.removeIdleObserver(this, BOOKMARKS_BACKUP_IDLE_TIME);
|
||||
if (this._isPlacesInitObserver)
|
||||
osvr.removeObserver(this, "places-init-complete");
|
||||
Services.obs.removeObserver(this, "places-init-complete");
|
||||
if (this._isPlacesLockedObserver)
|
||||
osvr.removeObserver(this, "places-database-locked");
|
||||
Services.obs.removeObserver(this, "places-database-locked");
|
||||
},
|
||||
|
||||
_onAppDefaults: function BG__onAppDefaults() {
|
||||
|
@ -285,13 +266,9 @@ BrowserGlue.prototype = {
|
|||
_onProfileStartup: function BG__onProfileStartup() {
|
||||
this._sanitizer.onStartup();
|
||||
// check if we're in safe mode
|
||||
var app = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).
|
||||
QueryInterface(Ci.nsIXULRuntime);
|
||||
if (app.inSafeMode) {
|
||||
var ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].
|
||||
getService(Ci.nsIWindowWatcher);
|
||||
ww.openWindow(null, "chrome://browser/content/safeMode.xul",
|
||||
"_blank", "chrome,centerscreen,modal,resizable=no", null);
|
||||
if (Services.appinfo.inSafeMode) {
|
||||
Services.ww.openWindow(null, "chrome://browser/content/safeMode.xul",
|
||||
"_blank", "chrome,centerscreen,modal,resizable=no", null);
|
||||
}
|
||||
|
||||
// apply distribution customizations
|
||||
|
@ -301,24 +278,20 @@ BrowserGlue.prototype = {
|
|||
// handle any UI migration
|
||||
this._migrateUI();
|
||||
|
||||
var ioService = Cc["@mozilla.org/network/io-service;1"].
|
||||
getService(Ci.nsIIOService2);
|
||||
|
||||
// if ioService is managing the offline status, then ioservice.offline
|
||||
// is already set correctly. We will continue to allow the ioService
|
||||
// to manage its offline state until the user uses the "Work Offline" UI.
|
||||
if (!ioService.manageOfflineStatus) {
|
||||
if (!Services.io.manageOfflineStatus) {
|
||||
// set the initial state
|
||||
try {
|
||||
ioService.offline = this._prefs.getBoolPref("browser.offline");
|
||||
Services.io.offline = Services.prefs.getBoolPref("browser.offline");
|
||||
}
|
||||
catch (e) {
|
||||
ioService.offline = false;
|
||||
Services.io.offline = false;
|
||||
}
|
||||
}
|
||||
|
||||
this._observerService
|
||||
.notifyObservers(null, "browser-ui-startup-complete", "");
|
||||
Services.obs.notifyObservers(null, "browser-ui-startup-complete", "");
|
||||
},
|
||||
|
||||
// profile shutdown handler (contains profile cleanup routines)
|
||||
|
@ -348,11 +321,11 @@ BrowserGlue.prototype = {
|
|||
this._showRightsNotification();
|
||||
|
||||
// Show update notification, if needed.
|
||||
if (this._prefs.prefHasUserValue("app.update.postupdate"))
|
||||
if (Services.prefs.prefHasUserValue("app.update.postupdate"))
|
||||
this._showUpdateNotification();
|
||||
|
||||
// If new add-ons were installed during startup open the add-ons manager.
|
||||
if (this._prefs.prefHasUserValue(PREF_EM_NEW_ADDONS_LIST)) {
|
||||
if (Services.prefs.prefHasUserValue(PREF_EM_NEW_ADDONS_LIST)) {
|
||||
var args = Cc["@mozilla.org/supports-array;1"].
|
||||
createInstance(Ci.nsISupportsArray);
|
||||
var str = Cc["@mozilla.org/supports-string;1"].
|
||||
|
@ -361,14 +334,12 @@ BrowserGlue.prototype = {
|
|||
args.AppendElement(str);
|
||||
var str = Cc["@mozilla.org/supports-string;1"].
|
||||
createInstance(Ci.nsISupportsString);
|
||||
str.data = this._prefs.getCharPref(PREF_EM_NEW_ADDONS_LIST);
|
||||
str.data = Services.prefs.getCharPref(PREF_EM_NEW_ADDONS_LIST);
|
||||
args.AppendElement(str);
|
||||
const EMURL = "chrome://mozapps/content/extensions/extensions.xul";
|
||||
const EMFEATURES = "chrome,menubar,extra-chrome,toolbar,dialog=no,resizable";
|
||||
var ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].
|
||||
getService(Ci.nsIWindowWatcher);
|
||||
ww.openWindow(null, EMURL, "_blank", EMFEATURES, args);
|
||||
this._prefs.clearUserPref(PREF_EM_NEW_ADDONS_LIST);
|
||||
Services.ww.openWindow(null, EMURL, "_blank", EMFEATURES, args);
|
||||
Services.prefs.clearUserPref(PREF_EM_NEW_ADDONS_LIST);
|
||||
}
|
||||
|
||||
// Load the "more info" page for a locked places.sqlite
|
||||
|
@ -382,7 +353,7 @@ BrowserGlue.prototype = {
|
|||
|
||||
// If there are plugins installed that are outdated, and the user hasn't
|
||||
// been warned about them yet, open the plugins update page.
|
||||
if (this._prefs.getBoolPref(PREF_PLUGINS_NOTIFYUSER))
|
||||
if (Services.prefs.getBoolPref(PREF_PLUGINS_NOTIFYUSER))
|
||||
this._showPluginUpdatePage();
|
||||
|
||||
#ifdef XP_WIN
|
||||
|
@ -404,12 +375,9 @@ BrowserGlue.prototype = {
|
|||
if ((aCancelQuit instanceof Ci.nsISupportsPRBool) && aCancelQuit.data)
|
||||
return;
|
||||
|
||||
var wm = Cc["@mozilla.org/appshell/window-mediator;1"].
|
||||
getService(Ci.nsIWindowMediator);
|
||||
|
||||
var windowcount = 0;
|
||||
var pagecount = 0;
|
||||
var browserEnum = wm.getEnumerator("navigator:browser");
|
||||
var browserEnum = Services.wm.getEnumerator("navigator:browser");
|
||||
while (browserEnum.hasMoreElements()) {
|
||||
windowcount++;
|
||||
|
||||
|
@ -432,14 +400,14 @@ BrowserGlue.prototype = {
|
|||
// browser.warnOnRestart specifically covers app-initiated restarts where we restart the app
|
||||
// browser.tabs.warnOnClose is the global "warn when closing multiple tabs" pref
|
||||
|
||||
var sessionWillBeSaved = this._prefs.getIntPref("browser.startup.page") == 3 ||
|
||||
this._prefs.getBoolPref("browser.sessionstore.resume_session_once");
|
||||
if (sessionWillBeSaved || !this._prefs.getBoolPref("browser.warnOnQuit"))
|
||||
var sessionWillBeSaved = Services.prefs.getIntPref("browser.startup.page") == 3 ||
|
||||
Services.prefs.getBoolPref("browser.sessionstore.resume_session_once");
|
||||
if (sessionWillBeSaved || !Services.prefs.getBoolPref("browser.warnOnQuit"))
|
||||
showPrompt = false;
|
||||
else if (aQuitType == "restart")
|
||||
showPrompt = this._prefs.getBoolPref("browser.warnOnRestart");
|
||||
showPrompt = Services.prefs.getBoolPref("browser.warnOnRestart");
|
||||
else
|
||||
showPrompt = this._prefs.getBoolPref("browser.tabs.warnOnClose");
|
||||
showPrompt = Services.prefs.getBoolPref("browser.tabs.warnOnClose");
|
||||
} catch (ex) {}
|
||||
|
||||
// Never show a prompt inside the private browsing mode
|
||||
|
@ -449,8 +417,8 @@ BrowserGlue.prototype = {
|
|||
if (!showPrompt || inPrivateBrowsing)
|
||||
return false;
|
||||
|
||||
var quitBundle = this._bundleService.createBundle("chrome://browser/locale/quitDialog.properties");
|
||||
var brandBundle = this._bundleService.createBundle("chrome://branding/locale/brand.properties");
|
||||
var quitBundle = Services.strings.createBundle("chrome://browser/locale/quitDialog.properties");
|
||||
var brandBundle = Services.strings.createBundle("chrome://branding/locale/brand.properties");
|
||||
|
||||
var appName = brandBundle.GetStringFromName("brandShortName");
|
||||
var quitDialogTitle = quitBundle.formatStringFromName(aQuitType + "DialogTitle",
|
||||
|
@ -467,8 +435,7 @@ BrowserGlue.prototype = {
|
|||
message = quitBundle.formatStringFromName("message",
|
||||
[appName], 1);
|
||||
|
||||
var promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"].
|
||||
getService(Ci.nsIPromptService);
|
||||
var promptService = Services.prompt;
|
||||
|
||||
var flags = promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0 +
|
||||
promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_1 +
|
||||
|
@ -487,7 +454,7 @@ BrowserGlue.prototype = {
|
|||
button2Title = quitBundle.GetStringFromName("quitTitle");
|
||||
}
|
||||
|
||||
var mostRecentBrowserWindow = wm.getMostRecentWindow("navigator:browser");
|
||||
var mostRecentBrowserWindow = Services.wm.getMostRecentWindow("navigator:browser");
|
||||
var buttonChoice =
|
||||
promptService.confirmEx(mostRecentBrowserWindow, quitDialogTitle, message,
|
||||
flags, button0Title, button1Title, button2Title,
|
||||
|
@ -496,7 +463,7 @@ BrowserGlue.prototype = {
|
|||
switch (buttonChoice) {
|
||||
case 2: // Quit
|
||||
if (neverAsk.value)
|
||||
this._prefs.setBoolPref("browser.tabs.warnOnClose", false);
|
||||
Services.prefs.setBoolPref("browser.tabs.warnOnClose", false);
|
||||
break;
|
||||
case 1: // Cancel
|
||||
aCancelQuit.QueryInterface(Ci.nsISupportsPRBool);
|
||||
|
@ -506,10 +473,10 @@ BrowserGlue.prototype = {
|
|||
this._saveSession = true;
|
||||
if (neverAsk.value) {
|
||||
if (aQuitType == "restart")
|
||||
this._prefs.setBoolPref("browser.warnOnRestart", false);
|
||||
Services.prefs.setBoolPref("browser.warnOnRestart", false);
|
||||
else {
|
||||
// always save state when shutting down
|
||||
this._prefs.setIntPref("browser.startup.page", 3);
|
||||
Services.prefs.setIntPref("browser.startup.page", 3);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -528,11 +495,11 @@ BrowserGlue.prototype = {
|
|||
// Look for an unconditional override pref. If set, do what it says.
|
||||
// (true --> never show, false --> always show)
|
||||
try {
|
||||
return !this._prefs.getBoolPref("browser.rights.override");
|
||||
return !Services.prefs.getBoolPref("browser.rights.override");
|
||||
} catch (e) { }
|
||||
// Ditto, for the legacy EULA pref.
|
||||
try {
|
||||
return !this._prefs.getBoolPref("browser.EULA.override");
|
||||
return !Services.prefs.getBoolPref("browser.EULA.override");
|
||||
} catch (e) { }
|
||||
|
||||
#ifndef OFFICIAL_BUILD
|
||||
|
@ -541,15 +508,15 @@ BrowserGlue.prototype = {
|
|||
#endif
|
||||
|
||||
// Look to see if the user has seen the current version or not.
|
||||
var currentVersion = this._prefs.getIntPref("browser.rights.version");
|
||||
var currentVersion = Services.prefs.getIntPref("browser.rights.version");
|
||||
try {
|
||||
return !this._prefs.getBoolPref("browser.rights." + currentVersion + ".shown");
|
||||
return !Services.prefs.getBoolPref("browser.rights." + currentVersion + ".shown");
|
||||
} catch (e) { }
|
||||
|
||||
// Legacy: If the user accepted a EULA, we won't annoy them with the
|
||||
// equivalent about:rights page until the version changes.
|
||||
try {
|
||||
return !this._prefs.getBoolPref("browser.EULA." + currentVersion + ".accepted");
|
||||
return !Services.prefs.getBoolPref("browser.EULA." + currentVersion + ".accepted");
|
||||
} catch (e) { }
|
||||
|
||||
// We haven't shown the notification before, so do so now.
|
||||
|
@ -562,8 +529,8 @@ BrowserGlue.prototype = {
|
|||
var browser = win.gBrowser; // for closure in notification bar callback
|
||||
var notifyBox = browser.getNotificationBox();
|
||||
|
||||
var brandBundle = this._bundleService.createBundle("chrome://branding/locale/brand.properties");
|
||||
var rightsBundle = this._bundleService.createBundle("chrome://global/locale/aboutRights.properties");
|
||||
var brandBundle = Services.strings.createBundle("chrome://branding/locale/brand.properties");
|
||||
var rightsBundle = Services.strings.createBundle("chrome://global/locale/aboutRights.properties");
|
||||
|
||||
var buttonLabel = rightsBundle.GetStringFromName("buttonLabel");
|
||||
var buttonAccessKey = rightsBundle.GetStringFromName("buttonAccessKey");
|
||||
|
@ -582,15 +549,15 @@ BrowserGlue.prototype = {
|
|||
];
|
||||
|
||||
// Set pref to indicate we've shown the notification.
|
||||
var currentVersion = this._prefs.getIntPref("browser.rights.version");
|
||||
this._prefs.setBoolPref("browser.rights." + currentVersion + ".shown", true);
|
||||
var currentVersion = Services.prefs.getIntPref("browser.rights.version");
|
||||
Services.prefs.setBoolPref("browser.rights." + currentVersion + ".shown", true);
|
||||
|
||||
var box = notifyBox.appendNotification(notifyRightsText, "about-rights", null, notifyBox.PRIORITY_INFO_LOW, buttons);
|
||||
box.persistence = 3; // arbitrary number, just so bar sticks around for a bit
|
||||
},
|
||||
|
||||
_showUpdateNotification: function BG__showUpdateNotification() {
|
||||
this._prefs.clearUserPref("app.update.postupdate");
|
||||
Services.prefs.clearUserPref("app.update.postupdate");
|
||||
|
||||
var um = Cc["@mozilla.org/updates/update-manager;1"].
|
||||
getService(Ci.nsIUpdateManager);
|
||||
|
@ -610,10 +577,8 @@ BrowserGlue.prototype = {
|
|||
|
||||
var formatter = Cc["@mozilla.org/toolkit/URLFormatterService;1"].
|
||||
getService(Ci.nsIURLFormatter);
|
||||
var browserBundle = this._bundleService.
|
||||
createBundle("chrome://browser/locale/browser.properties");
|
||||
var brandBundle = this._bundleService.
|
||||
createBundle("chrome://branding/locale/brand.properties");
|
||||
var browserBundle = Services.strings.createBundle("chrome://browser/locale/browser.properties");
|
||||
var brandBundle = Services.strings.createBundle("chrome://branding/locale/brand.properties");
|
||||
var appName = brandBundle.GetStringFromName("brandShortName");
|
||||
|
||||
function getNotifyString(aPropData) {
|
||||
|
@ -706,7 +671,7 @@ BrowserGlue.prototype = {
|
|||
},
|
||||
|
||||
_showPluginUpdatePage: function BG__showPluginUpdatePage() {
|
||||
this._prefs.setBoolPref(PREF_PLUGINS_NOTIFYUSER, false);
|
||||
Services.prefs.setBoolPref(PREF_PLUGINS_NOTIFYUSER, false);
|
||||
|
||||
var formatter = Cc["@mozilla.org/toolkit/URLFormatterService;1"].
|
||||
getService(Ci.nsIURLFormatter);
|
||||
|
@ -766,7 +731,7 @@ BrowserGlue.prototype = {
|
|||
var importBookmarksHTML = false;
|
||||
try {
|
||||
importBookmarksHTML =
|
||||
this._prefs.getBoolPref("browser.places.importBookmarksHTML");
|
||||
Services.prefs.getBoolPref("browser.places.importBookmarksHTML");
|
||||
if (importBookmarksHTML)
|
||||
importBookmarks = true;
|
||||
} catch(ex) {}
|
||||
|
@ -776,7 +741,7 @@ BrowserGlue.prototype = {
|
|||
var restoreDefaultBookmarks = false;
|
||||
try {
|
||||
restoreDefaultBookmarks =
|
||||
this._prefs.getBoolPref("browser.bookmarks.restore_default_bookmarks");
|
||||
Services.prefs.getBoolPref("browser.bookmarks.restore_default_bookmarks");
|
||||
if (restoreDefaultBookmarks) {
|
||||
// Ensure that we already have a bookmarks backup for today.
|
||||
this._backupBookmarks();
|
||||
|
@ -826,14 +791,14 @@ BrowserGlue.prototype = {
|
|||
// smart bookmarks are disabled.
|
||||
var autoExportHTML = false;
|
||||
try {
|
||||
autoExportHTML = this._prefs.getBoolPref("browser.bookmarks.autoExportHTML");
|
||||
autoExportHTML = Services.prefs.getBoolPref("browser.bookmarks.autoExportHTML");
|
||||
} catch(ex) {}
|
||||
var smartBookmarksVersion = 0;
|
||||
try {
|
||||
smartBookmarksVersion = this._prefs.getIntPref("browser.places.smartBookmarksVersion");
|
||||
smartBookmarksVersion = Services.prefs.getIntPref("browser.places.smartBookmarksVersion");
|
||||
} catch(ex) {}
|
||||
if (!autoExportHTML && smartBookmarksVersion != -1)
|
||||
this._prefs.setIntPref("browser.places.smartBookmarksVersion", 0);
|
||||
Services.prefs.setIntPref("browser.places.smartBookmarksVersion", 0);
|
||||
|
||||
// Get bookmarks.html file location
|
||||
var dirService = Cc["@mozilla.org/file/directory_service;1"].
|
||||
|
@ -851,8 +816,8 @@ BrowserGlue.prototype = {
|
|||
if (bookmarksFile.exists()) {
|
||||
// Add an import observer. It will ensure that smart bookmarks are
|
||||
// created once the operation is complete.
|
||||
this._observerService.addObserver(this, "bookmarks-restore-success", false);
|
||||
this._observerService.addObserver(this, "bookmarks-restore-failed", false);
|
||||
Services.obs.addObserver(this, "bookmarks-restore-success", false);
|
||||
Services.obs.addObserver(this, "bookmarks-restore-failed", false);
|
||||
|
||||
// Import from bookmarks.html file.
|
||||
try {
|
||||
|
@ -862,8 +827,8 @@ BrowserGlue.prototype = {
|
|||
} catch (err) {
|
||||
// Report the error, but ignore it.
|
||||
Cu.reportError("Bookmarks.html file could be corrupt. " + err);
|
||||
this._observerService.removeObserver(this, "bookmarks-restore-success");
|
||||
this._observerService.removeObserver(this, "bookmarks-restore-failed");
|
||||
Services.obs.removeObserver(this, "bookmarks-restore-success");
|
||||
Services.obs.removeObserver(this, "bookmarks-restore-failed");
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -871,10 +836,10 @@ BrowserGlue.prototype = {
|
|||
|
||||
// Reset preferences, so we won't try to import again at next run
|
||||
if (importBookmarksHTML)
|
||||
this._prefs.setBoolPref("browser.places.importBookmarksHTML", false);
|
||||
Services.prefs.setBoolPref("browser.places.importBookmarksHTML", false);
|
||||
if (restoreDefaultBookmarks)
|
||||
this._prefs.setBoolPref("browser.bookmarks.restore_default_bookmarks",
|
||||
false);
|
||||
Services.prefs.setBoolPref("browser.bookmarks.restore_default_bookmarks",
|
||||
false);
|
||||
}
|
||||
|
||||
// Initialize bookmark archiving on idle.
|
||||
|
@ -900,7 +865,7 @@ BrowserGlue.prototype = {
|
|||
// on the legacy format.
|
||||
var autoExportHTML = false;
|
||||
try {
|
||||
autoExportHTML = this._prefs.getBoolPref("browser.bookmarks.autoExportHTML");
|
||||
autoExportHTML = Services.prefs.getBoolPref("browser.bookmarks.autoExportHTML");
|
||||
} catch(ex) { /* Don't export */ }
|
||||
|
||||
if (autoExportHTML) {
|
||||
|
@ -924,7 +889,7 @@ BrowserGlue.prototype = {
|
|||
new Date() - PlacesUtils.backups.getDateForFile(lastBackupFile) > BOOKMARKS_BACKUP_INTERVAL) {
|
||||
let maxBackups = BOOKMARKS_BACKUP_MAX_BACKUPS;
|
||||
try {
|
||||
maxBackups = this._prefs.getIntPref("browser.bookmarks.max_backups");
|
||||
maxBackups = Services.prefs.getIntPref("browser.bookmarks.max_backups");
|
||||
}
|
||||
catch(ex) { /* Use default. */ }
|
||||
|
||||
|
@ -936,9 +901,9 @@ BrowserGlue.prototype = {
|
|||
* Show the notificationBox for a locked places database.
|
||||
*/
|
||||
_showPlacesLockedNotificationBox: function BG__showPlacesLockedNotificationBox() {
|
||||
var brandBundle = this._bundleService.createBundle("chrome://branding/locale/brand.properties");
|
||||
var brandBundle = Services.strings.createBundle("chrome://branding/locale/brand.properties");
|
||||
var applicationName = brandBundle.GetStringFromName("brandShortName");
|
||||
var placesBundle = this._bundleService.createBundle("chrome://browser/locale/places/places.properties");
|
||||
var placesBundle = Services.strings.createBundle("chrome://browser/locale/places/places.properties");
|
||||
var title = placesBundle.GetStringFromName("lockPrompt.title");
|
||||
var text = placesBundle.formatStringFromName("lockPrompt.text", [applicationName], 1);
|
||||
var buttonText = placesBundle.GetStringFromName("lockPromptInfoButton.label");
|
||||
|
@ -973,7 +938,7 @@ BrowserGlue.prototype = {
|
|||
_migrateUI: function BG__migrateUI() {
|
||||
var migration = 0;
|
||||
try {
|
||||
migration = this._prefs.getIntPref("browser.migration.version");
|
||||
migration = Services.prefs.getIntPref("browser.migration.version");
|
||||
} catch(ex) {}
|
||||
|
||||
if (migration == 0) {
|
||||
|
@ -1017,7 +982,7 @@ BrowserGlue.prototype = {
|
|||
this._dataSource = null;
|
||||
|
||||
// update the migration version
|
||||
this._prefs.setIntPref("browser.migration.version", 1);
|
||||
Services.prefs.setIntPref("browser.migration.version", 1);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -1072,7 +1037,7 @@ BrowserGlue.prototype = {
|
|||
// By default, if the pref is not set up, we must create Smart Bookmarks
|
||||
var smartBookmarksCurrentVersion = 0;
|
||||
try {
|
||||
smartBookmarksCurrentVersion = this._prefs.getIntPref(SMART_BOOKMARKS_PREF);
|
||||
smartBookmarksCurrentVersion = Services.prefs.getIntPref(SMART_BOOKMARKS_PREF);
|
||||
} catch(ex) { /* no version set, new profile */ }
|
||||
|
||||
// bail out if we don't have to create or update Smart Bookmarks
|
||||
|
@ -1087,9 +1052,7 @@ BrowserGlue.prototype = {
|
|||
|
||||
var callback = {
|
||||
_uri: function BG_EPDQI__uri(aSpec) {
|
||||
return Cc["@mozilla.org/network/io-service;1"].
|
||||
getService(Ci.nsIIOService).
|
||||
newURI(aSpec, null, null);
|
||||
return Services.io.newURI(aSpec, null, null);
|
||||
},
|
||||
|
||||
runBatched: function BG_EPDQI_runBatched() {
|
||||
|
@ -1097,9 +1060,7 @@ BrowserGlue.prototype = {
|
|||
var bookmarksMenuIndex = 0;
|
||||
var bookmarksToolbarIndex = 0;
|
||||
|
||||
var placesBundle = Cc["@mozilla.org/intl/stringbundle;1"].
|
||||
getService(Ci.nsIStringBundleService).
|
||||
createBundle("chrome://browser/locale/places/places.properties");
|
||||
var placesBundle = Services.strings.createBundle("chrome://browser/locale/places/places.properties");
|
||||
|
||||
// MOST VISITED
|
||||
var smart = {queryId: "MostVisited", // don't change this
|
||||
|
@ -1207,8 +1168,8 @@ BrowserGlue.prototype = {
|
|||
Components.utils.reportError(ex);
|
||||
}
|
||||
finally {
|
||||
this._prefs.setIntPref(SMART_BOOKMARKS_PREF, SMART_BOOKMARKS_VERSION);
|
||||
this._prefs.QueryInterface(Ci.nsIPrefService).savePrefFile(null);
|
||||
Services.prefs.setIntPref(SMART_BOOKMARKS_PREF, SMART_BOOKMARKS_VERSION);
|
||||
Services.prefs.savePrefFile(null);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -1218,21 +1179,18 @@ BrowserGlue.prototype = {
|
|||
|
||||
// this returns the most recent non-popup browser window
|
||||
getMostRecentBrowserWindow: function BG_getMostRecentBrowserWindow() {
|
||||
var wm = Cc["@mozilla.org/appshell/window-mediator;1"].
|
||||
getService(Ci.nsIWindowMediator);
|
||||
|
||||
function isFullBrowserWindow(win) {
|
||||
return !win.closed &&
|
||||
!win.document.documentElement.getAttribute("chromehidden");
|
||||
}
|
||||
|
||||
#ifdef BROKEN_WM_Z_ORDER
|
||||
var win = wm.getMostRecentWindow("navigator:browser");
|
||||
var win = Services.wm.getMostRecentWindow("navigator:browser");
|
||||
|
||||
// if we're lucky, this isn't a popup, and we can just return this
|
||||
if (win && !isFullBrowserWindow(win)) {
|
||||
win = null;
|
||||
let windowList = wm.getEnumerator("navigator:browser");
|
||||
let windowList = Services.wm.getEnumerator("navigator:browser");
|
||||
// this is oldest to newest, so this gets a bit ugly
|
||||
while (windowList.hasMoreElements()) {
|
||||
let nextWin = windowList.getNext();
|
||||
|
@ -1242,7 +1200,7 @@ BrowserGlue.prototype = {
|
|||
}
|
||||
return win;
|
||||
#else
|
||||
var windowList = wm.getZOrderDOMWindowEnumerator("navigator:browser", true);
|
||||
var windowList = Services.wm.getZOrderDOMWindowEnumerator("navigator:browser", true);
|
||||
while (windowList.hasMoreElements()) {
|
||||
let win = windowList.getNext();
|
||||
if (isFullBrowserWindow(win))
|
||||
|
@ -1282,9 +1240,7 @@ GeolocationPrompt.prototype = {
|
|||
QueryInterface: XPCOMUtils.generateQI([Ci.nsIGeolocationPrompt]),
|
||||
|
||||
prompt: function GP_prompt(request) {
|
||||
var pm = Cc["@mozilla.org/permissionmanager;1"].getService(Ci.nsIPermissionManager);
|
||||
|
||||
var result = pm.testExactPermission(request.requestingURI, "geo");
|
||||
var result = Services.perms.testExactPermission(request.requestingURI, "geo");
|
||||
|
||||
if (result == Ci.nsIPermissionManager.ALLOW_ACTION) {
|
||||
request.allow();
|
||||
|
@ -1298,9 +1254,9 @@ GeolocationPrompt.prototype = {
|
|||
|
||||
function setPagePermission(uri, allow) {
|
||||
if (allow == true)
|
||||
pm.add(uri, "geo", Ci.nsIPermissionManager.ALLOW_ACTION);
|
||||
Services.perms.add(uri, "geo", Ci.nsIPermissionManager.ALLOW_ACTION);
|
||||
else
|
||||
pm.add(uri, "geo", Ci.nsIPermissionManager.DENY_ACTION);
|
||||
Services.perms.add(uri, "geo", Ci.nsIPermissionManager.DENY_ACTION);
|
||||
}
|
||||
|
||||
function getChromeWindow(aWindow) {
|
||||
|
@ -1323,8 +1279,7 @@ GeolocationPrompt.prototype = {
|
|||
|
||||
var notification = notificationBox.getNotificationWithValue("geolocation");
|
||||
if (!notification) {
|
||||
var bundleService = Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService);
|
||||
var browserBundle = bundleService.createBundle("chrome://browser/locale/browser.properties");
|
||||
var browserBundle = Services.strings.createBundle("chrome://browser/locale/browser.properties");
|
||||
|
||||
var buttons = [{
|
||||
label: browserBundle.GetStringFromName("geolocation.shareLocation"),
|
||||
|
|
|
@ -279,7 +279,7 @@ var BookmarkPropertiesPanel = {
|
|||
// Load In Sidebar
|
||||
this._loadInSidebar = PlacesUtils.annotations
|
||||
.itemHasAnnotation(this._itemId,
|
||||
LOAD_IN_SIDEBAR_ANNO);
|
||||
PlacesUIUtils.LOAD_IN_SIDEBAR_ANNO);
|
||||
break;
|
||||
|
||||
case "folder":
|
||||
|
@ -295,10 +295,10 @@ var BookmarkPropertiesPanel = {
|
|||
|
||||
// Description
|
||||
if (PlacesUtils.annotations
|
||||
.itemHasAnnotation(this._itemId, DESCRIPTION_ANNO)) {
|
||||
.itemHasAnnotation(this._itemId, PlacesUIUtils.DESCRIPTION_ANNO)) {
|
||||
this._description = PlacesUtils.annotations
|
||||
.getItemAnnotation(this._itemId,
|
||||
DESCRIPTION_ANNO);
|
||||
PlacesUIUtils.DESCRIPTION_ANNO);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -114,6 +114,9 @@ InsertionPoint.prototype = {
|
|||
|
||||
function PlacesController(aView) {
|
||||
this._view = aView;
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "clipboard",
|
||||
"@mozilla.org/widget/clipboard;1",
|
||||
"nsIClipboard");
|
||||
}
|
||||
|
||||
PlacesController.prototype = {
|
||||
|
@ -170,7 +173,7 @@ PlacesController.prototype = {
|
|||
return this._canInsert();
|
||||
case "placesCmd_new:separator":
|
||||
return this._canInsert() &&
|
||||
!asQuery(this._view.getResultNode()).queryOptions.excludeItems &&
|
||||
!PlacesUtils.asQuery(this._view.getResultNode()).queryOptions.excludeItems &&
|
||||
this._view.getResult().sortingMode ==
|
||||
Ci.nsINavHistoryQueryOptions.SORT_BY_NONE;
|
||||
case "placesCmd_show:info":
|
||||
|
@ -183,7 +186,7 @@ PlacesController.prototype = {
|
|||
case "placesCmd_reloadMicrosummary":
|
||||
var selectedNode = this._view.selectedNode;
|
||||
return selectedNode && PlacesUtils.nodeIsBookmark(selectedNode) &&
|
||||
PlacesUIUtils.microsummaries.hasMicrosummary(selectedNode.itemId);
|
||||
PlacesUtils.microsummaries.hasMicrosummary(selectedNode.itemId);
|
||||
case "placesCmd_reload":
|
||||
// Livemark containers
|
||||
var selectedNode = this._view.selectedNode;
|
||||
|
@ -389,7 +392,7 @@ PlacesController.prototype = {
|
|||
// pasteable, with no need to unwrap all the nodes.
|
||||
|
||||
var flavors = PlacesControllerDragHelper.placesFlavors;
|
||||
var clipboard = PlacesUIUtils.clipboard;
|
||||
var clipboard = this.clipboard;
|
||||
var hasPlacesData =
|
||||
clipboard.hasDataMatchingFlavors(flavors, flavors.length,
|
||||
Ci.nsIClipboard.kGlobalClipboard);
|
||||
|
@ -465,7 +468,7 @@ PlacesController.prototype = {
|
|||
case Ci.nsINavHistoryResultNode.RESULT_TYPE_QUERY:
|
||||
nodeData["query"] = true;
|
||||
if (node.parent) {
|
||||
switch (asQuery(node.parent).queryOptions.resultType) {
|
||||
switch (PlacesUtils.asQuery(node.parent).queryOptions.resultType) {
|
||||
case Ci.nsINavHistoryQueryOptions.RESULTS_AS_SITE_QUERY:
|
||||
nodeData["host"] = true;
|
||||
break;
|
||||
|
@ -494,7 +497,7 @@ PlacesController.prototype = {
|
|||
if (PlacesUtils.nodeIsBookmark(node)) {
|
||||
nodeData["bookmark"] = true;
|
||||
PlacesUtils.nodeIsTagQuery(node.parent)
|
||||
var mss = PlacesUIUtils.microsummaries;
|
||||
var mss = PlacesUtils.microsummaries;
|
||||
if (mss.hasMicrosummary(node.itemId))
|
||||
nodeData["microsummary"] = true;
|
||||
|
||||
|
@ -732,7 +735,7 @@ PlacesController.prototype = {
|
|||
*/
|
||||
reloadSelectedMicrosummary: function PC_reloadSelectedMicrosummary() {
|
||||
var selectedNode = this._view.selectedNode;
|
||||
var mss = PlacesUIUtils.microsummaries;
|
||||
var mss = PlacesUtils.microsummaries;
|
||||
if (mss.hasMicrosummary(selectedNode.itemId))
|
||||
mss.refreshMicrosummary(selectedNode.itemId);
|
||||
},
|
||||
|
@ -940,7 +943,7 @@ PlacesController.prototype = {
|
|||
}
|
||||
else if (PlacesUtils.nodeIsTagQuery(node) && node.parent &&
|
||||
PlacesUtils.nodeIsQuery(node.parent) &&
|
||||
asQuery(node.parent).queryOptions.resultType ==
|
||||
PlacesUtils.asQuery(node.parent).queryOptions.resultType ==
|
||||
Ci.nsINavHistoryQueryOptions.RESULTS_AS_TAG_QUERY) {
|
||||
// This is a tag container.
|
||||
// Untag all URIs tagged with this tag only if the tag container is
|
||||
|
@ -953,7 +956,7 @@ PlacesController.prototype = {
|
|||
}
|
||||
else if (PlacesUtils.nodeIsURI(node) &&
|
||||
PlacesUtils.nodeIsQuery(node.parent) &&
|
||||
asQuery(node.parent).queryOptions.queryType ==
|
||||
PlacesUtils.asQuery(node.parent).queryOptions.queryType ==
|
||||
Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY) {
|
||||
// This is a uri node inside an history query.
|
||||
var bhist = PlacesUtils.history.QueryInterface(Ci.nsIBrowserHistory);
|
||||
|
@ -962,7 +965,7 @@ PlacesController.prototype = {
|
|||
}
|
||||
else if (node.itemId == -1 &&
|
||||
PlacesUtils.nodeIsQuery(node) &&
|
||||
asQuery(node).queryOptions.queryType ==
|
||||
PlacesUtils.asQuery(node).queryOptions.queryType ==
|
||||
Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY) {
|
||||
// This is a dynamically generated history query, like queries
|
||||
// grouped by site, time or both. Dynamically generated queries don't
|
||||
|
@ -1022,7 +1025,7 @@ PlacesController.prototype = {
|
|||
}
|
||||
}
|
||||
else if (PlacesUtils.nodeIsQuery(node) &&
|
||||
asQuery(node).queryOptions.queryType ==
|
||||
PlacesUtils.asQuery(node).queryOptions.queryType ==
|
||||
Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY)
|
||||
this._removeHistoryContainer(node);
|
||||
}
|
||||
|
@ -1090,7 +1093,7 @@ PlacesController.prototype = {
|
|||
if (PlacesUtils.nodeIsFolder(root))
|
||||
this._removeRowsFromBookmarks(aTxnName);
|
||||
else if (PlacesUtils.nodeIsQuery(root)) {
|
||||
var queryType = asQuery(root).queryOptions.queryType;
|
||||
var queryType = PlacesUtils.asQuery(root).queryOptions.queryType;
|
||||
if (queryType == Ci.nsINavHistoryQueryOptions.QUERY_TYPE_BOOKMARKS)
|
||||
this._removeRowsFromBookmarks(aTxnName);
|
||||
else if (queryType == Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY)
|
||||
|
@ -1216,7 +1219,7 @@ PlacesController.prototype = {
|
|||
addData(PlacesUtils.TYPE_HTML, htmlString);
|
||||
|
||||
if (placeString || unicodeString || htmlString || mozURLString) {
|
||||
PlacesUIUtils.clipboard.setData(xferable, null, Ci.nsIClipboard.kGlobalClipboard);
|
||||
this.clipboard.setData(xferable, null, Ci.nsIClipboard.kGlobalClipboard);
|
||||
}
|
||||
}
|
||||
finally {
|
||||
|
@ -1260,7 +1263,7 @@ PlacesController.prototype = {
|
|||
return xferable;
|
||||
}
|
||||
|
||||
var clipboard = PlacesUIUtils.clipboard;
|
||||
var clipboard = this.clipboard;
|
||||
|
||||
var ip = this._view.insertionPoint;
|
||||
if (!ip)
|
||||
|
|
|
@ -174,7 +174,7 @@ var gEditItemOverlay = {
|
|||
// Load In Sidebar checkbox
|
||||
this._element("loadInSidebarCheckbox").checked =
|
||||
PlacesUtils.annotations.itemHasAnnotation(this._itemId,
|
||||
LOAD_IN_SIDEBAR_ANNO);
|
||||
PlacesUIUtils.LOAD_IN_SIDEBAR_ANNO);
|
||||
}
|
||||
else {
|
||||
if (!this._readOnly) // If readOnly wasn't forced through aInfo
|
||||
|
@ -446,8 +446,8 @@ var gEditItemOverlay = {
|
|||
if (this._itemId != -1 &&
|
||||
this._itemType == Ci.nsINavBookmarksService.TYPE_BOOKMARK &&
|
||||
!this._readOnly)
|
||||
this._microsummaries = PlacesUIUtils.microsummaries
|
||||
.getMicrosummaries(this._uri, -1);
|
||||
this._microsummaries = PlacesUtils.microsummaries
|
||||
.getMicrosummaries(this._uri, -1);
|
||||
}
|
||||
catch(ex) {
|
||||
// getMicrosummaries will throw an exception in at least two cases:
|
||||
|
@ -458,6 +458,7 @@ var gEditItemOverlay = {
|
|||
// content types the service knows how to summarize).
|
||||
this._microsummaries = null;
|
||||
}
|
||||
|
||||
if (this._microsummaries) {
|
||||
var enumerator = this._microsummaries.Enumerate();
|
||||
|
||||
|
@ -468,8 +469,8 @@ var gEditItemOverlay = {
|
|||
var microsummary = enumerator.getNext()
|
||||
.QueryInterface(Ci.nsIMicrosummary);
|
||||
var menuItem = this._createMicrosummaryMenuItem(microsummary);
|
||||
if (PlacesUIUtils.microsummaries
|
||||
.isMicrosummary(this._itemId, microsummary))
|
||||
if (PlacesUtils.microsummaries
|
||||
.isMicrosummary(this._itemId, microsummary))
|
||||
itemToSelect = menuItem;
|
||||
|
||||
menupopup.appendChild(menuItem);
|
||||
|
@ -693,7 +694,7 @@ var gEditItemOverlay = {
|
|||
var newTitle = this._element("userEnteredName").label;
|
||||
if (this._getItemStaticTitle() != newTitle) {
|
||||
this._mayUpdateFirstEditField("namePicker");
|
||||
if (PlacesUIUtils.microsummaries.hasMicrosummary(this._itemId)) {
|
||||
if (PlacesUtils.microsummaries.hasMicrosummary(this._itemId)) {
|
||||
// Note: this implicitly also takes care of the microsummary->static
|
||||
// title case, the removeMicorosummary method in the service will set
|
||||
// the item-title to the value of this annotation.
|
||||
|
@ -714,10 +715,10 @@ var gEditItemOverlay = {
|
|||
// bookmark previously had one, or the user selected a microsummary which
|
||||
// is not the one the bookmark previously had
|
||||
if ((newMicrosummary == null &&
|
||||
PlacesUIUtils.microsummaries.hasMicrosummary(this._itemId)) ||
|
||||
PlacesUtils.microsummaries.hasMicrosummary(this._itemId)) ||
|
||||
(newMicrosummary != null &&
|
||||
!PlacesUIUtils.microsummaries
|
||||
.isMicrosummary(this._itemId, newMicrosummary))) {
|
||||
!PlacesUtils.microsummaries
|
||||
.isMicrosummary(this._itemId, newMicrosummary))) {
|
||||
txns.push(ptm.editBookmarkMicrosummary(this._itemId, newMicrosummary));
|
||||
}
|
||||
|
||||
|
@ -1122,20 +1123,20 @@ var gEditItemOverlay = {
|
|||
PlacesUtils.bookmarks
|
||||
.getKeywordForBookmark(this._itemId));
|
||||
break;
|
||||
case DESCRIPTION_ANNO:
|
||||
case PlacesUIUtils.DESCRIPTION_ANNO:
|
||||
this._initTextField("descriptionField",
|
||||
PlacesUIUtils.getItemDescription(this._itemId));
|
||||
break;
|
||||
case LOAD_IN_SIDEBAR_ANNO:
|
||||
case PlacesUIUtils.LOAD_IN_SIDEBAR_ANNO:
|
||||
this._element("loadInSidebarCheckbox").checked =
|
||||
PlacesUtils.annotations.itemHasAnnotation(this._itemId,
|
||||
LOAD_IN_SIDEBAR_ANNO);
|
||||
PlacesUIUtils.LOAD_IN_SIDEBAR_ANNO);
|
||||
break;
|
||||
case LMANNO_FEEDURI:
|
||||
case PlacesUtils.LMANNO_FEEDURI:
|
||||
var feedURISpec = PlacesUtils.livemarks.getFeedURI(this._itemId).spec;
|
||||
this._initTextField("feedLocationField", feedURISpec);
|
||||
break;
|
||||
case LMANNO_SITEURI:
|
||||
case PlacesUtils.LMANNO_SITEURI:
|
||||
var siteURISpec = "";
|
||||
var siteURI = PlacesUtils.livemarks.getSiteURI(this._itemId);
|
||||
if (siteURI)
|
||||
|
|
|
@ -604,7 +604,8 @@
|
|||
<parameter name="aParentPopup"/>
|
||||
<parameter name="aBefore"/>
|
||||
<body><![CDATA[
|
||||
let element = PlacesUIUtils.createMenuItemForNode(aChild);
|
||||
let element = PlacesUIUtils.createMenuItemForNode(aChild,
|
||||
aParentPopup.ownerDocument);
|
||||
if (aBefore)
|
||||
aParentPopup.insertBefore(element, aBefore);
|
||||
else {
|
||||
|
@ -981,7 +982,7 @@
|
|||
// so bail out now and save a lot of work when updating commands
|
||||
var resultNode = this._resultNode;
|
||||
if (PlacesUtils.nodeIsQuery(resultNode) &&
|
||||
asQuery(resultNode).queryOptions.queryType ==
|
||||
PlacesUtils.asQuery(resultNode).queryOptions.queryType ==
|
||||
Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY)
|
||||
return null;
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@ var PlacesOrganizer = {
|
|||
this._places.selectItems([itemId]);
|
||||
// Forcefully expand all-bookmarks
|
||||
if (aQueryName == "AllBookmarks")
|
||||
asContainer(this._places.selectedNode).containerOpen = true;
|
||||
PlacesUtils.asContainer(this._places.selectedNode).containerOpen = true;
|
||||
},
|
||||
|
||||
init: function PO_init() {
|
||||
|
@ -216,7 +216,7 @@ var PlacesOrganizer = {
|
|||
return;
|
||||
|
||||
var node = this._places.selectedNode;
|
||||
var queries = asQuery(node).getQueries();
|
||||
var queries = PlacesUtils.asQuery(node).getQueries();
|
||||
|
||||
// Items are only excluded on the left pane.
|
||||
var options = node.queryOptions.clone();
|
||||
|
@ -351,7 +351,7 @@ var PlacesOrganizer = {
|
|||
* main places pane.
|
||||
*/
|
||||
getCurrentOptions: function PO_getCurrentOptions() {
|
||||
return asQuery(this._content.getResult().root).queryOptions;
|
||||
return PlacesUtils.asQuery(this._content.getResult().root).queryOptions;
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -359,7 +359,7 @@ var PlacesOrganizer = {
|
|||
* main places pane.
|
||||
*/
|
||||
getCurrentQueries: function PO_getCurrentQueries() {
|
||||
return asQuery(this._content.getResult().root).getQueries();
|
||||
return PlacesUtils.asQuery(this._content.getResult().root).getQueries();
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -1324,7 +1324,7 @@ var ViewMenu = {
|
|||
lastModified: { key: "LASTMODIFIED", dir: "descending" },
|
||||
description: { key: "ANNOTATION",
|
||||
dir: "ascending",
|
||||
anno: DESCRIPTION_ANNO }
|
||||
anno: PlacesUIUtils.DESCRIPTION_ANNO }
|
||||
};
|
||||
|
||||
// Make sure we have a valid column.
|
||||
|
|
|
@ -51,8 +51,16 @@
|
|||
src="chrome://global/content/globalOverlay.js"/>
|
||||
<script type="application/javascript"
|
||||
src="chrome://browser/content/utilityOverlay.js"/>
|
||||
<script type="application/javascript"
|
||||
src="chrome://browser/content/places/utils.js"/>
|
||||
<script type="application/javascript"><![CDATA[
|
||||
// TODO: Bug 406371.
|
||||
// A bunch of browser code depends on us defining these, sad but true :(
|
||||
var Cc = Components.classes;
|
||||
var Ci = Components.interfaces;
|
||||
var Cr = Components.results;
|
||||
|
||||
Components.utils.import("resource://gre/modules/utils.js");
|
||||
Components.utils.import("resource:///modules/PlacesUIUtils.jsm");
|
||||
]]></script>
|
||||
<script type="application/javascript"
|
||||
src="chrome://browser/content/places/controller.js"/>
|
||||
<script type="application/javascript"
|
||||
|
|
|
@ -250,7 +250,7 @@
|
|||
var popup = document.createElement("menupopup");
|
||||
popup.setAttribute("placespopup", "true");
|
||||
button.appendChild(popup);
|
||||
popup._resultNode = asContainer(aChild);
|
||||
popup._resultNode = PlacesUtils.asContainer(aChild);
|
||||
#ifndef XP_MACOSX
|
||||
popup.setAttribute("context", "placesContext");
|
||||
#endif
|
||||
|
@ -809,7 +809,8 @@
|
|||
<parameter name="aParentPopup"/>
|
||||
<parameter name="aBefore"/>
|
||||
<body><![CDATA[
|
||||
var element = PlacesUIUtils.createMenuItemForNode(aChild);
|
||||
var element = PlacesUIUtils.createMenuItemForNode(aChild,
|
||||
aParentPopup.ownerDocument);
|
||||
|
||||
if (aBefore)
|
||||
aParentPopup.insertBefore(element, aBefore);
|
||||
|
|
|
@ -98,7 +98,7 @@
|
|||
<parameter name="folderRestrict"/>
|
||||
<body><![CDATA[
|
||||
// preserve grouping
|
||||
var queryNode = asQuery(this.getResultNode());
|
||||
var queryNode = PlacesUtils.asQuery(this.getResultNode());
|
||||
var options = queryNode.queryOptions.clone();
|
||||
|
||||
// Make sure we're getting uri results.
|
||||
|
@ -214,7 +214,7 @@
|
|||
if (childURI == placeURI)
|
||||
return child;
|
||||
else if (PlacesUtils.nodeIsContainer(child)) {
|
||||
var nested = findNode(asContainer(child), placeURI, nodesURIChecked);
|
||||
var nested = findNode(PlacesUtils.asContainer(child), placeURI, nodesURIChecked);
|
||||
if (nested)
|
||||
return nested;
|
||||
}
|
||||
|
@ -442,7 +442,7 @@
|
|||
// so bail out now and save a lot of work when updating commands
|
||||
var resultNode = this.getResultNode();
|
||||
if (PlacesUtils.nodeIsQuery(resultNode) &&
|
||||
asQuery(resultNode).queryOptions.queryType ==
|
||||
PlacesUtils.asQuery(resultNode).queryOptions.queryType ==
|
||||
Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY)
|
||||
return this._cachedInsertionPoint = null;
|
||||
|
||||
|
@ -535,7 +535,7 @@
|
|||
if (PlacesControllerDragHelper.disallowInsertion(container))
|
||||
return null;
|
||||
|
||||
var queryOptions = asQuery(result.root).queryOptions;
|
||||
var queryOptions = PlacesUtils.asQuery(result.root).queryOptions;
|
||||
if (queryOptions.sortingMode !=
|
||||
Ci.nsINavHistoryQueryOptions.SORT_BY_NONE) {
|
||||
// If we are within a sorted view, insert at the end
|
||||
|
@ -618,7 +618,7 @@
|
|||
var index = ids.indexOf(node.itemId);
|
||||
if (index == -1 &&
|
||||
node.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT)
|
||||
index = ids.indexOf(asQuery(node).folderItemId);
|
||||
index = ids.indexOf(PlacesUtils.asQuery(node).folderItemId);
|
||||
|
||||
if (index != -1) {
|
||||
nodes.push(node);
|
||||
|
@ -630,7 +630,7 @@
|
|||
nodesURIChecked.indexOf(node.uri) != -1)
|
||||
return foundOne;
|
||||
|
||||
asContainer(node);
|
||||
PlacesUtils.asContainer(node);
|
||||
if (!aOpenContainers && !node.containerOpen)
|
||||
return foundOne;
|
||||
|
||||
|
|
|
@ -570,11 +570,11 @@ PlacesTreeView.prototype = {
|
|||
case Ci.nsINavHistoryQueryOptions.SORT_BY_KEYWORD_DESCENDING:
|
||||
return [this.COLUMN_TYPE_KEYWORD, true];
|
||||
case Ci.nsINavHistoryQueryOptions.SORT_BY_ANNOTATION_ASCENDING:
|
||||
if (this._result.sortingAnnotation == DESCRIPTION_ANNO)
|
||||
if (this._result.sortingAnnotation == PlacesUIUtils.DESCRIPTION_ANNO)
|
||||
return [this.COLUMN_TYPE_DESCRIPTION, false];
|
||||
break;
|
||||
case Ci.nsINavHistoryQueryOptions.SORT_BY_ANNOTATION_DESCENDING:
|
||||
if (this._result.sortingAnnotation == DESCRIPTION_ANNO)
|
||||
if (this._result.sortingAnnotation == PlacesUIUtils.DESCRIPTION_ANNO)
|
||||
return [this.COLUMN_TYPE_DESCRIPTION, true];
|
||||
case Ci.nsINavHistoryQueryOptions.SORT_BY_DATEADDED_ASCENDING:
|
||||
return [this.COLUMN_TYPE_DATEADDED, false];
|
||||
|
@ -653,7 +653,7 @@ PlacesTreeView.prototype = {
|
|||
this._rows.splice(row, 0, aNode);
|
||||
this._tree.rowCountChanged(row, 1);
|
||||
|
||||
if (PlacesUtils.nodeIsContainer(aNode) && asContainer(aNode).containerOpen)
|
||||
if (PlacesUtils.nodeIsContainer(aNode) && PlacesUtils.asContainer(aNode).containerOpen)
|
||||
this.invalidateContainer(aNode);
|
||||
},
|
||||
|
||||
|
@ -827,7 +827,7 @@ PlacesTreeView.prototype = {
|
|||
},
|
||||
|
||||
nodeAnnotationChanged: function PTV_nodeAnnotationChanged(aNode, aAnno) {
|
||||
if (aAnno == DESCRIPTION_ANNO)
|
||||
if (aAnno == PlacesUIUtils.DESCRIPTION_ANNO)
|
||||
this._invalidateCellValue(aNode, this.COLUMN_TYPE_DESCRIPTION);
|
||||
},
|
||||
|
||||
|
@ -1124,7 +1124,7 @@ PlacesTreeView.prototype = {
|
|||
if ((PlacesUtils.nodeIsQuery(parent) ||
|
||||
PlacesUtils.nodeIsFolder(parent)) &&
|
||||
!node.hasChildren)
|
||||
return asQuery(parent).queryOptions.expandQueries;
|
||||
return PlacesUtils.asQuery(parent).queryOptions.expandQueries;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -1210,7 +1210,7 @@ PlacesTreeView.prototype = {
|
|||
if (PlacesControllerDragHelper.disallowInsertion(container))
|
||||
return null;
|
||||
|
||||
let queryOptions = asQuery(this._result.root).queryOptions;
|
||||
let queryOptions = PlacesUtils.asQuery(this._result.root).queryOptions;
|
||||
if (queryOptions.sortingMode !=
|
||||
Ci.nsINavHistoryQueryOptions.SORT_BY_NONE) {
|
||||
// If we are within a sorted view, insert at the end.
|
||||
|
@ -1338,7 +1338,7 @@ PlacesTreeView.prototype = {
|
|||
if (node.itemId != -1) {
|
||||
try {
|
||||
return PlacesUtils.annotations.
|
||||
getItemAnnotation(node.itemId, DESCRIPTION_ANNO);
|
||||
getItemAnnotation(node.itemId, PlacesUIUtils.DESCRIPTION_ANNO);
|
||||
}
|
||||
catch (ex) { /* has no description */ }
|
||||
}
|
||||
|
@ -1472,17 +1472,17 @@ PlacesTreeView.prototype = {
|
|||
break;
|
||||
case this.COLUMN_TYPE_DESCRIPTION:
|
||||
if (oldSort == NHQO.SORT_BY_ANNOTATION_ASCENDING &&
|
||||
oldSortingAnnotation == DESCRIPTION_ANNO) {
|
||||
oldSortingAnnotation == PlacesUIUtils.DESCRIPTION_ANNO) {
|
||||
newSort = NHQO.SORT_BY_ANNOTATION_DESCENDING;
|
||||
newSortingAnnotation = DESCRIPTION_ANNO;
|
||||
newSortingAnnotation = PlacesUIUtils.DESCRIPTION_ANNO;
|
||||
}
|
||||
else if (allowTriState &&
|
||||
oldSort == NHQO.SORT_BY_ANNOTATION_DESCENDING &&
|
||||
oldSortingAnnotation == DESCRIPTION_ANNO)
|
||||
oldSortingAnnotation == PlacesUIUtils.DESCRIPTION_ANNO)
|
||||
newSort = NHQO.SORT_BY_NONE;
|
||||
else {
|
||||
newSort = NHQO.SORT_BY_ANNOTATION_ASCENDING;
|
||||
newSortingAnnotation = DESCRIPTION_ANNO;
|
||||
newSortingAnnotation = PlacesUIUtils.DESCRIPTION_ANNO;
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
|
@ -12,7 +12,6 @@ browser.jar:
|
|||
* content/browser/places/toolbar.xml (content/toolbar.xml)
|
||||
* content/browser/places/menu.xml (content/menu.xml)
|
||||
* content/browser/places/tree.xml (content/tree.xml)
|
||||
* content/browser/places/utils.js (content/utils.js)
|
||||
* content/browser/places/controller.js (content/controller.js)
|
||||
* content/browser/places/treeView.js (content/treeView.js)
|
||||
# keep the Places version of the history sidebar at history/history-panel.xul
|
||||
|
|
|
@ -49,6 +49,10 @@ EXTRA_COMPONENTS = \
|
|||
PlacesProtocolHandler.js \
|
||||
$(NULL)
|
||||
|
||||
EXTRA_PP_JS_MODULES = \
|
||||
PlacesUIUtils.jsm \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
XPIDL_FLAGS += -I$(topsrcdir)/browser/components
|
||||
|
|
|
@ -40,30 +40,24 @@
|
|||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
function LOG(str) {
|
||||
dump("*** " + str + "\n");
|
||||
}
|
||||
var EXPORTED_SYMBOLS = ["PlacesUIUtils"];
|
||||
|
||||
var Ci = Components.interfaces;
|
||||
var Cc = Components.classes;
|
||||
var Cr = Components.results;
|
||||
var Cu = Components.utils;
|
||||
|
||||
__defineGetter__("PlacesUtils", function() {
|
||||
delete this.PlacesUtils
|
||||
var tmpScope = {};
|
||||
Components.utils.import("resource://gre/modules/utils.js", tmpScope);
|
||||
return this.PlacesUtils = tmpScope.PlacesUtils;
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyGetter(this, "Services", function() {
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
return Services;
|
||||
});
|
||||
|
||||
const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
|
||||
const DESCRIPTION_ANNO = "bookmarkProperties/description";
|
||||
const GUID_ANNO = "placesInternal/GUID";
|
||||
const LMANNO_FEEDURI = "livemark/feedURI";
|
||||
const LMANNO_SITEURI = "livemark/siteURI";
|
||||
const ORGANIZER_FOLDER_ANNO = "PlacesOrganizer/OrganizerFolder";
|
||||
const ORGANIZER_QUERY_ANNO = "PlacesOrganizer/OrganizerQuery";
|
||||
const ORGANIZER_LEFTPANE_VERSION = 6;
|
||||
const EXCLUDE_FROM_BACKUP_ANNO = "places/excludeFromBackup";
|
||||
XPCOMUtils.defineLazyGetter(this, "PlacesUtils", function() {
|
||||
Cu.import("resource://gre/modules/utils.js");
|
||||
return PlacesUtils;
|
||||
});
|
||||
|
||||
#ifdef XP_MACOSX
|
||||
// On Mac OSX, the transferable system converts "\r\n" to "\n\n", where we
|
||||
|
@ -74,66 +68,15 @@ const NEWLINE= "\n";
|
|||
const NEWLINE = "\r\n";
|
||||
#endif
|
||||
|
||||
function QI_node(aNode, aIID) {
|
||||
return aNode.QueryInterface(aIID);
|
||||
}
|
||||
function asVisit(aNode) { return QI_node(aNode, Ci.nsINavHistoryVisitResultNode); }
|
||||
function asFullVisit(aNode){ return QI_node(aNode, Ci.nsINavHistoryFullVisitResultNode);}
|
||||
function asContainer(aNode){ return QI_node(aNode, Ci.nsINavHistoryContainerResultNode);}
|
||||
function asQuery(aNode) { return QI_node(aNode, Ci.nsINavHistoryQueryResultNode); }
|
||||
|
||||
var PlacesUIUtils = {
|
||||
/**
|
||||
* The Microsummary Service
|
||||
*/
|
||||
get microsummaries() {
|
||||
delete this.microsummaries;
|
||||
return this.microsummaries = Cc["@mozilla.org/microsummary/service;1"].
|
||||
getService(Ci.nsIMicrosummaryService);
|
||||
},
|
||||
ORGANIZER_LEFTPANE_VERSION: 6,
|
||||
ORGANIZER_FOLDER_ANNO: "PlacesOrganizer/OrganizerFolder",
|
||||
ORGANIZER_QUERY_ANNO: "PlacesOrganizer/OrganizerQuery",
|
||||
|
||||
get RDF() {
|
||||
delete this.RDF;
|
||||
return this.RDF = Cc["@mozilla.org/rdf/rdf-service;1"].
|
||||
getService(Ci.nsIRDFService);
|
||||
},
|
||||
LOAD_IN_SIDEBAR_ANNO: "bookmarkProperties/loadInSidebar",
|
||||
DESCRIPTION_ANNO: "bookmarkProperties/description",
|
||||
|
||||
get localStore() {
|
||||
delete this.localStore;
|
||||
return this.localStore = this.RDF.GetDataSource("rdf:local-store");
|
||||
},
|
||||
|
||||
get ptm() {
|
||||
delete this.ptm;
|
||||
return this.ptm = Cc["@mozilla.org/browser/placesTransactionsService;1"].
|
||||
getService(Ci.nsIPlacesTransactionsService);
|
||||
},
|
||||
|
||||
get clipboard() {
|
||||
delete this.clipboard;
|
||||
return this.clipboard = Cc["@mozilla.org/widget/clipboard;1"].
|
||||
getService(Ci.nsIClipboard);
|
||||
},
|
||||
|
||||
get URIFixup() {
|
||||
delete this.URIFixup;
|
||||
return this.URIFixup = Cc["@mozilla.org/docshell/urifixup;1"].
|
||||
getService(Ci.nsIURIFixup);
|
||||
},
|
||||
|
||||
get ellipsis() {
|
||||
delete this.ellipsis;
|
||||
var pref = Cc["@mozilla.org/preferences-service;1"].
|
||||
getService(Ci.nsIPrefBranch);
|
||||
return this.ellipsis = pref.getComplexValue("intl.ellipsis",
|
||||
Ci.nsIPrefLocalizedString).data;
|
||||
},
|
||||
|
||||
get privateBrowsing() {
|
||||
delete this.privateBrowsing;
|
||||
return this.privateBrowsing = Cc["@mozilla.org/privatebrowsing;1"].
|
||||
getService(Ci.nsIPrivateBrowsingService);
|
||||
},
|
||||
TYPE_TAB_DROP: "application/x-moz-tabbrowser-tab",
|
||||
|
||||
/**
|
||||
* Makes a URI from a spec, and do fixup
|
||||
|
@ -141,7 +84,7 @@ var PlacesUIUtils = {
|
|||
* The string spec of the URI
|
||||
* @returns A URI object for the spec.
|
||||
*/
|
||||
createFixedURI: function PU_createFixedURI(aSpec) {
|
||||
createFixedURI: function PUIU_createFixedURI(aSpec) {
|
||||
return this.URIFixup.createFixupURI(aSpec, 0);
|
||||
},
|
||||
|
||||
|
@ -151,30 +94,18 @@ var PlacesUIUtils = {
|
|||
* The string to wrap
|
||||
* @returns A nsISupportsString object containing a string.
|
||||
*/
|
||||
_wrapString: function PU__wrapString(aString) {
|
||||
_wrapString: function PUIU__wrapString(aString) {
|
||||
var s = Cc["@mozilla.org/supports-string;1"].
|
||||
createInstance(Ci.nsISupportsString);
|
||||
s.data = aString;
|
||||
return s;
|
||||
},
|
||||
|
||||
/**
|
||||
* String bundle helpers
|
||||
*/
|
||||
get _bundle() {
|
||||
const PLACES_STRING_BUNDLE_URI =
|
||||
"chrome://browser/locale/places/places.properties";
|
||||
delete this._bundle;
|
||||
return this._bundle = Cc["@mozilla.org/intl/stringbundle;1"].
|
||||
getService(Ci.nsIStringBundleService).
|
||||
createBundle(PLACES_STRING_BUNDLE_URI);
|
||||
},
|
||||
|
||||
getFormattedString: function PU_getFormattedString(key, params) {
|
||||
getFormattedString: function PUIU_getFormattedString(key, params) {
|
||||
return this._bundle.formatStringFromName(key, params, params.length);
|
||||
},
|
||||
|
||||
getString: function PU_getString(key) {
|
||||
getString: function PUIU_getString(key) {
|
||||
return this._bundle.GetStringFromName(key);
|
||||
},
|
||||
|
||||
|
@ -209,14 +140,14 @@ var PlacesUIUtils = {
|
|||
* @returns A nsITransaction object that performs the copy.
|
||||
*/
|
||||
_getBookmarkItemCopyTransaction:
|
||||
function PU__getBookmarkItemCopyTransaction(aData, aContainer, aIndex,
|
||||
function PUIU__getBookmarkItemCopyTransaction(aData, aContainer, aIndex,
|
||||
aExcludeAnnotations) {
|
||||
var itemURL = PlacesUtils._uri(aData.uri);
|
||||
var itemTitle = aData.title;
|
||||
var keyword = aData.keyword || null;
|
||||
var annos = aData.annos || [];
|
||||
// always exclude GUID when copying any item
|
||||
var excludeAnnos = [GUID_ANNO];
|
||||
var excludeAnnos = [PlacesUtils.GUID_ANNO];
|
||||
if (aExcludeAnnotations)
|
||||
excludeAnnos = excludeAnnos.concat(aExcludeAnnotations);
|
||||
annos = annos.filter(function(aValue, aIndex, aArray) {
|
||||
|
@ -256,8 +187,7 @@ var PlacesUIUtils = {
|
|||
* @returns A nsITransaction object that will perform the copy.
|
||||
*/
|
||||
_getFolderCopyTransaction:
|
||||
function PU__getFolderCopyTransaction(aData, aContainer, aIndex) {
|
||||
var self = this;
|
||||
function PUIU__getFolderCopyTransaction(aData, aContainer, aIndex) {
|
||||
function getChildItemsTransactions(aChildren) {
|
||||
var childItemsTransactions = [];
|
||||
var cc = aChildren.length;
|
||||
|
@ -274,18 +204,19 @@ var PlacesUIUtils = {
|
|||
|
||||
if (node.type == PlacesUtils.TYPE_X_MOZ_PLACE_CONTAINER) {
|
||||
if (node.livemark && node.annos) // node is a livemark
|
||||
txn = self._getLivemarkCopyTransaction(node, aContainer, index);
|
||||
txn = PlacesUIUtils._getLivemarkCopyTransaction(node, aContainer, index);
|
||||
else
|
||||
txn = self._getFolderCopyTransaction(node, aContainer, index);
|
||||
txn = PlacesUIUtils._getFolderCopyTransaction(node, aContainer, index);
|
||||
}
|
||||
else if (node.type == PlacesUtils.TYPE_X_MOZ_PLACE_SEPARATOR)
|
||||
txn = self.ptm.createSeparator(-1, index);
|
||||
txn = PlacesUIUtils.ptm.createSeparator(-1, index);
|
||||
else if (node.type == PlacesUtils.TYPE_X_MOZ_PLACE)
|
||||
txn = self._getBookmarkItemCopyTransaction(node, -1, index);
|
||||
txn = PlacesUIUtils._getBookmarkItemCopyTransaction(node, -1, index);
|
||||
|
||||
NS_ASSERT(txn, "Unexpected item under a bookmarks folder");
|
||||
if (txn)
|
||||
childItemsTransactions.push(txn);
|
||||
else
|
||||
throw("Unexpected item under a bookmarks folder");
|
||||
}
|
||||
return childItemsTransactions;
|
||||
}
|
||||
|
@ -314,29 +245,30 @@ var PlacesUIUtils = {
|
|||
var annos = aData.annos || [];
|
||||
annos = annos.filter(function(aAnno) {
|
||||
// always exclude GUID when copying any item
|
||||
return aAnno.name != GUID_ANNO;
|
||||
return aAnno.name != PlacesUtils.GUID_ANNO;
|
||||
});
|
||||
return this.ptm.createFolder(aData.title, aContainer, aIndex, annos, childItems);
|
||||
}
|
||||
},
|
||||
|
||||
_getLivemarkCopyTransaction:
|
||||
function PU__getLivemarkCopyTransaction(aData, aContainer, aIndex) {
|
||||
NS_ASSERT(aData.livemark && aData.annos, "node is not a livemark");
|
||||
function PUIU__getLivemarkCopyTransaction(aData, aContainer, aIndex) {
|
||||
if (!aData.livemark || !aData.annos)
|
||||
throw("node is not a livemark");
|
||||
// Place is a Livemark Container
|
||||
var feedURI = null;
|
||||
var siteURI = null;
|
||||
aData.annos = aData.annos.filter(function(aAnno) {
|
||||
if (aAnno.name == LMANNO_FEEDURI) {
|
||||
if (aAnno.name == PlacesUtils.LMANNO_FEEDURI) {
|
||||
feedURI = PlacesUtils._uri(aAnno.value);
|
||||
return false;
|
||||
}
|
||||
else if (aAnno.name == LMANNO_SITEURI) {
|
||||
else if (aAnno.name == PlacesUtils.LMANNO_SITEURI) {
|
||||
siteURI = PlacesUtils._uri(aAnno.value);
|
||||
return false;
|
||||
}
|
||||
// always exclude GUID when copying any item
|
||||
return aAnno.name != GUID_ANNO;
|
||||
return aAnno.name != PlacesUtils.GUID_ANNO;
|
||||
});
|
||||
return this.ptm.createLivemark(feedURI, siteURI, aData.title, aContainer,
|
||||
aIndex, aData.annos);
|
||||
|
@ -358,7 +290,7 @@ var PlacesUIUtils = {
|
|||
* @returns An object implementing nsITransaction that can perform
|
||||
* the move/insert.
|
||||
*/
|
||||
makeTransaction: function PU_makeTransaction(data, type, container,
|
||||
makeTransaction: function PUIU_makeTransaction(data, type, container,
|
||||
index, copy) {
|
||||
switch (data.type) {
|
||||
case PlacesUtils.TYPE_X_MOZ_PLACE_CONTAINER:
|
||||
|
@ -387,7 +319,7 @@ var PlacesUIUtils = {
|
|||
default:
|
||||
if (type == PlacesUtils.TYPE_X_MOZ_URL ||
|
||||
type == PlacesUtils.TYPE_UNICODE ||
|
||||
type == TAB_DROP_TYPE) {
|
||||
type == this.TYPE_TAB_DROP) {
|
||||
var title = (type != PlacesUtils.TYPE_UNICODE) ? data.title :
|
||||
data.uri;
|
||||
return this.ptm.createItem(PlacesUtils._uri(data.uri),
|
||||
|
@ -441,7 +373,7 @@ var PlacesUIUtils = {
|
|||
* - When aDefaultInsertionPoint is not set, the dialog defaults to the
|
||||
* bookmarks root folder.
|
||||
*/
|
||||
showAddBookmarkUI: function PU_showAddBookmarkUI(aURI,
|
||||
showAddBookmarkUI: function PUIU_showAddBookmarkUI(aURI,
|
||||
aTitle,
|
||||
aDescription,
|
||||
aDefaultInsertionPoint,
|
||||
|
@ -497,7 +429,7 @@ var PlacesUIUtils = {
|
|||
* was used.
|
||||
*/
|
||||
showMinimalAddBookmarkUI:
|
||||
function PU_showMinimalAddBookmarkUI(aURI, aTitle, aDescription,
|
||||
function PUIU_showMinimalAddBookmarkUI(aURI, aTitle, aDescription,
|
||||
aDefaultInsertionPoint, aShowPicker,
|
||||
aLoadInSidebar, aKeyword, aPostData,
|
||||
aCharSet) {
|
||||
|
@ -540,7 +472,7 @@ var PlacesUIUtils = {
|
|||
else
|
||||
info.hiddenRows.push("keyword");
|
||||
|
||||
this._showBookmarkDialog(info, true);
|
||||
return this._showBookmarkDialog(info, true);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -565,7 +497,7 @@ var PlacesUIUtils = {
|
|||
* - When aDefaultInsertionPoint is not set, the dialog defaults to the
|
||||
* bookmarks root folder.
|
||||
*/
|
||||
showAddLivemarkUI: function PU_showAddLivemarkURI(aFeedURI,
|
||||
showAddLivemarkUI: function PUIU_showAddLivemarkURI(aFeedURI,
|
||||
aSiteURI,
|
||||
aTitle,
|
||||
aDescription,
|
||||
|
@ -605,7 +537,7 @@ var PlacesUIUtils = {
|
|||
* for the new live-bookmark.
|
||||
*/
|
||||
showMinimalAddLivemarkUI:
|
||||
function PU_showMinimalAddLivemarkURI(aFeedURI, aSiteURI, aTitle,
|
||||
function PUIU_showMinimalAddLivemarkURI(aFeedURI, aSiteURI, aTitle,
|
||||
aDescription, aDefaultInsertionPoint,
|
||||
aShowPicker) {
|
||||
var info = {
|
||||
|
@ -631,7 +563,7 @@ var PlacesUIUtils = {
|
|||
if (!aShowPicker)
|
||||
info.hiddenRows.push("folderPicker");
|
||||
}
|
||||
this._showBookmarkDialog(info, true);
|
||||
return this._showBookmarkDialog(info, true);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -643,16 +575,16 @@ var PlacesUIUtils = {
|
|||
* to be bookmarked.
|
||||
* @return true if any transaction has been performed.
|
||||
*/
|
||||
showMinimalAddMultiBookmarkUI: function PU_showAddMultiBookmarkUI(aURIList) {
|
||||
NS_ASSERT(aURIList.length,
|
||||
"showAddMultiBookmarkUI expects a list of nsIURI objects");
|
||||
showMinimalAddMultiBookmarkUI: function PUIU_showAddMultiBookmarkUI(aURIList) {
|
||||
if (aURIList.length == 0)
|
||||
throw("showAddMultiBookmarkUI expects a list of nsIURI objects");
|
||||
var info = {
|
||||
action: "add",
|
||||
type: "folder",
|
||||
hiddenRows: ["description"],
|
||||
URIList: aURIList
|
||||
};
|
||||
this._showBookmarkDialog(info, true);
|
||||
return this._showBookmarkDialog(info, true);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -666,7 +598,7 @@ var PlacesUIUtils = {
|
|||
* states if properties dialog should be readonly
|
||||
* @return true if any transaction has been performed.
|
||||
*/
|
||||
showItemProperties: function PU_showItemProperties(aItemId, aType, aReadOnly) {
|
||||
showItemProperties: function PUIU_showItemProperties(aItemId, aType, aReadOnly) {
|
||||
var info = {
|
||||
action: "edit",
|
||||
type: aType,
|
||||
|
@ -691,7 +623,7 @@ var PlacesUIUtils = {
|
|||
* @return true if any transaction has been performed.
|
||||
*/
|
||||
showAddFolderUI:
|
||||
function PU_showAddFolderUI(aTitle, aDefaultInsertionPoint, aShowPicker) {
|
||||
function PUIU_showAddFolderUI(aTitle, aDefaultInsertionPoint, aShowPicker) {
|
||||
var info = {
|
||||
action: "add",
|
||||
type: "folder",
|
||||
|
@ -722,7 +654,7 @@ var PlacesUIUtils = {
|
|||
*
|
||||
* @return true if any transaction has been performed, false otherwise.
|
||||
*/
|
||||
_showBookmarkDialog: function PU__showBookmarkDialog(aInfo, aMinimalUI) {
|
||||
_showBookmarkDialog: function PUIU__showBookmarkDialog(aInfo, aMinimalUI) {
|
||||
var dialogURL = aMinimalUI ?
|
||||
"chrome://browser/content/places/bookmarkProperties2.xul" :
|
||||
"chrome://browser/content/places/bookmarkProperties.xul";
|
||||
|
@ -732,17 +664,25 @@ var PlacesUIUtils = {
|
|||
features = "centerscreen,chrome,dialog,resizable,modal";
|
||||
else
|
||||
features = "centerscreen,chrome,modal,resizable=no";
|
||||
window.openDialog(dialogURL, "", features, aInfo);
|
||||
this._getCurrentActiveWin().openDialog(dialogURL, "", features, aInfo);
|
||||
return ("performed" in aInfo && aInfo.performed);
|
||||
},
|
||||
|
||||
_getTopBrowserWin: function PUIU__getTopBrowserWin() {
|
||||
return Services.wm.getMostRecentWindow("navigator:browser");
|
||||
},
|
||||
|
||||
_getCurrentActiveWin: function PUIU__getCurrentActiveWin() {
|
||||
return this.fm.activeWindow;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the closet ancestor places view for the given DOM node
|
||||
* @param aNode
|
||||
* a DOM node
|
||||
* @return the closet ancestor places view if exists, null otherwsie.
|
||||
*/
|
||||
getViewForNode: function PU_getViewForNode(aNode) {
|
||||
getViewForNode: function PUIU_getViewForNode(aNode) {
|
||||
var node = aNode;
|
||||
|
||||
// the view for a <menu> of which its associated menupopup is a places view,
|
||||
|
@ -770,7 +710,7 @@ var PlacesUIUtils = {
|
|||
* organizer. If this is not called visits will be marked as
|
||||
* TRANSITION_LINK.
|
||||
*/
|
||||
markPageAsTyped: function PU_markPageAsTyped(aURL) {
|
||||
markPageAsTyped: function PUIU_markPageAsTyped(aURL) {
|
||||
PlacesUtils.history.QueryInterface(Ci.nsIBrowserHistory)
|
||||
.markPageAsTyped(this.createFixedURI(aURL));
|
||||
},
|
||||
|
@ -782,7 +722,7 @@ var PlacesUIUtils = {
|
|||
* personal toolbar, and bookmarks from within the places organizer.
|
||||
* If this is not called visits will be marked as TRANSITION_LINK.
|
||||
*/
|
||||
markPageAsFollowedBookmark: function PU_markPageAsFollowedBookmark(aURL) {
|
||||
markPageAsFollowedBookmark: function PUIU_markPageAsFollowedBookmark(aURL) {
|
||||
PlacesUtils.history.markPageAsFollowedBookmark(this.createFixedURI(aURL));
|
||||
},
|
||||
|
||||
|
@ -792,7 +732,7 @@ var PlacesUIUtils = {
|
|||
* This is actually used to distinguish user-initiated visits in frames
|
||||
* so automatic visits can be correctly ignored.
|
||||
*/
|
||||
markPageAsFollowedLink: function PU_markPageAsUserClicked(aURL) {
|
||||
markPageAsFollowedLink: function PUIU_markPageAsUserClicked(aURL) {
|
||||
PlacesUtils.history.QueryInterface(Ci.nsIBrowserHistory)
|
||||
.markPageAsFollowedLink(this.createFixedURI(aURL));
|
||||
},
|
||||
|
@ -805,7 +745,7 @@ var PlacesUIUtils = {
|
|||
* @return true if it's safe to open the node in the browser, false otherwise.
|
||||
*
|
||||
*/
|
||||
checkURLSecurity: function PU_checkURLSecurity(aURINode) {
|
||||
checkURLSecurity: function PUIU_checkURLSecurity(aURINode, aWindow) {
|
||||
if (!PlacesUtils.nodeIsBookmark(aURINode)) {
|
||||
var uri = PlacesUtils._uri(aURINode.uri);
|
||||
if (uri.schemeIs("javascript") || uri.schemeIs("data")) {
|
||||
|
@ -814,11 +754,9 @@ var PlacesUIUtils = {
|
|||
getService(Ci.nsIStringBundleService).
|
||||
createBundle(BRANDING_BUNDLE_URI).
|
||||
GetStringFromName("brandShortName");
|
||||
var promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"].
|
||||
getService(Ci.nsIPromptService);
|
||||
|
||||
var errorStr = this.getString("load-js-data-url-error");
|
||||
promptService.alert(window, brandShortName, errorStr);
|
||||
Services.prompt.alert(aWindow, brandShortName, errorStr);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -833,7 +771,7 @@ var PlacesUIUtils = {
|
|||
* @returns A description string if a META element was discovered with a
|
||||
* "description" or "httpequiv" attribute, empty string otherwise.
|
||||
*/
|
||||
getDescriptionFromDocument: function PU_getDescriptionFromDocument(doc) {
|
||||
getDescriptionFromDocument: function PUIU_getDescriptionFromDocument(doc) {
|
||||
var metaElements = doc.getElementsByTagName("META");
|
||||
for (var i = 0; i < metaElements.length; ++i) {
|
||||
if (metaElements[i].name.toLowerCase() == "description" ||
|
||||
|
@ -851,26 +789,23 @@ var PlacesUIUtils = {
|
|||
* @returns the description of the given item, or an empty string if it is
|
||||
* not set.
|
||||
*/
|
||||
getItemDescription: function PU_getItemDescription(aItemId) {
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(aItemId, DESCRIPTION_ANNO))
|
||||
return PlacesUtils.annotations.getItemAnnotation(aItemId, DESCRIPTION_ANNO);
|
||||
getItemDescription: function PUIU_getItemDescription(aItemId) {
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(aItemId, this.DESCRIPTION_ANNO))
|
||||
return PlacesUtils.annotations.getItemAnnotation(aItemId, this.DESCRIPTION_ANNO);
|
||||
return "";
|
||||
},
|
||||
|
||||
/**
|
||||
* Gives the user a chance to cancel loading lots of tabs at once
|
||||
*/
|
||||
_confirmOpenInTabs: function PU__confirmOpenInTabs(numTabsToOpen) {
|
||||
var pref = Cc["@mozilla.org/preferences-service;1"].
|
||||
getService(Ci.nsIPrefBranch);
|
||||
|
||||
const kWarnOnOpenPref = "browser.tabs.warnOnOpen";
|
||||
_confirmOpenInTabs: function PUIU__confirmOpenInTabs(numTabsToOpen) {
|
||||
let pref = Services.prefs;
|
||||
let prompt = Services.prompt;
|
||||
const WARN_ON_OPEN_PREF = "browser.tabs.warnOnOpen";
|
||||
var reallyOpen = true;
|
||||
if (pref.getBoolPref(kWarnOnOpenPref)) {
|
||||
if (numTabsToOpen >= pref.getIntPref("browser.tabs.maxOpenBeforeWarn")) {
|
||||
var promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"].
|
||||
getService(Ci.nsIPromptService);
|
||||
|
||||
if (pref.getBoolPref(WARN_ON_OPEN_PREF)) {
|
||||
if (numTabsToOpen >= pref.getIntPref("browser.tabs.maxOpenBeforeWarn")) {
|
||||
// default to true: if it were false, we wouldn't get this far
|
||||
var warnOnOpen = { value: true };
|
||||
|
||||
|
@ -882,28 +817,32 @@ var PlacesUIUtils = {
|
|||
createBundle(BRANDING_BUNDLE_URI).
|
||||
GetStringFromName("brandShortName");
|
||||
|
||||
var buttonPressed = promptService.confirmEx(window,
|
||||
var buttonPressed = prompt.confirmEx(
|
||||
this._getCurrentActiveWin(),
|
||||
this.getString("tabs.openWarningTitle"),
|
||||
this.getFormattedString(messageKey, [numTabsToOpen, brandShortName]),
|
||||
(promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0)
|
||||
+ (promptService.BUTTON_TITLE_CANCEL * promptService.BUTTON_POS_1),
|
||||
(prompt.BUTTON_TITLE_IS_STRING * prompt.BUTTON_POS_0) +
|
||||
(prompt.BUTTON_TITLE_CANCEL * prompt.BUTTON_POS_1),
|
||||
this.getString(openKey), null, null,
|
||||
this.getFormattedString("tabs.openWarningPromptMeBranded",
|
||||
[brandShortName]), warnOnOpen);
|
||||
[brandShortName]),
|
||||
warnOnOpen
|
||||
);
|
||||
|
||||
reallyOpen = (buttonPressed == 0);
|
||||
// don't set the pref unless they press OK and it's false
|
||||
if (reallyOpen && !warnOnOpen.value)
|
||||
pref.setBoolPref(kWarnOnOpenPref, false);
|
||||
pref.setBoolPref(WARN_ON_OPEN_PREF, false);
|
||||
}
|
||||
}
|
||||
|
||||
return reallyOpen;
|
||||
},
|
||||
|
||||
/** aItemsToOpen needs to be an array of objects of the form:
|
||||
* {uri: string, isBookmark: boolean}
|
||||
*/
|
||||
_openTabset: function PU__openTabset(aItemsToOpen, aEvent) {
|
||||
_openTabset: function PUIU__openTabset(aItemsToOpen, aEvent) {
|
||||
if (!aItemsToOpen.length)
|
||||
return;
|
||||
|
||||
|
@ -918,12 +857,13 @@ var PlacesUIUtils = {
|
|||
urls.push(item.uri);
|
||||
}
|
||||
|
||||
var browserWindow = getTopWin();
|
||||
var browserWindow = this._getTopBrowserWin();
|
||||
var where = browserWindow ?
|
||||
whereToOpenLink(aEvent, false, true) : "window";
|
||||
browserWindow.whereToOpenLink(aEvent, false, true) : "window";
|
||||
if (where == "window") {
|
||||
window.openDialog(getBrowserURL(), "_blank",
|
||||
"chrome,all,dialog=no", urls.join("|"));
|
||||
let win = this._getCurrentActiveWin();
|
||||
win.openDialog(win.getBrowserURL(), "_blank",
|
||||
"chrome,all,dialog=no", urls.join("|"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -932,7 +872,7 @@ var PlacesUIUtils = {
|
|||
browserWindow.gBrowser.loadTabs(urls, loadInBackground, replaceCurrentTab);
|
||||
},
|
||||
|
||||
openContainerNodeInTabs: function PU_openContainerInTabs(aNode, aEvent) {
|
||||
openContainerNodeInTabs: function PUIU_openContainerInTabs(aNode, aEvent) {
|
||||
var urlsToOpen = PlacesUtils.getURLsForContainerNode(aNode);
|
||||
if (!this._confirmOpenInTabs(urlsToOpen.length))
|
||||
return;
|
||||
|
@ -940,7 +880,7 @@ var PlacesUIUtils = {
|
|||
this._openTabset(urlsToOpen, aEvent);
|
||||
},
|
||||
|
||||
openURINodesInTabs: function PU_openURINodesInTabs(aNodes, aEvent) {
|
||||
openURINodesInTabs: function PUIU_openURINodesInTabs(aNodes, aEvent) {
|
||||
var urlsToOpen = [];
|
||||
for (var i=0; i < aNodes.length; i++) {
|
||||
// skip over separators and folders
|
||||
|
@ -960,8 +900,8 @@ var PlacesUIUtils = {
|
|||
* The DOM mouse/key event with modifier keys set that track the
|
||||
* user's preferred destination window or tab.
|
||||
*/
|
||||
openNodeWithEvent: function PU_openNodeWithEvent(aNode, aEvent) {
|
||||
this.openNodeIn(aNode, whereToOpenLink(aEvent));
|
||||
openNodeWithEvent: function PUIU_openNodeWithEvent(aNode, aEvent) {
|
||||
this.openNodeIn(aNode, this._getCurrentActiveWin().whereToOpenLink(aEvent));
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -969,9 +909,9 @@ var PlacesUIUtils = {
|
|||
* web panel.
|
||||
* see also openUILinkIn
|
||||
*/
|
||||
openNodeIn: function PU_openNodeIn(aNode, aWhere) {
|
||||
openNodeIn: function PUIU_openNodeIn(aNode, aWhere) {
|
||||
if (aNode && PlacesUtils.nodeIsURI(aNode) &&
|
||||
this.checkURLSecurity(aNode)) {
|
||||
this.checkURLSecurity(aNode, this._getCurrentActiveWin())) {
|
||||
var isBookmark = PlacesUtils.nodeIsBookmark(aNode);
|
||||
|
||||
if (isBookmark)
|
||||
|
@ -983,15 +923,15 @@ var PlacesUIUtils = {
|
|||
// a web panel
|
||||
if (aWhere == "current" && isBookmark) {
|
||||
if (PlacesUtils.annotations
|
||||
.itemHasAnnotation(aNode.itemId, LOAD_IN_SIDEBAR_ANNO)) {
|
||||
var w = getTopWin();
|
||||
if (w) {
|
||||
w.openWebPanel(aNode.title, aNode.uri);
|
||||
.itemHasAnnotation(aNode.itemId, this.LOAD_IN_SIDEBAR_ANNO)) {
|
||||
var browserWin = this._getTopBrowserWin();
|
||||
if (browserWin) {
|
||||
browserWin.openWebPanel(aNode.title, aNode.uri);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
openUILinkIn(aNode.uri, aWhere);
|
||||
this._getCurrentActiveWin().openUILinkIn(aNode.uri, aWhere);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -1010,14 +950,24 @@ var PlacesUIUtils = {
|
|||
},
|
||||
|
||||
/**
|
||||
* Helper for the toolbar and menu views
|
||||
* Creates a menu item ready to be added to a popup.
|
||||
* Helper for the toolbar and menu views.
|
||||
* @param aNode
|
||||
* Places node used as source for DOM node.
|
||||
* @param aDocument
|
||||
* The node will be created in this document.
|
||||
* @return a DOM menuitem node.
|
||||
*/
|
||||
createMenuItemForNode:
|
||||
function PUU_createMenuItemForNode(aNode) {
|
||||
function PUU_createMenuItemForNode(aNode, aDocument) {
|
||||
var element;
|
||||
// For add-ons backwards compatibility, if the caller does not provide
|
||||
// a document, we guess one.
|
||||
var document = aDocument || this._getTopBrowserWin().document;
|
||||
var type = aNode.type;
|
||||
if (type == Ci.nsINavHistoryResultNode.RESULT_TYPE_SEPARATOR)
|
||||
if (type == Ci.nsINavHistoryResultNode.RESULT_TYPE_SEPARATOR) {
|
||||
element = document.createElement("menuseparator");
|
||||
}
|
||||
else {
|
||||
if (PlacesUtils.uriTypes.indexOf(type) != -1) {
|
||||
element = document.createElement("menuitem");
|
||||
|
@ -1044,7 +994,7 @@ var PlacesUIUtils = {
|
|||
|
||||
var popup = document.createElement("menupopup");
|
||||
popup.setAttribute("placespopup", "true");
|
||||
popup._resultNode = asContainer(aNode);
|
||||
popup._resultNode = PlacesUtils.asContainer(aNode);
|
||||
#ifdef XP_MACOSX
|
||||
// Binding on Mac native menus is lazy attached, so onPopupShowing,
|
||||
// in the capturing phase, fields are not yet initialized.
|
||||
|
@ -1074,7 +1024,7 @@ var PlacesUIUtils = {
|
|||
return element;
|
||||
},
|
||||
|
||||
cleanPlacesPopup: function PU_cleanPlacesPopup(aPopup) {
|
||||
cleanPlacesPopup: function PUIU_cleanPlacesPopup(aPopup) {
|
||||
// Remove places popup children and update markers to keep track of
|
||||
// their indices.
|
||||
var start = aPopup._startMarker != -1 ? aPopup._startMarker + 1 : 0;
|
||||
|
@ -1097,10 +1047,11 @@ var PlacesUIUtils = {
|
|||
}
|
||||
else {
|
||||
// This is static content...
|
||||
if (!placesNodeFound)
|
||||
if (!placesNodeFound) {
|
||||
// ...at the start of the popup
|
||||
// Initialized in menu.xml, in the base binding
|
||||
aPopup._startMarker++;
|
||||
}
|
||||
else {
|
||||
// ...after places nodes
|
||||
aPopup._endMarker = i;
|
||||
|
@ -1116,7 +1067,7 @@ var PlacesUIUtils = {
|
|||
}
|
||||
},
|
||||
|
||||
getBestTitle: function PU_getBestTitle(aNode) {
|
||||
getBestTitle: function PUIU_getBestTitle(aNode) {
|
||||
var title;
|
||||
if (!aNode.title && PlacesUtils.uriTypes.indexOf(aNode.type) != -1) {
|
||||
// if node title is empty, try to set the label using host and filename
|
||||
|
@ -1181,16 +1132,16 @@ var PlacesUIUtils = {
|
|||
// Removes an item and associated annotations, ignoring eventual errors.
|
||||
function safeRemoveItem(aItemId) {
|
||||
try {
|
||||
if (as.itemHasAnnotation(aItemId, ORGANIZER_QUERY_ANNO) &&
|
||||
!(as.getItemAnnotation(aItemId, ORGANIZER_QUERY_ANNO) in queries)) {
|
||||
if (as.itemHasAnnotation(aItemId, PlacesUIUtils.ORGANIZER_QUERY_ANNO) &&
|
||||
!(as.getItemAnnotation(aItemId, PlacesUIUtils.ORGANIZER_QUERY_ANNO) in queries)) {
|
||||
// Some extension annotated their roots with our query annotation,
|
||||
// so we should not delete them.
|
||||
return;
|
||||
}
|
||||
// removeItemAnnotation does not check if item exists, nor the anno,
|
||||
// so this is safe to do.
|
||||
as.removeItemAnnotation(aItemId, ORGANIZER_FOLDER_ANNO);
|
||||
as.removeItemAnnotation(aItemId, ORGANIZER_QUERY_ANNO);
|
||||
as.removeItemAnnotation(aItemId, PlacesUIUtils.ORGANIZER_FOLDER_ANNO);
|
||||
as.removeItemAnnotation(aItemId, PlacesUIUtils.ORGANIZER_QUERY_ANNO);
|
||||
// This will throw if the annotation is an orphan.
|
||||
bs.removeItem(aItemId);
|
||||
}
|
||||
|
@ -1209,7 +1160,7 @@ var PlacesUIUtils = {
|
|||
}
|
||||
|
||||
// Get all items marked as being the left pane folder.
|
||||
let items = as.getItemsWithAnnotation(ORGANIZER_FOLDER_ANNO);
|
||||
let items = as.getItemsWithAnnotation(this.ORGANIZER_FOLDER_ANNO);
|
||||
if (items.length > 1) {
|
||||
// Something went wrong, we cannot have more than one left pane folder,
|
||||
// remove all left pane folders and continue. We will create a new one.
|
||||
|
@ -1217,10 +1168,10 @@ var PlacesUIUtils = {
|
|||
}
|
||||
else if (items.length == 1 && items[0] != -1) {
|
||||
leftPaneRoot = items[0];
|
||||
|
||||
// Check that organizer left pane root is valid.
|
||||
let version = as.getItemAnnotation(leftPaneRoot, ORGANIZER_FOLDER_ANNO);
|
||||
if (version != ORGANIZER_LEFTPANE_VERSION || !itemExists(leftPaneRoot)) {
|
||||
let version = as.getItemAnnotation(leftPaneRoot, this.ORGANIZER_FOLDER_ANNO);
|
||||
if (version != this.ORGANIZER_LEFTPANE_VERSION ||
|
||||
!itemExists(leftPaneRoot)) {
|
||||
// Invalid root, we must rebuild the left pane.
|
||||
safeRemoveItem(leftPaneRoot);
|
||||
leftPaneRoot = -1;
|
||||
|
@ -1234,11 +1185,12 @@ var PlacesUIUtils = {
|
|||
delete this.leftPaneQueries;
|
||||
this.leftPaneQueries = {};
|
||||
|
||||
let items = as.getItemsWithAnnotation(ORGANIZER_QUERY_ANNO);
|
||||
let items = as.getItemsWithAnnotation(this.ORGANIZER_QUERY_ANNO);
|
||||
// While looping through queries we will also check for their validity.
|
||||
let queriesCount = 0;
|
||||
for(let i = 0; i < items.length; i++) {
|
||||
let queryName = as.getItemAnnotation(items[i], ORGANIZER_QUERY_ANNO);
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
let queryName = as.getItemAnnotation(items[i], this.ORGANIZER_QUERY_ANNO);
|
||||
|
||||
// Some extension did use our annotation to decorate their items
|
||||
// with icons, so we should check only our elements, to avoid dataloss.
|
||||
if (!(queryName in queries))
|
||||
|
@ -1289,7 +1241,6 @@ var PlacesUIUtils = {
|
|||
}
|
||||
|
||||
// Create a new left pane folder.
|
||||
var self = this;
|
||||
var callback = {
|
||||
// Helper to create an organizer special query.
|
||||
create_query: function CB_create_query(aQueryName, aParentId, aQueryUrl) {
|
||||
|
@ -1298,13 +1249,13 @@ var PlacesUIUtils = {
|
|||
bs.DEFAULT_INDEX,
|
||||
queries[aQueryName].title);
|
||||
// Mark as special organizer query.
|
||||
as.setItemAnnotation(itemId, ORGANIZER_QUERY_ANNO, aQueryName,
|
||||
as.setItemAnnotation(itemId, PlacesUIUtils.ORGANIZER_QUERY_ANNO, aQueryName,
|
||||
0, as.EXPIRE_NEVER);
|
||||
// We should never backup this, since it changes between profiles.
|
||||
as.setItemAnnotation(itemId, EXCLUDE_FROM_BACKUP_ANNO, 1,
|
||||
as.setItemAnnotation(itemId, PlacesUtils.EXCLUDE_FROM_BACKUP_ANNO, 1,
|
||||
0, as.EXPIRE_NEVER);
|
||||
// Add to the queries map.
|
||||
self.leftPaneQueries[aQueryName] = itemId;
|
||||
PlacesUIUtils.leftPaneQueries[aQueryName] = itemId;
|
||||
return itemId;
|
||||
},
|
||||
|
||||
|
@ -1315,29 +1266,29 @@ var PlacesUIUtils = {
|
|||
queries[aFolderName].title,
|
||||
bs.DEFAULT_INDEX);
|
||||
// We should never backup this, since it changes between profiles.
|
||||
as.setItemAnnotation(folderId, EXCLUDE_FROM_BACKUP_ANNO, 1,
|
||||
as.setItemAnnotation(folderId, PlacesUtils.EXCLUDE_FROM_BACKUP_ANNO, 1,
|
||||
0, as.EXPIRE_NEVER);
|
||||
// Disallow manipulating this folder within the organizer UI.
|
||||
bs.setFolderReadonly(folderId, true);
|
||||
|
||||
if (aIsRoot) {
|
||||
// Mark as special left pane root.
|
||||
as.setItemAnnotation(folderId, ORGANIZER_FOLDER_ANNO,
|
||||
ORGANIZER_LEFTPANE_VERSION,
|
||||
as.setItemAnnotation(folderId, PlacesUIUtils.ORGANIZER_FOLDER_ANNO,
|
||||
PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION,
|
||||
0, as.EXPIRE_NEVER);
|
||||
}
|
||||
else {
|
||||
// Mark as special organizer folder.
|
||||
as.setItemAnnotation(folderId, ORGANIZER_QUERY_ANNO, aFolderName,
|
||||
as.setItemAnnotation(folderId, PlacesUIUtils.ORGANIZER_QUERY_ANNO, aFolderName,
|
||||
0, as.EXPIRE_NEVER);
|
||||
self.leftPaneQueries[aFolderName] = folderId;
|
||||
PlacesUIUtils.leftPaneQueries[aFolderName] = folderId;
|
||||
}
|
||||
return folderId;
|
||||
},
|
||||
|
||||
runBatched: function CB_runBatched(aUserData) {
|
||||
delete self.leftPaneQueries;
|
||||
self.leftPaneQueries = { };
|
||||
delete PlacesUIUtils.leftPaneQueries;
|
||||
PlacesUIUtils.leftPaneQueries = { };
|
||||
|
||||
// Left Pane Root Folder.
|
||||
leftPaneRoot = this.create_folder("PlacesRoot", bs.placesRoot, true);
|
||||
|
@ -1397,14 +1348,14 @@ var PlacesUIUtils = {
|
|||
* @param aItemId id of a container
|
||||
* @returns the name of the query, or empty string if not a left-pane query
|
||||
*/
|
||||
getLeftPaneQueryNameFromId: function PU_getLeftPaneQueryNameFromId(aItemId) {
|
||||
getLeftPaneQueryNameFromId: function PUIU_getLeftPaneQueryNameFromId(aItemId) {
|
||||
var queryName = "";
|
||||
// If the let pane hasn't been built, use the annotation service
|
||||
// directly, to avoid building the left pane too early.
|
||||
if (this.__lookupGetter__("leftPaneFolderId")) {
|
||||
try {
|
||||
queryName = PlacesUtils.annotations.
|
||||
getItemAnnotation(aItemId, ORGANIZER_QUERY_ANNO);
|
||||
getItemAnnotation(aItemId, this.ORGANIZER_QUERY_ANNO);
|
||||
}
|
||||
catch (ex) {
|
||||
// doesn't have the annotation
|
||||
|
@ -1428,7 +1379,7 @@ var PlacesUIUtils = {
|
|||
* The livemark container popup
|
||||
*/
|
||||
ensureLivemarkStatusMenuItem:
|
||||
function PU_ensureLivemarkStatusMenuItem(aPopup) {
|
||||
function PUIU_ensureLivemarkStatusMenuItem(aPopup) {
|
||||
var itemId = aPopup._resultNode.itemId;
|
||||
|
||||
var lmStatus = null;
|
||||
|
@ -1441,6 +1392,7 @@ var PlacesUIUtils = {
|
|||
|
||||
if (lmStatus && !aPopup._lmStatusMenuItem) {
|
||||
// Create the status menuitem and cache it in the popup object.
|
||||
let document = aPopup.ownerDocument;
|
||||
aPopup._lmStatusMenuItem = document.createElement("menuitem");
|
||||
aPopup._lmStatusMenuItem.setAttribute("lmStatus", lmStatus);
|
||||
aPopup._lmStatusMenuItem.setAttribute("label", this.getString(lmStatus));
|
||||
|
@ -1463,3 +1415,40 @@ var PlacesUIUtils = {
|
|||
}
|
||||
}
|
||||
};
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(PlacesUIUtils, "RDF",
|
||||
"@mozilla.org/rdf/rdf-service;1",
|
||||
"nsIRDFService");
|
||||
|
||||
XPCOMUtils.defineLazyGetter(PlacesUIUtils, "localStore", function() {
|
||||
return PlacesUIUtils.RDF.GetDataSource("rdf:local-store");
|
||||
});
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(PlacesUIUtils, "ptm",
|
||||
"@mozilla.org/browser/placesTransactionsService;1",
|
||||
"nsIPlacesTransactionsService");
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(PlacesUIUtils, "URIFixup",
|
||||
"@mozilla.org/docshell/urifixup;1",
|
||||
"nsIURIFixup");
|
||||
|
||||
XPCOMUtils.defineLazyGetter(PlacesUIUtils, "ellipsis", function() {
|
||||
return Services.prefs.getComplexValue("intl.ellipsis",
|
||||
Ci.nsIPrefLocalizedString).data;
|
||||
});
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(PlacesUIUtils, "privateBrowsing",
|
||||
"@mozilla.org/privatebrowsing;1",
|
||||
"nsIPrivateBrowsingService");
|
||||
|
||||
XPCOMUtils.defineLazyGetter(PlacesUIUtils, "_bundle", function() {
|
||||
const PLACES_STRING_BUNDLE_URI =
|
||||
"chrome://browser/locale/places/places.properties";
|
||||
return Cc["@mozilla.org/intl/stringbundle;1"].
|
||||
getService(Ci.nsIStringBundleService).
|
||||
createBundle(PLACES_STRING_BUNDLE_URI);
|
||||
});
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(PlacesUIUtils, "fm",
|
||||
"@mozilla.org/focus-manager;1",
|
||||
"nsIFocusManager");
|
|
@ -41,21 +41,24 @@
|
|||
let Ci = Components.interfaces;
|
||||
let Cc = Components.classes;
|
||||
let Cr = Components.results;
|
||||
let Cu = Components.utils;
|
||||
|
||||
const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
|
||||
const DESCRIPTION_ANNO = "bookmarkProperties/description";
|
||||
const GUID_ANNO = "placesInternal/GUID";
|
||||
|
||||
const CLASS_ID = Components.ID("c0844a84-5a12-4808-80a8-809cb002bb4f");
|
||||
const CONTRACT_ID = "@mozilla.org/browser/placesTransactionsService;1";
|
||||
|
||||
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
|
||||
__defineGetter__("PlacesUtils", function() {
|
||||
delete this.PlacesUtils
|
||||
var tmpScope = {};
|
||||
Components.utils.import("resource://gre/modules/utils.js", tmpScope);
|
||||
return this.PlacesUtils = tmpScope.PlacesUtils;
|
||||
XPCOMUtils.defineLazyGetter(this, "Services", function() {
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
return Services;
|
||||
});
|
||||
|
||||
XPCOMUtils.defineLazyGetter(this, "PlacesUtils", function() {
|
||||
Cu.import("resource://gre/modules/utils.js");
|
||||
return PlacesUtils;
|
||||
});
|
||||
|
||||
// The minimum amount of transactions we should tell our observers to begin
|
||||
|
@ -63,6 +66,7 @@ __defineGetter__("PlacesUtils", function() {
|
|||
const MIN_TRANSACTIONS_FOR_BATCH = 5;
|
||||
|
||||
function placesTransactionsService() {
|
||||
Services.obs.addObserver(this, "xpcom-shutdown", false);
|
||||
this.mTransactionManager = Cc["@mozilla.org/transactionmanager;1"].
|
||||
createInstance(Ci.nsITransactionManager);
|
||||
}
|
||||
|
@ -72,8 +76,19 @@ placesTransactionsService.prototype = {
|
|||
classID: CLASS_ID,
|
||||
contractID: CONTRACT_ID,
|
||||
|
||||
QueryInterface: XPCOMUtils.generateQI([Ci.nsIPlacesTransactionsService,
|
||||
Ci.nsITransactionManager]),
|
||||
QueryInterface: XPCOMUtils.generateQI([
|
||||
Ci.nsIPlacesTransactionsService,
|
||||
Ci.nsITransactionManager,
|
||||
Ci.nsIObserver,
|
||||
]),
|
||||
|
||||
// nsIObserver
|
||||
observe: function PlacesTxn_observe(aSubject, aTopic, aData) {
|
||||
if (aTopic == "xpcom-shutdown") {
|
||||
Services.obs.removeObserver(this, "xpcom-shutdown");
|
||||
delete this.mTransactionManager;
|
||||
}
|
||||
},
|
||||
|
||||
aggregateTransactions:
|
||||
function placesTxn_aggregateTransactions(aName, aTransactions) {
|
||||
|
@ -228,9 +243,7 @@ placesTransactionsService.prototype = {
|
|||
// Update commands in the undo group of the active window
|
||||
// commands in inactive windows will are updated on-focus
|
||||
_updateCommands: function placesTxn__updateCommands() {
|
||||
var wm = Cc["@mozilla.org/appshell/window-mediator;1"].
|
||||
getService(Ci.nsIWindowMediator);
|
||||
var win = wm.getMostRecentWindow(null);
|
||||
var win = Services.wm.getMostRecentWindow(null);
|
||||
if (win)
|
||||
win.updateCommands("undo");
|
||||
},
|
||||
|
@ -445,7 +458,7 @@ placesCreateFolderTransactions.prototype = {
|
|||
}
|
||||
|
||||
// If a GUID exists for this item, preserve it before removing the item.
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(this._id, GUID_ANNO))
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(this._id, PlacesUtils.GUID_ANNO))
|
||||
this._GUID = PlacesUtils.bookmarks.getItemGUID(this._id);
|
||||
|
||||
// Remove item only after all child transactions have been reverted.
|
||||
|
@ -503,7 +516,7 @@ placesCreateItemTransactions.prototype = {
|
|||
}
|
||||
|
||||
// If a GUID exists for this item, preserve it before removing the item.
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(this._id, GUID_ANNO))
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(this._id, PlacesUtils.GUID_ANNO))
|
||||
this._GUID = PlacesUtils.bookmarks.getItemGUID(this._id);
|
||||
|
||||
// Remove item only after all child transactions have been reverted.
|
||||
|
@ -534,7 +547,7 @@ placesCreateSeparatorTransactions.prototype = {
|
|||
|
||||
undoTransaction: function PCST_undoTransaction() {
|
||||
// If a GUID exists for this item, preserve it before removing the item.
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(this._id, GUID_ANNO))
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(this._id, PlacesUtils.GUID_ANNO))
|
||||
this._GUID = PlacesUtils.bookmarks.getItemGUID(this._id);
|
||||
|
||||
PlacesUtils.bookmarks.removeItem(this._id);
|
||||
|
@ -572,7 +585,7 @@ placesCreateLivemarkTransactions.prototype = {
|
|||
|
||||
undoTransaction: function PCLT_undoTransaction() {
|
||||
// If a GUID exists for this item, preserve it before removing the item.
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(this._id, GUID_ANNO))
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(this._id, PlacesUtils.GUID_ANNO))
|
||||
this._GUID = PlacesUtils.bookmarks.getItemGUID(this._id);
|
||||
|
||||
PlacesUtils.bookmarks.removeItem(this._id);
|
||||
|
@ -1134,7 +1147,7 @@ placesTagURITransaction.prototype = {
|
|||
undoTransaction: function PTU_undoTransaction() {
|
||||
if (this._unfiledItemId != -1) {
|
||||
// If a GUID exists for this item, preserve it before removing the item.
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(this._unfiledItemId, GUID_ANNO)) {
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(this._unfiledItemId, PlacesUtils.GUID_ANNO)) {
|
||||
this._GUID = PlacesUtils.bookmarks.getItemGUID(this._unfiledItemId);
|
||||
}
|
||||
PlacesUtils.bookmarks.removeItem(this._unfiledItemId);
|
||||
|
|
|
@ -44,6 +44,7 @@ include $(DEPTH)/config/autoconf.mk
|
|||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
_BROWSER_TEST_FILES = \
|
||||
head.js \
|
||||
browser_0_library_left_pane_migration.js \
|
||||
browser_library_left_pane_fixnames.js \
|
||||
browser_425884.js \
|
||||
|
|
|
@ -60,7 +60,7 @@ function windowObserver(aSubject, aTopic, aData) {
|
|||
"Left pane folder correctly created");
|
||||
var leftPaneItems =
|
||||
PlacesUtils.annotations
|
||||
.getItemsWithAnnotation(ORGANIZER_FOLDER_ANNO);
|
||||
.getItemsWithAnnotation(PlacesUIUtils.ORGANIZER_FOLDER_ANNO);
|
||||
is(leftPaneItems.length, 1,
|
||||
"We correctly have only 1 left pane folder");
|
||||
var leftPaneRoot = leftPaneItems[0];
|
||||
|
@ -69,8 +69,8 @@ function windowObserver(aSubject, aTopic, aData) {
|
|||
// Check version has been upgraded.
|
||||
var version =
|
||||
PlacesUtils.annotations.getItemAnnotation(leftPaneRoot,
|
||||
ORGANIZER_FOLDER_ANNO);
|
||||
is(version, ORGANIZER_LEFTPANE_VERSION,
|
||||
PlacesUIUtils.ORGANIZER_FOLDER_ANNO);
|
||||
is(version, PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION,
|
||||
"Left pane version has been correctly upgraded");
|
||||
|
||||
// Check left pane is populated.
|
||||
|
@ -92,20 +92,20 @@ function test() {
|
|||
// Sanity checks.
|
||||
ok(PlacesUtils, "PlacesUtils is running in chrome context");
|
||||
ok(PlacesUIUtils, "PlacesUIUtils is running in chrome context");
|
||||
ok(ORGANIZER_LEFTPANE_VERSION > 0,
|
||||
"Left pane version in chrome context, current version is: " + ORGANIZER_LEFTPANE_VERSION );
|
||||
ok(PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION > 0,
|
||||
"Left pane version in chrome context, current version is: " + PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION );
|
||||
|
||||
// Check if we have any left pane folder already set, remove it eventually.
|
||||
var leftPaneItems = PlacesUtils.annotations
|
||||
.getItemsWithAnnotation(ORGANIZER_FOLDER_ANNO);
|
||||
.getItemsWithAnnotation(PlacesUIUtils.ORGANIZER_FOLDER_ANNO);
|
||||
if (leftPaneItems.length > 0) {
|
||||
// The left pane has already been created, touching it now would cause
|
||||
// next tests to rely on wrong values (and possibly crash)
|
||||
is(leftPaneItems.length, 1, "We correctly have only 1 left pane folder");
|
||||
// Check version.
|
||||
var version = PlacesUtils.annotations.getItemAnnotation(leftPaneItems[0],
|
||||
ORGANIZER_FOLDER_ANNO);
|
||||
is(version, ORGANIZER_LEFTPANE_VERSION, "Left pane version is actual");
|
||||
PlacesUIUtils.ORGANIZER_FOLDER_ANNO);
|
||||
is(version, PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION, "Left pane version is actual");
|
||||
ok(true, "left pane has already been created, skipping test");
|
||||
finish();
|
||||
return;
|
||||
|
@ -116,21 +116,21 @@ function test() {
|
|||
PlacesUtils.bookmarks.createFolder(PlacesUtils.placesRootId, "",
|
||||
PlacesUtils.bookmarks.DEFAULT_INDEX);
|
||||
PlacesUtils.annotations.setItemAnnotation(fakeLeftPaneRoot,
|
||||
ORGANIZER_FOLDER_ANNO,
|
||||
ORGANIZER_LEFTPANE_VERSION - 1,
|
||||
PlacesUIUtils.ORGANIZER_FOLDER_ANNO,
|
||||
PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION - 1,
|
||||
0,
|
||||
PlacesUtils.annotations.EXPIRE_NEVER);
|
||||
|
||||
// Check fake left pane root has been correctly created.
|
||||
var leftPaneItems =
|
||||
PlacesUtils.annotations.getItemsWithAnnotation(ORGANIZER_FOLDER_ANNO);
|
||||
PlacesUtils.annotations.getItemsWithAnnotation(PlacesUIUtils.ORGANIZER_FOLDER_ANNO);
|
||||
is(leftPaneItems.length, 1, "We correctly have only 1 left pane folder");
|
||||
is(leftPaneItems[0], fakeLeftPaneRoot, "left pane root itemId is correct");
|
||||
|
||||
// Check version.
|
||||
var version = PlacesUtils.annotations.getItemAnnotation(fakeLeftPaneRoot,
|
||||
ORGANIZER_FOLDER_ANNO);
|
||||
is(version, ORGANIZER_LEFTPANE_VERSION - 1, "Left pane version correctly set");
|
||||
PlacesUIUtils.ORGANIZER_FOLDER_ANNO);
|
||||
is(version, PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION - 1, "Left pane version correctly set");
|
||||
|
||||
// Open Library, this will upgrade our left pane version.
|
||||
ww.registerNotification(windowObserver);
|
||||
|
|
|
@ -143,7 +143,9 @@ function test() {
|
|||
var xferable = Cc["@mozilla.org/widget/transferable;1"].
|
||||
createInstance(Ci.nsITransferable);
|
||||
xferable.addDataFlavor(PU.TYPE_X_MOZ_PLACE);
|
||||
PUIU.clipboard.getData(xferable, Ci.nsIClipboard.kGlobalClipboard);
|
||||
var clipboard = Cc["@mozilla.org/widget/clipboard;1"].
|
||||
getService(Ci.nsIClipboard);
|
||||
clipboard.getData(xferable, Ci.nsIClipboard.kGlobalClipboard);
|
||||
var data = { }, type = { };
|
||||
xferable.getAnyTransferData(type, data, { });
|
||||
// Data is in the clipboard
|
||||
|
|
|
@ -172,11 +172,11 @@ function test() {
|
|||
|
||||
is(shortcutNode.itemId, shortcutId, "shortcut id and shortcut node item id match");
|
||||
|
||||
LOG("can move shortcut id?");
|
||||
dump("can move shortcut id?\n");
|
||||
is(PlacesControllerDragHelper.canMoveContainer(shortcutId),
|
||||
true, "should be able to move special folder shortcut id");
|
||||
|
||||
LOG("can move shortcut node?");
|
||||
dump("can move shortcut node?\n");
|
||||
is(PlacesControllerDragHelper.canMoveNode(shortcutNode),
|
||||
true, "should be able to move special folder shortcut node");
|
||||
}
|
||||
|
|
|
@ -118,12 +118,12 @@ function populate(aFolderId) {
|
|||
}
|
||||
|
||||
function validate(aNode) {
|
||||
asContainer(aNode);
|
||||
PlacesUtils.asContainer(aNode);
|
||||
aNode.containerOpen = true;
|
||||
is(aNode.childCount, 1, "confirm child count match");
|
||||
var folderNode = aNode.getChild(0);
|
||||
is(folderNode.title, "test folder", "confirm folder title");
|
||||
asContainer(folderNode);
|
||||
PlacesUtils.asContainer(folderNode);
|
||||
folderNode.containerOpen = true;
|
||||
is(folderNode.childCount, 2, "confirm child count match");
|
||||
var bookmarkNode = folderNode.getChild(0);
|
||||
|
|
|
@ -57,7 +57,7 @@ function test() {
|
|||
var testRootId = PlacesUtils.bookmarks.createFolder(toolbarId, "test root", -1);
|
||||
is(toolbarNode.childCount, oldCount+1, "confirm test root node is a container, and is empty");
|
||||
var testRootNode = toolbarNode.getChild(toolbarNode.childCount-1);
|
||||
asContainer(testRootNode);
|
||||
PlacesUtils.asContainer(testRootNode);
|
||||
testRootNode.containerOpen = true;
|
||||
is(testRootNode.childCount, 0, "confirm test root node is a container, and is empty");
|
||||
|
||||
|
@ -120,7 +120,7 @@ function test() {
|
|||
}
|
||||
|
||||
function getGUIDs(aNode) {
|
||||
asContainer(aNode);
|
||||
PlacesUtils.asContainer(aNode);
|
||||
aNode.containerOpen = true;
|
||||
var GUIDs = {
|
||||
folder: PlacesUtils.bookmarks.getItemGUID(aNode.itemId),
|
||||
|
@ -139,7 +139,7 @@ function checkGUIDs(aFolderNode, aGUIDs, aShouldMatch) {
|
|||
return aEquals ? (nodeGUID == aGUID) : (nodeGUID != aGUID);
|
||||
}
|
||||
|
||||
asContainer(aFolderNode);
|
||||
PlacesUtils.asContainer(aFolderNode);
|
||||
aFolderNode.containerOpen = true;
|
||||
|
||||
var allMatch = check(aFolderNode, aGUIDs.folder, aShouldMatch) &&
|
||||
|
|
|
@ -530,6 +530,10 @@ gTests.push({
|
|||
|
||||
function test() {
|
||||
waitForExplicitFinish();
|
||||
// This test can take some time, if we timeout too early it could run
|
||||
// in the middle of other tests, or hang them.
|
||||
requestLongerTimeout(2);
|
||||
|
||||
// Sanity checks.
|
||||
ok(PlacesUtils, "PlacesUtils in context");
|
||||
ok(PlacesUIUtils, "PlacesUIUtils in context");
|
||||
|
|
|
@ -81,32 +81,32 @@ function test() {
|
|||
// Sanity checks.
|
||||
ok(PlacesUtils, "PlacesUtils is running in chrome context");
|
||||
ok(PlacesUIUtils, "PlacesUIUtils is running in chrome context");
|
||||
ok(ORGANIZER_LEFTPANE_VERSION > 0,
|
||||
"Left pane version in chrome context, current version is: " + ORGANIZER_LEFTPANE_VERSION );
|
||||
ok(PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION > 0,
|
||||
"Left pane version in chrome context, current version is: " + PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION );
|
||||
|
||||
// Ensure left pane is initialized.
|
||||
ok(PlacesUIUtils.leftPaneFolderId > 0, "left pane folder is initialized");
|
||||
|
||||
// Get the left pane folder.
|
||||
var leftPaneItems = PlacesUtils.annotations
|
||||
.getItemsWithAnnotation(ORGANIZER_FOLDER_ANNO);
|
||||
.getItemsWithAnnotation(PlacesUIUtils.ORGANIZER_FOLDER_ANNO);
|
||||
|
||||
is(leftPaneItems.length, 1, "We correctly have only 1 left pane folder");
|
||||
// Check version.
|
||||
var version = PlacesUtils.annotations
|
||||
.getItemAnnotation(leftPaneItems[0],
|
||||
ORGANIZER_FOLDER_ANNO);
|
||||
is(version, ORGANIZER_LEFTPANE_VERSION, "Left pane version is actual");
|
||||
PlacesUIUtils.ORGANIZER_FOLDER_ANNO);
|
||||
is(version, PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION, "Left pane version is actual");
|
||||
|
||||
// Get all left pane queries.
|
||||
var items = PlacesUtils.annotations
|
||||
.getItemsWithAnnotation(ORGANIZER_QUERY_ANNO);
|
||||
.getItemsWithAnnotation(PlacesUIUtils.ORGANIZER_QUERY_ANNO);
|
||||
// Get current queries names.
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
var itemId = items[i];
|
||||
var queryName = PlacesUtils.annotations
|
||||
.getItemAnnotation(items[i],
|
||||
ORGANIZER_QUERY_ANNO);
|
||||
PlacesUIUtils.ORGANIZER_QUERY_ANNO);
|
||||
var query = { name: queryName,
|
||||
itemId: itemId,
|
||||
correctTitle: PlacesUtils.bookmarks.getItemTitle(itemId) }
|
||||
|
@ -131,6 +131,8 @@ function test() {
|
|||
PlacesUtils.bookmarks.setItemTitle(query.concreteId, "badName");
|
||||
}
|
||||
|
||||
PlacesUIUtils.__defineGetter__("leftPaneFolderId", cachedLeftPaneFolderIdGetter);
|
||||
|
||||
// Open Library, this will kick-off left pane code.
|
||||
ww.registerNotification(windowObserver);
|
||||
ww.openWindow(null,
|
||||
|
|
|
@ -82,10 +82,6 @@ var gTabsListener = {
|
|||
if (gCurrentTest.URIs.indexOf(spec) != -1 )
|
||||
this._loadedURIs.push(spec);
|
||||
|
||||
var fm = Components.classes["@mozilla.org/focus-manager;1"].
|
||||
getService(Components.interfaces.nsIFocusManager);
|
||||
is(fm.activeWindow, gBrowser.ownerDocument.defaultView, "window made active");
|
||||
|
||||
if (this._loadedURIs.length == gCurrentTest.URIs.length) {
|
||||
// We have correctly opened all URIs.
|
||||
|
||||
|
@ -97,7 +93,7 @@ var gTabsListener = {
|
|||
this._openTabsCount = 0;
|
||||
|
||||
// Test finished. This will move to the next one.
|
||||
gCurrentTest.finish();
|
||||
waitForFocus(gCurrentTest.finish, gBrowser.ownerDocument.defaultView);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -252,6 +248,8 @@ gTests.push({
|
|||
|
||||
function test() {
|
||||
waitForExplicitFinish();
|
||||
// Increase timeout, this test can be quite slow due to waitForFocus calls.
|
||||
requestLongerTimeout(2);
|
||||
|
||||
// Sanity checks.
|
||||
ok(PlacesUtils, "PlacesUtils in context");
|
||||
|
@ -302,8 +300,10 @@ function runNextTest() {
|
|||
gCurrentTest.setup();
|
||||
|
||||
// Middle click on first node in the content tree of the Library.
|
||||
gLibrary.PlacesOrganizer._content.focus();
|
||||
mouseEventOnCell(gLibrary.PlacesOrganizer._content, 0, 0, { button: 1 });
|
||||
gLibrary.focus();
|
||||
waitForFocus(function() {
|
||||
mouseEventOnCell(gLibrary.PlacesOrganizer._content, 0, 0, { button: 1 });
|
||||
}, gLibrary);
|
||||
}
|
||||
else {
|
||||
// No more tests.
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
|
||||
// We need to cache this before test runs...
|
||||
let cachedLeftPaneFolderIdGetter;
|
||||
let (getter = PlacesUIUtils.__lookupGetter__("leftPaneFolderId")) {
|
||||
if (!cachedLeftPaneFolderIdGetter && typeof(getter) == "function")
|
||||
cachedLeftPaneFolderIdGetter = getter;
|
||||
}
|
||||
// ...And restore it when test ends.
|
||||
registerCleanupFunction(function(){
|
||||
let (getter = PlacesUIUtils.__lookupGetter__("leftPaneFolderId")) {
|
||||
if (cachedLeftPaneFolderIdGetter && typeof(getter) != "function")
|
||||
PlacesUIUtils.__defineGetter__("leftPaneFolderId",
|
||||
cachedLeftPaneFolderIdGetter);
|
||||
}
|
||||
});
|
|
@ -47,8 +47,8 @@ _CHROME_TEST_FILES = \
|
|||
test_treeview_date.xul \
|
||||
test_bug485100-change-case-loses-tag.xul \
|
||||
test_bug427633_no_newfolder_if_noip.xul \
|
||||
test_multiple_left_pane.xul \
|
||||
test_bug510634.xul \
|
||||
test_0_multiple_left_pane.xul \
|
||||
test_0_bug510634.xul \
|
||||
$(NULL)
|
||||
|
||||
libs:: $(_CHROME_TEST_FILES)
|
||||
|
|
|
@ -108,7 +108,7 @@
|
|||
tree.place = "place:queryType=1&folder=" + leftPaneFolderId;
|
||||
|
||||
// Open All Bookmarks
|
||||
asContainer(tree.view.nodeForTreeIndex(2)).containerOpen = true;
|
||||
PlacesUtils.asContainer(tree.view.nodeForTreeIndex(2)).containerOpen = true;
|
||||
|
||||
// The query-property is set on the title column for each row.
|
||||
let titleColumn = tree.treeBoxObject.columns.getColumnAt(0);
|
||||
|
@ -127,6 +127,9 @@
|
|||
// Close the root node
|
||||
tree.getResult().root.containerOpen = false;
|
||||
|
||||
// Restore the getter for the next test.
|
||||
PlacesUIUtils.__defineGetter__("leftPaneFolderId", cachedLeftPaneFolderIdGetter);
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
|
@ -71,9 +71,9 @@
|
|||
// Sanity checks.
|
||||
ok(PlacesUtils, "PlacesUtils is running in chrome context");
|
||||
ok(PlacesUIUtils, "PlacesUIUtils is running in chrome context");
|
||||
ok(ORGANIZER_LEFTPANE_VERSION > 0,
|
||||
ok(PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION > 0,
|
||||
"Left pane version in chrome context, " +
|
||||
"current version is: " + ORGANIZER_LEFTPANE_VERSION );
|
||||
"current version is: " + PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION );
|
||||
|
||||
var fakeLeftPanes = [];
|
||||
var as = PlacesUtils.annotations;
|
||||
|
@ -81,12 +81,12 @@
|
|||
|
||||
// We need 2 left pane folders to simulate a corrupt profile.
|
||||
do {
|
||||
let leftPaneItems = as.getItemsWithAnnotation(ORGANIZER_FOLDER_ANNO);
|
||||
let leftPaneItems = as.getItemsWithAnnotation(PlacesUIUtils.ORGANIZER_FOLDER_ANNO);
|
||||
// Create a fake left pane folder.
|
||||
let fakeLeftPaneRoot = bs.createFolder(PlacesUtils.placesRootId, "",
|
||||
bs.DEFAULT_INDEX);
|
||||
as.setItemAnnotation(fakeLeftPaneRoot, ORGANIZER_FOLDER_ANNO,
|
||||
ORGANIZER_LEFTPANE_VERSION, 0,
|
||||
as.setItemAnnotation(fakeLeftPaneRoot, PlacesUIUtils.ORGANIZER_FOLDER_ANNO,
|
||||
PlacesUIUtils.ORGANIZER_LEFTPANE_VERSION, 0,
|
||||
as.EXPIRE_NEVER);
|
||||
fakeLeftPanes.push(fakeLeftPaneRoot);
|
||||
} while (fakeLeftPanes.length < 2);
|
||||
|
@ -97,7 +97,7 @@
|
|||
// Check left pane.
|
||||
ok(PlacesUIUtils.leftPaneFolderId > 0,
|
||||
"Left pane folder correctly created");
|
||||
var leftPaneItems = as.getItemsWithAnnotation(ORGANIZER_FOLDER_ANNO);
|
||||
var leftPaneItems = as.getItemsWithAnnotation(PlacesUIUtils.ORGANIZER_FOLDER_ANNO);
|
||||
is(leftPaneItems.length, 1,
|
||||
"We correctly have only 1 left pane folder");
|
||||
|
|
@ -53,6 +53,16 @@ let (commonFile = do_get_file("../../test_places/head_common.js", false)) {
|
|||
// Put any other stuff relative to this test folder below.
|
||||
|
||||
|
||||
XPCOMUtils.defineLazyGetter(this, "PlacesUIUtils", function() {
|
||||
Cu.import("resource:///modules/PlacesUIUtils.jsm");
|
||||
return PlacesUIUtils;
|
||||
});
|
||||
|
||||
|
||||
const ORGANIZER_FOLDER_ANNO = "PlacesOrganizer/OrganizerFolder";
|
||||
const ORGANIZER_QUERY_ANNO = "PlacesOrganizer/OrganizerQuery";
|
||||
|
||||
|
||||
// Needed by some test that relies on having an app registered.
|
||||
let (XULAppInfo = {
|
||||
vendor: "Mozilla",
|
||||
|
|
|
@ -116,10 +116,7 @@ function run_test() {
|
|||
// We want empty roots.
|
||||
remove_all_bookmarks();
|
||||
|
||||
// Import PlacesUIUtils.
|
||||
let scriptLoader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
|
||||
getService(Ci.mozIJSSubScriptLoader);
|
||||
scriptLoader.loadSubScript("chrome://browser/content/places/utils.js", this);
|
||||
// Sanity check.
|
||||
do_check_true(!!PlacesUIUtils);
|
||||
|
||||
// Check getters.
|
||||
|
|
|
@ -723,29 +723,6 @@
|
|||
}
|
||||
}
|
||||
})]]></field>
|
||||
|
||||
<!-- DND Observer -->
|
||||
<field name="searchbarDNDObserver" readonly="true"><![CDATA[({
|
||||
mOuter: this,
|
||||
|
||||
onDrop: function (aEvent, aXferData, aDragSession) {
|
||||
var data = transferUtils.retrieveURLFromData(aXferData.data,
|
||||
aXferData.flavour.contentType);
|
||||
if (data) {
|
||||
this.mOuter.value = data;
|
||||
this.mOuter.onTextEntered(aEvent);
|
||||
}
|
||||
},
|
||||
|
||||
getSupportedFlavours: function () {
|
||||
var flavourSet = new FlavourSet();
|
||||
|
||||
flavourSet.appendFlavour("text/unicode");
|
||||
flavourSet.appendFlavour("text/x-moz-url");
|
||||
flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
|
||||
return flavourSet;
|
||||
}
|
||||
})]]></field>
|
||||
</implementation>
|
||||
|
||||
<handlers>
|
||||
|
@ -771,8 +748,26 @@
|
|||
action="return this.openSearch();"/>
|
||||
#endif
|
||||
|
||||
<handler event="drop" phase="capturing">
|
||||
nsDragAndDrop.drop(event, this.searchbarDNDObserver);
|
||||
<handler event="dragover">
|
||||
<![CDATA[
|
||||
var types = event.dataTransfer.types;
|
||||
if (types.contains("text/plain") || types.contains("text/x-moz-text-internal"))
|
||||
event.preventDefault();
|
||||
]]>
|
||||
</handler>
|
||||
|
||||
<handler event="drop">
|
||||
<![CDATA[
|
||||
var dataTransfer = event.dataTransfer;
|
||||
var data = dataTransfer.getData("text/plain");
|
||||
if (!data)
|
||||
data = dataTransfer.getData("text/x-moz-text-internal");
|
||||
if (data) {
|
||||
event.preventDefault();
|
||||
this.value = data;
|
||||
this.onTextEntered(event);
|
||||
}
|
||||
]]>
|
||||
</handler>
|
||||
|
||||
</handlers>
|
||||
|
|
|
@ -125,12 +125,44 @@ function test() {
|
|||
isnot(event.originalTarget, gBrowser.contentDocument,
|
||||
"Shift+MiddleClick loaded results in background tab");
|
||||
|
||||
testRightClick();
|
||||
testDropText();
|
||||
});
|
||||
}
|
||||
|
||||
// prevent the search buttonmenu from opening during the drag tests
|
||||
function stopPopup(event) { event.preventDefault(); }
|
||||
|
||||
function testDropText() {
|
||||
init();
|
||||
searchBar.addEventListener("popupshowing", stopPopup, true);
|
||||
// drop on the search button so that we don't need to worry about the
|
||||
// default handlers for textboxes.
|
||||
EventUtils.synthesizeDrop(searchBar.searchButton, [[ {type: "text/plain", data: "Some Text" } ]], "copy", window);
|
||||
doOnloadOnce(function(event) {
|
||||
is(searchBar.value, "Some Text", "drop text/plain on searchbar");
|
||||
testDropInternalText();
|
||||
});
|
||||
}
|
||||
|
||||
function testDropInternalText() {
|
||||
init();
|
||||
EventUtils.synthesizeDrop(searchBar.searchButton, [[ {type: "text/x-moz-text-internal", data: "More Text" } ]], "copy", window);
|
||||
doOnloadOnce(function(event) {
|
||||
is(searchBar.value, "More Text", "drop text/x-moz-text-internal on searchbar");
|
||||
testDropLink();
|
||||
});
|
||||
}
|
||||
|
||||
function testDropLink() {
|
||||
init();
|
||||
EventUtils.synthesizeDrop(searchBar.searchButton, [[ {type: "text/uri-list", data: "http://www.mozilla.org" } ]], "copy", window);
|
||||
is(searchBar.value, "More Text", "drop text/uri-list on searchbar");
|
||||
SimpleTest.executeSoon(testRightClick);
|
||||
}
|
||||
|
||||
function testRightClick() {
|
||||
init();
|
||||
searchBar.removeEventListener("popupshowing", stopPopup, true);
|
||||
content.location.href = "about:blank";
|
||||
simulateClick({ button: 2 }, searchButton);
|
||||
setTimeout(function() {
|
||||
|
|
|
@ -326,6 +326,7 @@
|
|||
@BINPATH@/components/nsBadCertHandler.js
|
||||
@BINPATH@/components/nsFormAutoComplete.js
|
||||
@BINPATH@/components/contentSecurityPolicy.js
|
||||
@BINPATH@/components/contentAreaDropListener.js
|
||||
#ifdef XP_MACOSX
|
||||
@BINPATH@/components/libalerts_s.dylib
|
||||
#endif
|
||||
|
|
|
@ -48,6 +48,8 @@ yes=Yes
|
|||
no=No
|
||||
|
||||
mediaImg=Image
|
||||
mediaVideo=Video
|
||||
mediaAudio=Audio
|
||||
mediaBGImg=Background
|
||||
mediaObject=Object
|
||||
mediaEmbed=Embed
|
||||
|
|
|
@ -49,23 +49,22 @@
|
|||
background-color: white;
|
||||
}
|
||||
|
||||
#TabsToolbar:not(:-moz-lwtheme) {
|
||||
margin-bottom: 0;
|
||||
-moz-box-shadow: ThreeDDarkShadow 0 -1px inset;
|
||||
}
|
||||
|
||||
.tabbrowser-tab:not(:-moz-lwtheme),
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up:not(:-moz-lwtheme),
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down:not(:-moz-lwtheme),
|
||||
.tabs-newtab-button:not(:-moz-lwtheme),
|
||||
.tabs-alltabs-button:not(:-moz-lwtheme) {
|
||||
background-color: rgba(255,255,255,.5);
|
||||
.tabbrowser-arrowscrollbox > .tabs-newtab-button:not(:-moz-lwtheme) {
|
||||
background-image: -moz-linear-gradient(left, transparent, transparent 1px,
|
||||
rgba(255,255,255,.4) 1px, rgba(255,255,255,.4));
|
||||
text-shadow: 0 1px 0 rgba(255,255,255,.4);
|
||||
}
|
||||
|
||||
.tabbrowser-tab:not(:-moz-lwtheme):not([selected="true"]):hover,
|
||||
.tabbrowser-arrowscrollbox > .tabs-newtab-button:not(:-moz-lwtheme):hover {
|
||||
background-image: -moz-linear-gradient(left, transparent, transparent 1px,
|
||||
rgba(255,255,255,.6) 1px, rgba(255,255,255,.6));
|
||||
}
|
||||
|
||||
.tabbrowser-tab[selected="true"]:not(:-moz-lwtheme) {
|
||||
background-color: white;
|
||||
text-shadow: none;
|
||||
background-image: -moz-linear-gradient(left, transparent, transparent 1px,
|
||||
white 1px, white);
|
||||
}
|
||||
|
||||
#allTabs-panel,
|
||||
|
|
|
@ -941,8 +941,8 @@ richlistitem[type="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-i
|
|||
min-height: 0;
|
||||
padding: 0;
|
||||
border-style: none;
|
||||
margin-bottom: 2px;
|
||||
-moz-box-shadow: ThreeDShadow 0 -1px inset, -moz-dialog 0 2px;
|
||||
background: -moz-linear-gradient(transparent, transparent 10%,
|
||||
rgba(0,0,0,.03) 50%, rgba(0,0,0,.1) 90%, rgba(0,0,0,.2));
|
||||
}
|
||||
|
||||
.tabbrowser-tabs:-moz-system-metric(touch-enabled) {
|
||||
|
@ -955,65 +955,53 @@ richlistitem[type="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-i
|
|||
|
||||
/* Tabs */
|
||||
.tabbrowser-tab,
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up,
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down,
|
||||
.tabs-newtab-button,
|
||||
.tabs-alltabs-button {
|
||||
.tabbrowser-arrowscrollbox > .tabs-newtab-button {
|
||||
-moz-appearance: none;
|
||||
background: url("chrome://browser/skin/tabbrowser/tab-bkgnd.png") repeat-x;
|
||||
margin: 3px 0 1px;
|
||||
border: 2px solid;
|
||||
border-right-width: 1px;
|
||||
border-bottom: none;
|
||||
-moz-border-top-colors: ThreeDShadow rgba(255,255,255,.3);
|
||||
-moz-border-left-colors: ThreeDShadow rgba(255,255,255,.3);
|
||||
}
|
||||
|
||||
.tabbrowser-tab:-moz-lwtheme-brighttext,
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up:-moz-lwtheme-brighttext,
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down:-moz-lwtheme-brighttext,
|
||||
.tabs-newtab-button:-moz-lwtheme-brighttext,
|
||||
.tabs-alltabs-button:-moz-lwtheme-brighttext {
|
||||
background-color: rgba(0,0,0,.5);
|
||||
}
|
||||
|
||||
.tabbrowser-tab:-moz-lwtheme-darktext,
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up:-moz-lwtheme-darktext,
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down:-moz-lwtheme-darktext,
|
||||
.tabs-newtab-button:-moz-lwtheme-darktext,
|
||||
.tabs-alltabs-button:-moz-lwtheme-darktext {
|
||||
background-color: rgba(255,255,255,.5);
|
||||
}
|
||||
|
||||
.tabbrowser-tab {
|
||||
padding: 0 1px 1px 0;
|
||||
-moz-border-radius-topleft: 2px;
|
||||
-moz-border-radius-topright: 2px;
|
||||
-moz-border-right-colors: rgba(0,0,0,.1);
|
||||
background: -moz-linear-gradient(left, transparent, transparent 1px,
|
||||
rgba(255,255,255,.15) 1px, rgba(255,255,255,.15));
|
||||
background-position: -6px 0;
|
||||
-moz-background-size: 200%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
-moz-border-image: url(tabbrowser/tab.png) 3 5 3 6 / 3px 5px 3px 6px;
|
||||
-moz-border-radius: 6px 4px 0 0;
|
||||
}
|
||||
|
||||
.tabbrowser-tab:hover,
|
||||
.tabbrowser-tab[selected="true"] {
|
||||
border-width: 1px;
|
||||
-moz-border-radius-topleft: 4px;
|
||||
-moz-border-radius-topright: 4px;
|
||||
-moz-border-top-colors: ThreeDShadow;
|
||||
-moz-border-right-colors: ThreeDShadow;
|
||||
-moz-border-left-colors: ThreeDShadow;
|
||||
.tabbrowser-arrowscrollbox > .tabs-newtab-button:hover {
|
||||
background-image: -moz-linear-gradient(left, transparent, transparent 1px,
|
||||
rgba(255,255,255,.4) 1px, rgba(255,255,255,.4));
|
||||
}
|
||||
|
||||
.tabbrowser-tab:not([selected="true"]):hover {
|
||||
margin: 2px 0 1px;
|
||||
padding: 2px 1px 1px;
|
||||
background-image: url("chrome://browser/skin/tabbrowser/tab-hover-bkgnd.png");
|
||||
.tabbrowser-tab:-moz-lwtheme-brighttext,
|
||||
.tabbrowser-arrowscrollbox > .tabs-newtab-button:-moz-lwtheme-brighttext {
|
||||
background-image: -moz-linear-gradient(left, transparent, transparent 1px,
|
||||
rgba(40%,40%,40%,.6) 1px, rgba(40%,40%,40%,.6));
|
||||
}
|
||||
|
||||
.tabbrowser-tab:-moz-lwtheme-brighttext:not([selected="true"]):hover,
|
||||
.tabbrowser-arrowscrollbox > .tabs-newtab-button:-moz-lwtheme-brighttext:hover {
|
||||
background-image: -moz-linear-gradient(left, transparent, transparent 1px,
|
||||
rgba(60%,60%,60%,.6) 1px, rgba(60%,60%,60%,.6));
|
||||
}
|
||||
|
||||
.tabbrowser-tab:-moz-lwtheme-darktext,
|
||||
.tabbrowser-arrowscrollbox > .tabs-newtab-button:-moz-lwtheme-darktext {
|
||||
background-image: -moz-linear-gradient(left, transparent, transparent 1px,
|
||||
rgba(255,255,255,.4) 1px, rgba(255,255,255,.4));
|
||||
}
|
||||
|
||||
.tabbrowser-tab:-moz-lwtheme-darktext:not([selected="true"]):hover,
|
||||
.tabbrowser-arrowscrollbox > .tabs-newtab-button:-moz-lwtheme-darktext:hover {
|
||||
background-image: -moz-linear-gradient(left, transparent, transparent 1px,
|
||||
rgba(255,255,255,.6) 1px, rgba(255,255,255,.6));
|
||||
}
|
||||
|
||||
.tabbrowser-tab[selected="true"] {
|
||||
margin: 2px 0 0;
|
||||
padding: 1px;
|
||||
background-image: url("chrome://browser/skin/tabbrowser/tab-active-bkgnd.png");
|
||||
background-color: -moz-dialog;
|
||||
font-weight: bold;
|
||||
background-image: -moz-linear-gradient(left, transparent, transparent 1px,
|
||||
rgba(255,255,255,.4) 1px, rgba(255,255,255,.4)),
|
||||
-moz-linear-gradient(left, transparent, transparent 1px,
|
||||
-moz-dialog 1px, -moz-dialog);
|
||||
}
|
||||
|
||||
.tabbrowser-tab:-moz-lwtheme[selected="true"] {
|
||||
|
@ -1057,8 +1045,6 @@ richlistitem[type="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-i
|
|||
}
|
||||
|
||||
.tab-icon-image {
|
||||
margin-top: 1px;
|
||||
-moz-margin-start: 7px;
|
||||
-moz-margin-end: 3px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
|
@ -1081,15 +1067,9 @@ richlistitem[type="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-i
|
|||
}
|
||||
|
||||
/* Tab close button */
|
||||
.tab-close-button > .toolbarbutton-icon {
|
||||
-moz-margin-end: 0px !important;
|
||||
margin-top: 1px;
|
||||
}
|
||||
|
||||
.tab-close-button {
|
||||
-moz-appearance: none;
|
||||
-moz-image-region: rect(0px, 56px, 14px, 42px);
|
||||
-moz-margin-end: 6px;
|
||||
border: none;
|
||||
padding: 0px;
|
||||
list-style-image: url("chrome://global/skin/icons/close.png");
|
||||
|
@ -1121,16 +1101,6 @@ richlistitem[type="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-i
|
|||
}
|
||||
|
||||
/* Tab scrollbox arrow, tabstrip new tab and all-tabs buttons */
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up,
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down,
|
||||
.tabs-newtab-button,
|
||||
.tabs-alltabs-button {
|
||||
width: 18px;
|
||||
padding: 0;
|
||||
-moz-border-right-colors: ThreeDShadow;
|
||||
-moz-image-region: rect(0, 11px, 14px, 0);
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up:-moz-system-metric(touch-enabled),
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down:-moz-system-metric(touch-enabled),
|
||||
.tabs-alltabs-button:-moz-system-metric(touch-enabled) {
|
||||
|
@ -1141,21 +1111,12 @@ richlistitem[type="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-i
|
|||
min-width: 1cm;
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up:not([disabled="true"]):hover,
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down:not([disabled="true"]):hover,
|
||||
.tabs-newtab-button:hover,
|
||||
.tabs-alltabs-button:hover {
|
||||
border-top-width: 1px;
|
||||
padding-top: 1px;
|
||||
-moz-border-top-colors: ThreeDShadow;
|
||||
-moz-border-right-colors: ThreeDShadow;
|
||||
-moz-border-left-colors: ThreeDShadow transparent;
|
||||
background-image: url("chrome://browser/skin/tabbrowser/tab-hover-bkgnd.png");
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up,
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down {
|
||||
-moz-image-region: rect(0, 15px, 17px, 0);
|
||||
margin: 0;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up:not([disabled="true"]):hover,
|
||||
|
@ -1174,24 +1135,13 @@ richlistitem[type="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-i
|
|||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up:-moz-locale-dir(ltr) {
|
||||
border-left-style: none;
|
||||
-moz-border-radius-topright: 2px;
|
||||
list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-left.png");
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up:-moz-locale-dir(rtl) {
|
||||
border-right-style: none;
|
||||
-moz-border-radius-topleft: 2px;
|
||||
list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-right.png");
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down:-moz-locale-dir(ltr),
|
||||
.tabbrowser-tabs > .tabs-newtab-button:-moz-locale-dir(ltr),
|
||||
.tabs-alltabs-button:-moz-locale-dir(ltr) {
|
||||
border-right-style: none;
|
||||
-moz-border-radius-topleft: 2px;
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down {
|
||||
list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-right.png");
|
||||
-moz-transition: 1s background-color ease-out;
|
||||
|
@ -1202,30 +1152,21 @@ richlistitem[type="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-i
|
|||
-moz-transition: none;
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down:-moz-locale-dir(rtl),
|
||||
.tabbrowser-tabs > .tabs-newtab-button:-moz-locale-dir(rtl),
|
||||
.tabs-alltabs-button:-moz-locale-dir(rtl) {
|
||||
border-left-style: none;
|
||||
-moz-border-radius-topright: 2px;
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down:-moz-locale-dir(rtl) {
|
||||
list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-left.png");
|
||||
}
|
||||
|
||||
.tabs-newtab-button {
|
||||
list-style-image: url(chrome://browser/skin/tabbrowser/newtab.png);
|
||||
-moz-image-region: rect(0, 18px, 18px, 0);
|
||||
-moz-image-region: rect(0, 16px, 18px, 0);
|
||||
}
|
||||
|
||||
.tabs-newtab-button:hover:active {
|
||||
-moz-image-region: rect(0, 36px, 18px, 18px);
|
||||
-moz-image-region: rect(0, 32px, 18px, 16px);
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .tabs-newtab-button {
|
||||
width: 31px;
|
||||
-moz-border-radius-topright: 2px;
|
||||
-moz-border-radius-topleft: 2px;
|
||||
}
|
||||
|
||||
.tabs-alltabs-button > .toolbarbutton-text {
|
||||
|
@ -1234,16 +1175,16 @@ richlistitem[type="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-i
|
|||
|
||||
.tabs-alltabs-button > .toolbarbutton-icon {
|
||||
list-style-image: url("chrome://browser/skin/tabbrowser/alltabs.png");
|
||||
-moz-image-region: rect(0, 14px, 20px, 0);
|
||||
-moz-image-region: rect(0, 14px, 17px, 0);
|
||||
}
|
||||
|
||||
.tabs-alltabs-button:hover:active > .toolbarbutton-icon {
|
||||
-moz-image-region: rect(0, 28px, 20px, 14px);
|
||||
-moz-image-region: rect(0, 28px, 17px, 14px);
|
||||
}
|
||||
|
||||
.tabs-alltabs-button[type="menu"] > .toolbarbutton-icon {
|
||||
list-style-image: url("chrome://browser/skin/mainwindow-dropdown-arrow.png");
|
||||
margin: 5px 0 4px;
|
||||
margin: 3px 0;
|
||||
-moz-image-region: rect(0, 13px, 11px, 0);
|
||||
}
|
||||
|
||||
|
@ -1295,25 +1236,12 @@ richlistitem[type="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-i
|
|||
}
|
||||
|
||||
.tabbrowser-tabs > .tabs-closebutton {
|
||||
margin: 3px 0px 3px;
|
||||
margin: 0;
|
||||
padding: 4px 2px 2px;
|
||||
background: -moz-dialog url("chrome://browser/skin/tabbrowser/tab-active-bkgnd.png") repeat-x;
|
||||
border-left: 1px solid threedshadow;
|
||||
border-top: 1px solid threedshadow;
|
||||
-moz-border-radius-topleft: 2px;
|
||||
}
|
||||
|
||||
.tabbrowser-tabs > .tabs-closebutton:-moz-locale-dir(rtl) {
|
||||
border-left: none;
|
||||
border-right: 1px solid threedshadow;
|
||||
-moz-border-radius-topleft: 0px;
|
||||
-moz-border-radius-topright: 2px;
|
||||
}
|
||||
|
||||
#sidebar-box .tabs-closebutton {
|
||||
#sidebar-header > .tabs-closebutton {
|
||||
list-style-image: url("chrome://global/skin/icons/closeSidebar.png");
|
||||
margin-bottom: 0px !important;
|
||||
padding: 0px 2px 0px 2px !important;
|
||||
}
|
||||
|
||||
toolbarbutton.chevron {
|
||||
|
|
|
@ -79,12 +79,10 @@ browser.jar:
|
|||
skin/classic/browser/tabbrowser/newtab.png (tabbrowser/newtab.png)
|
||||
skin/classic/browser/tabbrowser/progress.png (tabbrowser/progress.png)
|
||||
skin/classic/browser/tabbrowser/progress-pulsing.png (tabbrowser/progress-pulsing.png)
|
||||
skin/classic/browser/tabbrowser/tab.png (tabbrowser/tab.png)
|
||||
skin/classic/browser/tabbrowser/tab-arrow-left.png (tabbrowser/tab-arrow-left.png)
|
||||
skin/classic/browser/tabbrowser/tab-arrow-right.png (tabbrowser/tab-arrow-right.png)
|
||||
skin/classic/browser/tabbrowser/tabDragIndicator.png (tabbrowser/tabDragIndicator.png)
|
||||
skin/classic/browser/tabbrowser/tab-bkgnd.png (tabbrowser/tab-bkgnd.png)
|
||||
skin/classic/browser/tabbrowser/tab-active-bkgnd.png (tabbrowser/tab-active-bkgnd.png)
|
||||
skin/classic/browser/tabbrowser/tab-hover-bkgnd.png (tabbrowser/tab-hover-bkgnd.png)
|
||||
|
||||
#ifdef XP_WIN
|
||||
browser.jar:
|
||||
|
@ -167,10 +165,8 @@ browser.jar:
|
|||
skin/classic/aero/browser/tabbrowser/newtab.png (tabbrowser/newtab-aero.png)
|
||||
skin/classic/aero/browser/tabbrowser/progress.png (tabbrowser/progress.png)
|
||||
skin/classic/aero/browser/tabbrowser/progress-pulsing.png (tabbrowser/progress-pulsing.png)
|
||||
skin/classic/aero/browser/tabbrowser/tab.png (tabbrowser/tab.png)
|
||||
skin/classic/aero/browser/tabbrowser/tab-arrow-left.png (tabbrowser/tab-arrow-left-aero.png)
|
||||
skin/classic/aero/browser/tabbrowser/tab-arrow-right.png (tabbrowser/tab-arrow-right-aero.png)
|
||||
skin/classic/aero/browser/tabbrowser/tabDragIndicator.png (tabbrowser/tabDragIndicator-aero.png)
|
||||
skin/classic/aero/browser/tabbrowser/tab-bkgnd.png (tabbrowser/tab-bkgnd.png)
|
||||
skin/classic/aero/browser/tabbrowser/tab-active-bkgnd.png (tabbrowser/tab-active-bkgnd.png)
|
||||
skin/classic/aero/browser/tabbrowser/tab-hover-bkgnd.png (tabbrowser/tab-hover-bkgnd.png)
|
||||
#endif
|
||||
|
|
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/alltabs-aero.png
До Ширина: | Высота: | Размер: 731 B После Ширина: | Высота: | Размер: 726 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/alltabs.png
До Ширина: | Высота: | Размер: 719 B После Ширина: | Высота: | Размер: 715 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/newtab-aero.png
До Ширина: | Высота: | Размер: 687 B После Ширина: | Высота: | Размер: 692 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/newtab.png
До Ширина: | Высота: | Размер: 687 B После Ширина: | Высота: | Размер: 700 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/tab-active-bkgnd.png
До Ширина: | Высота: | Размер: 188 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/tab-bkgnd.png
До Ширина: | Высота: | Размер: 189 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/tab-hover-bkgnd.png
До Ширина: | Высота: | Размер: 892 B |
После Ширина: | Высота: | Размер: 681 B |
|
@ -198,4 +198,6 @@ ifeq ($(OS_ARCH),Linux)
|
|||
libs:: $(topsrcdir)/tools/rb/fix-linux-stack.pl
|
||||
$(INSTALL) $< $(DIST)/bin
|
||||
endif
|
||||
|
||||
GARBAGE += automationutils.pyc
|
||||
endif # ENABLE_TESTS
|
||||
|
|
|
@ -78,4 +78,4 @@ automation.py: $(MOZILLA_DIR)/build/automation.py.in $(MOZILLA_DIR)/build/automa
|
|||
$(PYTHON) $(MOZILLA_DIR)/config/Preprocessor.py \
|
||||
$(AUTOMATION_PPARGS) $(DEFINES) $(ACDEFINES) $< > $@
|
||||
|
||||
GARBAGE += automation.py
|
||||
GARBAGE += automation.py automation.pyc
|
||||
|
|
|
@ -131,6 +131,7 @@ export::
|
|||
-DMOZ_NATIVE_ZLIB=$(MOZ_NATIVE_ZLIB) \
|
||||
-DMOZ_NATIVE_PNG=$(MOZ_NATIVE_PNG) \
|
||||
-DMOZ_NATIVE_JPEG=$(MOZ_NATIVE_JPEG) \
|
||||
-DMOZ_NATIVE_LIBEVENT=$(MOZ_NATIVE_LIBEVENT) \
|
||||
$(srcdir)/system-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers
|
||||
$(INSTALL) system_wrappers $(DIST)
|
||||
|
||||
|
|
|
@ -210,7 +210,6 @@ MOZ_RDF = @MOZ_RDF@
|
|||
|
||||
NECKO_PROTOCOLS = @NECKO_PROTOCOLS@
|
||||
NECKO_DISK_CACHE = @NECKO_DISK_CACHE@
|
||||
NECKO_SMALL_BUFFERS = @NECKO_SMALL_BUFFERS@
|
||||
NECKO_COOKIES = @NECKO_COOKIES@
|
||||
NECKO_WIFI = @NECKO_WIFI@
|
||||
MOZ_AUTH_EXTENSION = @MOZ_AUTH_EXTENSION@
|
||||
|
@ -219,6 +218,10 @@ MOZ_NATIVE_HUNSPELL = @SYSTEM_HUNSPELL@
|
|||
MOZ_HUNSPELL_LIBS = @MOZ_HUNSPELL_LIBS@
|
||||
MOZ_HUNSPELL_CFLAGS = @MOZ_HUNSPELL_CFLAGS@
|
||||
|
||||
MOZ_NATIVE_LIBEVENT = @MOZ_NATIVE_LIBEVENT@
|
||||
MOZ_LIBEVENT_LIBS = @MOZ_LIBEVENT_LIBS@
|
||||
MOZ_LIBEVENT_INCLUDES = @MOZ_LIBEVENT_INCLUDES@
|
||||
|
||||
MOZ_NATIVE_ZLIB = @SYSTEM_ZLIB@
|
||||
MOZ_NATIVE_BZ2 = @SYSTEM_BZ2@
|
||||
MOZ_NATIVE_JPEG = @SYSTEM_JPEG@
|
||||
|
|
|
@ -526,7 +526,7 @@ OS_COMPILE_CMMFLAGS += -fobjc-exceptions
|
|||
endif
|
||||
|
||||
COMPILE_CFLAGS = $(VISIBILITY_FLAGS) $(DEFINES) $(INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(CFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CFLAGS)
|
||||
COMPILE_CXXFLAGS = $(VISIBILITY_FLAGS) $(STL_FLAGS) $(DEFINES) $(INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(CXXFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CXXFLAGS)
|
||||
COMPILE_CXXFLAGS = $(STL_FLAGS) $(VISIBILITY_FLAGS) $(DEFINES) $(INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(CXXFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CXXFLAGS)
|
||||
COMPILE_CMFLAGS = $(OS_COMPILE_CMFLAGS)
|
||||
COMPILE_CMMFLAGS = $(OS_COMPILE_CMMFLAGS)
|
||||
|
||||
|
|
|
@ -45,13 +45,23 @@
|
|||
# error "STL code can only be used with -fno-exceptions"
|
||||
#endif
|
||||
|
||||
// Silence "warning: #include_next is a GCC extension"
|
||||
#pragma GCC system_header
|
||||
|
||||
// mozalloc.h wants <new>; break the cycle by always explicitly
|
||||
// including <new> here. NB: this is a tad sneaky. Sez the gcc docs:
|
||||
//
|
||||
// `#include_next' does not distinguish between <file> and "file"
|
||||
// inclusion, nor does it check that the file you specify has the
|
||||
// same name as the current file. It simply looks for the file
|
||||
// named, starting with the directory in the search path after the
|
||||
// one where the current file was found.
|
||||
#include_next <new>
|
||||
|
||||
// See if we're in code that can use mozalloc. NB: this duplicates
|
||||
// code in nscore.h because nscore.h pulls in prtypes.h, and chromium
|
||||
// can't build with that being included before base/basictypes.h.
|
||||
#if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC)
|
||||
# include <new> // to give mozalloc std::bad_alloc
|
||||
# include <stdlib.h> // to give mozalloc malloc/free decls
|
||||
# include <string.h>
|
||||
# include "mozilla/mozalloc.h"
|
||||
#else
|
||||
# error "STL code can only be used with infallible ::operator new()"
|
||||
|
@ -78,8 +88,8 @@
|
|||
// these __throw_*() functions will always throw exceptions (shades of
|
||||
// -fshort-wchar). We don't want that and so define our own inlined
|
||||
// __throw_*().
|
||||
#ifndef mozilla_functexcept_h
|
||||
# include "mozilla/functexcept.h"
|
||||
#ifndef mozilla_throw_gcc_h
|
||||
# include "mozilla/throw_gcc.h"
|
||||
#endif
|
||||
|
||||
#endif // if mozilla_${HEADER}_h
|
||||
|
|
|
@ -62,7 +62,8 @@ def main(outdir, compiler, template_file, header_list_file):
|
|||
os.mkdir(outdir)
|
||||
|
||||
template = open(template_file, 'r').read()
|
||||
|
||||
path_to_new = header_path('new', compiler)
|
||||
|
||||
for header in open(header_list_file, 'r'):
|
||||
header = header.rstrip()
|
||||
if 0 == len(header) or is_comment(header):
|
||||
|
@ -72,7 +73,8 @@ def main(outdir, compiler, template_file, header_list_file):
|
|||
try:
|
||||
f = open(os.path.join(outdir, header), 'w')
|
||||
f.write(string.Template(template).substitute(HEADER=header,
|
||||
HEADER_PATH=path))
|
||||
HEADER_PATH=path,
|
||||
NEW_HEADER_PATH=path_to_new))
|
||||
finally:
|
||||
f.close()
|
||||
|
||||
|
|
|
@ -45,13 +45,22 @@
|
|||
# error "STL code can only be used with -fno-exceptions"
|
||||
#endif
|
||||
|
||||
// Code built with !_HAS_EXCEPTIONS calls std::_Throw(), but the win2k
|
||||
// CRT doesn't export std::_Throw(). So we define it.
|
||||
#ifndef mozilla_Throw_h
|
||||
# include "mozilla/throw_msvc.h"
|
||||
#endif
|
||||
|
||||
// Code might include <new> before other wrapped headers, but <new>
|
||||
// includes <exception> and so we want to wrap it. But mozalloc.h
|
||||
// wants <new> also, so we break the cycle by always explicitly
|
||||
// including <new> here.
|
||||
#include <${NEW_HEADER_PATH}>
|
||||
|
||||
// See if we're in code that can use mozalloc. NB: this duplicates
|
||||
// code in nscore.h because nscore.h pulls in prtypes.h, and chromium
|
||||
// can't build with that being included before base/basictypes.h.
|
||||
#if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC)
|
||||
# include <new> // to give mozalloc std::bad_alloc
|
||||
# include <stdlib.h> // to give mozalloc malloc/free decls
|
||||
# include <string.h>
|
||||
# include "mozilla/mozalloc.h"
|
||||
#else
|
||||
# error "STL code can only be used with infallible ::operator new()"
|
||||
|
|
|
@ -606,15 +606,6 @@ endif
|
|||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(OS_ARCH),Linux)
|
||||
ifneq (,$(filter mips mipsel,$(OS_TEST)))
|
||||
ifeq ($(MODULE),layout)
|
||||
OS_CFLAGS += -Wa,-xgot
|
||||
OS_CXXFLAGS += -Wa,-xgot
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
#
|
||||
# HP-UXBeOS specific section: for COMPONENTS only, add -Bsymbolic flag
|
||||
# which uses internal symbols first
|
||||
|
@ -664,6 +655,14 @@ EXTRA_DSO_LDOPTS += -Wl,-Bsymbolic
|
|||
endif
|
||||
endif
|
||||
|
||||
#
|
||||
# GNU doesn't have path length limitation
|
||||
#
|
||||
|
||||
ifeq ($(OS_ARCH),GNU)
|
||||
OS_CPPFLAGS += -DPATH_MAX=1024 -DMAXPATHLEN=1024
|
||||
endif
|
||||
|
||||
#
|
||||
# MINGW32
|
||||
#
|
||||
|
|
|
@ -12,8 +12,17 @@
|
|||
# safety of <foo> for gcc and MSVC".
|
||||
#
|
||||
|
||||
new
|
||||
|
||||
# FIXME: these headers haven't been reviewed yet, but we use them
|
||||
# unsafely in modules/libpr0n, so we might as well prevent it from
|
||||
# unsafely in Gecko, so we might as well prevent them from
|
||||
# throwing exceptions
|
||||
algorithm
|
||||
deque
|
||||
iostream
|
||||
list
|
||||
map
|
||||
memory
|
||||
stack
|
||||
string
|
||||
vector
|
||||
|
|
|
@ -1024,3 +1024,6 @@ conic/conicconnection.h
|
|||
conic/conicconnectionevent.h
|
||||
conic/conicstatisticsevent.h
|
||||
#endif
|
||||
#if MOZ_NATIVE_LIBEVENT==1
|
||||
event.h
|
||||
#endif
|
||||
|
|
159
configure.in
|
@ -760,8 +760,43 @@ EOF
|
|||
AC_DEFINE_UNQUOTED(MOZ_NTDDI_LONGHORN, 0x06000000)
|
||||
AC_DEFINE_UNQUOTED(MOZ_NTDDI_WIN7, 0x06010000)
|
||||
|
||||
STL_FLAGS='-D_HAS_EXCEPTIONS=0 -I$(DIST)/stl_wrappers'
|
||||
WRAP_STL_INCLUDES=1
|
||||
AC_CACHE_CHECK(for std::_Throw, ac_cv_have_std__Throw,
|
||||
[
|
||||
AC_LANG_SAVE
|
||||
AC_LANG_CPLUSPLUS
|
||||
_SAVE_CXXFLAGS="$CXXFLAGS"
|
||||
CXXFLAGS="${CXXFLAGS} -D_HAS_EXCEPTIONS=0"
|
||||
AC_TRY_COMPILE([#include <exception>],
|
||||
[std::_Throw(std::exception()); return 0;],
|
||||
ac_cv_have_std__Throw="yes",
|
||||
ac_cv_have_std__Throw="no")
|
||||
CXXFLAGS="$_SAVE_CXXFLAGS"
|
||||
AC_LANG_RESTORE
|
||||
])
|
||||
|
||||
if test "$ac_cv_have_std__Throw" = "no"; then
|
||||
AC_MSG_ERROR([Your MSVC/SDK doesn't export std::_Throw. This breaks assumptions in Gecko. Please file a bug describing this error along with your build configuration.])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK(for |class __declspec(dllimport) exception| bug,
|
||||
ac_cv_have_dllimport_exception_bug,
|
||||
[
|
||||
AC_LANG_SAVE
|
||||
AC_LANG_CPLUSPLUS
|
||||
_SAVE_CXXFLAGS="$CXXFLAGS"
|
||||
CXXFLAGS="${CXXFLAGS} -D_HAS_EXCEPTIONS=0"
|
||||
AC_TRY_LINK([#include <vector>],
|
||||
[std::vector<int> v; return v.at(1);],
|
||||
ac_cv_have_dllimport_exception_bug="no",
|
||||
ac_cv_have_dllimport_exception_bug="yes")
|
||||
CXXFLAGS="$_SAVE_CXXFLAGS"
|
||||
AC_LANG_RESTORE
|
||||
])
|
||||
|
||||
if test "$ac_cv_have_dllimport_exception_bug" = "no"; then
|
||||
STL_FLAGS='-D_HAS_EXCEPTIONS=0 -I$(DIST)/stl_wrappers'
|
||||
WRAP_STL_INCLUDES=1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
|
@ -1094,6 +1129,7 @@ if test -n "$CROSS_COMPILE"; then
|
|||
case "${target_os}" in
|
||||
linux*) OS_ARCH=Linux OS_TARGET=Linux ;;
|
||||
kfreebsd*-gnu) OS_ARCH=GNU_kFreeBSD OS_TARGET=GNU_kFreeBSD ;;
|
||||
gnu*) OS_ARCH=GNU ;;
|
||||
solaris*) OS_ARCH=SunOS OS_RELEASE=5 ;;
|
||||
mingw*) OS_ARCH=WINNT ;;
|
||||
wince*) OS_ARCH=WINCE ;;
|
||||
|
@ -1390,9 +1426,7 @@ x86_64 | ia64)
|
|||
;;
|
||||
|
||||
arm)
|
||||
if test "$OS_TARGET" = "WINCE"; then
|
||||
CPU_ARCH="$OS_TEST"
|
||||
fi
|
||||
CPU_ARCH=arm
|
||||
;;
|
||||
esac
|
||||
|
||||
|
@ -1434,8 +1468,8 @@ if test "$GNU_CC"; then
|
|||
if test -z "$INTEL_CC"; then
|
||||
# Don't use -Wcast-align with ICC
|
||||
case "$CPU_ARCH" in
|
||||
# And don't use it on hppa, ia64, sparc, since it's noisy there
|
||||
hppa | ia64 | sparc)
|
||||
# And don't use it on hppa, ia64, sparc, arm, since it's noisy there
|
||||
hppa | ia64 | sparc | arm)
|
||||
;;
|
||||
*)
|
||||
_WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wcast-align"
|
||||
|
@ -1497,8 +1531,8 @@ if test "$GNU_CXX"; then
|
|||
if test -z "$INTEL_CC"; then
|
||||
# Don't use -Wcast-align with ICC
|
||||
case "$CPU_ARCH" in
|
||||
# And don't use it on hppa, ia64, sparc, since it's noisy there
|
||||
hppa | ia64 | sparc)
|
||||
# And don't use it on hppa, ia64, sparc, arm, since it's noisy there
|
||||
hppa | ia64 | sparc | arm)
|
||||
;;
|
||||
*)
|
||||
_WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wcast-align"
|
||||
|
@ -1738,7 +1772,7 @@ case "$host" in
|
|||
HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O3}"
|
||||
;;
|
||||
|
||||
*-linux*|*-kfreebsd*-gnu)
|
||||
*-linux*|*-kfreebsd*-gnu|*-gnu*)
|
||||
HOST_CFLAGS="$HOST_CFLAGS -DXP_UNIX"
|
||||
HOST_NSPR_MDCPUCFG='\"md/_linux.cfg\"'
|
||||
HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O3}"
|
||||
|
@ -2767,7 +2801,7 @@ dnl ========================================================
|
|||
dnl = Flags to strip unused symbols from .so components
|
||||
dnl ========================================================
|
||||
case "$target" in
|
||||
*-linux*|*-kfreebsd*-gnu)
|
||||
*-linux*|*-kfreebsd*-gnu|*-gnu*)
|
||||
MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-Wl,--version-script -Wl,$(BUILD_TOOLS)/gnu-ld-scripts/components-version-script'
|
||||
;;
|
||||
*-solaris*)
|
||||
|
@ -3550,7 +3584,7 @@ then
|
|||
fi
|
||||
;;
|
||||
|
||||
*-*-linux*|*-*-kfreebsd*-gnu)
|
||||
*-*-linux*|*-*-kfreebsd*-gnu|*-*-gnu*)
|
||||
AC_DEFINE(_REENTRANT)
|
||||
;;
|
||||
|
||||
|
@ -3947,8 +3981,30 @@ dnl Put your C++ language/feature checks below
|
|||
dnl ========================================================
|
||||
AC_LANG_CPLUSPLUS
|
||||
|
||||
ARM_ABI_PREFIX=
|
||||
HAVE_GCC3_ABI=
|
||||
if test "$GNU_CC"; then
|
||||
if test "$CPU_ARCH" = "arm" ; then
|
||||
AC_CACHE_CHECK(for ARM EABI,
|
||||
ac_cv_gcc_arm_eabi,
|
||||
[AC_TRY_COMPILE([],
|
||||
[
|
||||
#if defined(__ARM_EABI__)
|
||||
return 0;
|
||||
#else
|
||||
#error Not ARM EABI.
|
||||
#endif
|
||||
],
|
||||
ac_cv_gcc_arm_eabi="yes",
|
||||
ac_cv_gcc_arm_eabi="no")])
|
||||
if test "$ac_cv_gcc_arm_eabi" = "yes"; then
|
||||
HAVE_ARM_EABI=1
|
||||
ARM_ABI_PREFIX=eabi-
|
||||
else
|
||||
ARM_ABI_PREFIX=oabi-
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK(for gcc 3.0 ABI,
|
||||
ac_cv_gcc_three_abi,
|
||||
[AC_TRY_COMPILE([],
|
||||
|
@ -3962,10 +4018,10 @@ if test "$GNU_CC"; then
|
|||
ac_cv_gcc_three_abi="yes",
|
||||
ac_cv_gcc_three_abi="no")])
|
||||
if test "$ac_cv_gcc_three_abi" = "yes"; then
|
||||
TARGET_COMPILER_ABI="${TARGET_COMPILER_ABI-gcc3}"
|
||||
TARGET_COMPILER_ABI="${TARGET_COMPILER_ABI-${ARM_ABI_PREFIX}gcc3}"
|
||||
HAVE_GCC3_ABI=1
|
||||
else
|
||||
TARGET_COMPILER_ABI="${TARGET_COMPILER_ABI-gcc2}"
|
||||
TARGET_COMPILER_ABI="${TARGET_COMPILER_ABI-${ARM_ABI_PREFIX}gcc2}"
|
||||
fi
|
||||
fi
|
||||
AC_SUBST(HAVE_GCC3_ABI)
|
||||
|
@ -4268,7 +4324,16 @@ AC_CACHE_CHECK(for __thread keyword for TLS variables,
|
|||
ac_cv_thread_keyword=no)])
|
||||
LDFLAGS=$_SAVE_LDFLAGS
|
||||
if test "$ac_cv_thread_keyword" = yes; then
|
||||
AC_DEFINE(HAVE_THREAD_TLS_KEYWORD)
|
||||
# mips builds fail with TLS variables because of a binutils bug.
|
||||
# See bug 528687
|
||||
case "${target_cpu}" in
|
||||
mips*)
|
||||
:
|
||||
;;
|
||||
*)
|
||||
AC_DEFINE(HAVE_THREAD_TLS_KEYWORD)
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
dnl Check for the existence of various allocation headers/functions
|
||||
|
@ -4469,6 +4534,43 @@ else
|
|||
fi
|
||||
fi
|
||||
|
||||
dnl system libevent Support
|
||||
dnl ========================================================
|
||||
MOZ_ARG_WITH_STRING(system-libevent,
|
||||
[ --with-system-libevent=[PFX]
|
||||
Use system libevent [installed at prefix PFX]],
|
||||
LIBEVENT_DIR=$withval)
|
||||
|
||||
_SAVE_CFLAGS=$CFLAGS
|
||||
_SAVE_LDFLAGS=$LDFLAGS
|
||||
_SAVE_LIBS=$LIBS
|
||||
if test -z "$LIBEVENT_DIR" -o "$LIBEVENT_DIR" = no; then
|
||||
MOZ_NATIVE_LIBEVENT=
|
||||
else
|
||||
if test "${LIBEVENT_DIR}" = "yes"; then
|
||||
LIBEVENT_DIR=/usr
|
||||
fi
|
||||
CFLAGS="-I${LIBEVENT_DIR}/include $CFLAGS"
|
||||
LDFLAGS="-L${LIBEVENT_DIR}/lib $LDFLAGS"
|
||||
AC_CHECK_HEADER(event.h,
|
||||
[if test ! -f "${LIBEVENT_DIR}/include/event.h"; then
|
||||
AC_MSG_ERROR([event.h found, but is not in ${LIBEVENT_DIR}/include])
|
||||
fi],
|
||||
AC_MSG_ERROR([--with-system-libevent requested but event.h not found]))
|
||||
AC_CHECK_LIB(event, event_init,
|
||||
[MOZ_NATIVE_LIBEVENT=1
|
||||
MOZ_LIBEVENT_INCLUDES="${LIBEVENT_DIR}/include"
|
||||
MOZ_LIBEVENT_LIBS="-L${LIBEVENT_DIR}/lib -levent"],
|
||||
[MOZ_NATIVE_LIBEVENT= MOZ_LIBEVENT_INCLUDES= MOZ_LIBEVENT_LIBS=])
|
||||
fi
|
||||
CFLAGS=$_SAVE_CFLAGS
|
||||
LDFLAGS=$_SAVE_LDFLAGS
|
||||
LIBS=$_SAVE_LIBS
|
||||
|
||||
AC_SUBST(MOZ_NATIVE_LIBEVENT)
|
||||
AC_SUBST(MOZ_LIBEVENT_INCLUDES)
|
||||
AC_SUBST(MOZ_LIBEVENT_LIBS)
|
||||
|
||||
dnl ========================================================
|
||||
dnl = If NSS was not detected in the system,
|
||||
dnl = use the one in the source tree (mozilla/security/nss)
|
||||
|
@ -4769,7 +4871,6 @@ NECKO_WIFI=1
|
|||
NECKO_COOKIES=1
|
||||
NECKO_DISK_CACHE=1
|
||||
NECKO_PROTOCOLS_DEFAULT="about data file ftp gopher http res viewsource"
|
||||
NECKO_SMALL_BUFFERS=
|
||||
BUILD_CTYPES=1
|
||||
XPC_IDISPATCH_SUPPORT=
|
||||
|
||||
|
@ -7135,6 +7236,19 @@ if test -n "$MOZ_TIMELINE"; then
|
|||
AC_DEFINE(MOZ_TIMELINE)
|
||||
fi
|
||||
|
||||
dnl ========================================================
|
||||
dnl = Enable NS_FUNCTION_TIMER, which provides Function
|
||||
dnl = timing for identifying code bottlenecks
|
||||
dnl = NS_FUNCTION_TIMER is off by default.
|
||||
dnl ========================================================
|
||||
MOZ_ARG_ENABLE_BOOL(functiontimer,
|
||||
[ --enable-functiontimer Enable NS_FUNCTION_TIMER ],
|
||||
NS_FUNCTION_TIMER=1,
|
||||
NS_FUNCTION_TIMER= )
|
||||
if test -n "$NS_FUNCTION_TIMER"; then
|
||||
AC_DEFINE(NS_FUNCTION_TIMER)
|
||||
fi
|
||||
|
||||
dnl ========================================================
|
||||
dnl Turn on reflow counting
|
||||
dnl ========================================================
|
||||
|
@ -8099,19 +8213,6 @@ if test "$NECKO_WIFI"; then
|
|||
fi
|
||||
AC_SUBST(NECKO_WIFI)
|
||||
|
||||
dnl
|
||||
dnl option to minimize size of necko's i/o buffers
|
||||
dnl
|
||||
MOZ_ARG_ENABLE_BOOL(necko-small-buffers,
|
||||
[ --enable-necko-small-buffers
|
||||
Minimize size of necko's i/o buffers],
|
||||
NECKO_SMALL_BUFFERS=1,
|
||||
NECKO_SMALL_BUFFERS=)
|
||||
AC_SUBST(NECKO_SMALL_BUFFERS)
|
||||
if test "$NECKO_SMALL_BUFFERS"; then
|
||||
AC_DEFINE(NECKO_SMALL_BUFFERS)
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl option to disable cookies
|
||||
dnl
|
||||
|
|
|
@ -107,7 +107,7 @@ XPIDLSRCS = \
|
|||
nsISelectionPrivate.idl \
|
||||
nsIScriptLoaderObserver.idl \
|
||||
nsISyncLoadDOMService.idl \
|
||||
nsIDragDropHandler.idl \
|
||||
nsIDroppedLinkHandler.idl \
|
||||
nsIScriptEventHandler.idl \
|
||||
nsIScriptEventManager.idl \
|
||||
nsIImageLoadingContent.idl \
|
||||
|
|
|
@ -71,8 +71,8 @@ enum nsLinkState {
|
|||
|
||||
// IID for the nsIContent interface
|
||||
#define NS_ICONTENT_IID \
|
||||
{ 0x07734640, 0x0900, 0x480d, \
|
||||
{ 0x97, 0x5a, 0x31, 0xc7, 0x0e, 0xcd, 0x15, 0x2b } }
|
||||
{ 0x9d15dea4, 0xa112, 0x40f4, \
|
||||
{ 0xbd, 0xa9, 0x23, 0xc0, 0xed, 0xde, 0x08, 0x9c } }
|
||||
|
||||
/**
|
||||
* A node of content in a document's content model. This interface
|
||||
|
@ -642,6 +642,14 @@ public:
|
|||
*/
|
||||
virtual nsIContent *GetBindingParent() const = 0;
|
||||
|
||||
/**
|
||||
* Returns the content node that is the parent of this node in the flattened
|
||||
* tree.
|
||||
*
|
||||
* @return the flattened tree parent
|
||||
*/
|
||||
nsIContent *GetFlattenedTreeParent() const;
|
||||
|
||||
/**
|
||||
* Get the base URI for any relative URIs within this piece of
|
||||
* content. Generally, this is the document's base URI, but certain
|
||||
|
|
|
@ -115,8 +115,8 @@ class Link;
|
|||
} // namespace mozilla
|
||||
|
||||
#define NS_IDOCUMENT_IID \
|
||||
{ 0x3e162645, 0x4827, 0x4600, \
|
||||
{ 0x9c, 0xaa, 0xe8, 0xdd, 0xcb, 0x05, 0xfd, 0x85 } }
|
||||
{ 0x17e1c0ce, 0x3883, 0x4efc, \
|
||||
{ 0xbf, 0xdf, 0x40, 0xa6, 0x26, 0x9f, 0xbd, 0x2c } }
|
||||
|
||||
// Flag for AddStyleSheet().
|
||||
#define NS_STYLESHEET_FROM_CATALOG (1 << 0)
|
||||
|
@ -641,7 +641,10 @@ public:
|
|||
* this document. If you're not absolutely sure you need this, use
|
||||
* GetWindow().
|
||||
*/
|
||||
virtual nsPIDOMWindow *GetInnerWindow() = 0;
|
||||
nsPIDOMWindow* GetInnerWindow()
|
||||
{
|
||||
return mRemovedFromDocShell ? GetInnerWindowInternal() : mWindow;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the script loader for this document
|
||||
|
@ -1353,6 +1356,9 @@ protected:
|
|||
// want to expose to users of the nsIDocument API outside of Gecko.
|
||||
}
|
||||
|
||||
// Never ever call this. Only call GetInnerWindow!
|
||||
virtual nsPIDOMWindow *GetInnerWindowInternal() = 0;
|
||||
|
||||
/**
|
||||
* These methods should be called before and after dispatching
|
||||
* a mutation event.
|
||||
|
@ -1486,6 +1492,10 @@ protected:
|
|||
PRUint32 mEventsSuppressed;
|
||||
|
||||
nsString mPendingStateObject;
|
||||
|
||||
// Weak reference to mScriptGlobalObject QI:d to nsPIDOMWindow,
|
||||
// updated on every set of mSecriptGlobalObject.
|
||||
nsPIDOMWindow *mWindow;
|
||||
};
|
||||
|
||||
NS_DEFINE_STATIC_IID_ACCESSOR(nsIDocument, NS_IDOCUMENT_IID)
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is the Mozilla Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Neil Deakin <enndeakin@gmail.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsISupports.idl"
|
||||
|
||||
interface nsIDOMDragEvent;
|
||||
interface nsIURI;
|
||||
|
||||
[scriptable, uuid(F266B79B-7026-4D2D-B4BD-4F2C6B6C59B4)]
|
||||
interface nsIDroppedLinkHandler : nsISupports
|
||||
{
|
||||
/**
|
||||
* Determines if a link being dragged can be dropped and returns true if so.
|
||||
* aEvent should be a dragenter or dragover event.
|
||||
*
|
||||
* If aAllowSameDocument is false, drops are only allowed if the document
|
||||
* of the source of the drag is different from the destination. This check
|
||||
* includes any parent, sibling and child frames in the same content tree.
|
||||
* If true, the source is not checked.
|
||||
*/
|
||||
boolean canDropLink(in nsIDOMDragEvent aEvent, in PRBool aAllowSameDocument);
|
||||
|
||||
/**
|
||||
* Given a drop event aEvent, determines the link being dragged and returns
|
||||
* it. If a uri is returned the caller can, for instance, load it. If null
|
||||
* is returned, there is no valid link to be dropped. A
|
||||
* NS_ERROR_DOM_SECURITY_ERR error will be thrown and the event cancelled if
|
||||
* the receiving target should not load the uri for security reasons. This
|
||||
* will occur if the source of the drag initiated a link for dragging that
|
||||
* it itself cannot access. This prevents a source document from tricking
|
||||
* the user into a dragging a chrome url for example.
|
||||
*
|
||||
* aName is filled in with the link title if it exists, or an empty string
|
||||
* otherwise.
|
||||
*/
|
||||
AString dropLink(in nsIDOMDragEvent aEvent, out AString aName);
|
||||
};
|
|
@ -145,8 +145,17 @@ enum {
|
|||
NODE_ATTACH_BINDING_ON_POSTCREATE
|
||||
= 0x00040000U,
|
||||
|
||||
// This node needs to go through frame construction to get a frame (or
|
||||
// undisplayed entry).
|
||||
NODE_NEEDS_FRAME = 0x00080000U,
|
||||
|
||||
// At least one descendant in the flattened tree has NODE_NEEDS_FRAME set.
|
||||
// This should be set on every node on the flattened tree path between the
|
||||
// node(s) with NODE_NEEDS_FRAME and the root content.
|
||||
NODE_DESCENDANTS_NEED_FRAMES = 0x00100000U,
|
||||
|
||||
// Four bits for the script-type ID
|
||||
NODE_SCRIPT_TYPE_OFFSET = 20,
|
||||
NODE_SCRIPT_TYPE_OFFSET = 21,
|
||||
|
||||
NODE_SCRIPT_TYPE_SIZE = 4,
|
||||
|
||||
|
@ -242,9 +251,9 @@ private:
|
|||
|
||||
// IID for the nsINode interface
|
||||
#define NS_INODE_IID \
|
||||
{ 0xe71b48a8, 0xeead, 0x4320, \
|
||||
{ 0xb4, 0xb0, 0x15, 0xcd, 0x7c, 0x53, 0x96, 0x8c } }
|
||||
|
||||
{ 0xbc347b50, 0xa9b8, 0x419e, \
|
||||
{ 0xb1, 0x21, 0x76, 0x8f, 0x90, 0x05, 0x8d, 0xbf } }
|
||||
|
||||
/**
|
||||
* An internal interface that abstracts some DOMNode-related parts that both
|
||||
* nsIContent and nsIDocument share. An instance of this interface has a list
|
||||
|
@ -765,7 +774,9 @@ public:
|
|||
NS_ASSERTION(!(aFlagsToSet & (NODE_IS_ANONYMOUS |
|
||||
NODE_IS_NATIVE_ANONYMOUS_ROOT |
|
||||
NODE_IS_IN_ANONYMOUS_SUBTREE |
|
||||
NODE_ATTACH_BINDING_ON_POSTCREATE)) ||
|
||||
NODE_ATTACH_BINDING_ON_POSTCREATE |
|
||||
NODE_DESCENDANTS_NEED_FRAMES |
|
||||
NODE_NEEDS_FRAME)) ||
|
||||
IsNodeOfType(eCONTENT),
|
||||
"Flag only permitted on nsIContent nodes");
|
||||
PtrBits* flags = HasSlots() ? &FlagsAsSlots()->mFlags :
|
||||
|
|
|
@ -155,6 +155,7 @@ FORCE_STATIC_LIB = 1
|
|||
EXTRA_COMPONENTS = \
|
||||
$(srcdir)/nsBadCertHandler.js \
|
||||
contentSecurityPolicy.js \
|
||||
contentAreaDropListener.js \
|
||||
$(NULL)
|
||||
|
||||
EXTRA_JS_MODULES = \
|
||||
|
|
|
@ -0,0 +1,150 @@
|
|||
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
|
||||
const Cc = Components.classes;
|
||||
const Ci = Components.interfaces;
|
||||
|
||||
// This component is used for handling dragover and drop of urls.
|
||||
//
|
||||
// It checks to see whether a drop of a url is allowed. For instance, a url
|
||||
// cannot be dropped if it is not a valid uri or the source of the drag cannot
|
||||
// access the uri. This prevents, for example, a source document from tricking
|
||||
// the user into dragging a chrome url.
|
||||
|
||||
function ContentAreaDropListener() { };
|
||||
|
||||
ContentAreaDropListener.prototype =
|
||||
{
|
||||
classDescription: "A component that handles dragover and drop events on a content area",
|
||||
classID: Components.ID("{1f34bc80-1bc7-11d6-a384-d705dd0746fc}"),
|
||||
contractID: "@mozilla.org/content/dropped-link-handler;1",
|
||||
QueryInterface: XPCOMUtils.generateQI([Ci.nsIDroppedLinkHandler, Ci.nsISupports]),
|
||||
|
||||
_getDropURL : function (dt)
|
||||
{
|
||||
let types = dt.types;
|
||||
for (let t = 0; t < types.length; t++) {
|
||||
let type = types[t];
|
||||
switch (type) {
|
||||
case "text/uri-list":
|
||||
var url = dt.getData("URL").replace(/^\s+|\s+$/g, "");
|
||||
return [url, url];
|
||||
case "text/plain":
|
||||
case "text/x-moz-text-internal":
|
||||
var url = dt.getData(type).replace(/^\s+|\s+$/g, "");
|
||||
return [url, url];
|
||||
case "text/x-moz-url":
|
||||
return dt.getData(type).split("\n");
|
||||
}
|
||||
}
|
||||
|
||||
// For shortcuts, we want to check for the file type last, so that the
|
||||
// url pointed to in one of the url types is found first before the file
|
||||
// type, which points to the actual file.
|
||||
let file = dt.mozGetDataAt("application/x-moz-file", 0);
|
||||
if (file instanceof Ci.nsIFile) {
|
||||
let ioService = Cc["@mozilla.org/network/io-service;1"].
|
||||
getService(Ci.nsIIOService);
|
||||
let fileHandler = ioService.getProtocolHandler("file")
|
||||
.QueryInterface(Ci.nsIFileProtocolHandler);
|
||||
return [fileHandler.getURLSpecFromFile(file), file.leafName];
|
||||
}
|
||||
|
||||
return [ ];
|
||||
},
|
||||
|
||||
_validateURI: function(dataTransfer, uriString)
|
||||
{
|
||||
if (!uriString)
|
||||
return "";
|
||||
|
||||
// Strip leading and trailing whitespace, then try to create a
|
||||
// URI from the dropped string. If that succeeds, we're
|
||||
// dropping a URI and we need to do a security check to make
|
||||
// sure the source document can load the dropped URI.
|
||||
uriString = uriString.replace(/^\s*|\s*$/g, '');
|
||||
|
||||
let uri;
|
||||
try {
|
||||
// Check that the uri is valid first and return an empty string if not.
|
||||
// It may just be plain text and should be ignored here
|
||||
uri = Cc["@mozilla.org/network/io-service;1"].
|
||||
getService(Components.interfaces.nsIIOService).
|
||||
newURI(uriString, null, null);
|
||||
} catch (ex) { }
|
||||
if (!uri)
|
||||
return uriString;
|
||||
|
||||
// uriString is a valid URI, so do the security check.
|
||||
let secMan = Cc["@mozilla.org/scriptsecuritymanager;1"].
|
||||
getService(Ci.nsIScriptSecurityManager);
|
||||
let sourceNode = dataTransfer.mozSourceNode;
|
||||
// Use file:/// as the default uri so that drops of file URIs are always allowed
|
||||
if (sourceNode)
|
||||
secMan.checkLoadURIStrWithPrincipal(sourceNode.nodePrincipal, uriString, secMan.STANDARD);
|
||||
else
|
||||
secMan.checkLoadURIStr("file:///", uriString, secMan.STANDARD);
|
||||
|
||||
return uriString;
|
||||
},
|
||||
|
||||
canDropLink: function(aEvent, aAllowSameDocument)
|
||||
{
|
||||
let dataTransfer = aEvent.dataTransfer;
|
||||
let types = dataTransfer.types;
|
||||
if (!types.contains("application/x-moz-file") &&
|
||||
!types.contains("text/x-moz-url") &&
|
||||
!types.contains("text/uri-list") &&
|
||||
!types.contains("text/x-moz-text-internal") &&
|
||||
!types.contains("text/plain"))
|
||||
return false;
|
||||
|
||||
if (aAllowSameDocument)
|
||||
return true;
|
||||
|
||||
let sourceNode = dataTransfer.mozSourceNode;
|
||||
if (!sourceNode)
|
||||
return true;
|
||||
|
||||
// don't allow a drop of a node from the same document onto this one
|
||||
let sourceDocument = sourceNode.ownerDocument;
|
||||
let eventDocument = aEvent.originalTarget.ownerDocument;
|
||||
if (sourceDocument == eventDocument)
|
||||
return false;
|
||||
|
||||
// also check for nodes in other child or sibling frames by checking
|
||||
// if both have the same top window.
|
||||
if (sourceDocument && eventDocument) {
|
||||
let sourceRoot = sourceDocument.defaultView.top;
|
||||
if (sourceRoot && sourceRoot == eventDocument.defaultView.top)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
dropLink: function(aEvent, aName)
|
||||
{
|
||||
aName.value = "";
|
||||
|
||||
let dataTransfer = aEvent.dataTransfer;
|
||||
let [url, name] = this._getDropURL(dataTransfer);
|
||||
|
||||
try {
|
||||
url = this._validateURI(dataTransfer, url);
|
||||
} catch (ex) {
|
||||
aEvent.stopPropagation();
|
||||
aEvent.preventDefault();
|
||||
throw ex;
|
||||
}
|
||||
|
||||
if (name)
|
||||
aName.value = name;
|
||||
|
||||
return url;
|
||||
}
|
||||
};
|
||||
|
||||
var components = [ContentAreaDropListener];
|
||||
function NSGetModule(compMgr, fileSpec) {
|
||||
return XPCOMUtils.generateModule(components);
|
||||
}
|
|
@ -65,8 +65,6 @@
|
|||
#include "nsIDOMHTMLAreaElement.h"
|
||||
#include "nsIDOMHTMLAnchorElement.h"
|
||||
#include "nsITransferable.h"
|
||||
#include "nsIDragService.h"
|
||||
#include "nsIDragSession.h"
|
||||
#include "nsComponentManagerUtils.h"
|
||||
#include "nsXPCOM.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
@ -96,7 +94,6 @@
|
|||
#include "nsDOMDataTransfer.h"
|
||||
#include "nsISelectionController.h"
|
||||
#include "nsFrameSelection.h"
|
||||
#include "nsIDOMEventTarget.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
|
||||
static NS_DEFINE_CID(kHTMLConverterCID, NS_HTMLFORMATCONVERTER_CID);
|
||||
|
@ -106,23 +103,13 @@ static NS_DEFINE_CID(kHTMLConverterCID, NS_HTMLFORMATCONVERTER_CID);
|
|||
#define kHTMLInfo "text/_moz_htmlinfo"
|
||||
|
||||
|
||||
NS_IMPL_ADDREF(nsContentAreaDragDrop)
|
||||
NS_IMPL_RELEASE(nsContentAreaDragDrop)
|
||||
|
||||
NS_INTERFACE_MAP_BEGIN(nsContentAreaDragDrop)
|
||||
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMEventListener)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDOMEventListener)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDragDropHandler)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
|
||||
class NS_STACK_CLASS nsTransferableFactory
|
||||
class NS_STACK_CLASS DragDataProducer
|
||||
{
|
||||
public:
|
||||
nsTransferableFactory(nsIDOMWindow* aWindow,
|
||||
nsIContent* aTarget,
|
||||
nsIContent* aSelectionTargetNode,
|
||||
PRBool aIsAltKeyPressed);
|
||||
DragDataProducer(nsIDOMWindow* aWindow,
|
||||
nsIContent* aTarget,
|
||||
nsIContent* aSelectionTargetNode,
|
||||
PRBool aIsAltKeyPressed);
|
||||
nsresult Produce(nsDOMDataTransfer* aDataTransfer,
|
||||
PRBool* aCanDrag,
|
||||
PRBool* aDragSelection,
|
||||
|
@ -173,382 +160,6 @@ private:
|
|||
};
|
||||
|
||||
|
||||
//
|
||||
// nsContentAreaDragDrop ctor
|
||||
//
|
||||
nsContentAreaDragDrop::nsContentAreaDragDrop()
|
||||
: mNavigator(nsnull)
|
||||
{
|
||||
} // ctor
|
||||
|
||||
|
||||
//
|
||||
// ChromeTooltipListener dtor
|
||||
//
|
||||
nsContentAreaDragDrop::~nsContentAreaDragDrop()
|
||||
{
|
||||
RemoveDragListener();
|
||||
|
||||
} // dtor
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsContentAreaDragDrop::HookupTo(nsIDOMEventTarget *inAttachPoint,
|
||||
nsIWebNavigation* inNavigator)
|
||||
{
|
||||
NS_ASSERTION(inAttachPoint, "Can't hookup Drag Listeners to NULL receiver");
|
||||
mEventTarget = inAttachPoint;
|
||||
mNavigator = inNavigator;
|
||||
|
||||
return AddDragListener();
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsContentAreaDragDrop::Detach()
|
||||
{
|
||||
return RemoveDragListener();
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// AddDragListener
|
||||
//
|
||||
// Subscribe to the events that will allow us to track drags.
|
||||
//
|
||||
nsresult
|
||||
nsContentAreaDragDrop::AddDragListener()
|
||||
{
|
||||
if (mEventTarget) {
|
||||
nsresult rv = mEventTarget->AddEventListener(NS_LITERAL_STRING("dragover"),
|
||||
this, PR_FALSE);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = mEventTarget->AddEventListener(NS_LITERAL_STRING("drop"), this,
|
||||
PR_FALSE);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// RemoveDragListener
|
||||
//
|
||||
// Unsubscribe from all the various drag events that we were listening to.
|
||||
//
|
||||
nsresult
|
||||
nsContentAreaDragDrop::RemoveDragListener()
|
||||
{
|
||||
if (mEventTarget) {
|
||||
nsresult rv =
|
||||
mEventTarget->RemoveEventListener(NS_LITERAL_STRING("dragover"), this,
|
||||
PR_FALSE);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = mEventTarget->RemoveEventListener(NS_LITERAL_STRING("drop"), this,
|
||||
PR_FALSE);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
mEventTarget = nsnull;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// DragOver
|
||||
//
|
||||
// Called when an OS drag is in process and the mouse is over a gecko
|
||||
// window. The main purpose of this routine is to set the |canDrop|
|
||||
// property on the drag session to false if we want to disallow the
|
||||
// drop so that the OS can provide the appropriate feedback. All this
|
||||
// does is show feedback, it doesn't actually cancel the drop; that
|
||||
// comes later.
|
||||
//
|
||||
nsresult
|
||||
nsContentAreaDragDrop::DragOver(nsIDOMDragEvent* inEvent)
|
||||
{
|
||||
// first check that someone hasn't already handled this event
|
||||
PRBool preventDefault = PR_TRUE;
|
||||
nsCOMPtr<nsIDOMNSUIEvent> nsuiEvent(do_QueryInterface(inEvent));
|
||||
if ( nsuiEvent )
|
||||
nsuiEvent->GetPreventDefault(&preventDefault);
|
||||
if ( preventDefault )
|
||||
return NS_OK;
|
||||
|
||||
// if the drag originated w/in this content area, bail
|
||||
// early. This avoids loading a URL dragged from the content
|
||||
// area into the very same content area (which is almost never
|
||||
// the desired action).
|
||||
|
||||
nsCOMPtr<nsIDragSession> session = nsContentUtils::GetDragSession();
|
||||
NS_ENSURE_TRUE(session, NS_OK);
|
||||
|
||||
PRBool dropAllowed = PR_TRUE;
|
||||
|
||||
nsCOMPtr<nsIDOMDocument> sourceDoc;
|
||||
session->GetSourceDocument(getter_AddRefs(sourceDoc));
|
||||
nsCOMPtr<nsIDOMDocument> eventDoc;
|
||||
GetEventDocument(inEvent, getter_AddRefs(eventDoc));
|
||||
|
||||
if (sourceDoc == eventDoc) { // common case
|
||||
dropAllowed = PR_FALSE;
|
||||
} else if (sourceDoc && eventDoc) {
|
||||
// dig deeper
|
||||
// XXXbz we need better ways to get from a document to the docshell!
|
||||
nsCOMPtr<nsIDocument> sourceDocument(do_QueryInterface(sourceDoc));
|
||||
nsCOMPtr<nsIDocument> eventDocument(do_QueryInterface(eventDoc));
|
||||
NS_ASSERTION(sourceDocument, "Confused document object");
|
||||
NS_ASSERTION(eventDocument, "Confused document object");
|
||||
|
||||
nsPIDOMWindow* sourceWindow = sourceDocument->GetWindow();
|
||||
nsPIDOMWindow* eventWindow = eventDocument->GetWindow();
|
||||
|
||||
if (sourceWindow && eventWindow) {
|
||||
nsCOMPtr<nsIDocShellTreeItem> sourceShell =
|
||||
do_QueryInterface(sourceWindow->GetDocShell());
|
||||
nsCOMPtr<nsIDocShellTreeItem> eventShell =
|
||||
do_QueryInterface(eventWindow->GetDocShell());
|
||||
|
||||
if (sourceShell && eventShell) {
|
||||
// Whew. Almost there. Get the roots that are of the same type
|
||||
// (otherwise we'll always end up with the root docshell for the
|
||||
// window, and drag/drop from chrom to content won't work).
|
||||
nsCOMPtr<nsIDocShellTreeItem> sourceRoot;
|
||||
nsCOMPtr<nsIDocShellTreeItem> eventRoot;
|
||||
sourceShell->GetSameTypeRootTreeItem(getter_AddRefs(sourceRoot));
|
||||
eventShell->GetSameTypeRootTreeItem(getter_AddRefs(eventRoot));
|
||||
|
||||
if (sourceRoot && sourceRoot == eventRoot) {
|
||||
dropAllowed = PR_FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
session->SetCanDrop(dropAllowed);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// ExtractURLFromData
|
||||
//
|
||||
// build up a url from whatever data we get from the OS. How we
|
||||
// interpret the data depends on the flavor as it tells us the
|
||||
// nsISupports* primitive type we have.
|
||||
//
|
||||
void
|
||||
nsContentAreaDragDrop::ExtractURLFromData(const nsACString & inFlavor,
|
||||
nsISupports* inDataWrapper,
|
||||
PRUint32 inDataLen,
|
||||
nsAString & outURL)
|
||||
{
|
||||
if (!inDataWrapper) {
|
||||
return;
|
||||
}
|
||||
|
||||
outURL.Truncate();
|
||||
|
||||
if (inFlavor.Equals(kUnicodeMime) || inFlavor.Equals(kURLDataMime)) {
|
||||
// the data is regular unicode, just go with what we get. It may
|
||||
// be a url, it may not be. *shrug*
|
||||
nsCOMPtr<nsISupportsString> stringData(do_QueryInterface(inDataWrapper));
|
||||
if (stringData) {
|
||||
stringData->GetData(outURL);
|
||||
}
|
||||
}
|
||||
else if (inFlavor.Equals(kURLMime)) {
|
||||
// the data is an internet shortcut of the form
|
||||
// <url>\n<title>. Strip out the url piece and return that.
|
||||
nsCOMPtr<nsISupportsString> stringData(do_QueryInterface(inDataWrapper));
|
||||
|
||||
if (stringData) {
|
||||
nsAutoString data;
|
||||
stringData->GetData(data);
|
||||
PRInt32 separator = data.FindChar('\n');
|
||||
|
||||
if (separator >= 0)
|
||||
outURL = Substring(data, 0, separator);
|
||||
else
|
||||
outURL = data;
|
||||
}
|
||||
}
|
||||
else if (inFlavor.Equals(kFileMime)) {
|
||||
// the data is a file. Use the necko parsing utils to get a file:// url
|
||||
// from the OS data.
|
||||
nsCOMPtr<nsIFile> file(do_QueryInterface(inDataWrapper));
|
||||
if (file) {
|
||||
nsCAutoString url;
|
||||
NS_GetURLSpecFromFile(file, url);
|
||||
CopyUTF8toUTF16(url, outURL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// drop
|
||||
//
|
||||
// Called when an OS drag is in process and the mouse is released a
|
||||
// gecko window. Extract the data from the OS and do something with
|
||||
// it.
|
||||
//
|
||||
nsresult
|
||||
nsContentAreaDragDrop::Drop(nsIDOMDragEvent* inDragEvent)
|
||||
{
|
||||
// if we don't have a nsIWebNavigation object to do anything with,
|
||||
// just bail. The client will have to have another way to deal with it
|
||||
if (!mNavigator) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// check that someone hasn't already handled this event
|
||||
PRBool preventDefault = PR_TRUE;
|
||||
nsCOMPtr<nsIDOMNSUIEvent> nsuiEvent(do_QueryInterface(inDragEvent));
|
||||
if (nsuiEvent) {
|
||||
nsuiEvent->GetPreventDefault(&preventDefault);
|
||||
}
|
||||
|
||||
if (preventDefault) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// pull the transferable out of the drag service. at the moment, we
|
||||
// only care about the first item of the drag. We don't allow
|
||||
// dropping multiple items into a content area.
|
||||
nsCOMPtr<nsIDragSession> session = nsContentUtils::GetDragSession();
|
||||
NS_ENSURE_TRUE(session, NS_OK);
|
||||
|
||||
nsCOMPtr<nsITransferable> trans =
|
||||
do_CreateInstance("@mozilla.org/widget/transferable;1");
|
||||
if (!trans) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// add the relevant flavors. order is important (highest fidelity to lowest)
|
||||
trans->AddDataFlavor(kURLDataMime);
|
||||
trans->AddDataFlavor(kURLMime);
|
||||
trans->AddDataFlavor(kFileMime);
|
||||
trans->AddDataFlavor(kUnicodeMime);
|
||||
|
||||
// again, we only care about the first object
|
||||
nsresult rv = session->GetData(trans, 0);
|
||||
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
nsXPIDLCString flavor;
|
||||
nsCOMPtr<nsISupports> dataWrapper;
|
||||
PRUint32 dataLen = 0;
|
||||
rv = trans->GetAnyTransferData(getter_Copies(flavor),
|
||||
getter_AddRefs(dataWrapper), &dataLen);
|
||||
if (NS_SUCCEEDED(rv) && dataLen > 0) {
|
||||
// get the url from one of several possible formats
|
||||
nsAutoString url;
|
||||
ExtractURLFromData(flavor, dataWrapper, dataLen, url);
|
||||
NS_ASSERTION(!url.IsEmpty(), "Didn't get anything we can use as a url");
|
||||
|
||||
// valid urls don't have spaces. bail if this does.
|
||||
if (url.IsEmpty() || url.FindChar(' ') >= 0)
|
||||
return NS_OK;
|
||||
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
NS_NewURI(getter_AddRefs(uri), url);
|
||||
if (!uri) {
|
||||
// Not actually a URI
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIDOMDocument> sourceDocument;
|
||||
session->GetSourceDocument(getter_AddRefs(sourceDocument));
|
||||
|
||||
nsCOMPtr<nsIDocument> sourceDoc(do_QueryInterface(sourceDocument));
|
||||
if (sourceDoc) {
|
||||
rv = nsContentUtils::GetSecurityManager()->
|
||||
CheckLoadURIWithPrincipal(sourceDoc->NodePrincipal(), uri,
|
||||
nsIScriptSecurityManager::STANDARD);
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
// Security check failed, stop event propagation right here
|
||||
// and return the error.
|
||||
inDragEvent->StopPropagation();
|
||||
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
// ok, we have the url, load it.
|
||||
mNavigator->LoadURI(url.get(), nsIWebNavigation::LOAD_FLAGS_NONE, nsnull,
|
||||
nsnull, nsnull);
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//
|
||||
// NormalizeSelection
|
||||
//
|
||||
void
|
||||
nsContentAreaDragDrop::NormalizeSelection(nsIDOMNode* inBaseNode,
|
||||
nsISelection* inSelection)
|
||||
{
|
||||
nsCOMPtr<nsIDOMNode> parent;
|
||||
inBaseNode->GetParentNode(getter_AddRefs(parent));
|
||||
if (!parent || !inSelection)
|
||||
return;
|
||||
|
||||
nsCOMPtr<nsIDOMNodeList> childNodes;
|
||||
parent->GetChildNodes(getter_AddRefs(childNodes));
|
||||
if (!childNodes)
|
||||
return;
|
||||
PRUint32 listLen = 0;
|
||||
childNodes->GetLength(&listLen);
|
||||
|
||||
PRUint32 index = 0;
|
||||
for (; index < listLen; ++index) {
|
||||
nsCOMPtr<nsIDOMNode> indexedNode;
|
||||
childNodes->Item(index, getter_AddRefs(indexedNode));
|
||||
if (indexedNode == inBaseNode) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (index >= listLen) {
|
||||
return;
|
||||
}
|
||||
|
||||
// now make the selection contain all of |inBaseNode|'s siblings up
|
||||
// to and including |inBaseNode|
|
||||
inSelection->Collapse(parent, index);
|
||||
inSelection->Extend(parent, index+1);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// GetEventDocument
|
||||
//
|
||||
// Get the DOM document associated with a given DOM event
|
||||
//
|
||||
void
|
||||
nsContentAreaDragDrop::GetEventDocument(nsIDOMEvent* inEvent,
|
||||
nsIDOMDocument** outDocument)
|
||||
{
|
||||
*outDocument = nsnull;
|
||||
|
||||
nsCOMPtr<nsIDOMUIEvent> uiEvent(do_QueryInterface(inEvent));
|
||||
if (uiEvent) {
|
||||
nsCOMPtr<nsIDOMAbstractView> view;
|
||||
uiEvent->GetView(getter_AddRefs(view));
|
||||
nsCOMPtr<nsIDOMWindow> window(do_QueryInterface(view));
|
||||
|
||||
if (window) {
|
||||
window->GetDocument(outDocument);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
nsContentAreaDragDrop::GetDragData(nsIDOMWindow* aWindow,
|
||||
nsIContent* aTarget,
|
||||
|
@ -563,33 +174,12 @@ nsContentAreaDragDrop::GetDragData(nsIDOMWindow* aWindow,
|
|||
|
||||
*aCanDrag = PR_TRUE;
|
||||
|
||||
nsTransferableFactory
|
||||
factory(aWindow, aTarget, aSelectionTargetNode, aIsAltKeyPressed);
|
||||
return factory.Produce(aDataTransfer, aCanDrag, aDragSelection, aDragNode);
|
||||
DragDataProducer
|
||||
provider(aWindow, aTarget, aSelectionTargetNode, aIsAltKeyPressed);
|
||||
return provider.Produce(aDataTransfer, aCanDrag, aDragSelection, aDragNode);
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsContentAreaDragDrop::HandleEvent(nsIDOMEvent *event)
|
||||
{
|
||||
// make sure it's a drag event
|
||||
nsCOMPtr<nsIDOMDragEvent> dragEvent = do_QueryInterface(event);
|
||||
if (dragEvent) {
|
||||
nsAutoString eventType;
|
||||
event->GetType(eventType);
|
||||
if (eventType.EqualsLiteral("dragover"))
|
||||
return DragOver(dragEvent);
|
||||
if (eventType.EqualsLiteral("drop"))
|
||||
return Drop(dragEvent);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
#if 0
|
||||
#pragma mark -
|
||||
#endif
|
||||
|
||||
NS_IMPL_ISUPPORTS1(nsContentAreaDragDropDataProvider, nsIFlavorDataProvider)
|
||||
|
||||
// SaveURIToFile
|
||||
|
@ -703,14 +293,15 @@ nsContentAreaDragDropDataProvider::GetFlavorData(nsITransferable *aTransferable,
|
|||
return rv;
|
||||
}
|
||||
|
||||
nsTransferableFactory::nsTransferableFactory(nsIDOMWindow* aWindow,
|
||||
nsIContent* aTarget,
|
||||
nsIContent* aSelectionTargetNode,
|
||||
PRBool aIsAltKeyPressed)
|
||||
DragDataProducer::DragDataProducer(nsIDOMWindow* aWindow,
|
||||
nsIContent* aTarget,
|
||||
nsIContent* aSelectionTargetNode,
|
||||
PRBool aIsAltKeyPressed)
|
||||
: mWindow(aWindow),
|
||||
mTarget(aTarget),
|
||||
mSelectionTargetNode(aSelectionTargetNode),
|
||||
mIsAltKeyPressed(aIsAltKeyPressed)
|
||||
mIsAltKeyPressed(aIsAltKeyPressed),
|
||||
mIsAnchor(PR_FALSE)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -723,7 +314,7 @@ nsTransferableFactory::nsTransferableFactory(nsIDOMWindow* aWindow,
|
|||
// return null.
|
||||
//
|
||||
already_AddRefed<nsIContent>
|
||||
nsTransferableFactory::FindParentLinkNode(nsIContent* inNode)
|
||||
DragDataProducer::FindParentLinkNode(nsIContent* inNode)
|
||||
{
|
||||
nsIContent* content = inNode;
|
||||
if (!content) {
|
||||
|
@ -746,7 +337,7 @@ nsTransferableFactory::FindParentLinkNode(nsIContent* inNode)
|
|||
// GetAnchorURL
|
||||
//
|
||||
void
|
||||
nsTransferableFactory::GetAnchorURL(nsIContent* inNode, nsAString& outURL)
|
||||
DragDataProducer::GetAnchorURL(nsIContent* inNode, nsAString& outURL)
|
||||
{
|
||||
nsCOMPtr<nsIURI> linkURI;
|
||||
if (!inNode || !inNode->IsLink(getter_AddRefs(linkURI))) {
|
||||
|
@ -768,9 +359,9 @@ nsTransferableFactory::GetAnchorURL(nsIContent* inNode, nsAString& outURL)
|
|||
// <a href="inURL">inText</a>
|
||||
//
|
||||
void
|
||||
nsTransferableFactory::CreateLinkText(const nsAString& inURL,
|
||||
const nsAString & inText,
|
||||
nsAString& outLinkText)
|
||||
DragDataProducer::CreateLinkText(const nsAString& inURL,
|
||||
const nsAString & inText,
|
||||
nsAString& outLinkText)
|
||||
{
|
||||
// use a temp var in case |inText| is the same string as
|
||||
// |outLinkText| to avoid overwriting it while building up the
|
||||
|
@ -791,8 +382,8 @@ nsTransferableFactory::CreateLinkText(const nsAString& inURL,
|
|||
// Gets the text associated with a node
|
||||
//
|
||||
void
|
||||
nsTransferableFactory::GetNodeString(nsIContent* inNode,
|
||||
nsAString & outNodeString)
|
||||
DragDataProducer::GetNodeString(nsIContent* inNode,
|
||||
nsAString & outNodeString)
|
||||
{
|
||||
nsCOMPtr<nsIDOMNode> node = do_QueryInterface(inNode);
|
||||
|
||||
|
@ -814,10 +405,10 @@ nsTransferableFactory::GetNodeString(nsIContent* inNode,
|
|||
|
||||
|
||||
nsresult
|
||||
nsTransferableFactory::Produce(nsDOMDataTransfer* aDataTransfer,
|
||||
PRBool* aCanDrag,
|
||||
PRBool* aDragSelection,
|
||||
nsIContent** aDragNode)
|
||||
DragDataProducer::Produce(nsDOMDataTransfer* aDataTransfer,
|
||||
PRBool* aCanDrag,
|
||||
PRBool* aDragSelection,
|
||||
nsIContent** aDragNode)
|
||||
{
|
||||
NS_PRECONDITION(aCanDrag && aDragSelection && aDataTransfer && aDragNode,
|
||||
"null pointer passed to Produce");
|
||||
|
@ -828,8 +419,6 @@ nsTransferableFactory::Produce(nsDOMDataTransfer* aDataTransfer,
|
|||
|
||||
nsIContent* dragNode = nsnull;
|
||||
|
||||
mIsAnchor = PR_FALSE;
|
||||
|
||||
// find the selection to see what we could be dragging and if
|
||||
// what we're dragging is in what is selected.
|
||||
nsCOMPtr<nsISelection> selection;
|
||||
|
@ -1091,13 +680,6 @@ nsTransferableFactory::Produce(nsDOMDataTransfer* aDataTransfer,
|
|||
kUnicodeMime, getter_AddRefs(text), &textLen);
|
||||
NS_ENSURE_TRUE(text, NS_ERROR_FAILURE);
|
||||
text->GetData(mTitleString);
|
||||
|
||||
#ifdef CHANGE_SELECTION_ON_DRAG
|
||||
// We used to change the selection to wrap the dragged node (mainly
|
||||
// to work around now-fixed issues with dragging unselected elements).
|
||||
// There is no reason to do this any more.
|
||||
NormalizeSelection(selectionNormalizeNode, selection);
|
||||
#endif
|
||||
}
|
||||
|
||||
// default text value is the URL
|
||||
|
@ -1120,10 +702,10 @@ nsTransferableFactory::Produce(nsDOMDataTransfer* aDataTransfer,
|
|||
}
|
||||
|
||||
void
|
||||
nsTransferableFactory::AddString(nsDOMDataTransfer* aDataTransfer,
|
||||
const nsAString& aFlavor,
|
||||
const nsAString& aData,
|
||||
nsIPrincipal* aPrincipal)
|
||||
DragDataProducer::AddString(nsDOMDataTransfer* aDataTransfer,
|
||||
const nsAString& aFlavor,
|
||||
const nsAString& aData,
|
||||
nsIPrincipal* aPrincipal)
|
||||
{
|
||||
nsCOMPtr<nsIWritableVariant> variant = do_CreateInstance(NS_VARIANT_CONTRACTID);
|
||||
if (variant) {
|
||||
|
@ -1133,8 +715,8 @@ nsTransferableFactory::AddString(nsDOMDataTransfer* aDataTransfer,
|
|||
}
|
||||
|
||||
nsresult
|
||||
nsTransferableFactory::AddStringsToDataTransfer(nsIContent* aDragNode,
|
||||
nsDOMDataTransfer* aDataTransfer)
|
||||
DragDataProducer::AddStringsToDataTransfer(nsIContent* aDragNode,
|
||||
nsDOMDataTransfer* aDataTransfer)
|
||||
{
|
||||
NS_ASSERTION(aDragNode, "adding strings for null node");
|
||||
|
||||
|
@ -1215,10 +797,10 @@ nsTransferableFactory::AddStringsToDataTransfer(nsIContent* aDragNode,
|
|||
// note that this can return NS_OK, but a null out param (by design)
|
||||
// static
|
||||
nsresult
|
||||
nsTransferableFactory::GetDraggableSelectionData(nsISelection* inSelection,
|
||||
nsIContent* inRealTargetNode,
|
||||
nsIContent **outImageOrLinkNode,
|
||||
PRBool* outDragSelectedText)
|
||||
DragDataProducer::GetDraggableSelectionData(nsISelection* inSelection,
|
||||
nsIContent* inRealTargetNode,
|
||||
nsIContent **outImageOrLinkNode,
|
||||
PRBool* outDragSelectedText)
|
||||
{
|
||||
NS_ENSURE_ARG(inSelection);
|
||||
NS_ENSURE_ARG(inRealTargetNode);
|
||||
|
@ -1287,8 +869,9 @@ nsTransferableFactory::GetDraggableSelectionData(nsISelection* inSelection,
|
|||
}
|
||||
|
||||
// static
|
||||
void nsTransferableFactory::GetSelectedLink(nsISelection* inSelection,
|
||||
nsIContent **outLinkNode)
|
||||
void
|
||||
DragDataProducer::GetSelectedLink(nsISelection* inSelection,
|
||||
nsIContent **outLinkNode)
|
||||
{
|
||||
*outLinkNode = nsnull;
|
||||
|
||||
|
@ -1401,11 +984,11 @@ void nsTransferableFactory::GetSelectedLink(nsISelection* inSelection,
|
|||
|
||||
// static
|
||||
nsresult
|
||||
nsTransferableFactory::SerializeNodeOrSelection(nsIDOMWindow* inWindow,
|
||||
nsIContent* inNode,
|
||||
nsAString& outResultString,
|
||||
nsAString& outContext,
|
||||
nsAString& outInfo)
|
||||
DragDataProducer::SerializeNodeOrSelection(nsIDOMWindow* inWindow,
|
||||
nsIContent* inNode,
|
||||
nsAString& outResultString,
|
||||
nsAString& outContext,
|
||||
nsAString& outInfo)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(inWindow);
|
||||
|
||||
|
|
|
@ -42,7 +42,6 @@
|
|||
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
#include "nsIDragDropHandler.h"
|
||||
#include "nsIDOMEventTarget.h"
|
||||
#include "nsIDOMEventListener.h"
|
||||
#include "nsITransferable.h"
|
||||
|
@ -59,33 +58,12 @@ class nsIFile;
|
|||
class nsISimpleEnumerator;
|
||||
class nsDOMDataTransfer;
|
||||
|
||||
// {1f34bc80-1bc7-11d6-a384-d705dd0746fc}
|
||||
#define NS_CONTENTAREADRAGDROP_CID \
|
||||
{ 0x1f34bc80, 0x1bc7, 0x11d6, \
|
||||
{ 0xa3, 0x84, 0xd7, 0x05, 0xdd, 0x07, 0x46, 0xfc } }
|
||||
|
||||
#define NS_CONTENTAREADRAGDROP_CONTRACTID "@mozilla.org:/content/content-area-dragdrop;1"
|
||||
|
||||
|
||||
//
|
||||
// class nsContentAreaDragDrop
|
||||
// class nsContentAreaDragDrop, used to generate the dragdata
|
||||
//
|
||||
// The class that listens to the chrome events handles anything
|
||||
// related to drag and drop. Registers itself with the DOM with
|
||||
// AddChromeListeners() and removes itself with
|
||||
// RemoveChromeListeners().
|
||||
//
|
||||
class nsContentAreaDragDrop : public nsIDragDropHandler,
|
||||
public nsIDOMEventListener
|
||||
class nsContentAreaDragDrop
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSIDRAGDROPHANDLER
|
||||
|
||||
nsContentAreaDragDrop();
|
||||
virtual ~nsContentAreaDragDrop();
|
||||
|
||||
NS_IMETHOD HandleEvent(nsIDOMEvent *event);
|
||||
|
||||
/**
|
||||
* Determine what data in the content area, if any, is being dragged.
|
||||
|
@ -113,32 +91,6 @@ public:
|
|||
PRBool* aCanDrag,
|
||||
PRBool* aDragSelection,
|
||||
nsIContent** aDragNode);
|
||||
|
||||
private:
|
||||
|
||||
// Add/remove the relevant listeners
|
||||
nsresult AddDragListener();
|
||||
nsresult RemoveDragListener();
|
||||
|
||||
nsresult DragOver(nsIDOMDragEvent* aDragEvent);
|
||||
nsresult Drop(nsIDOMDragEvent* aDragEvent);
|
||||
|
||||
// utility routines
|
||||
static void NormalizeSelection(nsIDOMNode* inBaseNode,
|
||||
nsISelection* inSelection);
|
||||
static void GetEventDocument(nsIDOMEvent* inEvent,
|
||||
nsIDOMDocument** outDocument);
|
||||
|
||||
static void ExtractURLFromData(const nsACString & inFlavor,
|
||||
nsISupports* inDataWrapper, PRUint32 inDataLen,
|
||||
nsAString & outURL);
|
||||
|
||||
nsCOMPtr<nsIDOMEventTarget> mEventTarget;
|
||||
|
||||
// weak ref, this is probably my owning webshell
|
||||
// FIXME: we set this and never null it out. That's bad! See bug 332187.
|
||||
nsIWebNavigation* mNavigator;
|
||||
|
||||
};
|
||||
|
||||
// this is used to save images to disk lazily when the image data is asked for
|
||||
|
|
|
@ -3736,6 +3736,7 @@ nsContentUtils::CreateContextualFragment(nsIDOMNode* aContextNode,
|
|||
if (!parser) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
document->SetFragmentParser(parser);
|
||||
}
|
||||
nsCOMPtr<nsIDOMDocumentFragment> frag;
|
||||
rv = NS_NewDocumentFragment(getter_AddRefs(frag), document->NodeInfoManager());
|
||||
|
@ -3765,7 +3766,6 @@ nsContentUtils::CreateContextualFragment(nsIDOMNode* aContextNode,
|
|||
}
|
||||
|
||||
NS_ADDREF(*aReturn = frag);
|
||||
document->SetFragmentParser(parser);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -3810,11 +3810,10 @@ nsDocument::GetWindow()
|
|||
}
|
||||
|
||||
nsPIDOMWindow *
|
||||
nsDocument::GetInnerWindow()
|
||||
nsDocument::GetInnerWindowInternal()
|
||||
{
|
||||
if (!mRemovedFromDocShell) {
|
||||
return mWindow;
|
||||
}
|
||||
NS_ASSERTION(mRemovedFromDocShell,
|
||||
"This document should have been removed from docshell!");
|
||||
|
||||
nsCOMPtr<nsPIDOMWindow> win(do_QueryInterface(GetScriptGlobalObject()));
|
||||
|
||||
|
@ -7121,6 +7120,34 @@ nsDocument::GetLayoutHistoryState() const
|
|||
return state;
|
||||
}
|
||||
|
||||
void
|
||||
nsDocument::EnsureOnloadBlocker()
|
||||
{
|
||||
// If mScriptGlobalObject is null, we shouldn't be messing with the loadgroup
|
||||
// -- it's not ours.
|
||||
if (mOnloadBlockCount != 0 && mScriptGlobalObject) {
|
||||
nsCOMPtr<nsILoadGroup> loadGroup = GetDocumentLoadGroup();
|
||||
if (loadGroup) {
|
||||
// Check first to see if mOnloadBlocker is in the loadgroup.
|
||||
nsCOMPtr<nsISimpleEnumerator> requests;
|
||||
loadGroup->GetRequests(getter_AddRefs(requests));
|
||||
|
||||
PRBool hasMore = PR_FALSE;
|
||||
while (NS_SUCCEEDED(requests->HasMoreElements(&hasMore)) && hasMore) {
|
||||
nsCOMPtr<nsISupports> elem;
|
||||
requests->GetNext(getter_AddRefs(elem));
|
||||
nsCOMPtr<nsIRequest> request = do_QueryInterface(elem);
|
||||
if (request && request == mOnloadBlocker) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Not in the loadgroup, so add it.
|
||||
loadGroup->AddRequest(mOnloadBlocker, nsnull);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsDocument::BlockOnload()
|
||||
{
|
||||
|
|
|
@ -655,13 +655,6 @@ public:
|
|||
*/
|
||||
virtual nsPIDOMWindow *GetWindow();
|
||||
|
||||
/**
|
||||
* Return the inner window used as the script compilation scope for
|
||||
* this document. If you're not absolutely sure you need this, use
|
||||
* GetWindow().
|
||||
*/
|
||||
virtual nsPIDOMWindow *GetInnerWindow();
|
||||
|
||||
/**
|
||||
* Get the script loader for this document
|
||||
*/
|
||||
|
@ -1016,6 +1009,8 @@ protected:
|
|||
const nsAString& aType,
|
||||
PRBool aPersisted);
|
||||
|
||||
virtual nsPIDOMWindow *GetInnerWindowInternal();
|
||||
|
||||
// nsContentList match functions for GetElementsByClassName
|
||||
static PRBool MatchClassNames(nsIContent* aContent, PRInt32 aNamespaceID,
|
||||
nsIAtom* aAtom, void* aData);
|
||||
|
@ -1033,6 +1028,8 @@ protected:
|
|||
nsDocument(const char* aContentType);
|
||||
virtual ~nsDocument();
|
||||
|
||||
void EnsureOnloadBlocker();
|
||||
|
||||
nsCString mReferrer;
|
||||
nsString mLastModified;
|
||||
|
||||
|
@ -1062,9 +1059,6 @@ protected:
|
|||
// document can get its script context and scope. This is the
|
||||
// *inner* window object.
|
||||
nsCOMPtr<nsIScriptGlobalObject> mScriptGlobalObject;
|
||||
// Weak reference to mScriptGlobalObject QI:d to nsPIDOMWindow,
|
||||
// updated on every set of mSecriptGlobalObject.
|
||||
nsPIDOMWindow *mWindow;
|
||||
|
||||
// If document is created for example using
|
||||
// document.implementation.createDocument(...), mScriptObject points to
|
||||
|
|
|
@ -587,6 +587,8 @@ nsGenericDOMDataNode::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
|
|||
if (mText.IsBidi()) {
|
||||
aDocument->SetBidiEnabled();
|
||||
}
|
||||
// Clear the lazy frame construction bits.
|
||||
UnsetFlags(NODE_NEEDS_FRAME | NODE_DESCENDANTS_NEED_FRAMES);
|
||||
}
|
||||
|
||||
nsNodeUtils::ParentChainChanged(this);
|
||||
|
|
|
@ -631,6 +631,23 @@ nsIContent::FindFirstNonNativeAnonymous() const
|
|||
return nsnull;
|
||||
}
|
||||
|
||||
nsIContent*
|
||||
nsIContent::GetFlattenedTreeParent() const
|
||||
{
|
||||
nsIContent *parent = GetParent();
|
||||
if (parent && parent->HasFlag(NODE_MAY_BE_IN_BINDING_MNGR)) {
|
||||
nsIDocument *doc = parent->GetOwnerDoc();
|
||||
if (doc) {
|
||||
nsIContent* insertionElement =
|
||||
doc->BindingManager()->GetNestedInsertionPoint(parent, this);
|
||||
if (insertionElement) {
|
||||
parent = insertionElement;
|
||||
}
|
||||
}
|
||||
}
|
||||
return parent;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
NS_IMPL_ADDREF(nsChildContentList)
|
||||
|
@ -2592,7 +2609,9 @@ nsGenericElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
|
|||
mParentPtrBits |= PARENT_BIT_INDOCUMENT;
|
||||
|
||||
// Unset this flag since we now really are in a document.
|
||||
UnsetFlags(NODE_FORCE_XBL_BINDINGS);
|
||||
UnsetFlags(NODE_FORCE_XBL_BINDINGS |
|
||||
// And clear the lazy frame construction bits.
|
||||
NODE_NEEDS_FRAME | NODE_DESCENDANTS_NEED_FRAMES);
|
||||
}
|
||||
|
||||
// If NODE_FORCE_XBL_BINDINGS was set we might have anonymous children
|
||||
|
|
|
@ -138,32 +138,6 @@ nsNodeInfoManager::~nsNodeInfoManager()
|
|||
}
|
||||
|
||||
|
||||
nsrefcnt
|
||||
nsNodeInfoManager::AddRef()
|
||||
{
|
||||
NS_PRECONDITION(PRInt32(mRefCnt) >= 0, "illegal refcnt");
|
||||
|
||||
nsrefcnt count = PR_AtomicIncrement((PRInt32*)&mRefCnt);
|
||||
NS_LOG_ADDREF(this, count, "nsNodeInfoManager", sizeof(*this));
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
nsrefcnt
|
||||
nsNodeInfoManager::Release()
|
||||
{
|
||||
NS_PRECONDITION(0 != mRefCnt, "dup release");
|
||||
|
||||
nsrefcnt count = PR_AtomicDecrement((PRInt32 *)&mRefCnt);
|
||||
NS_LOG_RELEASE(this, count, "nsNodeInfoManager");
|
||||
if (count == 0) {
|
||||
mRefCnt = 1; /* stabilize */
|
||||
delete this;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_CLASS(nsNodeInfoManager)
|
||||
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(nsNodeInfoManager, AddRef)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(nsNodeInfoManager, Release)
|
||||
|
|
|
@ -68,8 +68,7 @@ public:
|
|||
|
||||
NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(nsNodeInfoManager)
|
||||
|
||||
nsrefcnt AddRef(void);
|
||||
nsrefcnt Release(void);
|
||||
NS_INLINE_DECL_REFCOUNTING(nsNodeInfoManager)
|
||||
|
||||
/**
|
||||
* Initialize the nodeinfo manager with a document.
|
||||
|
@ -154,9 +153,6 @@ private:
|
|||
static PRIntn NodeInfoInnerKeyCompare(const void *key1, const void *key2);
|
||||
static PLHashNumber GetNodeInfoInnerHashValue(const void *key);
|
||||
|
||||
nsAutoRefCnt mRefCnt;
|
||||
NS_DECL_OWNINGTHREAD
|
||||
|
||||
PLHashTable *mNodeInfoHash;
|
||||
nsIDocument *mDocument; // WEAK
|
||||
nsIPrincipal *mPrincipal; // STRONG, but not nsCOMPtr to avoid include hell
|
||||
|
|
|
@ -301,7 +301,7 @@ nsNodeIterator::NextOrPrevNode(NodePointer::MoveToMethodType aMove,
|
|||
|
||||
*_retval = nsnull;
|
||||
|
||||
if (mDetached)
|
||||
if (mDetached || mInAcceptNode)
|
||||
return NS_ERROR_DOM_INVALID_STATE_ERR;
|
||||
|
||||
mWorkingPointer = mPointer;
|
||||
|
|
|
@ -54,7 +54,8 @@ nsTraversal::nsTraversal(nsINode *aRoot,
|
|||
mRoot(aRoot),
|
||||
mWhatToShow(aWhatToShow),
|
||||
mFilter(aFilter),
|
||||
mExpandEntityReferences(aExpandEntityReferences)
|
||||
mExpandEntityReferences(aExpandEntityReferences),
|
||||
mInAcceptNode(PR_FALSE)
|
||||
{
|
||||
NS_ASSERTION(aRoot, "invalid root in call to nsTraversal constructor");
|
||||
}
|
||||
|
@ -73,6 +74,8 @@ nsTraversal::~nsTraversal()
|
|||
*/
|
||||
nsresult nsTraversal::TestNode(nsINode* aNode, PRInt16* _filtered)
|
||||
{
|
||||
NS_ENSURE_TRUE(!mInAcceptNode, NS_ERROR_DOM_INVALID_STATE_ERR);
|
||||
|
||||
nsresult rv;
|
||||
|
||||
*_filtered = nsIDOMNodeFilter::FILTER_SKIP;
|
||||
|
@ -114,7 +117,10 @@ nsresult nsTraversal::TestNode(nsINode* aNode, PRInt16* _filtered)
|
|||
domNode = do_QueryInterface(aNode);
|
||||
}
|
||||
|
||||
return mFilter->AcceptNode(domNode, _filtered);
|
||||
mInAcceptNode = PR_TRUE;
|
||||
rv = mFilter->AcceptNode(domNode, _filtered);
|
||||
mInAcceptNode = PR_FALSE;
|
||||
return rv;
|
||||
}
|
||||
|
||||
*_filtered = nsIDOMNodeFilter::FILTER_ACCEPT;
|
||||
|
|
|
@ -62,7 +62,8 @@ protected:
|
|||
nsCOMPtr<nsINode> mRoot;
|
||||
PRUint32 mWhatToShow;
|
||||
nsCOMPtr<nsIDOMNodeFilter> mFilter;
|
||||
PRBool mExpandEntityReferences;
|
||||
PRPackedBool mExpandEntityReferences;
|
||||
PRPackedBool mInAcceptNode;
|
||||
|
||||
/*
|
||||
* Tests if and how a node should be filtered. Uses mWhatToShow and
|
||||
|
|
|
@ -372,6 +372,7 @@ _TEST_FILES = test_bug5141.html \
|
|||
test_bug558726.html \
|
||||
test_bug557892.html \
|
||||
file_bug557892.html \
|
||||
test_bug559526.html \
|
||||
$(NULL)
|
||||
|
||||
# This test fails on the Mac for some reason
|
||||
|
|
|
@ -0,0 +1,97 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=559526
|
||||
-->
|
||||
<head>
|
||||
<title>Test for Bug 559526</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=559526">Mozilla Bug 559526</a>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none">
|
||||
|
||||
</div>
|
||||
<pre id="test">
|
||||
<div id="nodes" style="display:none">
|
||||
<div id="child1"></div>
|
||||
<div id="child2"></div>
|
||||
|
||||
<div id="child3"></div>
|
||||
<div id="child4"></div>
|
||||
<div id="child5"></div>
|
||||
<div id="child6"></div>
|
||||
<div id="child7"></div>
|
||||
<div id="child8"></div>
|
||||
</div>
|
||||
<script type="application/javascript">
|
||||
|
||||
/** Test for Bug 559526 **/
|
||||
|
||||
var it;
|
||||
var recurse = false;
|
||||
var testCount = 0;
|
||||
function filter(node) {
|
||||
if (node.id == "child3" && ! recurse) {
|
||||
recurse = true;
|
||||
var ex = null;
|
||||
try {
|
||||
var foo = it.nextNode();
|
||||
} catch(e) {
|
||||
ex = e;
|
||||
}
|
||||
++testCount;
|
||||
is(ex.code, DOMException.INVALID_STATE_ERR, "Should have thrown an exception!");
|
||||
recurse = false;
|
||||
}
|
||||
return NodeFilter.FILTER_ACCEPT;
|
||||
}
|
||||
|
||||
(function testNodeIterator() {
|
||||
|
||||
it = document.createNodeIterator(
|
||||
document.getElementById("nodes"),
|
||||
NodeFilter.SHOW_ELEMENT,
|
||||
filter,
|
||||
false
|
||||
);
|
||||
while (it.nextNode());
|
||||
})();
|
||||
|
||||
(function testTreeWalker() {
|
||||
it = document.createTreeWalker(
|
||||
document.getElementById("nodes"),
|
||||
NodeFilter.SHOW_ELEMENT,
|
||||
filter,
|
||||
false
|
||||
);
|
||||
while(it.nextNode());
|
||||
|
||||
it = document.createTreeWalker(
|
||||
document.getElementById("nodes"),
|
||||
NodeFilter.SHOW_ELEMENT,
|
||||
filter,
|
||||
false
|
||||
);
|
||||
it.firstChild();
|
||||
while(it.nextSibling());
|
||||
|
||||
it = document.createTreeWalker(
|
||||
document.getElementById("nodes"),
|
||||
NodeFilter.SHOW_ELEMENT,
|
||||
filter,
|
||||
false
|
||||
);
|
||||
it.lastChild();
|
||||
while(it.previousSibling());
|
||||
})();
|
||||
|
||||
is(testCount, 4, "Should have tests 3 filter calls!");
|
||||
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
|
@ -141,7 +141,8 @@ static inline bool
|
|||
DoubleIsFinite(double d)
|
||||
{
|
||||
#ifdef WIN32
|
||||
return _finite(d);
|
||||
// NOTE: '!!' casts an int to bool without spamming MSVC warning C4800.
|
||||
return !!_finite(d);
|
||||
#else
|
||||
return finite(d);
|
||||
#endif
|
||||
|
@ -778,8 +779,8 @@ nsCanvasRenderingContext2D::~nsCanvasRenderingContext2D()
|
|||
|
||||
sNumLivingContexts--;
|
||||
if (!sNumLivingContexts) {
|
||||
delete sUnpremultiplyTable;
|
||||
delete sPremultiplyTable;
|
||||
delete[] sUnpremultiplyTable;
|
||||
delete[] sPremultiplyTable;
|
||||
sUnpremultiplyTable = nsnull;
|
||||
sPremultiplyTable = nsnull;
|
||||
}
|
||||
|
@ -1732,7 +1733,7 @@ nsCanvasRenderingContext2D::ShadowInitialize(const gfxRect& extents, gfxAlphaBox
|
|||
blurRadius.height, blurRadius.width);
|
||||
drawExtents = drawExtents.Intersect(clipExtents - CurrentState().shadowOffset);
|
||||
|
||||
gfxContext* ctx = blur.Init(drawExtents, blurRadius, nsnull);
|
||||
gfxContext* ctx = blur.Init(drawExtents, blurRadius, nsnull, nsnull);
|
||||
|
||||
if (!ctx)
|
||||
return nsnull;
|
||||
|
@ -2210,7 +2211,7 @@ nsCanvasRenderingContext2D::SetFont(const nsAString& font)
|
|||
gfxFontStyle style(fontStyle->mFont.style,
|
||||
fontStyle->mFont.weight,
|
||||
fontStyle->mFont.stretch,
|
||||
NSAppUnitsToFloatPixels(fontSize, aupcp),
|
||||
NSAppUnitsToFloatPixels(fontSize, float(aupcp)),
|
||||
language,
|
||||
fontStyle->mFont.sizeAdjust,
|
||||
fontStyle->mFont.systemFont,
|
||||
|
@ -3473,7 +3474,8 @@ nsCanvasRenderingContext2D::DrawWindow(nsIDOMWindow* aWindow, float aX, float aY
|
|||
|
||||
// protect against too-large surfaces that will cause allocation
|
||||
// or overflow issues
|
||||
if (!gfxASurface::CheckSurfaceSize(gfxIntSize(aW, aH), 0xffff))
|
||||
if (!gfxASurface::CheckSurfaceSize(gfxIntSize(PRInt32(aW), PRInt32(aH)),
|
||||
0xffff))
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
// We can't allow web apps to call this until we fix at least the
|
||||
|
|
|
@ -56,8 +56,8 @@ class nsCxPusher;
|
|||
* Event listener manager interface.
|
||||
*/
|
||||
#define NS_IEVENTLISTENERMANAGER_IID \
|
||||
{ 0x2412fcd0, 0xd168, 0x4a1c, \
|
||||
{ 0xaa, 0x28, 0x70, 0xed, 0x58, 0xf0, 0x4c, 0xec } }
|
||||
{ 0xe86a148b, 0x0563, 0x454f, \
|
||||
{ 0x8c, 0xf2, 0xbd, 0xc4, 0x7c, 0xe6, 0xbe, 0x91 } }
|
||||
|
||||
class nsIEventListenerManager : public nsISupports {
|
||||
|
||||
|
@ -140,19 +140,6 @@ public:
|
|||
nsIAtom* aName,
|
||||
PRBool *aDidCompile) = 0;
|
||||
|
||||
/**
|
||||
* Causes a check for event listeners and processing by them if they exist.
|
||||
* Event flags live in nsGUIEvent.h
|
||||
* @param an event listener
|
||||
*/
|
||||
NS_IMETHOD HandleEvent(nsPresContext* aPresContext,
|
||||
nsEvent* aEvent,
|
||||
nsIDOMEvent** aDOMEvent,
|
||||
nsPIDOMEventTarget* aCurrentTarget,
|
||||
PRUint32 aFlags,
|
||||
nsEventStatus* aEventStatus,
|
||||
nsCxPusher* aPusher) = 0;
|
||||
|
||||
/**
|
||||
* Tells the event listener manager that its target (which owns it) is
|
||||
* no longer using it (and could go away).
|
||||
|
|
|
@ -198,7 +198,8 @@ public:
|
|||
if (!MayHaveListenerManager() && !aMayHaveNewListenerManagers) {
|
||||
return NS_OK;
|
||||
}
|
||||
mManager = mTarget->GetListenerManager(PR_FALSE);
|
||||
mManager =
|
||||
static_cast<nsEventListenerManager*>(mTarget->GetListenerManager(PR_FALSE));
|
||||
}
|
||||
if (mManager) {
|
||||
NS_ASSERTION(aVisitor.mEvent->currentTarget == nsnull,
|
||||
|
@ -240,7 +241,7 @@ public:
|
|||
// Event retargeting must happen whenever mNewTarget is non-null.
|
||||
nsCOMPtr<nsPIDOMEventTarget> mNewTarget;
|
||||
// Cache mTarget's event listener manager.
|
||||
nsCOMPtr<nsIEventListenerManager> mManager;
|
||||
nsRefPtr<nsEventListenerManager> mManager;
|
||||
|
||||
static PRUint32 sMaxEtciCount;
|
||||
static PRUint32 sCurrentEtciCount;
|
||||
|
|
|
@ -1095,34 +1095,14 @@ static const EventDispatchData* sLatestEventDispData = nsnull;
|
|||
*/
|
||||
|
||||
nsresult
|
||||
nsEventListenerManager::HandleEvent(nsPresContext* aPresContext,
|
||||
nsEvent* aEvent, nsIDOMEvent** aDOMEvent,
|
||||
nsPIDOMEventTarget* aCurrentTarget,
|
||||
PRUint32 aFlags,
|
||||
nsEventStatus* aEventStatus,
|
||||
nsCxPusher* aPusher)
|
||||
nsEventListenerManager::HandleEventInternal(nsPresContext* aPresContext,
|
||||
nsEvent* aEvent,
|
||||
nsIDOMEvent** aDOMEvent,
|
||||
nsPIDOMEventTarget* aCurrentTarget,
|
||||
PRUint32 aFlags,
|
||||
nsEventStatus* aEventStatus,
|
||||
nsCxPusher* aPusher)
|
||||
{
|
||||
if (mListeners.IsEmpty() || aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if (!mMayHaveCapturingListeners &&
|
||||
!(aEvent->flags & NS_EVENT_FLAG_BUBBLE)) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if (!mMayHaveSystemGroupListeners &&
|
||||
aFlags & NS_EVENT_FLAG_SYSTEM_EVENT) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Check if we already know that there is no event listener for the event.
|
||||
if (mNoListenerForEvent == aEvent->message &&
|
||||
(mNoListenerForEvent != NS_USER_DEFINED_EVENT ||
|
||||
mNoListenerForEventAtom == aEvent->userType)) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//Set the value of the internal PreventDefault flag properly based on aEventStatus
|
||||
if (*aEventStatus == nsEventStatus_eConsumeNoDefault) {
|
||||
aEvent->flags |= NS_EVENT_FLAG_NO_DEFAULT;
|
||||
|
|
|
@ -112,13 +112,45 @@ public:
|
|||
nsISupports *aObject,
|
||||
nsIAtom* aName, PRBool *aDidCompile);
|
||||
|
||||
NS_IMETHOD HandleEvent(nsPresContext* aPresContext,
|
||||
nsEvent* aEvent,
|
||||
nsIDOMEvent** aDOMEvent,
|
||||
nsPIDOMEventTarget* aCurrentTarget,
|
||||
PRUint32 aFlags,
|
||||
nsEventStatus* aEventStatus,
|
||||
nsCxPusher* aPusher);
|
||||
nsresult HandleEvent(nsPresContext* aPresContext,
|
||||
nsEvent* aEvent,
|
||||
nsIDOMEvent** aDOMEvent,
|
||||
nsPIDOMEventTarget* aCurrentTarget,
|
||||
PRUint32 aFlags,
|
||||
nsEventStatus* aEventStatus,
|
||||
nsCxPusher* aPusher)
|
||||
{
|
||||
if (mListeners.IsEmpty() || aEvent->flags & NS_EVENT_FLAG_STOP_DISPATCH) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if (!mMayHaveCapturingListeners &&
|
||||
!(aEvent->flags & NS_EVENT_FLAG_BUBBLE)) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if (!mMayHaveSystemGroupListeners &&
|
||||
aFlags & NS_EVENT_FLAG_SYSTEM_EVENT) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Check if we already know that there is no event listener for the event.
|
||||
if (mNoListenerForEvent == aEvent->message &&
|
||||
(mNoListenerForEvent != NS_USER_DEFINED_EVENT ||
|
||||
mNoListenerForEventAtom == aEvent->userType)) {
|
||||
return NS_OK;
|
||||
}
|
||||
return HandleEventInternal(aPresContext, aEvent, aDOMEvent, aCurrentTarget,
|
||||
aFlags, aEventStatus, aPusher);
|
||||
}
|
||||
|
||||
nsresult HandleEventInternal(nsPresContext* aPresContext,
|
||||
nsEvent* aEvent,
|
||||
nsIDOMEvent** aDOMEvent,
|
||||
nsPIDOMEventTarget* aCurrentTarget,
|
||||
PRUint32 aFlags,
|
||||
nsEventStatus* aEventStatus,
|
||||
nsCxPusher* aPusher);
|
||||
|
||||
NS_IMETHOD Disconnect();
|
||||
|
||||
|
|
|
@ -21,15 +21,32 @@ function fireEvent(target, event) {
|
|||
utils.dispatchDOMEventViaPresShell(target, event, true);
|
||||
}
|
||||
|
||||
function fireDrop(element, dragData, shouldAllowDrop, shouldAllowOnlyChromeDrop) {
|
||||
function fireDrop(element, shouldAllowDrop, shouldAllowOnlyChromeDrop) {
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
var ds = Components.classes["@mozilla.org/widget/dragservice;1"].
|
||||
getService(Components.interfaces.nsIDragService);
|
||||
|
||||
var dataTransfer;
|
||||
var trapDrag = function(event) {
|
||||
dataTransfer = event.dataTransfer;
|
||||
dataTransfer.setData("text/plain", "Hello");;
|
||||
dataTransfer.dropEffect = "move";
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
|
||||
// need to use real mouse action
|
||||
window.addEventListener("dragstart", trapDrag, true);
|
||||
synthesizeMouse(element, 2, 2, { type: "mousedown" });
|
||||
synthesizeMouse(element, 11, 11, { type: "mousemove" });
|
||||
synthesizeMouse(element, 20, 20, { type: "mousemove" });
|
||||
window.removeEventListener("dragstart", trapDrag, true);
|
||||
synthesizeMouse(element, 20, 20, { type: "mouseup" });
|
||||
|
||||
ds.startDragSession();
|
||||
|
||||
var event = document.createEvent("DragEvents");
|
||||
event.initDragEvent("dragover", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null, null);
|
||||
event.initDragEvent("dragover", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null, dataTransfer);
|
||||
fireEvent(element, event);
|
||||
|
||||
is(ds.getCurrentSession().canDrop, shouldAllowDrop, "Unexpected .canDrop");
|
||||
|
@ -37,7 +54,7 @@ function fireDrop(element, dragData, shouldAllowDrop, shouldAllowOnlyChromeDrop)
|
|||
"Unexpected .onlyChromeDrop");
|
||||
|
||||
event = document.createEvent("DragEvents");
|
||||
event.initDragEvent("drop", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null, null);
|
||||
event.initDragEvent("drop", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null, dataTransfer);
|
||||
fireEvent(element, event);
|
||||
|
||||
ds.endDragSession(false);
|
||||
|
@ -47,7 +64,7 @@ function fireDrop(element, dragData, shouldAllowDrop, shouldAllowOnlyChromeDrop)
|
|||
function runTests()
|
||||
{
|
||||
var targetHandling = document.getElementById("handling_target");
|
||||
fireDrop(targetHandling, [{"test/plain": "Hello!"}], false, false);
|
||||
fireDrop(targetHandling, true, false);
|
||||
|
||||
is(gGotHandlingDrop, true, "Got drop on accepting element (1)");
|
||||
is(gGotNotHandlingDrop, false, "Didn't get drop on unaccepting element (1)");
|
||||
|
@ -57,7 +74,7 @@ function runTests()
|
|||
gGotNotHandlingDrop = false;
|
||||
|
||||
var targetNotHandling = document.getElementById("nothandling_target");
|
||||
fireDrop(targetNotHandling, [{"test/plain": "Hello!"}], true, true);
|
||||
fireDrop(targetNotHandling, true, true);
|
||||
|
||||
is(gGotHandlingDrop, false, "Didn't get drop on accepting element (2)");
|
||||
is(gGotNotHandlingDrop, false, "Didn't get drop on unaccepting element (2)");
|
||||
|
|
|
@ -72,9 +72,7 @@ CPPSRCS = \
|
|||
nsHTMLFrameElement.cpp \
|
||||
nsHTMLFrameSetElement.cpp \
|
||||
nsHTMLHRElement.cpp \
|
||||
nsHTMLHeadElement.cpp \
|
||||
nsHTMLHeadingElement.cpp \
|
||||
nsHTMLHtmlElement.cpp \
|
||||
nsHTMLIFrameElement.cpp \
|
||||
nsHTMLImageElement.cpp \
|
||||
nsHTMLInputElement.cpp \
|
||||
|
|