зеркало из https://github.com/mozilla/gecko-dev.git
Merge mozilla-central and mozilla-inbound
This commit is contained in:
Коммит
37f7c950f8
|
@ -72,6 +72,11 @@ tier_base_dirs += \
|
||||||
other-licenses/skia-npapi \
|
other-licenses/skia-npapi \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
endif
|
endif
|
||||||
|
ifeq (gonk,$(MOZ_WIDGET_TOOLKIT))
|
||||||
|
tier_base_dirs += \
|
||||||
|
other-licenses/android \
|
||||||
|
$(NULL)
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef MOZ_MEMORY
|
ifdef MOZ_MEMORY
|
||||||
tier_base_dirs += memory/jemalloc
|
tier_base_dirs += memory/jemalloc
|
||||||
|
|
|
@ -650,7 +650,7 @@ protected:
|
||||||
* Set accessible parent and index in parent.
|
* Set accessible parent and index in parent.
|
||||||
*/
|
*/
|
||||||
virtual void BindToParent(nsAccessible* aParent, PRUint32 aIndexInParent);
|
virtual void BindToParent(nsAccessible* aParent, PRUint32 aIndexInParent);
|
||||||
void UnbindFromParent();
|
virtual void UnbindFromParent();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return sibling accessible at the given offset.
|
* Return sibling accessible at the given offset.
|
||||||
|
|
|
@ -248,6 +248,16 @@ nsLinkableAccessible::BindToParent(nsAccessible* aParent,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsLinkableAccessible::UnbindFromParent()
|
||||||
|
{
|
||||||
|
mActionAcc = nsnull;
|
||||||
|
mIsLink = false;
|
||||||
|
mIsOnclick = false;
|
||||||
|
|
||||||
|
nsAccessibleWrap::UnbindFromParent();
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// nsEnumRoleAccessible
|
// nsEnumRoleAccessible
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -108,6 +108,7 @@ public:
|
||||||
protected:
|
protected:
|
||||||
// nsAccessible
|
// nsAccessible
|
||||||
virtual void BindToParent(nsAccessible* aParent, PRUint32 aIndexInParent);
|
virtual void BindToParent(nsAccessible* aParent, PRUint32 aIndexInParent);
|
||||||
|
virtual void UnbindFromParent();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parent accessible that provides an action for this linkable accessible.
|
* Parent accessible that provides an action for this linkable accessible.
|
||||||
|
|
|
@ -216,53 +216,6 @@ nsHTMLAreaAccessible::Description(nsString& aDescription)
|
||||||
area->GetShape(aDescription);
|
area->GetShape(aDescription);
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsHTMLAreaAccessible::GetBounds(PRInt32 *aX, PRInt32 *aY,
|
|
||||||
PRInt32 *aWidth, PRInt32 *aHeight)
|
|
||||||
{
|
|
||||||
NS_ENSURE_ARG_POINTER(aX);
|
|
||||||
*aX = 0;
|
|
||||||
NS_ENSURE_ARG_POINTER(aY);
|
|
||||||
*aY = 0;
|
|
||||||
NS_ENSURE_ARG_POINTER(aWidth);
|
|
||||||
*aWidth = 0;
|
|
||||||
NS_ENSURE_ARG_POINTER(aHeight);
|
|
||||||
*aHeight = 0;
|
|
||||||
|
|
||||||
if (IsDefunct())
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
|
|
||||||
// Essentially this uses GetRect on mAreas of nsImageMap from nsImageFrame.
|
|
||||||
nsPresContext *presContext = GetPresContext();
|
|
||||||
NS_ENSURE_TRUE(presContext, NS_ERROR_FAILURE);
|
|
||||||
|
|
||||||
nsIFrame *frame = GetFrame();
|
|
||||||
NS_ENSURE_TRUE(frame, NS_ERROR_FAILURE);
|
|
||||||
nsImageFrame *imageFrame = do_QueryFrame(frame);
|
|
||||||
|
|
||||||
nsImageMap* map = imageFrame->GetImageMap();
|
|
||||||
NS_ENSURE_TRUE(map, NS_ERROR_FAILURE);
|
|
||||||
|
|
||||||
nsRect rect;
|
|
||||||
nsresult rv = map->GetBoundsForAreaContent(mContent, rect);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
*aX = presContext->AppUnitsToDevPixels(rect.x);
|
|
||||||
*aY = presContext->AppUnitsToDevPixels(rect.y);
|
|
||||||
|
|
||||||
// XXX Areas are screwy; they return their rects as a pair of points, one pair
|
|
||||||
// stored into the width and height.
|
|
||||||
*aWidth = presContext->AppUnitsToDevPixels(rect.width - rect.x);
|
|
||||||
*aHeight = presContext->AppUnitsToDevPixels(rect.height - rect.y);
|
|
||||||
|
|
||||||
// Put coords in absolute screen coords
|
|
||||||
nsIntRect orgRectPixels = frame->GetScreenRectExternal();
|
|
||||||
*aX += orgRectPixels.x;
|
|
||||||
*aY += orgRectPixels.y;
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// nsHTMLAreaAccessible: nsAccessNode public
|
// nsHTMLAreaAccessible: nsAccessNode public
|
||||||
|
|
||||||
|
@ -326,3 +279,25 @@ nsHTMLAreaAccessible::CacheChildren()
|
||||||
{
|
{
|
||||||
// No children for aria accessible.
|
// No children for aria accessible.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsHTMLAreaAccessible::GetBoundsRect(nsRect& aBounds, nsIFrame** aBoundingFrame)
|
||||||
|
{
|
||||||
|
nsIFrame* frame = GetFrame();
|
||||||
|
if (!frame)
|
||||||
|
return;
|
||||||
|
|
||||||
|
nsImageFrame* imageFrame = do_QueryFrame(frame);
|
||||||
|
nsImageMap* map = imageFrame->GetImageMap();
|
||||||
|
|
||||||
|
nsresult rv = map->GetBoundsForAreaContent(mContent, aBounds);
|
||||||
|
if (NS_FAILED(rv))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// XXX Areas are screwy; they return their rects as a pair of points, one pair
|
||||||
|
// stored into the width and height.
|
||||||
|
aBounds.width -= aBounds.x;
|
||||||
|
aBounds.height -= aBounds.y;
|
||||||
|
|
||||||
|
*aBoundingFrame = frame;
|
||||||
|
}
|
||||||
|
|
|
@ -96,10 +96,6 @@ public:
|
||||||
|
|
||||||
nsHTMLAreaAccessible(nsIContent* aContent, nsDocAccessible* aDoc);
|
nsHTMLAreaAccessible(nsIContent* aContent, nsDocAccessible* aDoc);
|
||||||
|
|
||||||
// nsIAccessible
|
|
||||||
|
|
||||||
NS_IMETHOD GetBounds(PRInt32 *x, PRInt32 *y, PRInt32 *width, PRInt32 *height);
|
|
||||||
|
|
||||||
// nsAccessNode
|
// nsAccessNode
|
||||||
virtual bool IsPrimaryForNode() const;
|
virtual bool IsPrimaryForNode() const;
|
||||||
|
|
||||||
|
@ -118,6 +114,7 @@ protected:
|
||||||
|
|
||||||
// nsAccessible
|
// nsAccessible
|
||||||
virtual void CacheChildren();
|
virtual void CacheChildren();
|
||||||
|
virtual void GetBoundsRect(nsRect& aBounds, nsIFrame** aBoundingFrame);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1224,7 +1224,7 @@ nsHyperTextAccessible::GetAttributesInternal(nsIPersistentProperties *aAttribute
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FocusMgr()->IsFocused(this)) {
|
if (FocusMgr()->IsFocused(this)) {
|
||||||
PRInt32 lineNumber = GetCaretLineNumber();
|
PRInt32 lineNumber = CaretLineNumber();
|
||||||
if (lineNumber >= 1) {
|
if (lineNumber >= 1) {
|
||||||
nsAutoString strLineNumber;
|
nsAutoString strLineNumber;
|
||||||
strLineNumber.AppendInt(lineNumber);
|
strLineNumber.AppendInt(lineNumber);
|
||||||
|
@ -1680,7 +1680,7 @@ nsHyperTextAccessible::GetCaretOffset(PRInt32 *aCaretOffset)
|
||||||
}
|
}
|
||||||
|
|
||||||
PRInt32
|
PRInt32
|
||||||
nsHyperTextAccessible::GetCaretLineNumber()
|
nsHyperTextAccessible::CaretLineNumber()
|
||||||
{
|
{
|
||||||
// Provide the line number for the caret, relative to the
|
// Provide the line number for the caret, relative to the
|
||||||
// currently focused node. Use a 1-based index
|
// currently focused node. Use a 1-based index
|
||||||
|
|
|
@ -264,6 +264,22 @@ public:
|
||||||
return GetChildAt(GetChildIndexAtOffset(aOffset));
|
return GetChildAt(GetChildIndexAtOffset(aOffset));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the bounds of the text between given start and end offset.
|
||||||
|
*/
|
||||||
|
nsIntRect GetTextBounds(PRInt32 aStartOffset, PRInt32 aEndOffset)
|
||||||
|
{
|
||||||
|
nsIntRect bounds;
|
||||||
|
GetPosAndText(aStartOffset, aEndOffset, nsnull, nsnull, &bounds);
|
||||||
|
return bounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provide the line number for the caret.
|
||||||
|
* @return 1-based index for the line number with the caret
|
||||||
|
*/
|
||||||
|
PRInt32 CaretLineNumber();
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
// EditableTextAccessible
|
// EditableTextAccessible
|
||||||
|
|
||||||
|
@ -373,13 +389,6 @@ protected:
|
||||||
|
|
||||||
nsresult SetSelectionRange(PRInt32 aStartPos, PRInt32 aEndPos);
|
nsresult SetSelectionRange(PRInt32 aStartPos, PRInt32 aEndPos);
|
||||||
|
|
||||||
/**
|
|
||||||
* Provide the line number for the caret, relative to the
|
|
||||||
* current DOM node.
|
|
||||||
* @return 1-based index for the line number with the caret
|
|
||||||
*/
|
|
||||||
PRInt32 GetCaretLineNumber();
|
|
||||||
|
|
||||||
// Helpers
|
// Helpers
|
||||||
nsresult GetDOMPointByFrameOffset(nsIFrame *aFrame, PRInt32 aOffset,
|
nsresult GetDOMPointByFrameOffset(nsIFrame *aFrame, PRInt32 aOffset,
|
||||||
nsIAccessible *aAccessible,
|
nsIAccessible *aAccessible,
|
||||||
|
|
|
@ -44,6 +44,18 @@
|
||||||
|
|
||||||
@class mozRootAccessible;
|
@class mozRootAccessible;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All mozAccessibles are either abstract objects (that correspond to XUL
|
||||||
|
* widgets, HTML frames, etc) or are attached to a certain view; for example
|
||||||
|
* a document view. When we hand an object off to an AT, we always want
|
||||||
|
* to give it the represented view, in the latter case.
|
||||||
|
*/
|
||||||
|
inline id <mozAccessible>
|
||||||
|
GetObjectOrRepresentedView(id <mozAccessible> aObject)
|
||||||
|
{
|
||||||
|
return [aObject hasRepresentedView] ? [aObject representedView] : aObject;
|
||||||
|
}
|
||||||
|
|
||||||
@interface mozAccessible : NSObject <mozAccessible>
|
@interface mozAccessible : NSObject <mozAccessible>
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -71,21 +71,6 @@ ConvertCocoaToGeckoPoint(NSPoint &aInPoint, nsPoint &aOutPoint)
|
||||||
aOutPoint.MoveTo ((nscoord)aInPoint.x, (nscoord)(mainScreenHeight - aInPoint.y));
|
aOutPoint.MoveTo ((nscoord)aInPoint.x, (nscoord)(mainScreenHeight - aInPoint.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
// all mozAccessibles are either abstract objects (that correspond to XUL widgets, HTML frames, etc) or are
|
|
||||||
// attached to a certain view; for example a document view. when we hand an object off to an AT, we always want
|
|
||||||
// to give it the represented view, in the latter case.
|
|
||||||
static inline id <mozAccessible>
|
|
||||||
GetObjectOrRepresentedView(id <mozAccessible> anObject)
|
|
||||||
{
|
|
||||||
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
|
|
||||||
|
|
||||||
if ([anObject hasRepresentedView])
|
|
||||||
return [anObject representedView];
|
|
||||||
return anObject;
|
|
||||||
|
|
||||||
NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns the passed in object if it is not ignored. if it's ignored, will return
|
// returns the passed in object if it is not ignored. if it's ignored, will return
|
||||||
// the first unignored ancestor.
|
// the first unignored ancestor.
|
||||||
static inline id
|
static inline id
|
||||||
|
|
|
@ -10,13 +10,3 @@
|
||||||
nsIAccessibleEditableText *mGeckoEditableTextAccessible; // strong
|
nsIAccessibleEditableText *mGeckoEditableTextAccessible; // strong
|
||||||
}
|
}
|
||||||
@end
|
@end
|
||||||
|
|
||||||
/* A combobox (in the mac world) is a textfield with an associated menu, for example
|
|
||||||
the location bar. */
|
|
||||||
@interface mozComboboxAccessible : mozTextAccessible
|
|
||||||
// equivalent to pressing return key in this textfield.
|
|
||||||
- (void)confirm;
|
|
||||||
|
|
||||||
// shows the menu for this combobox.
|
|
||||||
- (void)showMenu;
|
|
||||||
@end
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
/* -*- Mode: Objective-C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
|
||||||
#include "nsAccessibleWrap.h"
|
#include "nsAccessibleWrap.h"
|
||||||
|
|
||||||
#include "nsCocoaUtils.h"
|
#include "nsCocoaUtils.h"
|
||||||
|
@ -243,107 +245,10 @@ using namespace mozilla::a11y;
|
||||||
{
|
{
|
||||||
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
|
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
|
||||||
|
|
||||||
NSAccessibilityPostNotification([self hasRepresentedView] ? [self representedView] : self,
|
NSAccessibilityPostNotification(GetObjectOrRepresentedView(self),
|
||||||
NSAccessibilityValueChangedNotification);
|
NSAccessibilityValueChangedNotification);
|
||||||
|
|
||||||
NS_OBJC_END_TRY_ABORT_BLOCK;
|
NS_OBJC_END_TRY_ABORT_BLOCK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation mozComboboxAccessible
|
|
||||||
|
|
||||||
- (NSArray*)accessibilityAttributeNames
|
|
||||||
{
|
|
||||||
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
|
|
||||||
|
|
||||||
static NSArray *supportedAttributes = nil;
|
|
||||||
if (!supportedAttributes) {
|
|
||||||
// standard attributes that are shared and supported by all generic elements.
|
|
||||||
supportedAttributes = [[NSArray alloc] initWithObjects:NSAccessibilityParentAttribute, // required
|
|
||||||
NSAccessibilityRoleAttribute, // required
|
|
||||||
NSAccessibilityTitleAttribute,
|
|
||||||
NSAccessibilityValueAttribute, // required
|
|
||||||
NSAccessibilityHelpAttribute,
|
|
||||||
NSAccessibilityRoleDescriptionAttribute,
|
|
||||||
NSAccessibilityPositionAttribute, // required
|
|
||||||
NSAccessibilitySizeAttribute, // required
|
|
||||||
NSAccessibilityWindowAttribute, // required
|
|
||||||
NSAccessibilityFocusedAttribute, // required
|
|
||||||
NSAccessibilityEnabledAttribute, // required
|
|
||||||
NSAccessibilityChildrenAttribute, // required
|
|
||||||
NSAccessibilityHelpAttribute,
|
|
||||||
// NSAccessibilityExpandedAttribute, // required
|
|
||||||
NSAccessibilityTopLevelUIElementAttribute, // required
|
|
||||||
NSAccessibilityDescriptionAttribute, // required
|
|
||||||
/* text-specific attributes */
|
|
||||||
NSAccessibilitySelectedTextAttribute, // required
|
|
||||||
NSAccessibilitySelectedTextRangeAttribute, // required
|
|
||||||
NSAccessibilityNumberOfCharactersAttribute, // required
|
|
||||||
// TODO: NSAccessibilityVisibleCharacterRangeAttribute, // required
|
|
||||||
// TODO: NSAccessibilityInsertionPointLineNumberAttribute
|
|
||||||
#if DEBUG
|
|
||||||
@"AXMozDescription",
|
|
||||||
#endif
|
|
||||||
nil];
|
|
||||||
}
|
|
||||||
return supportedAttributes;
|
|
||||||
|
|
||||||
NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSArray *)accessibilityActionNames
|
|
||||||
{
|
|
||||||
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
|
|
||||||
|
|
||||||
if ([self isEnabled]) {
|
|
||||||
return [NSArray arrayWithObjects:NSAccessibilityConfirmAction,
|
|
||||||
NSAccessibilityShowMenuAction,
|
|
||||||
nil];
|
|
||||||
}
|
|
||||||
return nil;
|
|
||||||
|
|
||||||
NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSString *)accessibilityActionDescription:(NSString *)action
|
|
||||||
{
|
|
||||||
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
|
|
||||||
|
|
||||||
if ([action isEqualToString:NSAccessibilityShowMenuAction])
|
|
||||||
return @"show menu";
|
|
||||||
if ([action isEqualToString:NSAccessibilityConfirmAction])
|
|
||||||
return @"confirm";
|
|
||||||
|
|
||||||
return [super accessibilityActionDescription:action];
|
|
||||||
|
|
||||||
NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)accessibilityPerformAction:(NSString *)action
|
|
||||||
{
|
|
||||||
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
|
|
||||||
|
|
||||||
// both the ShowMenu and Click action do the same thing.
|
|
||||||
if ([self isEnabled]) {
|
|
||||||
if ([action isEqualToString:NSAccessibilityShowMenuAction])
|
|
||||||
[self showMenu];
|
|
||||||
if ([action isEqualToString:NSAccessibilityConfirmAction])
|
|
||||||
[self confirm];
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_OBJC_END_TRY_ABORT_BLOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)showMenu
|
|
||||||
{
|
|
||||||
// currently unimplemented. waiting for support in bug 363697
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)confirm
|
|
||||||
{
|
|
||||||
// should be the same as pressing enter/return in this textfield.
|
|
||||||
// not yet implemented
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
|
@ -110,9 +110,6 @@ nsAccessibleWrap::GetNativeType ()
|
||||||
case roles::CHECKBUTTON:
|
case roles::CHECKBUTTON:
|
||||||
return [mozCheckboxAccessible class];
|
return [mozCheckboxAccessible class];
|
||||||
|
|
||||||
case roles::AUTOCOMPLETE:
|
|
||||||
return [mozComboboxAccessible class];
|
|
||||||
|
|
||||||
case roles::HEADING:
|
case roles::HEADING:
|
||||||
return [mozHeadingAccessible class];
|
return [mozHeadingAccessible class];
|
||||||
|
|
||||||
|
|
|
@ -142,7 +142,7 @@ static const NSString* AXRoles [] = {
|
||||||
NSAccessibilityGroupRole, // ROLE_FOOTER
|
NSAccessibilityGroupRole, // ROLE_FOOTER
|
||||||
NSAccessibilityGroupRole, // ROLE_PARAGRAPH
|
NSAccessibilityGroupRole, // ROLE_PARAGRAPH
|
||||||
@"AXRuler", // ROLE_RULER. 10.4+ only, so we re-define the constant.
|
@"AXRuler", // ROLE_RULER. 10.4+ only, so we re-define the constant.
|
||||||
NSAccessibilityComboBoxRole, // ROLE_AUTOCOMPLETE
|
NSAccessibilityUnknownRole, // ROLE_AUTOCOMPLETE
|
||||||
NSAccessibilityTextFieldRole, // ROLE_EDITBAR
|
NSAccessibilityTextFieldRole, // ROLE_EDITBAR
|
||||||
NSAccessibilityTextFieldRole, // ROLE_ENTRY
|
NSAccessibilityTextFieldRole, // ROLE_ENTRY
|
||||||
NSAccessibilityStaticTextRole, // ROLE_CAPTION
|
NSAccessibilityStaticTextRole, // ROLE_CAPTION
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<script type="application/javascript"
|
||||||
|
src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
|
||||||
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="../common.js"></script>
|
src="../common.js"></script>
|
||||||
|
@ -21,24 +23,42 @@
|
||||||
function doTest()
|
function doTest()
|
||||||
{
|
{
|
||||||
var tabDocument = currentTabDocument();
|
var tabDocument = currentTabDocument();
|
||||||
var p1 = tabDocument.body.firstElementChild;
|
var p1 = tabDocument.getElementById("p1");
|
||||||
var p2 = tabDocument.body.lastElementChild;
|
var p2 = tabDocument.getElementById("p2");
|
||||||
|
|
||||||
|
var imgMap = tabDocument.getElementById("imgmap");
|
||||||
|
ensureImageMapTree(imgMap);
|
||||||
|
var imgMapAcc = getAccessible(imgMap);
|
||||||
|
var area = imgMapAcc.firstChild;
|
||||||
|
|
||||||
testBounds(p1);
|
testBounds(p1);
|
||||||
testBounds(p2);
|
testBounds(p2);
|
||||||
|
testBounds(area);
|
||||||
|
|
||||||
zoomDocument(tabDocument, 2.0);
|
zoomDocument(tabDocument, 2.0);
|
||||||
|
|
||||||
testBounds(p1);
|
testBounds(p1);
|
||||||
testBounds(p2);
|
testBounds(p2);
|
||||||
|
testBounds(area);
|
||||||
|
|
||||||
closeBrowserWindow();
|
closeBrowserWindow();
|
||||||
SimpleTest.finish();
|
SimpleTest.finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var url = "data:text/html,<html><body>";
|
||||||
|
url += "<p id='p1'>para 1</p><p id='p2'>para 2</p>";
|
||||||
|
url += "<map name='atoz_map' id='map'>";
|
||||||
|
url += " <area id='area1' href='http%3A%2F%2Fmozilla.org'";
|
||||||
|
url += " coords=17,0,30,14' alt='mozilla.org' shape='rect'>";
|
||||||
|
url += "</map>";
|
||||||
|
url += "<img id='imgmap' width='447' height='15'";
|
||||||
|
url += " usemap='%23atoz_map'";
|
||||||
|
url += " src='chrome%3A%2F%2Fmochitests%2Fcontent%2Fa11y%2Faccessible%2Fletters.gif'>";
|
||||||
|
url += "</body></html>";
|
||||||
|
|
||||||
SimpleTest.waitForExplicitFinish();
|
SimpleTest.waitForExplicitFinish();
|
||||||
openBrowserWindow(doTest,
|
openBrowserWindow(doTest,
|
||||||
"data:text/html,<html><body><p>para 1</p><p>para 2</p></body></html>",
|
url,
|
||||||
{ left: 0, top: 0, width: 600, height: 600 });
|
{ left: 0, top: 0, width: 600, height: 600 });
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
|
@ -494,7 +494,9 @@ function ensureImageMapTree(aID)
|
||||||
// XXX: We send a useless mouse move to the image to force it to setup its
|
// XXX: We send a useless mouse move to the image to force it to setup its
|
||||||
// image map, because flushing layout won't do it. Hopefully bug 135040
|
// image map, because flushing layout won't do it. Hopefully bug 135040
|
||||||
// will make this not suck.
|
// will make this not suck.
|
||||||
synthesizeMouse(getNode(aID), 10, 10, { type: "mousemove" });
|
var image = getNode(aID);
|
||||||
|
synthesizeMouse(image, 10, 10, { type: "mousemove" },
|
||||||
|
image.ownerDocument.defaultView);
|
||||||
|
|
||||||
// XXX This may affect a11y more than other code because imagemaps may not
|
// XXX This may affect a11y more than other code because imagemaps may not
|
||||||
// get drawn or have an mouse event over them. Bug 570322 tracks a11y
|
// get drawn or have an mouse event over them. Bug 570322 tracks a11y
|
||||||
|
|
|
@ -107,16 +107,42 @@ function getBounds(aID)
|
||||||
*/
|
*/
|
||||||
function getBoundsForDOMElm(aID)
|
function getBoundsForDOMElm(aID)
|
||||||
{
|
{
|
||||||
|
var x = 0, y = 0, width = 0, height = 0;
|
||||||
|
|
||||||
var elm = getNode(aID);
|
var elm = getNode(aID);
|
||||||
|
if (elm.localName == "area") {
|
||||||
|
var mapName = elm.parentNode.getAttribute("name");
|
||||||
|
var selector = "[usemap='#" + mapName + "']";
|
||||||
|
var img = elm.ownerDocument.querySelector(selector);
|
||||||
|
|
||||||
|
var areaCoords = elm.coords.split(",");
|
||||||
|
var areaX = parseInt(areaCoords[0]);
|
||||||
|
var areaY = parseInt(areaCoords[1]);
|
||||||
|
var areaWidth = parseInt(areaCoords[2]) - areaX;
|
||||||
|
var areaHeight = parseInt(areaCoords[3]) - areaY;
|
||||||
|
|
||||||
|
var rect = img.getBoundingClientRect();
|
||||||
|
x = rect.left + areaX;
|
||||||
|
y = rect.top + areaY;
|
||||||
|
width = areaWidth;
|
||||||
|
height = areaHeight;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var rect = elm.getBoundingClientRect();
|
||||||
|
x = rect.left;
|
||||||
|
y = rect.top;
|
||||||
|
width = rect.width;
|
||||||
|
height = rect.height;
|
||||||
|
}
|
||||||
|
|
||||||
var elmWindow = elm.ownerDocument.defaultView;
|
var elmWindow = elm.ownerDocument.defaultView;
|
||||||
var winUtil = elmWindow.
|
var winUtil = elmWindow.
|
||||||
QueryInterface(Components.interfaces.nsIInterfaceRequestor).
|
QueryInterface(Components.interfaces.nsIInterfaceRequestor).
|
||||||
getInterface(Components.interfaces.nsIDOMWindowUtils);
|
getInterface(Components.interfaces.nsIDOMWindowUtils);
|
||||||
|
|
||||||
var ratio = winUtil.screenPixelsPerCSSPixel;
|
var ratio = winUtil.screenPixelsPerCSSPixel;
|
||||||
var rect = elm.getBoundingClientRect();
|
return [ (x + elmWindow.mozInnerScreenX) * ratio,
|
||||||
return [ (rect.left + elmWindow.mozInnerScreenX) * ratio,
|
(y + elmWindow.mozInnerScreenY) * ratio,
|
||||||
(rect.top + elmWindow.mozInnerScreenY) * ratio,
|
width * ratio,
|
||||||
rect.width * ratio,
|
height * ratio ];
|
||||||
rect.height * ratio ];
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,12 @@ extensions/Makefile
|
||||||
"
|
"
|
||||||
|
|
||||||
if [ ! "$LIBXUL_SDK" ]; then
|
if [ ! "$LIBXUL_SDK" ]; then
|
||||||
|
if [ "$STLPORT_SOURCES" ]; then
|
||||||
|
add_makefiles "
|
||||||
|
build/stlport/Makefile
|
||||||
|
build/stlport/stl/config/_android.h
|
||||||
|
"
|
||||||
|
fi
|
||||||
add_makefiles "
|
add_makefiles "
|
||||||
memory/mozalloc/Makefile
|
memory/mozalloc/Makefile
|
||||||
mozglue/Makefile
|
mozglue/Makefile
|
||||||
|
|
|
@ -327,17 +327,36 @@ var shell = {
|
||||||
};
|
};
|
||||||
|
|
||||||
(function PowerManager() {
|
(function PowerManager() {
|
||||||
let idleHandler = {
|
// This will eventually be moved to content, so use content API as
|
||||||
observe: function(subject, topic, time) {
|
// much as possible here. TODO: Bug 738530
|
||||||
if (topic === "idle") {
|
let power = navigator.mozPower;
|
||||||
// TODO: Check wakelock status. See bug 697132.
|
let idleHandler = function idleHandler(subject, topic, time) {
|
||||||
|
if (topic === "idle") {
|
||||||
|
if (power.getWakeLockState("screen") != "locked-foreground") {
|
||||||
screen.mozEnabled = false;
|
screen.mozEnabled = false;
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
}
|
||||||
|
let wakeLockHandler = function wakeLockHandler(topic, state) {
|
||||||
|
// Turn off the screen when no one needs the it or all of them are
|
||||||
|
// invisible, otherwise turn the screen on. Note that the CPU
|
||||||
|
// might go to sleep as soon as the screen is turned off and
|
||||||
|
// acquiring wake lock will not bring it back (actually the code
|
||||||
|
// is not executed at all).
|
||||||
|
if (topic == "screen") {
|
||||||
|
if (state != "locked-foreground") {
|
||||||
|
if (Services.idle.idleTime > idleTimeout*1000) {
|
||||||
|
screen.mozEnabled = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
screen.mozEnabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
let idleTimeout = Services.prefs.getIntPref("power.screen.timeout");
|
let idleTimeout = Services.prefs.getIntPref("power.screen.timeout");
|
||||||
if (idleTimeout) {
|
if (idleTimeout) {
|
||||||
Services.idle.addIdleObserver(idleHandler, idleTimeout);
|
Services.idle.addIdleObserver(idleHandler, idleTimeout);
|
||||||
|
power.addWakeLockListener(wakeLockHandler);
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
|
@ -236,6 +236,7 @@
|
||||||
@BINPATH@/components/pref.xpt
|
@BINPATH@/components/pref.xpt
|
||||||
@BINPATH@/components/prefetch.xpt
|
@BINPATH@/components/prefetch.xpt
|
||||||
@BINPATH@/components/profile.xpt
|
@BINPATH@/components/profile.xpt
|
||||||
|
@BINPATH@/components/profiler.xpt
|
||||||
@BINPATH@/components/proxyObject.xpt
|
@BINPATH@/components/proxyObject.xpt
|
||||||
@BINPATH@/components/rdf.xpt
|
@BINPATH@/components/rdf.xpt
|
||||||
@BINPATH@/components/satchel.xpt
|
@BINPATH@/components/satchel.xpt
|
||||||
|
|
|
@ -7,30 +7,30 @@ function test () {
|
||||||
let doc = gBrowser.contentDocument;
|
let doc = gBrowser.contentDocument;
|
||||||
let tooltip = document.getElementById("aHTMLTooltip");
|
let tooltip = document.getElementById("aHTMLTooltip");
|
||||||
|
|
||||||
ok(FillInHTMLTooltip(doc.getElementById("svg1"), "should get title"));
|
ok(FillInHTMLTooltip(doc.getElementById("svg1")), "should get title");
|
||||||
is(tooltip.getAttribute("label"), "This is a non-root SVG element title");
|
is(tooltip.getAttribute("label"), "This is a non-root SVG element title");
|
||||||
|
|
||||||
ok(FillInHTMLTooltip(doc.getElementById("text1"), "should get title"));
|
ok(FillInHTMLTooltip(doc.getElementById("text1")), "should get title");
|
||||||
is(tooltip.getAttribute("label"), "\n\n\n This is a title\n\n ");
|
is(tooltip.getAttribute("label"), "\n\n\n This is a title\n\n ");
|
||||||
|
|
||||||
ok(!FillInHTMLTooltip(doc.getElementById("text2"), "should not get title"));
|
ok(!FillInHTMLTooltip(doc.getElementById("text2")), "should not get title");
|
||||||
|
|
||||||
ok(!FillInHTMLTooltip(doc.getElementById("text3"), "should not get title"));
|
ok(!FillInHTMLTooltip(doc.getElementById("text3")), "should not get title");
|
||||||
|
|
||||||
ok(FillInHTMLTooltip(doc.getElementById("link1"), "should get title"));
|
ok(FillInHTMLTooltip(doc.getElementById("link1")), "should get title");
|
||||||
is(tooltip.getAttribute("label"), "\n This is a title\n ");
|
is(tooltip.getAttribute("label"), "\n This is a title\n ");
|
||||||
ok(FillInHTMLTooltip(doc.getElementById("text4"), "should get title"));
|
ok(FillInHTMLTooltip(doc.getElementById("text4")), "should get title");
|
||||||
is(tooltip.getAttribute("label"), "\n This is a title\n ");
|
is(tooltip.getAttribute("label"), "\n This is a title\n ");
|
||||||
|
|
||||||
ok(!FillInHTMLTooltip(doc.getElementById("link2"), "should not get title"));
|
ok(!FillInHTMLTooltip(doc.getElementById("link2")), "should not get title");
|
||||||
|
|
||||||
ok(FillInHTMLTooltip(doc.getElementById("link3"), "should get title"));
|
ok(FillInHTMLTooltip(doc.getElementById("link3")), "should get title");
|
||||||
ok(tooltip.getAttribute("label") != "");
|
isnot(tooltip.getAttribute("label"), "");
|
||||||
|
|
||||||
ok(FillInHTMLTooltip(doc.getElementById("link4"), "should get title"));
|
ok(FillInHTMLTooltip(doc.getElementById("link4")), "should get title");
|
||||||
is(tooltip.getAttribute("label"), "This is an xlink:title attribute");
|
is(tooltip.getAttribute("label"), "This is an xlink:title attribute");
|
||||||
|
|
||||||
ok(!FillInHTMLTooltip(doc.getElementById("text5"), "should not get title"));
|
ok(!FillInHTMLTooltip(doc.getElementById("text5")), "should not get title");
|
||||||
|
|
||||||
gBrowser.removeCurrentTab();
|
gBrowser.removeCurrentTab();
|
||||||
finish();
|
finish();
|
||||||
|
|
|
@ -163,20 +163,3 @@ GetProfilePath(nsIProfileStartup* aStartup, nsCOMPtr<nsIFile>& aProfileDir)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
|
||||||
ImportDefaultBookmarks()
|
|
||||||
{
|
|
||||||
nsCOMPtr<nsIPlacesImportExportService> importer =
|
|
||||||
do_GetService(NS_PLACESIMPORTEXPORTSERVICE_CONTRACTID);
|
|
||||||
NS_ENSURE_STATE(importer);
|
|
||||||
|
|
||||||
nsCOMPtr<nsIIOService> ioService = mozilla::services::GetIOService();
|
|
||||||
NS_ENSURE_STATE(ioService);
|
|
||||||
nsCOMPtr<nsIURI> bookmarksURI;
|
|
||||||
nsresult rv = ioService->NewURI(DEFAULT_BOOKMARKS, nsnull, nsnull,
|
|
||||||
getter_AddRefs(bookmarksURI));
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
return importer->ImportHTMLFromURI(bookmarksURI, true);
|
|
||||||
}
|
|
||||||
|
|
|
@ -99,10 +99,5 @@ void GetMigrateDataFromArray(MigrationData* aDataArray,
|
||||||
// this is already cloned, modify it to your heart's content
|
// this is already cloned, modify it to your heart's content
|
||||||
void GetProfilePath(nsIProfileStartup* aStartup, nsCOMPtr<nsIFile>& aProfileDir);
|
void GetProfilePath(nsIProfileStartup* aStartup, nsCOMPtr<nsIFile>& aProfileDir);
|
||||||
|
|
||||||
/**
|
|
||||||
* Imports default bookmarks to the profile.
|
|
||||||
*/
|
|
||||||
nsresult ImportDefaultBookmarks();
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1398,11 +1398,6 @@ nsIEProfileMigrator::CopyFavoritesBatched(bool aReplace)
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// If importing defaults fails for whatever reason, let the import process
|
|
||||||
// continue.
|
|
||||||
DebugOnly<nsresult> rv = ImportDefaultBookmarks();
|
|
||||||
MOZ_ASSERT(NS_SUCCEEDED(rv), "Should be able to import default bookmarks");
|
|
||||||
|
|
||||||
// Locate the Links toolbar folder, we want to replace the Personal Toolbar
|
// Locate the Links toolbar folder, we want to replace the Personal Toolbar
|
||||||
// content with Favorites in this folder.
|
// content with Favorites in this folder.
|
||||||
// On versions minor or equal to IE6 the folder name is stored in the
|
// On versions minor or equal to IE6 the folder name is stored in the
|
||||||
|
|
|
@ -974,11 +974,6 @@ nsSafariProfileMigrator::CopyBookmarksBatched(bool aReplace)
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// If importing defaults fails for whatever reason, let the import process
|
|
||||||
// continue.
|
|
||||||
DebugOnly<nsresult> rv = ImportDefaultBookmarks();
|
|
||||||
MOZ_ASSERT(NS_SUCCEEDED(rv), "Should be able to import default bookmarks");
|
|
||||||
|
|
||||||
// In replace mode we are merging at the top level.
|
// In replace mode we are merging at the top level.
|
||||||
folder = bookmarksMenuFolderId;
|
folder = bookmarksMenuFolderId;
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,9 @@ XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
|
XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
|
||||||
"resource://gre/modules/PlacesUtils.jsm");
|
"resource://gre/modules/PlacesUtils.jsm");
|
||||||
|
|
||||||
|
XPCOMUtils.defineLazyModuleGetter(this, "BookmarkHTMLUtils",
|
||||||
|
"resource://gre/modules/BookmarkHTMLUtils.jsm");
|
||||||
|
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "KeywordURLResetPrompter",
|
XPCOMUtils.defineLazyModuleGetter(this, "KeywordURLResetPrompter",
|
||||||
"resource:///modules/KeywordURLResetPrompter.jsm");
|
"resource:///modules/KeywordURLResetPrompter.jsm");
|
||||||
|
|
||||||
|
@ -228,10 +231,6 @@ BrowserGlue.prototype = {
|
||||||
// no longer needed, since history was initialized completely.
|
// no longer needed, since history was initialized completely.
|
||||||
Services.obs.removeObserver(this, "places-database-locked");
|
Services.obs.removeObserver(this, "places-database-locked");
|
||||||
this._isPlacesLockedObserver = false;
|
this._isPlacesLockedObserver = false;
|
||||||
|
|
||||||
// Now apply distribution customized bookmarks.
|
|
||||||
// This should always run after Places initialization.
|
|
||||||
this._distributionCustomizer.applyBookmarks();
|
|
||||||
break;
|
break;
|
||||||
case "places-database-locked":
|
case "places-database-locked":
|
||||||
this._isPlacesDatabaseLocked = true;
|
this._isPlacesDatabaseLocked = true;
|
||||||
|
@ -257,13 +256,6 @@ BrowserGlue.prototype = {
|
||||||
// Customization has finished, we don't need the customizer anymore.
|
// Customization has finished, we don't need the customizer anymore.
|
||||||
delete this._distributionCustomizer;
|
delete this._distributionCustomizer;
|
||||||
break;
|
break;
|
||||||
case "bookmarks-restore-success":
|
|
||||||
case "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
|
case "browser-glue-test": // used by tests
|
||||||
if (data == "post-update-notification") {
|
if (data == "post-update-notification") {
|
||||||
if (Services.prefs.prefHasUserValue("app.update.postupdate"))
|
if (Services.prefs.prefHasUserValue("app.update.postupdate"))
|
||||||
|
@ -288,6 +280,9 @@ BrowserGlue.prototype = {
|
||||||
keywordURI);
|
keywordURI);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "initial-migration":
|
||||||
|
this._initialMigrationPerformed = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -990,18 +985,9 @@ BrowserGlue.prototype = {
|
||||||
// If the database is corrupt or has been newly created we should
|
// If the database is corrupt or has been newly created we should
|
||||||
// import bookmarks.
|
// import bookmarks.
|
||||||
var dbStatus = PlacesUtils.history.databaseStatus;
|
var dbStatus = PlacesUtils.history.databaseStatus;
|
||||||
var importBookmarks = dbStatus == PlacesUtils.history.DATABASE_STATUS_CREATE ||
|
var importBookmarks = !this._initialMigrationPerformed &&
|
||||||
dbStatus == PlacesUtils.history.DATABASE_STATUS_CORRUPT;
|
(dbStatus == PlacesUtils.history.DATABASE_STATUS_CREATE ||
|
||||||
|
dbStatus == PlacesUtils.history.DATABASE_STATUS_CORRUPT);
|
||||||
if (dbStatus == PlacesUtils.history.DATABASE_STATUS_CREATE) {
|
|
||||||
// If the database has just been created, but we already have any
|
|
||||||
// bookmark, this is not the initial import. This can happen after a
|
|
||||||
// migration from a different browser since migrators run before us.
|
|
||||||
// In such a case we should not import, unless some pref has been set.
|
|
||||||
if (PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId, 0) != -1 ||
|
|
||||||
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0) != -1)
|
|
||||||
importBookmarks = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if user or an extension has required to import bookmarks.html
|
// Check if user or an extension has required to import bookmarks.html
|
||||||
var importBookmarksHTML = false;
|
var importBookmarksHTML = false;
|
||||||
|
@ -1058,6 +1044,9 @@ BrowserGlue.prototype = {
|
||||||
// delayed till the import operations has finished. Not doing so would
|
// delayed till the import operations has finished. Not doing so would
|
||||||
// cause them to be overwritten by the newly imported bookmarks.
|
// cause them to be overwritten by the newly imported bookmarks.
|
||||||
if (!importBookmarks) {
|
if (!importBookmarks) {
|
||||||
|
// Now apply distribution customized bookmarks.
|
||||||
|
// This should always run after Places initialization.
|
||||||
|
this._distributionCustomizer.applyBookmarks();
|
||||||
this.ensurePlacesDefaultQueriesInitialized();
|
this.ensurePlacesDefaultQueriesInitialized();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1091,25 +1080,28 @@ BrowserGlue.prototype = {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bookmarksURI) {
|
if (bookmarksURI) {
|
||||||
// Add an import observer. It will ensure that smart bookmarks are
|
|
||||||
// created once the operation is complete.
|
|
||||||
Services.obs.addObserver(this, "bookmarks-restore-success", false);
|
|
||||||
Services.obs.addObserver(this, "bookmarks-restore-failed", false);
|
|
||||||
|
|
||||||
// Import from bookmarks.html file.
|
// Import from bookmarks.html file.
|
||||||
try {
|
try {
|
||||||
var importer = Cc["@mozilla.org/browser/places/import-export-service;1"].
|
BookmarkHTMLUtils.importFromURL(bookmarksURI.spec, true, (function (success) {
|
||||||
getService(Ci.nsIPlacesImportExportService);
|
if (success) {
|
||||||
importer.importHTMLFromURI(bookmarksURI, true /* overwrite existing */);
|
// Now apply distribution customized bookmarks.
|
||||||
|
// This should always run after Places initialization.
|
||||||
|
this._distributionCustomizer.applyBookmarks();
|
||||||
|
// Ensure that smart bookmarks are created once the operation is
|
||||||
|
// complete.
|
||||||
|
this.ensurePlacesDefaultQueriesInitialized();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Cu.reportError("Bookmarks.html file could be corrupt.");
|
||||||
|
}
|
||||||
|
}).bind(this));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// Report the error, but ignore it.
|
|
||||||
Cu.reportError("Bookmarks.html file could be corrupt. " + err);
|
Cu.reportError("Bookmarks.html file could be corrupt. " + err);
|
||||||
Services.obs.removeObserver(this, "bookmarks-restore-success");
|
|
||||||
Services.obs.removeObserver(this, "bookmarks-restore-failed");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
Cu.reportError("Unable to find bookmarks.html file.");
|
Cu.reportError("Unable to find bookmarks.html file.");
|
||||||
|
}
|
||||||
|
|
||||||
// Reset preferences, so we won't try to import again at next run
|
// Reset preferences, so we won't try to import again at next run
|
||||||
if (importBookmarksHTML)
|
if (importBookmarksHTML)
|
||||||
|
|
|
@ -400,10 +400,9 @@ var PlacesOrganizer = {
|
||||||
Ci.nsIFilePicker.modeOpen);
|
Ci.nsIFilePicker.modeOpen);
|
||||||
fp.appendFilters(Ci.nsIFilePicker.filterHTML);
|
fp.appendFilters(Ci.nsIFilePicker.filterHTML);
|
||||||
if (fp.show() != Ci.nsIFilePicker.returnCancel) {
|
if (fp.show() != Ci.nsIFilePicker.returnCancel) {
|
||||||
if (fp.file) {
|
if (fp.fileURL) {
|
||||||
var importer = Cc["@mozilla.org/browser/places/import-export-service;1"].
|
Components.utils.import("resource://gre/modules/BookmarkHTMLUtils.jsm");
|
||||||
getService(Ci.nsIPlacesImportExportService);
|
BookmarkHTMLUtils.importFromURL(fp.fileURL.spec, false);
|
||||||
importer.importHTMLFromFile(fp.file, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -57,8 +57,8 @@ function run_test() {
|
||||||
- export as json, import, test
|
- export as json, import, test
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// get places import/export service
|
// import the importer
|
||||||
var importer = Cc["@mozilla.org/browser/places/import-export-service;1"].getService(Ci.nsIPlacesImportExportService);
|
Cu.import("resource://gre/modules/BookmarkHTMLUtils.jsm");
|
||||||
|
|
||||||
// avoid creating the places smart folder during tests
|
// avoid creating the places smart folder during tests
|
||||||
Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch).
|
Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch).
|
||||||
|
@ -83,8 +83,14 @@ function run_test() {
|
||||||
// 2. run the test-suite
|
// 2. run the test-suite
|
||||||
// Note: we do not empty the db before this import to catch bugs like 380999
|
// Note: we do not empty the db before this import to catch bugs like 380999
|
||||||
try {
|
try {
|
||||||
importer.importHTMLFromFile(bookmarksFileOld, true);
|
BookmarkHTMLUtils.importFromFile(bookmarksFileOld, true, after_import);
|
||||||
} catch(ex) { do_throw("couldn't import legacy bookmarks file: " + ex); }
|
} catch(ex) { do_throw("couldn't import legacy bookmarks file: " + ex); }
|
||||||
|
}
|
||||||
|
|
||||||
|
function after_import(success) {
|
||||||
|
if (!success) {
|
||||||
|
do_throw("Couldn't import legacy bookmarks file.");
|
||||||
|
}
|
||||||
populate();
|
populate();
|
||||||
validate();
|
validate();
|
||||||
|
|
||||||
|
@ -95,6 +101,8 @@ function run_test() {
|
||||||
// 3. import bookmarks.exported.json
|
// 3. import bookmarks.exported.json
|
||||||
// 4. run the test-suite
|
// 4. run the test-suite
|
||||||
try {
|
try {
|
||||||
|
var jsonFile = Services.dirsvc.get("ProfD", Ci.nsILocalFile);
|
||||||
|
jsonFile.append("bookmarks.exported.json");
|
||||||
PlacesUtils.backups.saveBookmarksToJSONFile(jsonFile);
|
PlacesUtils.backups.saveBookmarksToJSONFile(jsonFile);
|
||||||
} catch(ex) { do_throw("couldn't export to file: " + ex); }
|
} catch(ex) { do_throw("couldn't export to file: " + ex); }
|
||||||
LOG("exported json");
|
LOG("exported json");
|
||||||
|
|
|
@ -56,6 +56,8 @@ try {
|
||||||
try {
|
try {
|
||||||
var gluesvc = Cc["@mozilla.org/browser/browserglue;1"].
|
var gluesvc = Cc["@mozilla.org/browser/browserglue;1"].
|
||||||
getService(Ci.nsIBrowserGlue);
|
getService(Ci.nsIBrowserGlue);
|
||||||
|
// Avoid default bookmarks import.
|
||||||
|
gluesvc.QueryInterface(Ci.nsIObserver).observe(null, "initial-migration", null);
|
||||||
} catch(ex) {
|
} catch(ex) {
|
||||||
do_throw("Could not get BrowserGlue service\n");
|
do_throw("Could not get BrowserGlue service\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,7 @@ var ps = Cc["@mozilla.org/preferences-service;1"].
|
||||||
getService(Ci.nsIPrefBranch);
|
getService(Ci.nsIPrefBranch);
|
||||||
var ies = Cc["@mozilla.org/browser/places/import-export-service;1"].
|
var ies = Cc["@mozilla.org/browser/places/import-export-service;1"].
|
||||||
getService(Ci.nsIPlacesImportExportService);
|
getService(Ci.nsIPlacesImportExportService);
|
||||||
|
Cu.import("resource://gre/modules/BookmarkHTMLUtils.jsm");
|
||||||
|
|
||||||
const DESCRIPTION_ANNO = "bookmarkProperties/description";
|
const DESCRIPTION_ANNO = "bookmarkProperties/description";
|
||||||
const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
|
const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
|
||||||
|
@ -72,8 +73,14 @@ function run_test() {
|
||||||
// import bookmarks from corrupt file
|
// import bookmarks from corrupt file
|
||||||
var corruptBookmarksFile = do_get_file("bookmarks.corrupt.html");
|
var corruptBookmarksFile = do_get_file("bookmarks.corrupt.html");
|
||||||
try {
|
try {
|
||||||
ies.importHTMLFromFile(corruptBookmarksFile, true);
|
BookmarkHTMLUtils.importFromFile(corruptBookmarksFile, true, after_import);
|
||||||
} catch(ex) { do_throw("couldn't import corrupt bookmarks file: " + ex); }
|
} catch(ex) { do_throw("couldn't import corrupt bookmarks file: " + ex); }
|
||||||
|
}
|
||||||
|
|
||||||
|
function after_import(success) {
|
||||||
|
if (!success) {
|
||||||
|
do_throw("Couldn't import corrupt bookmarks file.");
|
||||||
|
}
|
||||||
|
|
||||||
// Check that every bookmark is correct
|
// Check that every bookmark is correct
|
||||||
// Corrupt bookmarks should not have been imported
|
// Corrupt bookmarks should not have been imported
|
||||||
|
@ -105,14 +112,16 @@ function run_test() {
|
||||||
|
|
||||||
// Import bookmarks
|
// Import bookmarks
|
||||||
try {
|
try {
|
||||||
ies.importHTMLFromFile(bookmarksFile, true);
|
BookmarkHTMLUtils.importFromFile(bookmarksFile, true, before_database_check);
|
||||||
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function before_database_check(success) {
|
||||||
// Check that every bookmark is correct
|
// Check that every bookmark is correct
|
||||||
database_check();
|
database_check();
|
||||||
|
|
||||||
waitForAsyncUpdates(do_test_finished);
|
waitForAsyncUpdates(do_test_finished);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
Cu.import("resource://gre/modules/BookmarkHTMLUtils.jsm");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests the bookmarks-restore-* nsIObserver notifications after restoring
|
* Tests the bookmarks-restore-* nsIObserver notifications after restoring
|
||||||
* bookmarks from JSON and HTML. See bug 470314.
|
* bookmarks from JSON and HTML. See bug 470314.
|
||||||
|
@ -134,10 +136,14 @@ var tests = [
|
||||||
run: function () {
|
run: function () {
|
||||||
this.file = createFile("bookmarks-test_restoreNotification.html");
|
this.file = createFile("bookmarks-test_restoreNotification.html");
|
||||||
addBookmarks();
|
addBookmarks();
|
||||||
importer.exportHTMLToFile(this.file);
|
exporter.exportHTMLToFile(this.file);
|
||||||
remove_all_bookmarks();
|
remove_all_bookmarks();
|
||||||
try {
|
try {
|
||||||
importer.importHTMLFromFile(this.file, false);
|
BookmarkHTMLUtils.importFromFile(this.file, false, function (success) {
|
||||||
|
if (!success) {
|
||||||
|
do_throw(" Restore should not have failed");
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
do_throw(" Restore should not have failed");
|
do_throw(" Restore should not have failed");
|
||||||
|
@ -154,7 +160,11 @@ var tests = [
|
||||||
run: function () {
|
run: function () {
|
||||||
this.file = createFile("bookmarks-test_restoreNotification.init.html");
|
this.file = createFile("bookmarks-test_restoreNotification.init.html");
|
||||||
try {
|
try {
|
||||||
importer.importHTMLFromFile(this.file, false);
|
BookmarkHTMLUtils.importFromFile(this.file, false, function (success) {
|
||||||
|
if (!success) {
|
||||||
|
do_throw(" Restore should not have failed");
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
do_throw(" Restore should not have failed");
|
do_throw(" Restore should not have failed");
|
||||||
|
@ -172,8 +182,12 @@ var tests = [
|
||||||
this.file = Services.dirsvc.get("ProfD", Ci.nsILocalFile);
|
this.file = Services.dirsvc.get("ProfD", Ci.nsILocalFile);
|
||||||
this.file.append("this file doesn't exist because nobody created it");
|
this.file.append("this file doesn't exist because nobody created it");
|
||||||
try {
|
try {
|
||||||
importer.importHTMLFromFile(this.file, false);
|
BookmarkHTMLUtils.importFromFile(this.file, false, function (success) {
|
||||||
do_throw(" Restore should have failed");
|
print("callback");
|
||||||
|
if (success) {
|
||||||
|
do_throw(" Restore should have failed");
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
catch (e) {}
|
catch (e) {}
|
||||||
}
|
}
|
||||||
|
@ -188,10 +202,14 @@ var tests = [
|
||||||
run: function () {
|
run: function () {
|
||||||
this.file = createFile("bookmarks-test_restoreNotification.init.html");
|
this.file = createFile("bookmarks-test_restoreNotification.init.html");
|
||||||
addBookmarks();
|
addBookmarks();
|
||||||
importer.exportHTMLToFile(this.file);
|
exporter.exportHTMLToFile(this.file);
|
||||||
remove_all_bookmarks();
|
remove_all_bookmarks();
|
||||||
try {
|
try {
|
||||||
importer.importHTMLFromFile(this.file, true);
|
BookmarkHTMLUtils.importFromFile(this.file, true, function (success) {
|
||||||
|
if (!success) {
|
||||||
|
do_throw(" Restore should not have failed");
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
do_throw(" Restore should not have failed");
|
do_throw(" Restore should not have failed");
|
||||||
|
@ -208,7 +226,11 @@ var tests = [
|
||||||
run: function () {
|
run: function () {
|
||||||
this.file = createFile("bookmarks-test_restoreNotification.init.html");
|
this.file = createFile("bookmarks-test_restoreNotification.init.html");
|
||||||
try {
|
try {
|
||||||
importer.importHTMLFromFile(this.file, true);
|
BookmarkHTMLUtils.importFromFile(this.file, true, function (success) {
|
||||||
|
if (!success) {
|
||||||
|
do_throw(" Restore should not have failed");
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
do_throw(" Restore should not have failed");
|
do_throw(" Restore should not have failed");
|
||||||
|
@ -226,13 +248,15 @@ var tests = [
|
||||||
this.file = Services.dirsvc.get("ProfD", Ci.nsILocalFile);
|
this.file = Services.dirsvc.get("ProfD", Ci.nsILocalFile);
|
||||||
this.file.append("this file doesn't exist because nobody created it");
|
this.file.append("this file doesn't exist because nobody created it");
|
||||||
try {
|
try {
|
||||||
importer.importHTMLFromFile(this.file, true);
|
BookmarkHTMLUtils.importFromFile(this.file, true, function (success) {
|
||||||
do_throw(" Restore should have failed");
|
if (success) {
|
||||||
|
do_throw(" Restore should have failed");
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
catch (e) {}
|
catch (e) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
// nsIObserver that observes bookmarks-restore-begin.
|
// nsIObserver that observes bookmarks-restore-begin.
|
||||||
|
@ -281,7 +305,7 @@ var successAndFailedObserver = {
|
||||||
do_check_eq(test.folderId, null);
|
do_check_eq(test.folderId, null);
|
||||||
|
|
||||||
remove_all_bookmarks();
|
remove_all_bookmarks();
|
||||||
doNextTest();
|
do_execute_soon(doNextTest);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -294,7 +318,7 @@ var bmsvc = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
|
||||||
var obssvc = Cc["@mozilla.org/observer-service;1"].
|
var obssvc = Cc["@mozilla.org/observer-service;1"].
|
||||||
getService(Ci.nsIObserverService);
|
getService(Ci.nsIObserverService);
|
||||||
|
|
||||||
var importer = Cc["@mozilla.org/browser/places/import-export-service;1"].
|
var exporter = Cc["@mozilla.org/browser/places/import-export-service;1"].
|
||||||
getService(Ci.nsIPlacesImportExportService);
|
getService(Ci.nsIPlacesImportExportService);
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -99,9 +99,11 @@ let gBookmarksFileOld;
|
||||||
// Places bookmarks.html file pointer.
|
// Places bookmarks.html file pointer.
|
||||||
let gBookmarksFileNew;
|
let gBookmarksFileNew;
|
||||||
|
|
||||||
let importer = Cc["@mozilla.org/browser/places/import-export-service;1"].
|
let exporter = Cc["@mozilla.org/browser/places/import-export-service;1"].
|
||||||
getService(Ci.nsIPlacesImportExportService);
|
getService(Ci.nsIPlacesImportExportService);
|
||||||
|
|
||||||
|
Cu.import("resource://gre/modules/BookmarkHTMLUtils.jsm");
|
||||||
|
|
||||||
function run_test()
|
function run_test()
|
||||||
{
|
{
|
||||||
run_next_test();
|
run_next_test();
|
||||||
|
@ -131,22 +133,26 @@ add_test(function setup() {
|
||||||
// 2. run the test-suite
|
// 2. run the test-suite
|
||||||
// Note: we do not empty the db before this import to catch bugs like 380999
|
// Note: we do not empty the db before this import to catch bugs like 380999
|
||||||
try {
|
try {
|
||||||
importer.importHTMLFromFile(gBookmarksFileOld, true);
|
BookmarkHTMLUtils.importFromFile(gBookmarksFileOld, true, function(success) {
|
||||||
} catch(ex) { do_throw("couldn't import legacy bookmarks file: " + ex); }
|
if (success) {
|
||||||
|
waitForAsyncUpdates(function () {
|
||||||
|
testImportedBookmarks();
|
||||||
|
|
||||||
waitForAsyncUpdates(function () {
|
// Prepare for next tests.
|
||||||
testImportedBookmarks();
|
try {
|
||||||
|
exporter.exportHTMLToFile(gBookmarksFileNew);
|
||||||
|
} catch(ex) { do_throw("couldn't export to file: " + ex); }
|
||||||
|
|
||||||
// Prepare for next tests.
|
waitForAsyncUpdates(function () {
|
||||||
try {
|
remove_all_bookmarks();
|
||||||
importer.exportHTMLToFile(gBookmarksFileNew);
|
run_next_test();
|
||||||
} catch(ex) { do_throw("couldn't export to file: " + ex); }
|
});
|
||||||
|
});
|
||||||
waitForAsyncUpdates(function () {
|
} else {
|
||||||
remove_all_bookmarks();
|
do_throw("couldn't import legacy bookmarks file.");
|
||||||
run_next_test();
|
}
|
||||||
});
|
});
|
||||||
});
|
} catch(ex) { do_throw("couldn't import legacy bookmarks file: " + ex); }
|
||||||
});
|
});
|
||||||
|
|
||||||
add_test(function test_import_new()
|
add_test(function test_import_new()
|
||||||
|
@ -156,17 +162,21 @@ add_test(function test_import_new()
|
||||||
// 2. run the test-suite
|
// 2. run the test-suite
|
||||||
|
|
||||||
try {
|
try {
|
||||||
importer.importHTMLFromFile(gBookmarksFileNew, true);
|
BookmarkHTMLUtils.importFromFile(gBookmarksFileNew, true, function(success) {
|
||||||
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
if (success) {
|
||||||
|
waitForAsyncUpdates(function () {
|
||||||
|
testImportedBookmarks();
|
||||||
|
|
||||||
waitForAsyncUpdates(function () {
|
waitForAsyncUpdates(function () {
|
||||||
testImportedBookmarks();
|
remove_all_bookmarks();
|
||||||
|
run_next_test();
|
||||||
waitForAsyncUpdates(function () {
|
});
|
||||||
remove_all_bookmarks();
|
});
|
||||||
run_next_test();
|
} else {
|
||||||
|
do_throw("couldn't import the exported file.");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
||||||
});
|
});
|
||||||
|
|
||||||
add_test(function test_emptytitle_export()
|
add_test(function test_emptytitle_export()
|
||||||
|
@ -180,42 +190,50 @@ add_test(function test_emptytitle_export()
|
||||||
// 5. run the test-suite
|
// 5. run the test-suite
|
||||||
|
|
||||||
try {
|
try {
|
||||||
importer.importHTMLFromFile(gBookmarksFileNew, true);
|
BookmarkHTMLUtils.importFromFile(gBookmarksFileNew, true, function(success) {
|
||||||
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
if (success) {
|
||||||
|
const NOTITLE_URL = "http://notitle.mozilla.org/";
|
||||||
|
let id = PlacesUtils.bookmarks.insertBookmark(PlacesUtils.unfiledBookmarksFolderId,
|
||||||
|
NetUtil.newURI(NOTITLE_URL),
|
||||||
|
PlacesUtils.bookmarks.DEFAULT_INDEX,
|
||||||
|
"");
|
||||||
|
test_bookmarks.unfiled.push({ title: "", url: NOTITLE_URL });
|
||||||
|
|
||||||
const NOTITLE_URL = "http://notitle.mozilla.org/";
|
try {
|
||||||
let id = PlacesUtils.bookmarks.insertBookmark(PlacesUtils.unfiledBookmarksFolderId,
|
exporter.exportHTMLToFile(gBookmarksFileNew);
|
||||||
NetUtil.newURI(NOTITLE_URL),
|
} catch(ex) { do_throw("couldn't export to file: " + ex); }
|
||||||
PlacesUtils.bookmarks.DEFAULT_INDEX,
|
|
||||||
"");
|
|
||||||
test_bookmarks.unfiled.push({ title: "", url: NOTITLE_URL });
|
|
||||||
|
|
||||||
try {
|
remove_all_bookmarks();
|
||||||
importer.exportHTMLToFile(gBookmarksFileNew);
|
|
||||||
} catch(ex) { do_throw("couldn't export to file: " + ex); }
|
|
||||||
|
|
||||||
remove_all_bookmarks();
|
try {
|
||||||
|
BookmarkHTMLUtils.importFromFile(gBookmarksFileNew, true, function(success) {
|
||||||
|
if (success) {
|
||||||
|
waitForAsyncUpdates(function () {
|
||||||
|
testImportedBookmarks();
|
||||||
|
|
||||||
try {
|
// Cleanup.
|
||||||
importer.importHTMLFromFile(gBookmarksFileNew, true);
|
test_bookmarks.unfiled.pop();
|
||||||
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
PlacesUtils.bookmarks.removeItem(id);
|
||||||
|
|
||||||
waitForAsyncUpdates(function () {
|
try {
|
||||||
testImportedBookmarks();
|
exporter.exportHTMLToFile(gBookmarksFileNew);
|
||||||
|
} catch(ex) { do_throw("couldn't export to file: " + ex); }
|
||||||
|
|
||||||
// Cleanup.
|
waitForAsyncUpdates(function () {
|
||||||
test_bookmarks.unfiled.pop();
|
remove_all_bookmarks();
|
||||||
PlacesUtils.bookmarks.removeItem(id);
|
run_next_test();
|
||||||
|
});
|
||||||
try {
|
});
|
||||||
importer.exportHTMLToFile(gBookmarksFileNew);
|
} else {
|
||||||
} catch(ex) { do_throw("couldn't export to file: " + ex); }
|
do_throw("couldn't import the exported file.");
|
||||||
|
}
|
||||||
waitForAsyncUpdates(function () {
|
});
|
||||||
remove_all_bookmarks();
|
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
||||||
run_next_test();
|
} else {
|
||||||
|
do_throw("couldn't import the exported file.");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
||||||
});
|
});
|
||||||
|
|
||||||
add_test(function test_import_ontop()
|
add_test(function test_import_ontop()
|
||||||
|
@ -229,23 +247,33 @@ add_test(function test_import_ontop()
|
||||||
// 4. run the test-suite
|
// 4. run the test-suite
|
||||||
|
|
||||||
try {
|
try {
|
||||||
importer.importHTMLFromFile(gBookmarksFileNew, true);
|
BookmarkHTMLUtils.importFromFile(gBookmarksFileNew, true, function(success) {
|
||||||
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
if (success) {
|
||||||
try {
|
try {
|
||||||
importer.exportHTMLToFile(gBookmarksFileNew);
|
exporter.exportHTMLToFile(gBookmarksFileNew);
|
||||||
} catch(ex) { do_throw("couldn't export to file: " + ex); }
|
} catch(ex) { do_throw("couldn't export to file: " + ex); }
|
||||||
try {
|
try {
|
||||||
importer.importHTMLFromFile(gBookmarksFileNew, true);
|
BookmarkHTMLUtils.importFromFile(gBookmarksFileNew, true, function(success) {
|
||||||
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
if (success) {
|
||||||
|
waitForAsyncUpdates(function () {
|
||||||
|
testImportedBookmarks();
|
||||||
|
|
||||||
waitForAsyncUpdates(function () {
|
waitForAsyncUpdates(function () {
|
||||||
testImportedBookmarks();
|
remove_all_bookmarks();
|
||||||
|
run_next_test();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
do_throw("couldn't import the exported file.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
||||||
|
|
||||||
waitForAsyncUpdates(function () {
|
} else {
|
||||||
remove_all_bookmarks();
|
do_throw("couldn't import the exported file.");
|
||||||
run_next_test();
|
}
|
||||||
});
|
});
|
||||||
});
|
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
||||||
});
|
});
|
||||||
|
|
||||||
function testImportedBookmarks()
|
function testImportedBookmarks()
|
||||||
|
|
|
@ -29,14 +29,15 @@ function run_test() {
|
||||||
do_check_eq(PlacesUtils.history.databaseStatus,
|
do_check_eq(PlacesUtils.history.databaseStatus,
|
||||||
PlacesUtils.history.DATABASE_STATUS_CREATE);
|
PlacesUtils.history.DATABASE_STATUS_CREATE);
|
||||||
|
|
||||||
// A migrator would run before nsBrowserGlue, so we mimic that behavior
|
//A migrator would run before nsBrowserGlue Places initialization, so mimic
|
||||||
// adding a bookmark.
|
//that behavior adding a bookmark and notifying the migration.
|
||||||
PlacesUtils.bookmarks.insertBookmark(PlacesUtils.bookmarks.bookmarksMenuFolder, uri("http://mozilla.org/"),
|
PlacesUtils.bookmarks.insertBookmark(PlacesUtils.bookmarks.bookmarksMenuFolder, uri("http://mozilla.org/"),
|
||||||
PlacesUtils.bookmarks.DEFAULT_INDEX, "migrated");
|
PlacesUtils.bookmarks.DEFAULT_INDEX, "migrated");
|
||||||
|
|
||||||
// Initialize nsBrowserGlue.
|
// Initialize nsBrowserGlue.
|
||||||
let bg = Cc["@mozilla.org/browser/browserglue;1"].
|
let bg = Cc["@mozilla.org/browser/browserglue;1"].
|
||||||
getService(Ci.nsIBrowserGlue);
|
getService(Ci.nsIObserver);
|
||||||
|
bg.observe(null, "initial-migration", null)
|
||||||
|
|
||||||
let bookmarksObserver = {
|
let bookmarksObserver = {
|
||||||
onBeginUpdateBatch: function() {},
|
onBeginUpdateBatch: function() {},
|
||||||
|
|
|
@ -17,6 +17,16 @@ const TOPICDATA_FORCE_PLACES_INIT = "force-places-init";
|
||||||
let bg = Cc["@mozilla.org/browser/browserglue;1"].
|
let bg = Cc["@mozilla.org/browser/browserglue;1"].
|
||||||
getService(Ci.nsIBrowserGlue);
|
getService(Ci.nsIBrowserGlue);
|
||||||
|
|
||||||
|
function waitForImportAndSmartBookmarks(aCallback) {
|
||||||
|
Services.obs.addObserver(function waitImport() {
|
||||||
|
Services.obs.removeObserver(waitImport, "bookmarks-restore-success");
|
||||||
|
// Delay to test eventual smart bookmarks creation.
|
||||||
|
do_execute_soon(function () {
|
||||||
|
waitForAsyncUpdates(aCallback);
|
||||||
|
});
|
||||||
|
}, "bookmarks-restore-success", false);
|
||||||
|
}
|
||||||
|
|
||||||
let gTests = [
|
let gTests = [
|
||||||
|
|
||||||
// This test must be the first one.
|
// This test must be the first one.
|
||||||
|
@ -66,19 +76,20 @@ let gTests = [
|
||||||
|
|
||||||
// Force nsBrowserGlue::_initPlaces().
|
// Force nsBrowserGlue::_initPlaces().
|
||||||
print("Simulate Places init");
|
print("Simulate Places init");
|
||||||
|
waitForImportAndSmartBookmarks(function () {
|
||||||
|
// Check bookmarks.html has been imported, and a smart bookmark has been
|
||||||
|
// created.
|
||||||
|
itemId = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
|
||||||
|
SMART_BOOKMARKS_ON_TOOLBAR);
|
||||||
|
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "example");
|
||||||
|
// Check preferences have been reverted.
|
||||||
|
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
|
||||||
|
|
||||||
|
run_next_test();
|
||||||
|
});
|
||||||
bg.QueryInterface(Ci.nsIObserver).observe(null,
|
bg.QueryInterface(Ci.nsIObserver).observe(null,
|
||||||
TOPIC_BROWSERGLUE_TEST,
|
TOPIC_BROWSERGLUE_TEST,
|
||||||
TOPICDATA_FORCE_PLACES_INIT);
|
TOPICDATA_FORCE_PLACES_INIT);
|
||||||
|
|
||||||
// Check bookmarks.html has been imported, and a smart bookmark has been
|
|
||||||
// created.
|
|
||||||
itemId = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
|
|
||||||
SMART_BOOKMARKS_ON_TOOLBAR);
|
|
||||||
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "example");
|
|
||||||
// Check preferences have been reverted.
|
|
||||||
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
|
|
||||||
|
|
||||||
run_next_test();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
function test_import_noSmartBookmarks()
|
function test_import_noSmartBookmarks()
|
||||||
|
@ -98,19 +109,20 @@ let gTests = [
|
||||||
|
|
||||||
// Force nsBrowserGlue::_initPlaces().
|
// Force nsBrowserGlue::_initPlaces().
|
||||||
print("Simulate Places init");
|
print("Simulate Places init");
|
||||||
|
waitForImportAndSmartBookmarks(function () {
|
||||||
|
// Check bookmarks.html has been imported, but smart bookmarks have not
|
||||||
|
// been created.
|
||||||
|
itemId =
|
||||||
|
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
|
||||||
|
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "example");
|
||||||
|
// Check preferences have been reverted.
|
||||||
|
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
|
||||||
|
|
||||||
|
run_next_test();
|
||||||
|
});
|
||||||
bg.QueryInterface(Ci.nsIObserver).observe(null,
|
bg.QueryInterface(Ci.nsIObserver).observe(null,
|
||||||
TOPIC_BROWSERGLUE_TEST,
|
TOPIC_BROWSERGLUE_TEST,
|
||||||
TOPICDATA_FORCE_PLACES_INIT);
|
TOPICDATA_FORCE_PLACES_INIT);
|
||||||
|
|
||||||
// Check bookmarks.html has been imported, but smart bookmarks have not
|
|
||||||
// been created.
|
|
||||||
itemId =
|
|
||||||
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
|
|
||||||
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "example");
|
|
||||||
// Check preferences have been reverted.
|
|
||||||
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
|
|
||||||
|
|
||||||
run_next_test();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
function test_import_autoExport_updatedSmartBookmarks()
|
function test_import_autoExport_updatedSmartBookmarks()
|
||||||
|
@ -131,20 +143,21 @@ let gTests = [
|
||||||
|
|
||||||
// Force nsBrowserGlue::_initPlaces()
|
// Force nsBrowserGlue::_initPlaces()
|
||||||
print("Simulate Places init");
|
print("Simulate Places init");
|
||||||
|
waitForImportAndSmartBookmarks(function () {
|
||||||
|
// Check bookmarks.html has been imported, but smart bookmarks have not
|
||||||
|
// been created.
|
||||||
|
itemId =
|
||||||
|
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
|
||||||
|
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "example");
|
||||||
|
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
|
||||||
|
// Check preferences have been reverted.
|
||||||
|
Services.prefs.setBoolPref(PREF_AUTO_EXPORT_HTML, false);
|
||||||
|
|
||||||
|
run_next_test();
|
||||||
|
});
|
||||||
bg.QueryInterface(Ci.nsIObserver).observe(null,
|
bg.QueryInterface(Ci.nsIObserver).observe(null,
|
||||||
TOPIC_BROWSERGLUE_TEST,
|
TOPIC_BROWSERGLUE_TEST,
|
||||||
TOPICDATA_FORCE_PLACES_INIT);
|
TOPICDATA_FORCE_PLACES_INIT);
|
||||||
|
|
||||||
// Check bookmarks.html has been imported, but smart bookmarks have not
|
|
||||||
// been created.
|
|
||||||
itemId =
|
|
||||||
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
|
|
||||||
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "example");
|
|
||||||
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
|
|
||||||
// Check preferences have been reverted.
|
|
||||||
Services.prefs.setBoolPref(PREF_AUTO_EXPORT_HTML, false);
|
|
||||||
|
|
||||||
run_next_test();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
function test_import_autoExport_oldSmartBookmarks()
|
function test_import_autoExport_oldSmartBookmarks()
|
||||||
|
@ -165,21 +178,22 @@ let gTests = [
|
||||||
|
|
||||||
// Force nsBrowserGlue::_initPlaces()
|
// Force nsBrowserGlue::_initPlaces()
|
||||||
print("Simulate Places init");
|
print("Simulate Places init");
|
||||||
|
waitForImportAndSmartBookmarks(function () {
|
||||||
|
// Check bookmarks.html has been imported, but smart bookmarks have not
|
||||||
|
// been created.
|
||||||
|
itemId =
|
||||||
|
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
|
||||||
|
SMART_BOOKMARKS_ON_TOOLBAR);
|
||||||
|
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "example");
|
||||||
|
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
|
||||||
|
// Check preferences have been reverted.
|
||||||
|
Services.prefs.setBoolPref(PREF_AUTO_EXPORT_HTML, false);
|
||||||
|
|
||||||
|
run_next_test();
|
||||||
|
});
|
||||||
bg.QueryInterface(Ci.nsIObserver).observe(null,
|
bg.QueryInterface(Ci.nsIObserver).observe(null,
|
||||||
TOPIC_BROWSERGLUE_TEST,
|
TOPIC_BROWSERGLUE_TEST,
|
||||||
TOPICDATA_FORCE_PLACES_INIT);
|
TOPICDATA_FORCE_PLACES_INIT);
|
||||||
|
|
||||||
// Check bookmarks.html has been imported, but smart bookmarks have not
|
|
||||||
// been created.
|
|
||||||
itemId =
|
|
||||||
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
|
|
||||||
SMART_BOOKMARKS_ON_TOOLBAR);
|
|
||||||
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "example");
|
|
||||||
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
|
|
||||||
// Check preferences have been reverted.
|
|
||||||
Services.prefs.setBoolPref(PREF_AUTO_EXPORT_HTML, false);
|
|
||||||
|
|
||||||
run_next_test();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
function test_restore()
|
function test_restore()
|
||||||
|
@ -198,19 +212,21 @@ let gTests = [
|
||||||
|
|
||||||
// Force nsBrowserGlue::_initPlaces()
|
// Force nsBrowserGlue::_initPlaces()
|
||||||
print("Simulate Places init");
|
print("Simulate Places init");
|
||||||
|
waitForImportAndSmartBookmarks(function () {
|
||||||
|
// Check bookmarks.html has been restored.
|
||||||
|
itemId =
|
||||||
|
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
|
||||||
|
SMART_BOOKMARKS_ON_TOOLBAR);
|
||||||
|
do_check_true(itemId > 0);
|
||||||
|
// Check preferences have been reverted.
|
||||||
|
do_check_false(Services.prefs.getBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS));
|
||||||
|
|
||||||
|
run_next_test();
|
||||||
|
});
|
||||||
bg.QueryInterface(Ci.nsIObserver).observe(null,
|
bg.QueryInterface(Ci.nsIObserver).observe(null,
|
||||||
TOPIC_BROWSERGLUE_TEST,
|
TOPIC_BROWSERGLUE_TEST,
|
||||||
TOPICDATA_FORCE_PLACES_INIT);
|
TOPICDATA_FORCE_PLACES_INIT);
|
||||||
|
|
||||||
// Check bookmarks.html has been restored.
|
|
||||||
itemId =
|
|
||||||
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
|
|
||||||
SMART_BOOKMARKS_ON_TOOLBAR);
|
|
||||||
do_check_true(itemId > 0);
|
|
||||||
// Check preferences have been reverted.
|
|
||||||
do_check_false(Services.prefs.getBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS));
|
|
||||||
|
|
||||||
run_next_test();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
function test_restore_import()
|
function test_restore_import()
|
||||||
|
@ -230,20 +246,21 @@ let gTests = [
|
||||||
|
|
||||||
// Force nsBrowserGlue::_initPlaces()
|
// Force nsBrowserGlue::_initPlaces()
|
||||||
print("Simulate Places init");
|
print("Simulate Places init");
|
||||||
|
waitForImportAndSmartBookmarks(function () {
|
||||||
|
// Check bookmarks.html has been restored.
|
||||||
|
itemId =
|
||||||
|
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
|
||||||
|
SMART_BOOKMARKS_ON_TOOLBAR);
|
||||||
|
do_check_true(itemId > 0);
|
||||||
|
// Check preferences have been reverted.
|
||||||
|
do_check_false(Services.prefs.getBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS));
|
||||||
|
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
|
||||||
|
|
||||||
|
run_next_test();
|
||||||
|
});
|
||||||
bg.QueryInterface(Ci.nsIObserver).observe(null,
|
bg.QueryInterface(Ci.nsIObserver).observe(null,
|
||||||
TOPIC_BROWSERGLUE_TEST,
|
TOPIC_BROWSERGLUE_TEST,
|
||||||
TOPICDATA_FORCE_PLACES_INIT);
|
TOPICDATA_FORCE_PLACES_INIT);
|
||||||
|
|
||||||
// Check bookmarks.html has been restored.
|
|
||||||
itemId =
|
|
||||||
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
|
|
||||||
SMART_BOOKMARKS_ON_TOOLBAR);
|
|
||||||
do_check_true(itemId > 0);
|
|
||||||
// Check preferences have been reverted.
|
|
||||||
do_check_false(Services.prefs.getBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS));
|
|
||||||
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
|
|
||||||
|
|
||||||
run_next_test();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
|
@ -364,6 +364,15 @@ function run_test() {
|
||||||
}
|
}
|
||||||
catch(ex) {}
|
catch(ex) {}
|
||||||
|
|
||||||
// Kick-off tests.
|
waitForImportAndSmartBookmarks(next_test);
|
||||||
next_test();
|
}
|
||||||
|
|
||||||
|
function waitForImportAndSmartBookmarks(aCallback) {
|
||||||
|
Services.obs.addObserver(function waitImport() {
|
||||||
|
Services.obs.removeObserver(waitImport, "bookmarks-restore-success");
|
||||||
|
// Delay to test eventual smart bookmarks creation.
|
||||||
|
do_execute_soon(function () {
|
||||||
|
waitForAsyncUpdates(aCallback);
|
||||||
|
});
|
||||||
|
}, "bookmarks-restore-success", false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,7 +110,9 @@ function run_test() {
|
||||||
do_test_pending();
|
do_test_pending();
|
||||||
|
|
||||||
print("Initialize browserglue before Places");
|
print("Initialize browserglue before Places");
|
||||||
Cc["@mozilla.org/browser/browserglue;1"].getService(Ci.nsIBrowserGlue);
|
// Avoid default bookmarks import.
|
||||||
|
Cc["@mozilla.org/browser/browserglue;1"].getService(Ci.nsIObserver)
|
||||||
|
.observe(null, "initial-migration", null);
|
||||||
|
|
||||||
Services.prefs.setBoolPref("privacy.clearOnShutdown.cache", true);
|
Services.prefs.setBoolPref("privacy.clearOnShutdown.cache", true);
|
||||||
Services.prefs.setBoolPref("privacy.clearOnShutdown.cookies", true);
|
Services.prefs.setBoolPref("privacy.clearOnShutdown.cookies", true);
|
||||||
|
|
|
@ -99,7 +99,9 @@
|
||||||
@BINPATH@/@MOZ_APP_NAME@
|
@BINPATH@/@MOZ_APP_NAME@
|
||||||
#endif
|
#endif
|
||||||
@BINPATH@/application.ini
|
@BINPATH@/application.ini
|
||||||
|
#ifdef MOZ_UPDATER
|
||||||
@BINPATH@/update-settings.ini
|
@BINPATH@/update-settings.ini
|
||||||
|
#endif
|
||||||
@BINPATH@/platform.ini
|
@BINPATH@/platform.ini
|
||||||
#ifndef XP_OS2
|
#ifndef XP_OS2
|
||||||
@BINPATH@/@DLL_PREFIX@mozsqlite3@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@mozsqlite3@DLL_SUFFIX@
|
||||||
|
|
|
@ -280,7 +280,7 @@ can reach it easily. -->
|
||||||
<!ENTITY clearRecentHistory.label "Clear Recent History…">
|
<!ENTITY clearRecentHistory.label "Clear Recent History…">
|
||||||
<!ENTITY clearRecentHistory.accesskey "H">
|
<!ENTITY clearRecentHistory.accesskey "H">
|
||||||
|
|
||||||
<!-- LOCALIZATION NOTE : These two strings can share an access key beause they never appear together on the menu -->
|
<!-- LOCALIZATION NOTE : These two strings can share an access key because they never appear together on the menu -->
|
||||||
<!ENTITY privateBrowsingCmd.start.label "Start Private Browsing">
|
<!ENTITY privateBrowsingCmd.start.label "Start Private Browsing">
|
||||||
<!ENTITY privateBrowsingCmd.start.accesskey "P">
|
<!ENTITY privateBrowsingCmd.start.accesskey "P">
|
||||||
<!ENTITY privateBrowsingCmd.stop.label "Stop Private Browsing">
|
<!ENTITY privateBrowsingCmd.stop.label "Stop Private Browsing">
|
||||||
|
|
|
@ -158,9 +158,9 @@
|
||||||
border-right-style: none !important;
|
border-right-style: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#toolbar-menubar :-moz-any(@primaryToolbarButtons@):not(:-moz-any(#alltabs-button,#tabview-button,#new-tab-button,#sync-button[status])) > .toolbarbutton-icon:not(:-moz-lwtheme),
|
#toolbar-menubar :-moz-any(@primaryToolbarButtons@):not(:-moz-any(#alltabs-button,#tabview-button,#sync-button[status])) > .toolbarbutton-icon:not(:-moz-lwtheme),
|
||||||
#TabsToolbar[tabsontop=true] :-moz-any(@primaryToolbarButtons@):not(:-moz-any(#alltabs-button,#tabview-button,#new-tab-button,#sync-button[status])) > .toolbarbutton-icon:not(:-moz-lwtheme),
|
#TabsToolbar[tabsontop=true] :-moz-any(@primaryToolbarButtons@):not(:-moz-any(#alltabs-button,#tabview-button,#new-tab-button,#sync-button[status])) > .toolbarbutton-icon:not(:-moz-lwtheme),
|
||||||
#navigator-toolbox[tabsontop=false] > #nav-bar :-moz-any(@primaryToolbarButtons@):not(:-moz-any(#alltabs-button,#tabview-button,#new-tab-button,#sync-button[status])) > .toolbarbutton-icon:not(:-moz-lwtheme),
|
#navigator-toolbox[tabsontop=false] > #nav-bar :-moz-any(@primaryToolbarButtons@):not(:-moz-any(#alltabs-button,#tabview-button,#sync-button[status])) > .toolbarbutton-icon:not(:-moz-lwtheme),
|
||||||
#nav-bar + #customToolbars + #PersonalToolbar[collapsed=true] + #TabsToolbar[tabsontop=false]:last-child :-moz-any(@primaryToolbarButtons@):not(:-moz-any(#alltabs-button,#tabview-button,#new-tab-button,#sync-button[status])) > .toolbarbutton-icon:not(:-moz-lwtheme) {
|
#nav-bar + #customToolbars + #PersonalToolbar[collapsed=true] + #TabsToolbar[tabsontop=false]:last-child :-moz-any(@primaryToolbarButtons@):not(:-moz-any(#alltabs-button,#tabview-button,#new-tab-button,#sync-button[status])) > .toolbarbutton-icon:not(:-moz-lwtheme) {
|
||||||
list-style-image: url("chrome://browser/skin/Toolbar-inverted.png");
|
list-style-image: url("chrome://browser/skin/Toolbar-inverted.png");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1003,6 +1003,8 @@ toolbar[mode=full] .toolbarbutton-1 > .toolbarbutton-menubutton-button {
|
||||||
%ifdef WINSTRIPE_AERO
|
%ifdef WINSTRIPE_AERO
|
||||||
#TabsToolbar > #tabview-button:-moz-system-metric(windows-compositor):not(:-moz-lwtheme),
|
#TabsToolbar > #tabview-button:-moz-system-metric(windows-compositor):not(:-moz-lwtheme),
|
||||||
#TabsToolbar > toolbarpaletteitem > #tabview-button:-moz-system-metric(windows-compositor):not(:-moz-lwtheme),
|
#TabsToolbar > toolbarpaletteitem > #tabview-button:-moz-system-metric(windows-compositor):not(:-moz-lwtheme),
|
||||||
|
#navigator-toolbox[tabsontop=false] > #nav-bar #tabview-button:-moz-system-metric(windows-compositor):not(:-moz-lwtheme),
|
||||||
|
#toolbar-menubar #tabview-button:-moz-system-metric(windows-compositor):not(:-moz-lwtheme),
|
||||||
%endif
|
%endif
|
||||||
#tabview-button:-moz-lwtheme-brighttext {
|
#tabview-button:-moz-lwtheme-brighttext {
|
||||||
list-style-image: url(chrome://browser/skin/tabview/tabview-inverted.png);
|
list-style-image: url(chrome://browser/skin/tabview/tabview-inverted.png);
|
||||||
|
@ -2051,6 +2053,8 @@ richlistitem[type~="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-
|
||||||
%ifdef WINSTRIPE_AERO
|
%ifdef WINSTRIPE_AERO
|
||||||
#TabsToolbar > #alltabs-button[type="menu"]:-moz-system-metric(windows-compositor):not(:-moz-lwtheme),
|
#TabsToolbar > #alltabs-button[type="menu"]:-moz-system-metric(windows-compositor):not(:-moz-lwtheme),
|
||||||
#TabsToolbar > toolbarpaletteitem > #alltabs-button[type="menu"]:-moz-system-metric(windows-compositor):not(:-moz-lwtheme),
|
#TabsToolbar > toolbarpaletteitem > #alltabs-button[type="menu"]:-moz-system-metric(windows-compositor):not(:-moz-lwtheme),
|
||||||
|
#navigator-toolbox[tabsontop=false] > #nav-bar #alltabs-button[type="menu"]:-moz-system-metric(windows-compositor):not(:-moz-lwtheme),
|
||||||
|
#toolbar-menubar #alltabs-button[type="menu"]:-moz-system-metric(windows-compositor):not(:-moz-lwtheme),
|
||||||
%endif
|
%endif
|
||||||
#alltabs-button[type="menu"]:-moz-lwtheme-brighttext {
|
#alltabs-button[type="menu"]:-moz-lwtheme-brighttext {
|
||||||
list-style-image: url("chrome://browser/skin/toolbarbutton-dropdown-arrow-inverted.png");
|
list-style-image: url("chrome://browser/skin/toolbarbutton-dropdown-arrow-inverted.png");
|
||||||
|
|
|
@ -53,6 +53,10 @@ ifeq (WINNT,$(OS_ARCH))
|
||||||
DIRS = win32
|
DIRS = win32
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef STLPORT_SOURCES
|
||||||
|
DIRS += stlport
|
||||||
|
endif
|
||||||
|
|
||||||
DIRS += pgo
|
DIRS += pgo
|
||||||
|
|
||||||
TEST_DIRS += autoconf/test
|
TEST_DIRS += autoconf/test
|
||||||
|
@ -69,8 +73,10 @@ ifdef MOZ_APP_BASENAME
|
||||||
DIST_FILES = application.ini
|
DIST_FILES = application.ini
|
||||||
|
|
||||||
ifneq (android,$(MOZ_WIDGET_TOOLKIT))
|
ifneq (android,$(MOZ_WIDGET_TOOLKIT))
|
||||||
|
ifdef MOZ_UPDATER
|
||||||
DIST_FILES += update-settings.ini
|
DIST_FILES += update-settings.ini
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef LIBXUL_SDK
|
ifdef LIBXUL_SDK
|
||||||
GRE_MILESTONE = $(shell $(PYTHON) $(topsrcdir)/config/printconfigsetting.py $(LIBXUL_DIST)/bin/platform.ini Build Milestone)
|
GRE_MILESTONE = $(shell $(PYTHON) $(topsrcdir)/config/printconfigsetting.py $(LIBXUL_DIST)/bin/platform.ini Build Milestone)
|
||||||
|
@ -160,10 +166,12 @@ leaktest.py: leaktest.py.in
|
||||||
GARBAGE += leaktest.py
|
GARBAGE += leaktest.py
|
||||||
|
|
||||||
ifneq (android,$(MOZ_WIDGET_TOOLKIT))
|
ifneq (android,$(MOZ_WIDGET_TOOLKIT))
|
||||||
|
ifdef MOZ_UPDATER
|
||||||
update-settings.ini: update-settings.ini.in $(APP_INI_DEPS)
|
update-settings.ini: update-settings.ini.in $(APP_INI_DEPS)
|
||||||
$(PYTHON) $(topsrcdir)/config/Preprocessor.py $(DEFINES) $< > $@
|
$(PYTHON) $(topsrcdir)/config/Preprocessor.py $(DEFINES) $< > $@
|
||||||
GARBAGE += update-settings.ini
|
GARBAGE += update-settings.ini
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef MOZ_APP_BASENAME
|
ifdef MOZ_APP_BASENAME
|
||||||
application.ini: application.ini.in $(APP_INI_DEPS)
|
application.ini: application.ini.in $(APP_INI_DEPS)
|
||||||
|
|
|
@ -235,12 +235,12 @@ class DeviceManager:
|
||||||
|
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def killProcess(self, appname):
|
def killProcess(self, appname, forceKill=False):
|
||||||
"""
|
"""
|
||||||
external function
|
external function
|
||||||
returns:
|
returns:
|
||||||
success: output from testagent
|
success: True
|
||||||
failure: None
|
failure: False
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
|
|
|
@ -376,16 +376,21 @@ class DeviceManagerADB(DeviceManager):
|
||||||
|
|
||||||
# external function
|
# external function
|
||||||
# returns:
|
# returns:
|
||||||
# success: output from testagent
|
# success: True
|
||||||
# failure: None
|
# failure: False
|
||||||
def killProcess(self, appname):
|
def killProcess(self, appname, forceKill=False):
|
||||||
procs = self.getProcessList()
|
procs = self.getProcessList()
|
||||||
|
didKillProcess = False
|
||||||
for (pid, name, user) in procs:
|
for (pid, name, user) in procs:
|
||||||
if name == appname:
|
if name == appname:
|
||||||
p = self.runCmdAs(["shell", "kill", pid])
|
args = ["shell", "kill"]
|
||||||
return p.stdout.read()
|
if forceKill:
|
||||||
|
args.append("-9")
|
||||||
|
args.append(pid)
|
||||||
|
p = self.runCmdAs(args)
|
||||||
|
didKillProcess = True
|
||||||
|
|
||||||
return None
|
return didKillProcess
|
||||||
|
|
||||||
# external function
|
# external function
|
||||||
# returns:
|
# returns:
|
||||||
|
|
|
@ -582,15 +582,17 @@ class DeviceManagerSUT(DeviceManager):
|
||||||
|
|
||||||
# external function
|
# external function
|
||||||
# returns:
|
# returns:
|
||||||
# success: output from testagent
|
# success: True
|
||||||
# failure: None
|
# failure: False
|
||||||
def killProcess(self, appname):
|
def killProcess(self, appname, forceKill=False):
|
||||||
|
if forceKill:
|
||||||
|
print "WARNING: killProcess(): forceKill parameter unsupported on SUT"
|
||||||
try:
|
try:
|
||||||
data = self.runCmds(['kill ' + appname])
|
data = self.runCmds(['kill ' + appname])
|
||||||
except AgentError:
|
except AgentError:
|
||||||
return None
|
return False
|
||||||
|
|
||||||
return data
|
return True
|
||||||
|
|
||||||
# external function
|
# external function
|
||||||
# returns:
|
# returns:
|
||||||
|
|
|
@ -70,6 +70,8 @@ import org.json.*;
|
||||||
import com.jayway.android.robotium.solo.Solo;
|
import com.jayway.android.robotium.solo.Solo;
|
||||||
|
|
||||||
public class FennecNativeDriver implements Driver {
|
public class FennecNativeDriver implements Driver {
|
||||||
|
private static final int FRAME_TIME_THRESHOLD = 17; // allow 17ms per frame (~60fps)
|
||||||
|
|
||||||
// Map of IDs to element names.
|
// Map of IDs to element names.
|
||||||
private HashMap mLocators = null;
|
private HashMap mLocators = null;
|
||||||
private Activity mActivity;
|
private Activity mActivity;
|
||||||
|
@ -225,21 +227,15 @@ public class FennecNativeDriver implements Driver {
|
||||||
public int stopFrameRecording() {
|
public int stopFrameRecording() {
|
||||||
Class [] parameters = new Class[1];
|
Class [] parameters = new Class[1];
|
||||||
parameters[0] = null;
|
parameters[0] = null;
|
||||||
List frames;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Object [] params = null;
|
Object [] params = null;
|
||||||
frames = (List)_stopFrameRecording.invoke(null, params);
|
List<Long> frames = (List<Long>)_stopFrameRecording.invoke(null, params);
|
||||||
Object [] framearray = frames.toArray();
|
|
||||||
Long last = new Long(0);
|
|
||||||
Long threshold = new Long(17);
|
|
||||||
int numDelays = 0;
|
int numDelays = 0;
|
||||||
for (int i=0; i < framearray.length; i++) {
|
for (int i = 1; i < frames.size(); i++) {
|
||||||
Long val = (Long)framearray[i];
|
if (frames.get(i) - frames.get(i-1) > FRAME_TIME_THRESHOLD) {
|
||||||
if ((val - last) > threshold) {
|
|
||||||
numDelays++;
|
numDelays++;
|
||||||
}
|
}
|
||||||
last = val;
|
|
||||||
}
|
}
|
||||||
return numDelays;
|
return numDelays;
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
|
@ -265,18 +261,15 @@ public class FennecNativeDriver implements Driver {
|
||||||
public float stopCheckerboardRecording() {
|
public float stopCheckerboardRecording() {
|
||||||
Class [] parameters = new Class[1];
|
Class [] parameters = new Class[1];
|
||||||
parameters[0] = null;
|
parameters[0] = null;
|
||||||
List checkerboard;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Object [] params = null;
|
Object [] params = null;
|
||||||
checkerboard = (List)_stopCheckerboardRecording.invoke(null, params);
|
List<Float> checkerboard = (List<Float>)_stopCheckerboardRecording.invoke(null, params);
|
||||||
Object [] amountarray = checkerboard.toArray();
|
float completeness = 0;
|
||||||
double completeness = 0;
|
for (float val : checkerboard) {
|
||||||
for (Object obj : amountarray) {
|
completeness += (1.0f - val);
|
||||||
float val = (Float)obj;
|
|
||||||
completeness += (1.0 - (double)val) / (double)amountarray.length;
|
|
||||||
}
|
}
|
||||||
return (float)completeness;
|
return completeness / (float)checkerboard.size();
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (InvocationTargetException e) {
|
} catch (InvocationTargetException e) {
|
||||||
|
|
|
@ -59,9 +59,7 @@ namespace std {
|
||||||
template ostream& ostream::_M_insert(unsigned long);
|
template ostream& ostream::_M_insert(unsigned long);
|
||||||
template ostream& ostream::_M_insert(long long);
|
template ostream& ostream::_M_insert(long long);
|
||||||
template ostream& ostream::_M_insert(unsigned long long);
|
template ostream& ostream::_M_insert(unsigned long long);
|
||||||
#ifdef DEBUG
|
|
||||||
template ostream& ostream::_M_insert(const void*);
|
template ostream& ostream::_M_insert(const void*);
|
||||||
#endif
|
|
||||||
template ostream& __ostream_insert(ostream&, const char*, streamsize);
|
template ostream& __ostream_insert(ostream&, const char*, streamsize);
|
||||||
template istream& istream::_M_extract(double&);
|
template istream& istream::_M_extract(double&);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
DEPTH = ../..
|
||||||
|
topsrcdir = @top_srcdir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
|
||||||
|
include $(DEPTH)/config/autoconf.mk
|
||||||
|
|
||||||
|
MODULES = stlport
|
||||||
|
LIBRARY_NAME = stlport_static
|
||||||
|
FORCE_STATIC_LIB = 1
|
||||||
|
STL_FLAGS =
|
||||||
|
|
||||||
|
# Force to build a static library, instead of a fake library, without
|
||||||
|
# installing it in dist/lib.
|
||||||
|
LIBRARY = $(LIB_PREFIX)$(LIBRARY_NAME).$(LIB_SUFFIX)
|
||||||
|
|
||||||
|
VPATH += $(STLPORT_SOURCES)/src
|
||||||
|
|
||||||
|
CPPSRCS = $(notdir $(wildcard $(STLPORT_SOURCES)/src/*.cpp))
|
||||||
|
CSRCS = $(notdir $(wildcard $(STLPORT_SOURCES)/src/*.c))
|
||||||
|
|
||||||
|
include $(topsrcdir)/config/rules.mk
|
||||||
|
|
||||||
|
DEFINES += -D_GNU_SOURCE
|
||||||
|
CXXFLAGS += -fuse-cxa-atexit
|
||||||
|
INCLUDES += -I$(STLPORT_SOURCES)/stlport
|
|
@ -0,0 +1,23 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#ifndef mozilla_stl_config__android_h
|
||||||
|
#define mozilla_stl_config__android_h
|
||||||
|
|
||||||
|
#include "@STLPORT_SOURCES@/stlport/stl/config/_android.h"
|
||||||
|
|
||||||
|
// No rtti support
|
||||||
|
#undef _STLP_NO_RTTI
|
||||||
|
#define _STLP_NO_RTTI 1
|
||||||
|
|
||||||
|
// No throwing exceptions
|
||||||
|
#undef _STLP_NO_EXCEPTIONS
|
||||||
|
#define _STLP_NO_EXCEPTIONS 1
|
||||||
|
|
||||||
|
#undef _STLP_NATIVE_CPP_C_HEADER
|
||||||
|
#define _STLP_NATIVE_CPP_C_HEADER(header) <../../system/include/header>
|
||||||
|
#undef _STLP_NATIVE_CPP_RUNTIME_HEADER
|
||||||
|
#define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../../system/include/header>
|
||||||
|
|
||||||
|
#endif /* mozilla_stl_config__android_h */
|
|
@ -109,6 +109,7 @@ def build_gcc(stage_dir, is_stage_one):
|
||||||
"--with-mpfr=%s" % lib_inst_dir,
|
"--with-mpfr=%s" % lib_inst_dir,
|
||||||
"--with-mpc=%s" % lib_inst_dir,
|
"--with-mpc=%s" % lib_inst_dir,
|
||||||
"--enable-languages=c,c++",
|
"--enable-languages=c,c++",
|
||||||
|
"--disable-lto",
|
||||||
"--disable-multilib",
|
"--disable-multilib",
|
||||||
"--disable-bootstrap"]
|
"--disable-bootstrap"]
|
||||||
if is_stage_one:
|
if is_stage_one:
|
||||||
|
|
|
@ -691,6 +691,7 @@ ANDROID_PLATFORM = @ANDROID_PLATFORM@
|
||||||
ANDROID_SDK = @ANDROID_SDK@
|
ANDROID_SDK = @ANDROID_SDK@
|
||||||
ANDROID_PLATFORM_TOOLS = @ANDROID_PLATFORM_TOOLS@
|
ANDROID_PLATFORM_TOOLS = @ANDROID_PLATFORM_TOOLS@
|
||||||
ANDROID_VERSION = @ANDROID_VERSION@
|
ANDROID_VERSION = @ANDROID_VERSION@
|
||||||
|
STLPORT_SOURCES = @STLPORT_SOURCES@
|
||||||
|
|
||||||
ANDROID_PACKAGE_NAME = @ANDROID_PACKAGE_NAME@
|
ANDROID_PACKAGE_NAME = @ANDROID_PACKAGE_NAME@
|
||||||
|
|
||||||
|
|
22
configure.in
22
configure.in
|
@ -1616,9 +1616,10 @@ if test "$OS_TARGET" = "Android" -a -z "$gonkdir"; then
|
||||||
STLPORT_CPPFLAGS="-I$android_ndk/sources/cxx-stl/gnu-libstdc++/include -I$android_ndk/sources/cxx-stl/gnu-libstdc++/libs/$ANDROID_CPU_ARCH/include -D_GLIBCXX_PERMIT_BACKWARD_HASH"
|
STLPORT_CPPFLAGS="-I$android_ndk/sources/cxx-stl/gnu-libstdc++/include -I$android_ndk/sources/cxx-stl/gnu-libstdc++/libs/$ANDROID_CPU_ARCH/include -D_GLIBCXX_PERMIT_BACKWARD_HASH"
|
||||||
STLPORT_LDFLAGS="-L$android_ndk/sources/cxx-stl/gnu-libstdc++/libs/$ANDROID_CPU_ARCH"
|
STLPORT_LDFLAGS="-L$android_ndk/sources/cxx-stl/gnu-libstdc++/libs/$ANDROID_CPU_ARCH"
|
||||||
STLPORT_LIBS="-lstdc++"
|
STLPORT_LIBS="-lstdc++"
|
||||||
elif test -e "$android_ndk/sources/cxx-stl/stlport/libs/$ANDROID_CPU_ARCH/libstlport_static.a" ; then
|
elif test -e "$android_ndk/sources/cxx-stl/stlport/src/iostream.cpp" ; then
|
||||||
STLPORT_CPPFLAGS="-I$android_ndk/sources/cxx-stl/stlport/stlport"
|
STLPORT_SOURCES="$android_ndk/sources/cxx-stl/stlport"
|
||||||
STLPORT_LDFLAGS="-L$android_ndk/sources/cxx-stl/stlport/libs/$ANDROID_CPU_ARCH/"
|
STLPORT_CPPFLAGS="-I$_objdir/build/stlport -I$android_ndk/sources/cxx-stl/stlport/stlport"
|
||||||
|
STLPORT_LDFLAGS="-L$_objdir/build/stlport -L$android_ndk/sources/cxx-stl/stlport/libs/$ANDROID_CPU_ARCH/"
|
||||||
STLPORT_LIBS="-lstlport_static"
|
STLPORT_LIBS="-lstlport_static"
|
||||||
elif test -e "$android_ndk/tmp/ndk-digit/build/install/sources/cxx-stl/stlport/libs/$ANDROID_CPU_ARCH/libstlport_static.a" ; then
|
elif test -e "$android_ndk/tmp/ndk-digit/build/install/sources/cxx-stl/stlport/libs/$ANDROID_CPU_ARCH/libstlport_static.a" ; then
|
||||||
STLPORT_CPPFLAGS="-I$android_ndk/sources/cxx-stl/stlport/stlport"
|
STLPORT_CPPFLAGS="-I$android_ndk/sources/cxx-stl/stlport/stlport"
|
||||||
|
@ -1633,6 +1634,8 @@ if test "$OS_TARGET" = "Android" -a -z "$gonkdir"; then
|
||||||
LIBS="$LIBS $STLPORT_LIBS"
|
LIBS="$LIBS $STLPORT_LIBS"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
AC_SUBST([STLPORT_SOURCES])
|
||||||
|
|
||||||
dnl ========================================================
|
dnl ========================================================
|
||||||
dnl Suppress Clang Argument Warnings
|
dnl Suppress Clang Argument Warnings
|
||||||
dnl ========================================================
|
dnl ========================================================
|
||||||
|
@ -7228,13 +7231,11 @@ dnl We need to wrap dlopen and related functions on Android because we use
|
||||||
dnl our own linker.
|
dnl our own linker.
|
||||||
if test "$OS_TARGET" = Android; then
|
if test "$OS_TARGET" = Android; then
|
||||||
WRAP_LDFLAGS="${WRAP_LDFLAGS} -L$_objdir/dist/lib -lmozglue"
|
WRAP_LDFLAGS="${WRAP_LDFLAGS} -L$_objdir/dist/lib -lmozglue"
|
||||||
if test "$MOZ_WIDGET_TOOLKIT" = android; then
|
if test -n "$MOZ_OLD_LINKER"; then
|
||||||
if test -n "$MOZ_OLD_LINKER"; then
|
WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=dlopen,--wrap=dlclose,--wrap=dlerror,--wrap=dlsym,--wrap=dladdr"
|
||||||
WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=dlopen,--wrap=dlclose,--wrap=dlerror,--wrap=dlsym,--wrap=dladdr"
|
|
||||||
fi
|
|
||||||
WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=getaddrinfo,--wrap=freeaddrinfo,--wrap=gai_strerror"
|
|
||||||
WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=fork,--wrap=pthread_atfork"
|
|
||||||
fi
|
fi
|
||||||
|
WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=getaddrinfo,--wrap=freeaddrinfo,--wrap=gai_strerror"
|
||||||
|
WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=fork,--wrap=pthread_atfork"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl ========================================================
|
dnl ========================================================
|
||||||
|
@ -9107,6 +9108,9 @@ if test -n "$MOZ_GLUE_PROGRAM_LDFLAGS"; then
|
||||||
export MOZ_GLUE_PROGRAM_LDFLAGS
|
export MOZ_GLUE_PROGRAM_LDFLAGS
|
||||||
fi
|
fi
|
||||||
export MOZ_APP_NAME
|
export MOZ_APP_NAME
|
||||||
|
export STLPORT_CPPFLAGS
|
||||||
|
export STLPORT_LDFLAGS
|
||||||
|
export STLPORT_LIBS
|
||||||
AC_OUTPUT_SUBDIRS(js/src)
|
AC_OUTPUT_SUBDIRS(js/src)
|
||||||
ac_configure_args="$_SUBDIR_CONFIG_ARGS"
|
ac_configure_args="$_SUBDIR_CONFIG_ARGS"
|
||||||
|
|
||||||
|
|
|
@ -1248,13 +1248,14 @@ nsObjectLoadingContent::LoadObject(nsIURI* aURI,
|
||||||
// Only do a URI equality check for things that aren't stopped plugins.
|
// Only do a URI equality check for things that aren't stopped plugins.
|
||||||
// This is because we still need to load again if the plugin has been stopped.
|
// This is because we still need to load again if the plugin has been stopped.
|
||||||
if (mType == eType_Document || mType == eType_Image || mInstanceOwner) {
|
if (mType == eType_Document || mType == eType_Image || mInstanceOwner) {
|
||||||
if (mURI && aURI && !aForceLoad) {
|
if (mURI && aURI) {
|
||||||
bool equal;
|
bool equal;
|
||||||
nsresult rv = mURI->Equals(aURI, &equal);
|
nsresult rv = mURI->Equals(aURI, &equal);
|
||||||
if (NS_SUCCEEDED(rv) && equal) {
|
if (NS_SUCCEEDED(rv) && equal && !aForceLoad) {
|
||||||
// URI didn't change, do nothing
|
// URI didn't change, do nothing
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
StopPluginInstance();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -417,8 +417,7 @@ nsScriptLoader::ProcessScriptElement(nsIScriptElement *aElement)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsIScriptContext *context = globalObject->GetScriptContext(
|
nsIScriptContext *context = globalObject->GetScriptContext();
|
||||||
nsIProgrammingLanguage::JAVASCRIPT);
|
|
||||||
|
|
||||||
// If scripts aren't enabled in the current context, there's no
|
// If scripts aren't enabled in the current context, there's no
|
||||||
// point in going on.
|
// point in going on.
|
||||||
|
@ -890,14 +889,14 @@ nsScriptLoader::EvaluateScript(nsScriptLoadRequest* aRequest,
|
||||||
PRUint32 stid = scriptContent ? scriptContent->GetScriptTypeID() :
|
PRUint32 stid = scriptContent ? scriptContent->GetScriptTypeID() :
|
||||||
nsIProgrammingLanguage::JAVASCRIPT;
|
nsIProgrammingLanguage::JAVASCRIPT;
|
||||||
// and make sure we are setup for this type of script.
|
// and make sure we are setup for this type of script.
|
||||||
rv = globalObject->EnsureScriptEnvironment(stid);
|
rv = globalObject->EnsureScriptEnvironment();
|
||||||
if (NS_FAILED(rv))
|
if (NS_FAILED(rv))
|
||||||
return rv;
|
return rv;
|
||||||
|
|
||||||
// Make sure context is a strong reference since we access it after
|
// Make sure context is a strong reference since we access it after
|
||||||
// we've executed a script, which may cause all other references to
|
// we've executed a script, which may cause all other references to
|
||||||
// the context to go away.
|
// the context to go away.
|
||||||
nsCOMPtr<nsIScriptContext> context = globalObject->GetScriptContext(stid);
|
nsCOMPtr<nsIScriptContext> context = globalObject->GetScriptContext();
|
||||||
if (!context) {
|
if (!context) {
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,10 @@ class nsICanvasElementExternal : public nsISupports {
|
||||||
public:
|
public:
|
||||||
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICANVASELEMENTEXTERNAL_IID)
|
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICANVASELEMENTEXTERNAL_IID)
|
||||||
|
|
||||||
|
enum {
|
||||||
|
RenderFlagPremultAlpha = 0x1
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the size in pixels of this canvas element
|
* Get the size in pixels of this canvas element
|
||||||
*/
|
*/
|
||||||
|
@ -77,7 +81,8 @@ public:
|
||||||
* to the given gfxContext at the origin of its coordinate space.
|
* to the given gfxContext at the origin of its coordinate space.
|
||||||
*/
|
*/
|
||||||
NS_IMETHOD RenderContextsExternal(gfxContext *ctx,
|
NS_IMETHOD RenderContextsExternal(gfxContext *ctx,
|
||||||
gfxPattern::GraphicsFilter aFilter) = 0;
|
gfxPattern::GraphicsFilter aFilter,
|
||||||
|
PRUint32 aFlags = RenderFlagPremultAlpha) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
NS_DEFINE_STATIC_IID_ACCESSOR(nsICanvasElementExternal, NS_ICANVASELEMENTEXTERNAL_IID)
|
NS_DEFINE_STATIC_IID_ACCESSOR(nsICanvasElementExternal, NS_ICANVASELEMENTEXTERNAL_IID)
|
||||||
|
|
|
@ -74,6 +74,10 @@ public:
|
||||||
|
|
||||||
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICANVASRENDERINGCONTEXTINTERNAL_IID)
|
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICANVASRENDERINGCONTEXTINTERNAL_IID)
|
||||||
|
|
||||||
|
enum {
|
||||||
|
RenderFlagPremultAlpha = 0x1
|
||||||
|
};
|
||||||
|
|
||||||
// This method should NOT hold a ref to aParentCanvas; it will be called
|
// This method should NOT hold a ref to aParentCanvas; it will be called
|
||||||
// with nsnull when the element is going away.
|
// with nsnull when the element is going away.
|
||||||
NS_IMETHOD SetCanvasElement(nsHTMLCanvasElement* aParentCanvas) = 0;
|
NS_IMETHOD SetCanvasElement(nsHTMLCanvasElement* aParentCanvas) = 0;
|
||||||
|
@ -85,7 +89,9 @@ public:
|
||||||
NS_IMETHOD InitializeWithSurface(nsIDocShell *docShell, gfxASurface *surface, PRInt32 width, PRInt32 height) = 0;
|
NS_IMETHOD InitializeWithSurface(nsIDocShell *docShell, gfxASurface *surface, PRInt32 width, PRInt32 height) = 0;
|
||||||
|
|
||||||
// Render the canvas at the origin of the given gfxContext
|
// Render the canvas at the origin of the given gfxContext
|
||||||
NS_IMETHOD Render(gfxContext *ctx, gfxPattern::GraphicsFilter aFilter) = 0;
|
NS_IMETHOD Render(gfxContext *ctx,
|
||||||
|
gfxPattern::GraphicsFilter aFilter,
|
||||||
|
PRUint32 aFlags = RenderFlagPremultAlpha) = 0;
|
||||||
|
|
||||||
// Gives you a stream containing the image represented by this context.
|
// Gives you a stream containing the image represented by this context.
|
||||||
// The format is given in aMimeTime, for example "image/png".
|
// The format is given in aMimeTime, for example "image/png".
|
||||||
|
|
|
@ -561,7 +561,7 @@ WebGLContext::SetDimensions(PRInt32 width, PRInt32 height)
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
WebGLContext::Render(gfxContext *ctx, gfxPattern::GraphicsFilter f)
|
WebGLContext::Render(gfxContext *ctx, gfxPattern::GraphicsFilter f, PRUint32 aFlags)
|
||||||
{
|
{
|
||||||
if (!gl)
|
if (!gl)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
@ -572,7 +572,15 @@ WebGLContext::Render(gfxContext *ctx, gfxPattern::GraphicsFilter f)
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
gl->ReadPixelsIntoImageSurface(0, 0, mWidth, mHeight, surf);
|
gl->ReadPixelsIntoImageSurface(0, 0, mWidth, mHeight, surf);
|
||||||
gfxUtils::PremultiplyImageSurface(surf);
|
|
||||||
|
bool srcPremultAlpha = mOptions.premultipliedAlpha;
|
||||||
|
bool dstPremultAlpha = aFlags & RenderFlagPremultAlpha;
|
||||||
|
|
||||||
|
if (!srcPremultAlpha && dstPremultAlpha) {
|
||||||
|
gfxUtils::PremultiplyImageSurface(surf);
|
||||||
|
} else if (srcPremultAlpha && !dstPremultAlpha) {
|
||||||
|
gfxUtils::UnpremultiplyImageSurface(surf);
|
||||||
|
}
|
||||||
|
|
||||||
nsRefPtr<gfxPattern> pat = new gfxPattern(surf);
|
nsRefPtr<gfxPattern> pat = new gfxPattern(surf);
|
||||||
pat->SetFilter(f);
|
pat->SetFilter(f);
|
||||||
|
@ -608,7 +616,8 @@ WebGLContext::GetInputStream(const char* aMimeType,
|
||||||
|
|
||||||
nsRefPtr<gfxContext> tmpcx = new gfxContext(surf);
|
nsRefPtr<gfxContext> tmpcx = new gfxContext(surf);
|
||||||
// Use Render() to make sure that appropriate y-flip gets applied
|
// Use Render() to make sure that appropriate y-flip gets applied
|
||||||
nsresult rv = Render(tmpcx, gfxPattern::FILTER_NEAREST);
|
PRUint32 flags = mOptions.premultipliedAlpha ? RenderFlagPremultAlpha : 0;
|
||||||
|
nsresult rv = Render(tmpcx, gfxPattern::FILTER_NEAREST, flags);
|
||||||
if (NS_FAILED(rv))
|
if (NS_FAILED(rv))
|
||||||
return rv;
|
return rv;
|
||||||
|
|
||||||
|
@ -625,11 +634,22 @@ WebGLContext::GetInputStream(const char* aMimeType,
|
||||||
if (!encoder)
|
if (!encoder)
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
int format = imgIEncoder::INPUT_FORMAT_HOSTARGB;
|
||||||
|
if (!mOptions.premultipliedAlpha) {
|
||||||
|
// We need to convert to INPUT_FORMAT_RGBA, otherwise
|
||||||
|
// we are automatically considered premult, and unpremult'd.
|
||||||
|
// Yes, it is THAT silly.
|
||||||
|
// Except for different lossy conversions by color,
|
||||||
|
// we could probably just change the label, and not change the data.
|
||||||
|
gfxUtils::ConvertBGRAtoRGBA(surf);
|
||||||
|
format = imgIEncoder::INPUT_FORMAT_RGBA;
|
||||||
|
}
|
||||||
|
|
||||||
rv = encoder->InitFromData(surf->Data(),
|
rv = encoder->InitFromData(surf->Data(),
|
||||||
mWidth * mHeight * 4,
|
mWidth * mHeight * 4,
|
||||||
mWidth, mHeight,
|
mWidth, mHeight,
|
||||||
surf->Stride(),
|
surf->Stride(),
|
||||||
imgIEncoder::INPUT_FORMAT_HOSTARGB,
|
format,
|
||||||
nsDependentString(aEncoderOptions));
|
nsDependentString(aEncoderOptions));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
|
|
@ -542,7 +542,9 @@ public:
|
||||||
{ return NS_ERROR_NOT_IMPLEMENTED; }
|
{ return NS_ERROR_NOT_IMPLEMENTED; }
|
||||||
NS_IMETHOD Reset()
|
NS_IMETHOD Reset()
|
||||||
{ /* (InitializeWithSurface) */ return NS_ERROR_NOT_IMPLEMENTED; }
|
{ /* (InitializeWithSurface) */ return NS_ERROR_NOT_IMPLEMENTED; }
|
||||||
NS_IMETHOD Render(gfxContext *ctx, gfxPattern::GraphicsFilter f);
|
NS_IMETHOD Render(gfxContext *ctx,
|
||||||
|
gfxPattern::GraphicsFilter f,
|
||||||
|
PRUint32 aFlags = RenderFlagPremultAlpha);
|
||||||
NS_IMETHOD GetInputStream(const char* aMimeType,
|
NS_IMETHOD GetInputStream(const char* aMimeType,
|
||||||
const PRUnichar* aEncoderOptions,
|
const PRUnichar* aEncoderOptions,
|
||||||
nsIInputStream **aStream);
|
nsIInputStream **aStream);
|
||||||
|
|
|
@ -351,7 +351,9 @@ public:
|
||||||
void Initialize(nsIDocShell *shell, PRInt32 width, PRInt32 height);
|
void Initialize(nsIDocShell *shell, PRInt32 width, PRInt32 height);
|
||||||
NS_IMETHOD InitializeWithSurface(nsIDocShell *shell, gfxASurface *surface, PRInt32 width, PRInt32 height);
|
NS_IMETHOD InitializeWithSurface(nsIDocShell *shell, gfxASurface *surface, PRInt32 width, PRInt32 height);
|
||||||
bool EnsureSurface();
|
bool EnsureSurface();
|
||||||
NS_IMETHOD Render(gfxContext *ctx, gfxPattern::GraphicsFilter aFilter);
|
NS_IMETHOD Render(gfxContext *ctx,
|
||||||
|
gfxPattern::GraphicsFilter aFilter,
|
||||||
|
PRUint32 aFlags = RenderFlagPremultAlpha);
|
||||||
NS_IMETHOD GetInputStream(const char* aMimeType,
|
NS_IMETHOD GetInputStream(const char* aMimeType,
|
||||||
const PRUnichar* aEncoderOptions,
|
const PRUnichar* aEncoderOptions,
|
||||||
nsIInputStream **aStream);
|
nsIInputStream **aStream);
|
||||||
|
@ -1278,7 +1280,7 @@ nsCanvasRenderingContext2D::SetIsIPC(bool isIPC)
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsCanvasRenderingContext2D::Render(gfxContext *ctx, gfxPattern::GraphicsFilter aFilter)
|
nsCanvasRenderingContext2D::Render(gfxContext *ctx, gfxPattern::GraphicsFilter aFilter, PRUint32 aFlags)
|
||||||
{
|
{
|
||||||
nsresult rv = NS_OK;
|
nsresult rv = NS_OK;
|
||||||
|
|
||||||
|
@ -1303,6 +1305,14 @@ nsCanvasRenderingContext2D::Render(gfxContext *ctx, gfxPattern::GraphicsFilter a
|
||||||
if (mOpaque)
|
if (mOpaque)
|
||||||
ctx->SetOperator(op);
|
ctx->SetOperator(op);
|
||||||
|
|
||||||
|
if (!(aFlags & RenderFlagPremultAlpha)) {
|
||||||
|
nsRefPtr<gfxASurface> curSurface = ctx->CurrentSurface();
|
||||||
|
nsRefPtr<gfxImageSurface> gis = curSurface->GetAsImageSurface();
|
||||||
|
NS_ABORT_IF_FALSE(gis, "If non-premult alpha, must be able to get image surface!");
|
||||||
|
|
||||||
|
gfxUtils::UnpremultiplyImageSurface(gis);
|
||||||
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -406,7 +406,9 @@ public:
|
||||||
NS_IMETHOD InitializeWithSurface(nsIDocShell *shell, gfxASurface *surface, PRInt32 width, PRInt32 height)
|
NS_IMETHOD InitializeWithSurface(nsIDocShell *shell, gfxASurface *surface, PRInt32 width, PRInt32 height)
|
||||||
{ return NS_ERROR_NOT_IMPLEMENTED; }
|
{ return NS_ERROR_NOT_IMPLEMENTED; }
|
||||||
|
|
||||||
NS_IMETHOD Render(gfxContext *ctx, gfxPattern::GraphicsFilter aFilter);
|
NS_IMETHOD Render(gfxContext *ctx,
|
||||||
|
gfxPattern::GraphicsFilter aFilter,
|
||||||
|
PRUint32 aFlags = RenderFlagPremultAlpha);
|
||||||
NS_IMETHOD GetInputStream(const char* aMimeType,
|
NS_IMETHOD GetInputStream(const char* aMimeType,
|
||||||
const PRUnichar* aEncoderOptions,
|
const PRUnichar* aEncoderOptions,
|
||||||
nsIInputStream **aStream);
|
nsIInputStream **aStream);
|
||||||
|
@ -1382,7 +1384,7 @@ nsCanvasRenderingContext2DAzure::SetIsIPC(bool isIPC)
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsCanvasRenderingContext2DAzure::Render(gfxContext *ctx, gfxPattern::GraphicsFilter aFilter)
|
nsCanvasRenderingContext2DAzure::Render(gfxContext *ctx, gfxPattern::GraphicsFilter aFilter, PRUint32 aFlags)
|
||||||
{
|
{
|
||||||
nsresult rv = NS_OK;
|
nsresult rv = NS_OK;
|
||||||
|
|
||||||
|
@ -1414,6 +1416,14 @@ nsCanvasRenderingContext2DAzure::Render(gfxContext *ctx, gfxPattern::GraphicsFil
|
||||||
if (mOpaque)
|
if (mOpaque)
|
||||||
ctx->SetOperator(op);
|
ctx->SetOperator(op);
|
||||||
|
|
||||||
|
if (!(aFlags & RenderFlagPremultAlpha)) {
|
||||||
|
nsRefPtr<gfxASurface> curSurface = ctx->CurrentSurface();
|
||||||
|
nsRefPtr<gfxImageSurface> gis = curSurface->GetAsImageSurface();
|
||||||
|
NS_ABORT_IF_FALSE(gis, "If non-premult alpha, must be able to get image surface!");
|
||||||
|
|
||||||
|
gfxUtils::UnpremultiplyImageSurface(gis);
|
||||||
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
conformance/context/premultiplyalpha-test.html
|
|
||||||
conformance/misc/uninitialized-test.html
|
conformance/misc/uninitialized-test.html
|
||||||
conformance/programs/gl-get-active-attribute.html
|
conformance/programs/gl-get-active-attribute.html
|
||||||
conformance/textures/texture-mips.html
|
conformance/textures/texture-mips.html
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
conformance/context/premultiplyalpha-test.html
|
|
||||||
conformance/glsl/misc/glsl-function-nodes.html
|
conformance/glsl/misc/glsl-function-nodes.html
|
||||||
conformance/more/conformance/quickCheckAPI-S_V.html
|
conformance/more/conformance/quickCheckAPI-S_V.html
|
||||||
conformance/programs/program-test.html
|
conformance/programs/program-test.html
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
conformance/context/premultiplyalpha-test.html
|
|
||||||
conformance/glsl/functions/glsl-function-atan.html
|
conformance/glsl/functions/glsl-function-atan.html
|
||||||
conformance/glsl/functions/glsl-function-atan-xy.html
|
conformance/glsl/functions/glsl-function-atan-xy.html
|
||||||
conformance/more/conformance/quickCheckAPI-S_V.html
|
conformance/more/conformance/quickCheckAPI-S_V.html
|
||||||
|
|
|
@ -532,12 +532,12 @@ nsEventListenerManager::AddScriptEventListener(nsIAtom *aName,
|
||||||
|
|
||||||
// This might be the first reference to this language in the global
|
// This might be the first reference to this language in the global
|
||||||
// We must init the language before we attempt to fetch its context.
|
// We must init the language before we attempt to fetch its context.
|
||||||
if (NS_FAILED(global->EnsureScriptEnvironment(aLanguage))) {
|
if (NS_FAILED(global->EnsureScriptEnvironment())) {
|
||||||
NS_WARNING("Failed to setup script environment for this language");
|
NS_WARNING("Failed to setup script environment for this language");
|
||||||
// but fall through and let the inevitable failure below handle it.
|
// but fall through and let the inevitable failure below handle it.
|
||||||
}
|
}
|
||||||
|
|
||||||
nsIScriptContext* context = global->GetScriptContext(aLanguage);
|
nsIScriptContext* context = global->GetScriptContext();
|
||||||
NS_ENSURE_TRUE(context, NS_ERROR_FAILURE);
|
NS_ENSURE_TRUE(context, NS_ERROR_FAILURE);
|
||||||
|
|
||||||
JSObject* scope = global->GetGlobalJSObject();
|
JSObject* scope = global->GetGlobalJSObject();
|
||||||
|
|
|
@ -142,7 +142,9 @@ public:
|
||||||
* nsICanvasElementExternal -- for use outside of content/layout
|
* nsICanvasElementExternal -- for use outside of content/layout
|
||||||
*/
|
*/
|
||||||
NS_IMETHOD_(nsIntSize) GetSizeExternal();
|
NS_IMETHOD_(nsIntSize) GetSizeExternal();
|
||||||
NS_IMETHOD RenderContextsExternal(gfxContext *aContext, gfxPattern::GraphicsFilter aFilter);
|
NS_IMETHOD RenderContextsExternal(gfxContext *aContext,
|
||||||
|
gfxPattern::GraphicsFilter aFilter,
|
||||||
|
PRUint32 aFlags = RenderFlagPremultAlpha);
|
||||||
|
|
||||||
virtual bool ParseAttribute(PRInt32 aNamespaceID,
|
virtual bool ParseAttribute(PRInt32 aNamespaceID,
|
||||||
nsIAtom* aAttribute,
|
nsIAtom* aAttribute,
|
||||||
|
|
|
@ -794,12 +794,12 @@ nsHTMLCanvasElement::GetSizeExternal()
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLCanvasElement::RenderContextsExternal(gfxContext *aContext, gfxPattern::GraphicsFilter aFilter)
|
nsHTMLCanvasElement::RenderContextsExternal(gfxContext *aContext, gfxPattern::GraphicsFilter aFilter, PRUint32 aFlags)
|
||||||
{
|
{
|
||||||
if (!mCurrentContext)
|
if (!mCurrentContext)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
return mCurrentContext->Render(aContext, aFilter);
|
return mCurrentContext->Render(aContext, aFilter, aFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult NS_NewCanvasRenderingContext2DThebes(nsIDOMCanvasRenderingContext2D** aResult);
|
nsresult NS_NewCanvasRenderingContext2DThebes(nsIDOMCanvasRenderingContext2D** aResult);
|
||||||
|
|
|
@ -855,6 +855,10 @@ nsHTMLInputElement::AfterSetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateEditableState(aNotify);
|
UpdateEditableState(aNotify);
|
||||||
|
nsTextEditorState *state = GetEditorState();
|
||||||
|
if (state) {
|
||||||
|
state->UpdateEditableState(aNotify);
|
||||||
|
}
|
||||||
UpdateState(aNotify);
|
UpdateState(aNotify);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1293,6 +1293,7 @@ nsHTMLTextAreaElement::AfterSetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
|
||||||
|
|
||||||
if (aName == nsGkAtoms::readonly) {
|
if (aName == nsGkAtoms::readonly) {
|
||||||
UpdateEditableState(aNotify);
|
UpdateEditableState(aNotify);
|
||||||
|
mState->UpdateEditableState(aNotify);
|
||||||
}
|
}
|
||||||
UpdateState(aNotify);
|
UpdateState(aNotify);
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include "nsITextControlElement.h"
|
#include "nsITextControlElement.h"
|
||||||
#include "nsITextControlFrame.h"
|
#include "nsITextControlFrame.h"
|
||||||
#include "nsCycleCollectionParticipant.h"
|
#include "nsCycleCollectionParticipant.h"
|
||||||
|
#include "nsIContent.h"
|
||||||
|
|
||||||
class nsTextInputListener;
|
class nsTextInputListener;
|
||||||
class nsTextControlFrame;
|
class nsTextControlFrame;
|
||||||
|
@ -238,6 +239,12 @@ public:
|
||||||
void WillInitEagerly() { mSelectionRestoreEagerInit = true; }
|
void WillInitEagerly() { mSelectionRestoreEagerInit = true; }
|
||||||
bool HasNeverInitializedBefore() const { return !mEverInited; }
|
bool HasNeverInitializedBefore() const { return !mEverInited; }
|
||||||
|
|
||||||
|
void UpdateEditableState(bool aNotify) {
|
||||||
|
if (mRootNode) {
|
||||||
|
mRootNode->UpdateEditableState(aNotify);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class RestoreSelectionState;
|
friend class RestoreSelectionState;
|
||||||
|
|
||||||
|
|
|
@ -2681,8 +2681,8 @@ nsHTMLDocument::EditingStateChanged()
|
||||||
rv = LoadChromeSheetSync(uri, true, getter_AddRefs(sheet));
|
rv = LoadChromeSheetSync(uri, true, getter_AddRefs(sheet));
|
||||||
NS_ENSURE_TRUE(sheet, rv);
|
NS_ENSURE_TRUE(sheet, rv);
|
||||||
|
|
||||||
rv = agentSheets.AppendObject(sheet);
|
bool result = agentSheets.AppendObject(sheet);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_TRUE(result, NS_ERROR_OUT_OF_MEMORY);
|
||||||
|
|
||||||
// Should we update the editable state of all the nodes in the document? We
|
// Should we update the editable state of all the nodes in the document? We
|
||||||
// need to do this when the designMode value changes, as that overrides
|
// need to do this when the designMode value changes, as that overrides
|
||||||
|
@ -2695,8 +2695,8 @@ nsHTMLDocument::EditingStateChanged()
|
||||||
rv = LoadChromeSheetSync(uri, true, getter_AddRefs(sheet));
|
rv = LoadChromeSheetSync(uri, true, getter_AddRefs(sheet));
|
||||||
NS_ENSURE_TRUE(sheet, rv);
|
NS_ENSURE_TRUE(sheet, rv);
|
||||||
|
|
||||||
rv = agentSheets.AppendObject(sheet);
|
result = agentSheets.AppendObject(sheet);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_TRUE(result, NS_ERROR_OUT_OF_MEMORY);
|
||||||
|
|
||||||
// Disable scripting and plugins.
|
// Disable scripting and plugins.
|
||||||
rv = editSession->DisableJSAndPlugins(window);
|
rv = editSession->DisableJSAndPlugins(window);
|
||||||
|
|
|
@ -78,8 +78,8 @@ public:
|
||||||
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
||||||
|
|
||||||
// nsIScriptGlobalObject methods
|
// nsIScriptGlobalObject methods
|
||||||
virtual nsresult EnsureScriptEnvironment(PRUint32 aLangID);
|
virtual nsresult EnsureScriptEnvironment();
|
||||||
virtual nsresult SetScriptContext(PRUint32 lang_id, nsIScriptContext *aContext);
|
virtual nsresult SetScriptContext(nsIScriptContext *aContext);
|
||||||
|
|
||||||
virtual nsIScriptContext *GetContext();
|
virtual nsIScriptContext *GetContext();
|
||||||
virtual JSObject *GetGlobalJSObject();
|
virtual JSObject *GetGlobalJSObject();
|
||||||
|
@ -103,10 +103,10 @@ protected:
|
||||||
virtual ~nsXBLDocGlobalObject();
|
virtual ~nsXBLDocGlobalObject();
|
||||||
|
|
||||||
void SetContext(nsIScriptContext *aContext);
|
void SetContext(nsIScriptContext *aContext);
|
||||||
nsIScriptContext *GetScriptContext(PRUint32 language);
|
nsIScriptContext *GetScriptContext();
|
||||||
|
|
||||||
nsCOMPtr<nsIScriptContext> mScriptContext;
|
nsCOMPtr<nsIScriptContext> mScriptContext;
|
||||||
JSObject *mJSObject; // XXX JS language rabies bigotry badness
|
JSObject *mJSObject;
|
||||||
|
|
||||||
nsIScriptGlobalObjectOwner* mGlobalObjectOwner; // weak reference
|
nsIScriptGlobalObjectOwner* mGlobalObjectOwner; // weak reference
|
||||||
static JSClass gSharedGlobalClass;
|
static JSClass gSharedGlobalClass;
|
||||||
|
@ -282,28 +282,21 @@ nsXBLDocGlobalObject::SetContext(nsIScriptContext *aScriptContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsXBLDocGlobalObject::SetScriptContext(PRUint32 lang_id, nsIScriptContext *aContext)
|
nsXBLDocGlobalObject::SetScriptContext(nsIScriptContext *aContext)
|
||||||
{
|
{
|
||||||
NS_ASSERTION(lang_id == nsIProgrammingLanguage::JAVASCRIPT, "Only JS allowed!");
|
|
||||||
SetContext(aContext);
|
SetContext(aContext);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsIScriptContext *
|
nsIScriptContext *
|
||||||
nsXBLDocGlobalObject::GetScriptContext(PRUint32 language)
|
nsXBLDocGlobalObject::GetScriptContext()
|
||||||
{
|
{
|
||||||
// This impl still assumes JS
|
|
||||||
NS_ENSURE_TRUE(language==nsIProgrammingLanguage::JAVASCRIPT, nsnull);
|
|
||||||
return GetContext();
|
return GetContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsXBLDocGlobalObject::EnsureScriptEnvironment(PRUint32 aLangID)
|
nsXBLDocGlobalObject::EnsureScriptEnvironment()
|
||||||
{
|
{
|
||||||
if (aLangID != nsIProgrammingLanguage::JAVASCRIPT) {
|
|
||||||
NS_WARNING("XBL still JS only");
|
|
||||||
return NS_ERROR_INVALID_ARG;
|
|
||||||
}
|
|
||||||
if (mScriptContext)
|
if (mScriptContext)
|
||||||
return NS_OK; // already initialized for this lang
|
return NS_OK; // already initialized for this lang
|
||||||
nsCOMPtr<nsIDOMScriptObjectFactory> factory = do_GetService(kDOMScriptObjectFactoryCID);
|
nsCOMPtr<nsIDOMScriptObjectFactory> factory = do_GetService(kDOMScriptObjectFactoryCID);
|
||||||
|
@ -312,10 +305,11 @@ nsXBLDocGlobalObject::EnsureScriptEnvironment(PRUint32 aLangID)
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
|
||||||
nsCOMPtr<nsIScriptRuntime> scriptRuntime;
|
nsCOMPtr<nsIScriptRuntime> scriptRuntime;
|
||||||
rv = NS_GetScriptRuntimeByID(aLangID, getter_AddRefs(scriptRuntime));
|
rv = NS_GetScriptRuntimeByID(nsIProgrammingLanguage::JAVASCRIPT,
|
||||||
|
getter_AddRefs(scriptRuntime));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
nsCOMPtr<nsIScriptContext> newCtx = scriptRuntime->CreateContext();
|
nsCOMPtr<nsIScriptContext> newCtx = scriptRuntime->CreateContext();
|
||||||
rv = SetScriptContext(aLangID, newCtx);
|
rv = SetScriptContext(newCtx);
|
||||||
|
|
||||||
JSContext *cx = mScriptContext->GetNativeContext();
|
JSContext *cx = mScriptContext->GetNativeContext();
|
||||||
JSAutoRequest ar(cx);
|
JSAutoRequest ar(cx);
|
||||||
|
@ -347,7 +341,7 @@ nsXBLDocGlobalObject::GetContext()
|
||||||
// This whole fragile mess is predicated on the fact that
|
// This whole fragile mess is predicated on the fact that
|
||||||
// GetContext() will be called before GetScriptObject() is.
|
// GetContext() will be called before GetScriptObject() is.
|
||||||
if (! mScriptContext) {
|
if (! mScriptContext) {
|
||||||
nsresult rv = EnsureScriptEnvironment(nsIProgrammingLanguage::JAVASCRIPT);
|
nsresult rv = EnsureScriptEnvironment();
|
||||||
// JS is builtin so we make noise if it fails to initialize.
|
// JS is builtin so we make noise if it fails to initialize.
|
||||||
NS_WARN_IF_FALSE(NS_SUCCEEDED(rv), "Failed to setup JS!?");
|
NS_WARN_IF_FALSE(NS_SUCCEEDED(rv), "Failed to setup JS!?");
|
||||||
NS_ENSURE_SUCCESS(rv, nsnull);
|
NS_ENSURE_SUCCESS(rv, nsnull);
|
||||||
|
@ -563,7 +557,7 @@ nsXBLDocumentInfo::~nsXBLDocumentInfo()
|
||||||
/* destructor code */
|
/* destructor code */
|
||||||
if (mGlobalObject) {
|
if (mGlobalObject) {
|
||||||
// remove circular reference
|
// remove circular reference
|
||||||
mGlobalObject->SetScriptContext(nsIProgrammingLanguage::JAVASCRIPT, nsnull);
|
mGlobalObject->SetScriptContext(nsnull);
|
||||||
mGlobalObject->ClearGlobalObjectOwner(); // just in case
|
mGlobalObject->ClearGlobalObjectOwner(); // just in case
|
||||||
}
|
}
|
||||||
if (mBindingTable) {
|
if (mBindingTable) {
|
||||||
|
|
|
@ -301,8 +301,7 @@ nsXBLPrototypeHandler::ExecuteHandler(nsIDOMEventTarget* aTarget,
|
||||||
if (!boundGlobal)
|
if (!boundGlobal)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
nsIScriptContext *boundContext =
|
nsIScriptContext *boundContext = boundGlobal->GetScriptContext();
|
||||||
boundGlobal->GetScriptContext(nsIProgrammingLanguage::JAVASCRIPT);
|
|
||||||
if (!boundContext)
|
if (!boundContext)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
|
|
|
@ -771,7 +771,7 @@ nsScriptEventHandlerOwnerTearoff::CompileEventHandler(
|
||||||
nsIScriptGlobalObject* global = globalOwner->GetScriptGlobalObject();
|
nsIScriptGlobalObject* global = globalOwner->GetScriptGlobalObject();
|
||||||
NS_ENSURE_TRUE(global, NS_ERROR_UNEXPECTED);
|
NS_ENSURE_TRUE(global, NS_ERROR_UNEXPECTED);
|
||||||
|
|
||||||
context = global->GetScriptContext(aContext->GetScriptTypeID());
|
context = global->GetScriptContext();
|
||||||
// It could be possible the language has been setup on aContext but
|
// It could be possible the language has been setup on aContext but
|
||||||
// not on the global - we don't demand-create language contexts on the
|
// not on the global - we don't demand-create language contexts on the
|
||||||
// nsGlobalWindow
|
// nsGlobalWindow
|
||||||
|
@ -2943,8 +2943,7 @@ nsXULPrototypeScript::Serialize(nsIObjectOutputStream* aStream,
|
||||||
nsIScriptGlobalObject* aGlobal,
|
nsIScriptGlobalObject* aGlobal,
|
||||||
const nsCOMArray<nsINodeInfo> *aNodeInfos)
|
const nsCOMArray<nsINodeInfo> *aNodeInfos)
|
||||||
{
|
{
|
||||||
nsIScriptContext *context = aGlobal->GetScriptContext(
|
nsIScriptContext *context = aGlobal->GetScriptContext();
|
||||||
mScriptObject.mLangID);
|
|
||||||
NS_ASSERTION(!mSrcLoading || mSrcLoadWaiters != nsnull ||
|
NS_ASSERTION(!mSrcLoading || mSrcLoadWaiters != nsnull ||
|
||||||
!mScriptObject.mObject,
|
!mScriptObject.mObject,
|
||||||
"script source still loading when serializing?!");
|
"script source still loading when serializing?!");
|
||||||
|
@ -3022,8 +3021,7 @@ nsXULPrototypeScript::Deserialize(nsIObjectInputStream* aStream,
|
||||||
aStream->Read32(&mLineNo);
|
aStream->Read32(&mLineNo);
|
||||||
aStream->Read32(&mLangVersion);
|
aStream->Read32(&mLangVersion);
|
||||||
|
|
||||||
nsIScriptContext *context = aGlobal->GetScriptContext(
|
nsIScriptContext *context = aGlobal->GetScriptContext();
|
||||||
mScriptObject.mLangID);
|
|
||||||
NS_ASSERTION(context != nsnull, "Have no context for deserialization");
|
NS_ASSERTION(context != nsnull, "Have no context for deserialization");
|
||||||
NS_ENSURE_TRUE(context, NS_ERROR_UNEXPECTED);
|
NS_ENSURE_TRUE(context, NS_ERROR_UNEXPECTED);
|
||||||
nsScriptObjectHolder<JSScript> newScriptObject(context);
|
nsScriptObjectHolder<JSScript> newScriptObject(context);
|
||||||
|
@ -3151,7 +3149,7 @@ nsXULPrototypeScript::Compile(const PRUnichar* aText,
|
||||||
if (! global)
|
if (! global)
|
||||||
return NS_ERROR_UNEXPECTED;
|
return NS_ERROR_UNEXPECTED;
|
||||||
|
|
||||||
context = global->GetScriptContext(mScriptObject.mLangID);
|
context = global->GetScriptContext();
|
||||||
NS_ASSERTION(context != nsnull, "no context for script global");
|
NS_ASSERTION(context != nsnull, "no context for script global");
|
||||||
if (! context)
|
if (! context)
|
||||||
return NS_ERROR_UNEXPECTED;
|
return NS_ERROR_UNEXPECTED;
|
||||||
|
|
|
@ -3553,9 +3553,8 @@ nsXULDocument::OnStreamComplete(nsIStreamLoader* aLoader,
|
||||||
|
|
||||||
NS_ASSERTION(global != nsnull, "master prototype w/o global?!");
|
NS_ASSERTION(global != nsnull, "master prototype w/o global?!");
|
||||||
if (global) {
|
if (global) {
|
||||||
PRUint32 stid = scriptProto->mScriptObject.mLangID;
|
|
||||||
nsIScriptContext *scriptContext = \
|
nsIScriptContext *scriptContext = \
|
||||||
global->GetScriptContext(stid);
|
global->GetScriptContext();
|
||||||
NS_ASSERTION(scriptContext != nsnull,
|
NS_ASSERTION(scriptContext != nsnull,
|
||||||
"Failed to get script context for language");
|
"Failed to get script context for language");
|
||||||
if (scriptContext)
|
if (scriptContext)
|
||||||
|
@ -3619,14 +3618,13 @@ nsXULDocument::ExecuteScript(nsXULPrototypeScript *aScript)
|
||||||
NS_PRECONDITION(aScript != nsnull, "null ptr");
|
NS_PRECONDITION(aScript != nsnull, "null ptr");
|
||||||
NS_ENSURE_TRUE(aScript, NS_ERROR_NULL_POINTER);
|
NS_ENSURE_TRUE(aScript, NS_ERROR_NULL_POINTER);
|
||||||
NS_ENSURE_TRUE(mScriptGlobalObject, NS_ERROR_NOT_INITIALIZED);
|
NS_ENSURE_TRUE(mScriptGlobalObject, NS_ERROR_NOT_INITIALIZED);
|
||||||
PRUint32 stid = aScript->mScriptObject.mLangID;
|
|
||||||
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
rv = mScriptGlobalObject->EnsureScriptEnvironment(stid);
|
rv = mScriptGlobalObject->EnsureScriptEnvironment();
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
nsCOMPtr<nsIScriptContext> context =
|
nsCOMPtr<nsIScriptContext> context =
|
||||||
mScriptGlobalObject->GetScriptContext(stid);
|
mScriptGlobalObject->GetScriptContext();
|
||||||
// failure getting a script context is fatal.
|
// failure getting a script context is fatal.
|
||||||
NS_ENSURE_TRUE(context != nsnull, NS_ERROR_UNEXPECTED);
|
NS_ENSURE_TRUE(context != nsnull, NS_ERROR_UNEXPECTED);
|
||||||
|
|
||||||
|
|
|
@ -85,10 +85,10 @@ public:
|
||||||
virtual void SetScriptsEnabled(bool aEnabled, bool aFireTimeouts);
|
virtual void SetScriptsEnabled(bool aEnabled, bool aFireTimeouts);
|
||||||
|
|
||||||
virtual JSObject* GetGlobalJSObject();
|
virtual JSObject* GetGlobalJSObject();
|
||||||
virtual nsresult EnsureScriptEnvironment(PRUint32 aLangID);
|
virtual nsresult EnsureScriptEnvironment();
|
||||||
|
|
||||||
virtual nsIScriptContext *GetScriptContext(PRUint32 lang);
|
virtual nsIScriptContext *GetScriptContext();
|
||||||
virtual nsresult SetScriptContext(PRUint32 language, nsIScriptContext *ctx);
|
virtual nsresult SetScriptContext(nsIScriptContext *ctx);
|
||||||
|
|
||||||
// nsIScriptObjectPrincipal methods
|
// nsIScriptObjectPrincipal methods
|
||||||
virtual nsIPrincipal* GetPrincipal();
|
virtual nsIPrincipal* GetPrincipal();
|
||||||
|
@ -683,10 +683,8 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(nsXULPDGlobalObject)
|
||||||
//
|
//
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsXULPDGlobalObject::SetScriptContext(PRUint32 lang_id, nsIScriptContext *aScriptContext)
|
nsXULPDGlobalObject::SetScriptContext(nsIScriptContext *aScriptContext)
|
||||||
{
|
{
|
||||||
NS_ABORT_IF_FALSE(lang_id == nsIProgrammingLanguage::JAVASCRIPT,
|
|
||||||
"We don't support this language ID");
|
|
||||||
// almost a clone of nsGlobalWindow
|
// almost a clone of nsGlobalWindow
|
||||||
if (!aScriptContext) {
|
if (!aScriptContext) {
|
||||||
NS_WARNING("Possibly early removal of script object, see bug #41608");
|
NS_WARNING("Possibly early removal of script object, see bug #41608");
|
||||||
|
@ -713,10 +711,8 @@ nsXULPDGlobalObject::SetScriptContext(PRUint32 lang_id, nsIScriptContext *aScrip
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsXULPDGlobalObject::EnsureScriptEnvironment(PRUint32 lang_id)
|
nsXULPDGlobalObject::EnsureScriptEnvironment()
|
||||||
{
|
{
|
||||||
NS_ABORT_IF_FALSE(lang_id == nsIProgrammingLanguage::JAVASCRIPT,
|
|
||||||
"We don't support this language ID");
|
|
||||||
if (mContext) {
|
if (mContext) {
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
@ -752,23 +748,21 @@ nsXULPDGlobalObject::EnsureScriptEnvironment(PRUint32 lang_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_ENSURE_SUCCESS(rv, NS_OK);
|
NS_ENSURE_SUCCESS(rv, NS_OK);
|
||||||
rv = SetScriptContext(lang_id, ctxNew);
|
rv = SetScriptContext(ctxNew);
|
||||||
NS_ENSURE_SUCCESS(rv, NS_OK);
|
NS_ENSURE_SUCCESS(rv, NS_OK);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsIScriptContext*
|
nsIScriptContext*
|
||||||
nsXULPDGlobalObject::GetScriptContext(PRUint32 lang_id)
|
nsXULPDGlobalObject::GetScriptContext()
|
||||||
{
|
{
|
||||||
NS_ABORT_IF_FALSE(lang_id == nsIProgrammingLanguage::JAVASCRIPT,
|
|
||||||
"We don't support this language ID");
|
|
||||||
// This global object creates a context on demand - do that now.
|
// This global object creates a context on demand - do that now.
|
||||||
nsresult rv = EnsureScriptEnvironment(nsIProgrammingLanguage::JAVASCRIPT);
|
nsresult rv = EnsureScriptEnvironment();
|
||||||
if (NS_FAILED(rv)) {
|
if (NS_FAILED(rv)) {
|
||||||
NS_ERROR("Failed to setup script language");
|
NS_ERROR("Failed to setup script language");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
// Note that EnsureScriptEnvironment has validated lang_id
|
|
||||||
return mContext;
|
return mContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10850,11 +10850,9 @@ nsDocShell::EnsureScriptEnvironment()
|
||||||
nsCOMPtr<nsPIDOMWindow> win(do_QueryInterface(mScriptGlobal));
|
nsCOMPtr<nsPIDOMWindow> win(do_QueryInterface(mScriptGlobal));
|
||||||
win->SetDocShell(static_cast<nsIDocShell *>(this));
|
win->SetDocShell(static_cast<nsIDocShell *>(this));
|
||||||
|
|
||||||
// Ensure the script object is set to run javascript - other languages
|
// Ensure the script object is set up to run script.
|
||||||
// setup on demand.
|
|
||||||
// XXXmarkh - should this be setup to run the default language for this doc?
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
rv = mScriptGlobal->EnsureScriptEnvironment(nsIProgrammingLanguage::JAVASCRIPT);
|
rv = mScriptGlobal->EnsureScriptEnvironment();
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
|
@ -526,6 +526,7 @@ using mozilla::dom::indexedDB::IDBWrapperCache;
|
||||||
|
|
||||||
#ifdef MOZ_B2G_BT
|
#ifdef MOZ_B2G_BT
|
||||||
#include "BluetoothAdapter.h"
|
#include "BluetoothAdapter.h"
|
||||||
|
#include "BluetoothDevice.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "DOMError.h"
|
#include "DOMError.h"
|
||||||
|
@ -1621,6 +1622,8 @@ static nsDOMClassInfoData sClassInfoData[] = {
|
||||||
#ifdef MOZ_B2G_BT
|
#ifdef MOZ_B2G_BT
|
||||||
NS_DEFINE_CLASSINFO_DATA(BluetoothAdapter, nsEventTargetSH,
|
NS_DEFINE_CLASSINFO_DATA(BluetoothAdapter, nsEventTargetSH,
|
||||||
EVENTTARGET_SCRIPTABLE_FLAGS)
|
EVENTTARGET_SCRIPTABLE_FLAGS)
|
||||||
|
NS_DEFINE_CLASSINFO_DATA(BluetoothDevice, nsEventTargetSH,
|
||||||
|
EVENTTARGET_SCRIPTABLE_FLAGS)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
NS_DEFINE_CLASSINFO_DATA(DOMError, nsDOMGenericSH,
|
NS_DEFINE_CLASSINFO_DATA(DOMError, nsDOMGenericSH,
|
||||||
|
@ -4374,6 +4377,10 @@ nsDOMClassInfo::Init()
|
||||||
#ifdef MOZ_B2G_BT
|
#ifdef MOZ_B2G_BT
|
||||||
DOM_CLASSINFO_MAP_BEGIN(BluetoothAdapter, nsIDOMBluetoothAdapter)
|
DOM_CLASSINFO_MAP_BEGIN(BluetoothAdapter, nsIDOMBluetoothAdapter)
|
||||||
DOM_CLASSINFO_MAP_ENTRY(nsIDOMBluetoothAdapter)
|
DOM_CLASSINFO_MAP_ENTRY(nsIDOMBluetoothAdapter)
|
||||||
|
DOM_CLASSINFO_MAP_END
|
||||||
|
|
||||||
|
DOM_CLASSINFO_MAP_BEGIN(BluetoothDevice, nsIDOMBluetoothDevice)
|
||||||
|
DOM_CLASSINFO_MAP_ENTRY(nsIDOMBluetoothDevice)
|
||||||
DOM_CLASSINFO_MAP_END
|
DOM_CLASSINFO_MAP_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -541,6 +541,7 @@ DOMCI_CLASS(CallEvent)
|
||||||
|
|
||||||
#ifdef MOZ_B2G_BT
|
#ifdef MOZ_B2G_BT
|
||||||
DOMCI_CLASS(BluetoothAdapter)
|
DOMCI_CLASS(BluetoothAdapter)
|
||||||
|
DOMCI_CLASS(BluetoothDevice)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DOMCI_CLASS(DOMError)
|
DOMCI_CLASS(DOMError)
|
||||||
|
|
|
@ -1572,10 +1572,8 @@ nsGlobalWindow::UnmarkGrayTimers()
|
||||||
//*****************************************************************************
|
//*****************************************************************************
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGlobalWindow::SetScriptContext(PRUint32 lang_id, nsIScriptContext *aScriptContext)
|
nsGlobalWindow::SetScriptContext(nsIScriptContext *aScriptContext)
|
||||||
{
|
{
|
||||||
NS_ASSERTION(lang_id == nsIProgrammingLanguage::JAVASCRIPT,
|
|
||||||
"We don't support this language ID");
|
|
||||||
NS_ASSERTION(IsOuterWindow(), "Uh, SetScriptContext() called on inner window!");
|
NS_ASSERTION(IsOuterWindow(), "Uh, SetScriptContext() called on inner window!");
|
||||||
|
|
||||||
NS_ASSERTION(!aScriptContext || !mContext, "Bad call to SetContext()!");
|
NS_ASSERTION(!aScriptContext || !mContext, "Bad call to SetContext()!");
|
||||||
|
@ -1601,11 +1599,9 @@ nsGlobalWindow::SetScriptContext(PRUint32 lang_id, nsIScriptContext *aScriptCont
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGlobalWindow::EnsureScriptEnvironment(PRUint32 aLangID)
|
nsGlobalWindow::EnsureScriptEnvironment()
|
||||||
{
|
{
|
||||||
NS_ASSERTION(aLangID == nsIProgrammingLanguage::JAVASCRIPT,
|
FORWARD_TO_OUTER(EnsureScriptEnvironment, (), NS_ERROR_NOT_INITIALIZED);
|
||||||
"We don't support this language ID");
|
|
||||||
FORWARD_TO_OUTER(EnsureScriptEnvironment, (aLangID), NS_ERROR_NOT_INITIALIZED);
|
|
||||||
|
|
||||||
if (mJSObject)
|
if (mJSObject)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
@ -1614,20 +1610,18 @@ nsGlobalWindow::EnsureScriptEnvironment(PRUint32 aLangID)
|
||||||
"mJSObject is null, but we have an inner window?");
|
"mJSObject is null, but we have an inner window?");
|
||||||
|
|
||||||
nsCOMPtr<nsIScriptRuntime> scriptRuntime;
|
nsCOMPtr<nsIScriptRuntime> scriptRuntime;
|
||||||
nsresult rv = NS_GetScriptRuntimeByID(aLangID, getter_AddRefs(scriptRuntime));
|
nsresult rv = NS_GetScriptRuntimeByID(nsIProgrammingLanguage::JAVASCRIPT,
|
||||||
|
getter_AddRefs(scriptRuntime));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
nsCOMPtr<nsIScriptContext> context = scriptRuntime->CreateContext();
|
nsCOMPtr<nsIScriptContext> context = scriptRuntime->CreateContext();
|
||||||
return SetScriptContext(aLangID, context);
|
return SetScriptContext(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
nsIScriptContext *
|
nsIScriptContext *
|
||||||
nsGlobalWindow::GetScriptContext(PRUint32 lang)
|
nsGlobalWindow::GetScriptContext()
|
||||||
{
|
{
|
||||||
NS_ASSERTION(lang == nsIProgrammingLanguage::JAVASCRIPT,
|
FORWARD_TO_OUTER(GetScriptContext, (), nsnull);
|
||||||
"We don't support this language ID");
|
|
||||||
|
|
||||||
FORWARD_TO_OUTER(GetScriptContext, (lang), nsnull);
|
|
||||||
return mContext;
|
return mContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1637,7 +1631,7 @@ nsGlobalWindow::GetContext()
|
||||||
FORWARD_TO_OUTER(GetContext, (), nsnull);
|
FORWARD_TO_OUTER(GetContext, (), nsnull);
|
||||||
|
|
||||||
// check GetContext is indeed identical to GetScriptContext()
|
// check GetContext is indeed identical to GetScriptContext()
|
||||||
NS_ASSERTION(mContext == GetScriptContext(nsIProgrammingLanguage::JAVASCRIPT),
|
NS_ASSERTION(mContext == GetScriptContext(),
|
||||||
"GetContext confused?");
|
"GetContext confused?");
|
||||||
return mContext;
|
return mContext;
|
||||||
}
|
}
|
||||||
|
|
|
@ -317,13 +317,13 @@ public:
|
||||||
return mJSObject;
|
return mJSObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual nsresult EnsureScriptEnvironment(PRUint32 aLangID);
|
virtual nsresult EnsureScriptEnvironment();
|
||||||
|
|
||||||
virtual nsIScriptContext *GetScriptContext(PRUint32 lang);
|
virtual nsIScriptContext *GetScriptContext();
|
||||||
|
|
||||||
// Set a new script language context for this global. The native global
|
// Set a new script language context for this global. The native global
|
||||||
// for the context is created by the context's GetNativeGlobal() method.
|
// for the context is created by the context's GetNativeGlobal() method.
|
||||||
virtual nsresult SetScriptContext(PRUint32 lang, nsIScriptContext *aContext);
|
virtual nsresult SetScriptContext(nsIScriptContext *aContext);
|
||||||
|
|
||||||
virtual void OnFinalize(JSObject* aObject);
|
virtual void OnFinalize(JSObject* aObject);
|
||||||
virtual void SetScriptsEnabled(bool aEnabled, bool aFireTimeouts);
|
virtual void SetScriptsEnabled(bool aEnabled, bool aFireTimeouts);
|
||||||
|
|
|
@ -122,16 +122,16 @@ public:
|
||||||
* has not been registered, as well as 'normal' errors, such as
|
* has not been registered, as well as 'normal' errors, such as
|
||||||
* out-of-memory
|
* out-of-memory
|
||||||
*/
|
*/
|
||||||
virtual nsresult EnsureScriptEnvironment(PRUint32 aLangID) = 0;
|
virtual nsresult EnsureScriptEnvironment() = 0;
|
||||||
/**
|
/**
|
||||||
* Get a script context (WITHOUT added reference) for the specified language.
|
* Get a script context (WITHOUT added reference) for the specified language.
|
||||||
*/
|
*/
|
||||||
virtual nsIScriptContext *GetScriptContext(PRUint32 lang) = 0;
|
virtual nsIScriptContext *GetScriptContext() = 0;
|
||||||
|
|
||||||
virtual JSObject* GetGlobalJSObject() = 0;
|
virtual JSObject* GetGlobalJSObject() = 0;
|
||||||
|
|
||||||
virtual nsIScriptContext *GetContext() {
|
virtual nsIScriptContext *GetContext() {
|
||||||
return GetScriptContext(nsIProgrammingLanguage::JAVASCRIPT);
|
return GetScriptContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -139,7 +139,7 @@ public:
|
||||||
* context is created by the context's GetNativeGlobal() method.
|
* context is created by the context's GetNativeGlobal() method.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
virtual nsresult SetScriptContext(PRUint32 lang, nsIScriptContext *aContext) = 0;
|
virtual nsresult SetScriptContext(nsIScriptContext *aContext) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the global script for a language is finalized, typically as
|
* Called when the global script for a language is finalized, typically as
|
||||||
|
|
|
@ -143,7 +143,7 @@ nsJSUtils::GetStaticScriptContext(JSContext* aContext, JSObject* aObj)
|
||||||
if (!nativeGlobal)
|
if (!nativeGlobal)
|
||||||
return nsnull;
|
return nsnull;
|
||||||
|
|
||||||
return nativeGlobal->GetScriptContext(nsIProgrammingLanguage::JAVASCRIPT);
|
return nativeGlobal->GetScriptContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
nsIScriptGlobalObject *
|
nsIScriptGlobalObject *
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#include "BluetoothDevice.h"
|
||||||
|
#include "nsDOMClassInfo.h"
|
||||||
|
|
||||||
|
USING_BLUETOOTH_NAMESPACE
|
||||||
|
|
||||||
|
DOMCI_DATA(BluetoothDevice, BluetoothDevice)
|
||||||
|
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_CLASS(BluetoothDevice)
|
||||||
|
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(BluetoothDevice,
|
||||||
|
nsDOMEventTargetHelper)
|
||||||
|
NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(propertychanged)
|
||||||
|
NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(disconnectrequested)
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||||
|
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(BluetoothDevice,
|
||||||
|
nsDOMEventTargetHelper)
|
||||||
|
NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(propertychanged)
|
||||||
|
NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(disconnectrequested)
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
||||||
|
|
||||||
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(BluetoothDevice)
|
||||||
|
NS_INTERFACE_MAP_ENTRY(nsIDOMBluetoothDevice)
|
||||||
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMBluetoothDevice)
|
||||||
|
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(BluetoothDevice)
|
||||||
|
NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
|
||||||
|
|
||||||
|
NS_IMPL_ADDREF_INHERITED(BluetoothDevice, nsDOMEventTargetHelper)
|
||||||
|
NS_IMPL_RELEASE_INHERITED(BluetoothDevice, nsDOMEventTargetHelper)
|
||||||
|
|
||||||
|
BluetoothDevice::BluetoothDevice()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::GetAdapter(nsAString& aAdapter)
|
||||||
|
{
|
||||||
|
aAdapter = mAdapter;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::GetAddress(nsAString& aAddress)
|
||||||
|
{
|
||||||
|
aAddress = mAddress;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::GetName(nsAString& aName)
|
||||||
|
{
|
||||||
|
aName = mName;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::GetClass(PRUint32* aClass)
|
||||||
|
{
|
||||||
|
*aClass = mClass;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::GetConnected(bool* aConnected)
|
||||||
|
{
|
||||||
|
*aConnected = mConnected;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::GetPaired(bool* aPaired)
|
||||||
|
{
|
||||||
|
*aPaired = mPaired;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::GetLegacyPairing(bool* aLegacyPairing)
|
||||||
|
{
|
||||||
|
*aLegacyPairing = mLegacyPairing;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::GetTrusted(bool* aTrusted)
|
||||||
|
{
|
||||||
|
*aTrusted = mTrusted;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::SetTrusted(bool aTrusted)
|
||||||
|
{
|
||||||
|
mTrusted = aTrusted;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::GetAlias(nsAString& aAlias)
|
||||||
|
{
|
||||||
|
aAlias = mAlias;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::SetAlias(const nsAString& aAlias)
|
||||||
|
{
|
||||||
|
mAlias = aAlias;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::GetUuids(jsval* aUuids)
|
||||||
|
{
|
||||||
|
//TODO: convert mUuids to jsval and assign to aUuids;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::Disconnect()
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::GetProperties(jsval* aProperties)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::SetProperty(const nsAString& aName, const nsAString& aValue)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::DiscoverServices(const nsAString& aPattern, jsval* aServices)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDevice::CancelDiscovery()
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMPL_EVENT_HANDLER(BluetoothDevice, propertychanged)
|
||||||
|
NS_IMPL_EVENT_HANDLER(BluetoothDevice, disconnectrequested)
|
|
@ -0,0 +1,48 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#ifndef mozilla_dom_bluetooth_bluetoothdevice_h__
|
||||||
|
#define mozilla_dom_bluetooth_bluetoothdevice_h__
|
||||||
|
|
||||||
|
#include "BluetoothCommon.h"
|
||||||
|
#include "nsDOMEventTargetHelper.h"
|
||||||
|
#include "nsIDOMBluetoothDevice.h"
|
||||||
|
#include "nsString.h"
|
||||||
|
|
||||||
|
BEGIN_BLUETOOTH_NAMESPACE
|
||||||
|
|
||||||
|
class BluetoothDevice : public nsIDOMBluetoothDevice
|
||||||
|
, public nsDOMEventTargetHelper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
NS_DECL_NSIDOMBLUETOOTHDEVICE
|
||||||
|
|
||||||
|
NS_FORWARD_NSIDOMEVENTTARGET(nsDOMEventTargetHelper::)
|
||||||
|
|
||||||
|
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(BluetoothDevice,
|
||||||
|
nsDOMEventTargetHelper)
|
||||||
|
|
||||||
|
BluetoothDevice();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
nsString mAdapter;
|
||||||
|
nsString mAddress;
|
||||||
|
PRUint32 mClass;
|
||||||
|
bool mConnected;
|
||||||
|
bool mLegacyPairing;
|
||||||
|
nsString mName;
|
||||||
|
bool mPaired;
|
||||||
|
nsTArray<nsString> mUuids;
|
||||||
|
|
||||||
|
bool mTrusted;
|
||||||
|
nsString mAlias;
|
||||||
|
|
||||||
|
NS_DECL_EVENT_HANDLER(propertychanged)
|
||||||
|
NS_DECL_EVENT_HANDLER(disconnectrequested)
|
||||||
|
};
|
||||||
|
|
||||||
|
END_BLUETOOTH_NAMESPACE
|
||||||
|
|
||||||
|
#endif
|
|
@ -19,11 +19,13 @@ include $(topsrcdir)/dom/dom-config.mk
|
||||||
|
|
||||||
CPPSRCS = \
|
CPPSRCS = \
|
||||||
BluetoothAdapter.cpp \
|
BluetoothAdapter.cpp \
|
||||||
|
BluetoothDevice.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
XPIDLSRCS = \
|
XPIDLSRCS = \
|
||||||
nsIDOMNavigatorBluetooth.idl \
|
nsIDOMNavigatorBluetooth.idl \
|
||||||
nsIDOMBluetoothAdapter.idl \
|
nsIDOMBluetoothAdapter.idl \
|
||||||
|
nsIDOMBluetoothDevice.idl \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
include $(topsrcdir)/config/rules.mk
|
include $(topsrcdir)/config/rules.mk
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#include "nsIDOMEventTarget.idl"
|
||||||
|
|
||||||
|
[scriptable, builtinclass, uuid(2da61f89-a7d2-4f7d-9f4c-fb8a99d9add2)]
|
||||||
|
interface nsIDOMBluetoothDevice : nsIDOMEventTarget
|
||||||
|
{
|
||||||
|
readonly attribute DOMString adapter;
|
||||||
|
readonly attribute DOMString address;
|
||||||
|
readonly attribute unsigned long class;
|
||||||
|
readonly attribute boolean connected;
|
||||||
|
readonly attribute boolean legacyPairing;
|
||||||
|
readonly attribute DOMString name;
|
||||||
|
readonly attribute boolean paired;
|
||||||
|
readonly attribute jsval uuids;
|
||||||
|
|
||||||
|
attribute boolean trusted;
|
||||||
|
attribute DOMString alias;
|
||||||
|
|
||||||
|
attribute nsIDOMEventListener onpropertychanged;
|
||||||
|
attribute nsIDOMEventListener ondisconnectrequested;
|
||||||
|
|
||||||
|
void disconnect();
|
||||||
|
jsval getProperties();
|
||||||
|
void setProperty(in DOMString name, in DOMString value);
|
||||||
|
jsval discoverServices(in DOMString pattern);
|
||||||
|
void cancelDiscovery();
|
||||||
|
};
|
|
@ -111,6 +111,7 @@ _MOCHITEST_FILES = \
|
||||||
test_instance_unparent3.html \
|
test_instance_unparent3.html \
|
||||||
test_pluginstream_referer.html \
|
test_pluginstream_referer.html \
|
||||||
plugin-stream-referer.sjs \
|
plugin-stream-referer.sjs \
|
||||||
|
test_src_url_change.html \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
# test_plugin_scroll_painting.html \ bug 596491
|
# test_plugin_scroll_painting.html \ bug 596491
|
||||||
|
|
|
@ -16,9 +16,17 @@
|
||||||
// Test with no modifications
|
// Test with no modifications
|
||||||
is(p1.getNPNVdocumentOrigin(), realOrigin, "Checking for expected origin.");
|
is(p1.getNPNVdocumentOrigin(), realOrigin, "Checking for expected origin.");
|
||||||
|
|
||||||
// Mess with window.location.toString
|
// This used to test that shadowing window.location.toString didn't confuse
|
||||||
window.location.toString = function() { return 'http://victim.rckc.at/'; }
|
// getNPNVdocumentOrigin. But now we explicitly throw when that happens. So
|
||||||
is(p1.getNPNVdocumentOrigin(), realOrigin, "Checking for expected origin afer modifying window.location.toString.");
|
// just verify that we throw. There's no reason why getNPNVdocumentOrigin _would_
|
||||||
|
// be confused in this case anyway.
|
||||||
|
try {
|
||||||
|
window.location.toString = function() { return 'http://victim.rckc.at/'; }
|
||||||
|
ok(false, "Should throw when shadowing window.location.toString");
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
ok(true, "Should throw when shadowing window.location.toString");
|
||||||
|
}
|
||||||
|
|
||||||
// Create a plugin in a new window with about:blank
|
// Create a plugin in a new window with about:blank
|
||||||
var newWindow = window.open("about:blank");
|
var newWindow = window.open("about:blank");
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Test changing src attribute</title>
|
||||||
|
<script type="text/javascript" src="/MochiKit/packed.js"></script>
|
||||||
|
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||||
|
</head>
|
||||||
|
<body onload="runTests()">
|
||||||
|
<p id="display"></p>
|
||||||
|
|
||||||
|
<embed id="plugin1" src="about:blank" type="application/x-test" width="200" height="200"></embed>
|
||||||
|
|
||||||
|
<script type="application/javascript;version=1.8">
|
||||||
|
SimpleTest.waitForExplicitFinish();
|
||||||
|
|
||||||
|
var p = document.getElementById('plugin1');
|
||||||
|
|
||||||
|
var destroyed = false;
|
||||||
|
function onDestroy() {
|
||||||
|
destroyed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function runTests() {
|
||||||
|
p.startWatchingInstanceCount();
|
||||||
|
p.callOnDestroy(onDestroy);
|
||||||
|
|
||||||
|
p.setAttribute("src", "loremipsum.txt");
|
||||||
|
|
||||||
|
is(destroyed, true, "Instance should have been destroyed.");
|
||||||
|
is(p.getInstanceCount(), 1, "One new instance should have been created.");
|
||||||
|
|
||||||
|
p.stopWatchingInstanceCount();
|
||||||
|
|
||||||
|
SimpleTest.finish();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
|
@ -25,6 +25,15 @@ ok(window === orig, "can't override window");
|
||||||
ok(window.location === location, "properties are properly aliased");
|
ok(window.location === location, "properties are properly aliased");
|
||||||
ok(document.location === location, "properties are properly aliased");
|
ok(document.location === location, "properties are properly aliased");
|
||||||
|
|
||||||
|
var canDefine = false;
|
||||||
|
try {
|
||||||
|
var foo;
|
||||||
|
__defineGetter__.call(foo, 'bar', function() {});
|
||||||
|
__defineSetter__.call(foo, 'bar', function() {});
|
||||||
|
canDefine = true;
|
||||||
|
} catch (e) {}
|
||||||
|
ok(canDefine, "Should have access to __defineGetter__ and __defineSetter__");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
__defineGetter__('window', function() {});
|
__defineGetter__('window', function() {});
|
||||||
ok(false, "should not be able to defineGetter(window)");
|
ok(false, "should not be able to defineGetter(window)");
|
||||||
|
@ -32,41 +41,57 @@ try {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
window.__defineGetter__('location', function(){});
|
__defineGetter__.call(window, 'location', function(){});
|
||||||
ok(false, "should not be able to defineGetter(window.location)");
|
ok(false, "should not be able to defineGetter(window.location)");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
window.location.__defineGetter__('href', function(){});
|
__defineGetter__.call(window.location, 'href', function(){});
|
||||||
ok(false, "shouldn't be able to override location.href");
|
ok(false, "shouldn't be able to override location.href");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
ok(/shadow/.exec(e.message), "Should be caught by the anti-shadow mechanism.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Try deleting the property.
|
||||||
|
delete window.location.href;
|
||||||
|
ok(typeof window.location.href !== 'undefined',
|
||||||
|
"shouldn't be able to delete the inherited property");
|
||||||
|
delete Object.getPrototypeOf(window.location).href;
|
||||||
|
ok(typeof window.location.href !== 'undefined',
|
||||||
|
"shouldn't be able to delete the property off of the prototype");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
window.location.__proto__.__defineGetter__('href', function(){});
|
__defineGetter__.call(Object.getPrototypeOf(window.location), 'href', function(){});
|
||||||
ok(false, "shouldn't be able to use the prototype");
|
ok(false, "shouldn't be able to use the prototype");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
window.location.__defineSetter__('href', function(){});
|
__defineSetter__.call(window.location, 'href', function(){});
|
||||||
ok(false, "overrode a setter for location.href?");
|
ok(false, "overrode a setter for location.href?");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
ok(/shadow/.exec(e.message), "Should be caught by the anti-shadow mechanism.");
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
document.__defineGetter__('location', function(){});
|
__defineGetter__.call(document, 'location', function(){});
|
||||||
ok(false, "shouldn't be able to override document.location");
|
ok(false, "shouldn't be able to override document.location");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
is(location.watch, undefined, "watch doesn't exist on location objects");
|
// Make sure watch works correctly.
|
||||||
|
var watchTest = {a: 42};
|
||||||
|
var watchHandler = function(prop, oldval, newval) { return 22; }
|
||||||
|
Object.prototype.watch.call(watchTest, 'a', watchHandler);
|
||||||
|
watchTest.a = 1;
|
||||||
|
is(watchTest.a, 22, "Watch works correctly");
|
||||||
|
|
||||||
|
// Now make sure we can't watch location.
|
||||||
try {
|
try {
|
||||||
Object.prototype.watch.call(location, function() {});
|
Object.prototype.watch.call(location, 'href', function(prop, oldval, newval) {});
|
||||||
ok(false, "shouldn't be able to set a watchpoint on location");
|
ok(false, "shouldn't be able to set a watchpoint on location");
|
||||||
} catch (e) {
|
} catch (e) {}
|
||||||
}
|
|
||||||
|
|
||||||
ok(window === orig, "can't override window");
|
ok(window === orig, "can't override window");
|
||||||
ok(window.location === origLocation, "properties are properly aliased");
|
ok(window.location === origLocation, "properties are properly aliased");
|
||||||
|
|
|
@ -73,6 +73,7 @@ _TEST_FILES = \
|
||||||
489127.html \
|
489127.html \
|
||||||
test_focus_docnav.xul \
|
test_focus_docnav.xul \
|
||||||
window_focus_docnav.xul \
|
window_focus_docnav.xul \
|
||||||
|
test_clonewrapper.xul \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
ifeq (WINNT,$(OS_ARCH))
|
ifeq (WINNT,$(OS_ARCH))
|
||||||
|
|
|
@ -0,0 +1,126 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
|
||||||
|
<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
|
||||||
|
<!--
|
||||||
|
https://bugzilla.mozilla.org/show_bug.cgi?id=667388
|
||||||
|
-->
|
||||||
|
<window title="Mozilla Bug 667388"
|
||||||
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
||||||
|
|
||||||
|
<!-- test code goes here -->
|
||||||
|
<script type="application/javascript">
|
||||||
|
<![CDATA[
|
||||||
|
|
||||||
|
// Setup.
|
||||||
|
SimpleTest.waitForExplicitFinish();
|
||||||
|
window.testObject = { myNumber: 42,
|
||||||
|
myDomain: window.location.domain };
|
||||||
|
|
||||||
|
|
||||||
|
// Wait for both frames to load before proceeding.
|
||||||
|
var framesLoaded = [null, false, false, false];
|
||||||
|
function onFrameLoaded(id) {
|
||||||
|
|
||||||
|
// Mark this frame as loaded.
|
||||||
|
framesLoaded[id] = true;
|
||||||
|
|
||||||
|
// Allow it to call |is|.
|
||||||
|
window.frames[id].wrappedJSObject.is = is;
|
||||||
|
|
||||||
|
// If all the frames are loaded, start the test.
|
||||||
|
if (framesLoaded[1] && framesLoaded[2] && framesLoaded[3])
|
||||||
|
startTest();
|
||||||
|
}
|
||||||
|
|
||||||
|
function startTest() {
|
||||||
|
|
||||||
|
// Test interaction between chrome and content.
|
||||||
|
runChromeContentTest(window.frames[1]);
|
||||||
|
|
||||||
|
// Try same origin.
|
||||||
|
runContentContentTest(window.frames[1], window.frames[2],
|
||||||
|
true, "Should be able to clone same-origin");
|
||||||
|
|
||||||
|
// Try cross-origin.
|
||||||
|
runContentContentTest(window.frames[2], window.frames[3],
|
||||||
|
false, "Should not be able to clone cross-origin");
|
||||||
|
|
||||||
|
// Colaborate with document.domain, then try again.
|
||||||
|
frames[2].document.domain = 'example.org';
|
||||||
|
frames[3].document.domain = 'example.org';
|
||||||
|
runContentContentTest(window.frames[2], window.frames[3],
|
||||||
|
true, "Should be able to clone cross-origin with document.domain")
|
||||||
|
|
||||||
|
SimpleTest.finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests cloning between chrome and content.
|
||||||
|
function runChromeContentTest(contentWin) {
|
||||||
|
|
||||||
|
// We should be able to clone a content object.
|
||||||
|
tryToClone(contentWin.wrappedJSObject.testObject,
|
||||||
|
true,
|
||||||
|
"Chrome should be able to clone content object");
|
||||||
|
|
||||||
|
// Content should not be able to clone a chrome object.
|
||||||
|
//
|
||||||
|
// Note that because we're using |wrappedJSObject| here, the subject
|
||||||
|
// principal is clamed to the principal of the iframe, which is what we want.
|
||||||
|
contentWin.wrappedJSObject.tryToClone(window.testObject, false,
|
||||||
|
"Content should not be able to clone chrome object");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test cloning between content and content.
|
||||||
|
//
|
||||||
|
// Note - the way we do this is kind of sketchy. Because we're grabbing the
|
||||||
|
// test object from win1 by waiving Xray (via .wrappedJSObject), the object
|
||||||
|
// we're passing from win1 to win2 is actually the waived object (which has
|
||||||
|
// a distinct identity in the compartment of win2). So this means that we're
|
||||||
|
// actually giving win2 Xray waivers to win1! This doesn't affect things as
|
||||||
|
// long as the security wrappers check documentDomainMakesSameOrigin directly
|
||||||
|
// for the puncture case rather than checking IsTransparent(), but it still
|
||||||
|
// gives rise to a situation that wouldn't really happen in practice.
|
||||||
|
//
|
||||||
|
// A more serious issues is that we don't/can't test the Xray wrapper path,
|
||||||
|
// because the only native objects that we successfully send through
|
||||||
|
// structured clone don't force a parent in PreCreate, and so we _can't_
|
||||||
|
// have security wrappers around them (we get a new XPCWN in each
|
||||||
|
// compartment). Since the case can't happen, we can't write tests for it.
|
||||||
|
// But when it can happen (ie, we fix PreCreate for File, FileList, Blob, etc),
|
||||||
|
// we want tests right away, because this stuff is very security-sensitive.
|
||||||
|
// So we set this test up to fail when things are fixed, so that the someone
|
||||||
|
// will notice and properly augment this test to cover native objects.
|
||||||
|
function runContentContentTest(win1, win2, shouldSucceed, msg) {
|
||||||
|
win1.wrappedJSObject.tryToClone(win2.wrappedJSObject.testObject,
|
||||||
|
shouldSucceed, msg);
|
||||||
|
|
||||||
|
var fixMsg = "If this fails, you fixed PreCreate. That's a good thing, ";
|
||||||
|
fixMsg += "but now we need some test coverage. See the above comment.";
|
||||||
|
win1.wrappedJSObject.tryToClone(win2.wrappedJSObject.blob, true, fixMsg);
|
||||||
|
win1.wrappedJSObject.tryToClone(win2.wrappedJSObject.filelist, true, fixMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
function tryToClone(obj, shouldSucceed, message) {
|
||||||
|
var success = false;
|
||||||
|
var sink = window.frames[0];
|
||||||
|
try { sink.postMessage(obj, '*'); success = true; }
|
||||||
|
catch (e) { message = message + ' (threw: ' + e.message + ')'; }
|
||||||
|
is(success, shouldSucceed, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
]]>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- test results are displayed in the html:body -->
|
||||||
|
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=667388"
|
||||||
|
target="_blank">Mozilla Bug 667388</a>
|
||||||
|
<iframe id="sink" />
|
||||||
|
<!-- The first two are same-origin, the third is not. -->
|
||||||
|
<iframe id="frame1" onload="onFrameLoaded(1);" src="http://test1.example.org/tests/dom/tests/mochitest/general/file_clonewrapper.html" />
|
||||||
|
<iframe id="frame2" onload="onFrameLoaded(2);" src="http://test1.example.org/tests/dom/tests/mochitest/general/file_clonewrapper.html" />
|
||||||
|
<iframe id="frame3" onload="onFrameLoaded(3);" src="http://test2.example.org/tests/dom/tests/mochitest/general/file_clonewrapper.html" />
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</window>
|
|
@ -82,6 +82,7 @@ _TEST_FILES = \
|
||||||
test_browserFrame7.html \
|
test_browserFrame7.html \
|
||||||
test_for_of.html \
|
test_for_of.html \
|
||||||
test_focus_legend_noparent.html \
|
test_focus_legend_noparent.html \
|
||||||
|
file_clonewrapper.html \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
_CHROME_FILES = \
|
_CHROME_FILES = \
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script type="application/javascript">
|
||||||
|
|
||||||
|
// Set up the objects for cloning.
|
||||||
|
function setup() {
|
||||||
|
window.testObject = { myNumber: 42,
|
||||||
|
myDomain: window.location.domain };
|
||||||
|
window.blob = (new MozBlobBuilder()).getBlob('text/plain');
|
||||||
|
window.fileList = document.getElementById('fileinput').files;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called by the chrome parent window.
|
||||||
|
function tryToClone(obj, shouldSucceed, message) {
|
||||||
|
var success = false;
|
||||||
|
var sink = window.frames[0];
|
||||||
|
try { sink.postMessage(obj, '*'); success = true; }
|
||||||
|
catch (e) { message = message + ' (threw: ' + e.message + ')'; }
|
||||||
|
is(success, shouldSucceed, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body onload="setup()">
|
||||||
|
<input id="fileinput" type="file"></input>
|
||||||
|
<iframe id="sink">
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -676,11 +676,7 @@ nsEditorEventListener::DragOver(nsIDOMDragEvent* aDragEvent)
|
||||||
nsCOMPtr<nsIContent> dropParent = do_QueryInterface(parent);
|
nsCOMPtr<nsIContent> dropParent = do_QueryInterface(parent);
|
||||||
NS_ENSURE_TRUE(dropParent, NS_ERROR_FAILURE);
|
NS_ENSURE_TRUE(dropParent, NS_ERROR_FAILURE);
|
||||||
|
|
||||||
if (!dropParent->IsEditable()) {
|
if (dropParent->IsEditable() && CanDrop(aDragEvent)) {
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CanDrop(aDragEvent)) {
|
|
||||||
aDragEvent->PreventDefault(); // consumed
|
aDragEvent->PreventDefault(); // consumed
|
||||||
|
|
||||||
if (mCaret) {
|
if (mCaret) {
|
||||||
|
@ -754,11 +750,7 @@ nsEditorEventListener::Drop(nsIDOMDragEvent* aMouseEvent)
|
||||||
nsCOMPtr<nsIContent> dropParent = do_QueryInterface(parent);
|
nsCOMPtr<nsIContent> dropParent = do_QueryInterface(parent);
|
||||||
NS_ENSURE_TRUE(dropParent, NS_ERROR_FAILURE);
|
NS_ENSURE_TRUE(dropParent, NS_ERROR_FAILURE);
|
||||||
|
|
||||||
if (!dropParent->IsEditable()) {
|
if (!dropParent->IsEditable() || !CanDrop(aMouseEvent)) {
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!CanDrop(aMouseEvent)) {
|
|
||||||
// was it because we're read-only?
|
// was it because we're read-only?
|
||||||
if (mEditor->IsReadonly() || mEditor->IsDisabled())
|
if (mEditor->IsReadonly() || mEditor->IsDisabled())
|
||||||
{
|
{
|
||||||
|
|
|
@ -866,6 +866,8 @@ TiledTextureImage::TiledTextureImage(GLContext* aGL,
|
||||||
: TextureImage(aSize, LOCAL_GL_CLAMP_TO_EDGE, aContentType, aUseNearestFilter)
|
: TextureImage(aSize, LOCAL_GL_CLAMP_TO_EDGE, aContentType, aUseNearestFilter)
|
||||||
, mCurrentImage(0)
|
, mCurrentImage(0)
|
||||||
, mInUpdate(false)
|
, mInUpdate(false)
|
||||||
|
, mRows(0)
|
||||||
|
, mColumns(0)
|
||||||
, mGL(aGL)
|
, mGL(aGL)
|
||||||
, mUseNearestFilter(aUseNearestFilter)
|
, mUseNearestFilter(aUseNearestFilter)
|
||||||
, mTextureState(Created)
|
, mTextureState(Created)
|
||||||
|
@ -1114,30 +1116,98 @@ TiledTextureImage::ApplyFilter()
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* simple resize, just discards everything. we can be more clever just
|
* Resize, trying to reuse tiles. The reuse strategy is to decide on reuse per
|
||||||
* adding or discarding tiles, but do we want this?
|
* column. A tile on a column is reused if it hasn't changed size, otherwise it
|
||||||
|
* is discarded/replaced. Extra tiles on a column are pruned after iterating
|
||||||
|
* each column, and extra rows are pruned after iteration over the entire image
|
||||||
|
* finishes.
|
||||||
*/
|
*/
|
||||||
void TiledTextureImage::Resize(const nsIntSize& aSize)
|
void TiledTextureImage::Resize(const nsIntSize& aSize)
|
||||||
{
|
{
|
||||||
if (mSize == aSize && mTextureState != Created) {
|
if (mSize == aSize && mTextureState != Created) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mSize = aSize;
|
|
||||||
mImages.Clear();
|
|
||||||
// calculate rows and columns, rounding up
|
|
||||||
mColumns = (aSize.width + mTileSize - 1) / mTileSize;
|
|
||||||
mRows = (aSize.height + mTileSize - 1) / mTileSize;
|
|
||||||
|
|
||||||
for (unsigned int row = 0; row < mRows; row++) {
|
// calculate rows and columns, rounding up
|
||||||
for (unsigned int col = 0; col < mColumns; col++) {
|
unsigned int columns = (aSize.width + mTileSize - 1) / mTileSize;
|
||||||
nsIntSize size( // use tilesize first, then the remainder
|
unsigned int rows = (aSize.height + mTileSize - 1) / mTileSize;
|
||||||
(col+1) * mTileSize > (unsigned int)aSize.width ? aSize.width % mTileSize : mTileSize,
|
|
||||||
(row+1) * mTileSize > (unsigned int)aSize.height ? aSize.height % mTileSize : mTileSize);
|
// Iterate over old tile-store and insert/remove tiles as necessary
|
||||||
nsRefPtr<TextureImage> teximg =
|
int row;
|
||||||
mGL->TileGenFunc(size, mContentType, mUseNearestFilter);
|
unsigned int i = 0;
|
||||||
mImages.AppendElement(teximg.forget());
|
for (row = 0; row < (int)rows; row++) {
|
||||||
}
|
// If we've gone beyond how many rows there were before, set mColumns to
|
||||||
|
// zero so that we only create new tiles.
|
||||||
|
if (row >= (int)mRows)
|
||||||
|
mColumns = 0;
|
||||||
|
|
||||||
|
// Similarly, if we're on the last row of old tiles and the height has
|
||||||
|
// changed, discard all tiles in that row.
|
||||||
|
// This will cause the pruning of columns not to work, but we don't need
|
||||||
|
// to worry about that, as no more tiles will be reused past this point
|
||||||
|
// anyway.
|
||||||
|
if ((row == (int)mRows - 1) && (aSize.height != mSize.height))
|
||||||
|
mColumns = 0;
|
||||||
|
|
||||||
|
int col;
|
||||||
|
for (col = 0; col < (int)columns; col++) {
|
||||||
|
nsIntSize size( // use tilesize first, then the remainder
|
||||||
|
(col+1) * mTileSize > (unsigned int)aSize.width ? aSize.width % mTileSize : mTileSize,
|
||||||
|
(row+1) * mTileSize > (unsigned int)aSize.height ? aSize.height % mTileSize : mTileSize);
|
||||||
|
|
||||||
|
bool replace = false;
|
||||||
|
|
||||||
|
// Check if we can re-use old tiles.
|
||||||
|
if (col < (int)mColumns) {
|
||||||
|
// Reuse an existing tile. If the tile is an end-tile and the
|
||||||
|
// width differs, replace it instead.
|
||||||
|
if (mSize.width != aSize.width) {
|
||||||
|
if (col == (int)mColumns - 1) {
|
||||||
|
// Tile at the end of the old column, replace it with
|
||||||
|
// a new one.
|
||||||
|
replace = true;
|
||||||
|
} else if (col == (int)columns - 1) {
|
||||||
|
// Tile at the end of the new column, create a new one.
|
||||||
|
} else {
|
||||||
|
// Before the last column on both the old and new sizes,
|
||||||
|
// reuse existing tile.
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Width hasn't changed, reuse existing tile.
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new tile.
|
||||||
|
nsRefPtr<TextureImage> teximg =
|
||||||
|
mGL->TileGenFunc(size, mContentType, mUseNearestFilter);
|
||||||
|
if (replace)
|
||||||
|
mImages.ReplaceElementAt(i, teximg.forget());
|
||||||
|
else
|
||||||
|
mImages.InsertElementAt(i, teximg.forget());
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prune any unused tiles on the end of the column.
|
||||||
|
if (row < (int)mRows) {
|
||||||
|
for (col = (int)mColumns - col; col > 0; col--) {
|
||||||
|
mImages.RemoveElementAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prune any unused tiles at the end of the store.
|
||||||
|
unsigned int length = mImages.Length();
|
||||||
|
for (; i < length; i++)
|
||||||
|
mImages.RemoveElementAt(mImages.Length()-1);
|
||||||
|
|
||||||
|
// Reset tile-store properties.
|
||||||
|
mRows = rows;
|
||||||
|
mColumns = columns;
|
||||||
|
mSize = aSize;
|
||||||
mTextureState = Allocated;
|
mTextureState = Allocated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -184,6 +184,8 @@ struct THEBES_API gfxRGBA {
|
||||||
* The color value is interpreted based on colorType;
|
* The color value is interpreted based on colorType;
|
||||||
* all values use the native platform endianness.
|
* all values use the native platform endianness.
|
||||||
*
|
*
|
||||||
|
* Resulting gfxRGBA stores non-premultiplied data.
|
||||||
|
*
|
||||||
* @see gfxRGBA::Packed
|
* @see gfxRGBA::Packed
|
||||||
*/
|
*/
|
||||||
gfxRGBA(PRUint32 c, PackedColorType colorType = PACKED_ABGR) {
|
gfxRGBA(PRUint32 c, PackedColorType colorType = PACKED_ABGR) {
|
||||||
|
|
|
@ -1935,6 +1935,10 @@ gfxFont::GetShapedWord(gfxContext *aContext,
|
||||||
aFlags);
|
aFlags);
|
||||||
|
|
||||||
CacheHashEntry *entry = mWordCache.PutEntry(key);
|
CacheHashEntry *entry = mWordCache.PutEntry(key);
|
||||||
|
if (!entry) {
|
||||||
|
NS_WARNING("failed to create word cache entry - expect missing text");
|
||||||
|
return nsnull;
|
||||||
|
}
|
||||||
gfxShapedWord *sw = entry->mShapedWord;
|
gfxShapedWord *sw = entry->mShapedWord;
|
||||||
Telemetry::Accumulate(Telemetry::WORD_CACHE_LOOKUP_LEN, aLength);
|
Telemetry::Accumulate(Telemetry::WORD_CACHE_LOOKUP_LEN, aLength);
|
||||||
Telemetry::Accumulate(Telemetry::WORD_CACHE_LOOKUP_SCRIPT, aRunScript);
|
Telemetry::Accumulate(Telemetry::WORD_CACHE_LOOKUP_SCRIPT, aRunScript);
|
||||||
|
@ -1950,20 +1954,21 @@ gfxFont::GetShapedWord(gfxContext *aContext,
|
||||||
aRunScript,
|
aRunScript,
|
||||||
aAppUnitsPerDevUnit,
|
aAppUnitsPerDevUnit,
|
||||||
aFlags);
|
aFlags);
|
||||||
NS_ASSERTION(sw != nsnull,
|
|
||||||
"failed to create gfxShapedWord - expect missing text");
|
|
||||||
if (!sw) {
|
if (!sw) {
|
||||||
|
NS_WARNING("failed to create gfxShapedWord - expect missing text");
|
||||||
return nsnull;
|
return nsnull;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ok;
|
bool ok = false;
|
||||||
if (sizeof(T) == sizeof(PRUnichar)) {
|
if (sizeof(T) == sizeof(PRUnichar)) {
|
||||||
ok = ShapeWord(aContext, sw, (const PRUnichar*)aText);
|
ok = ShapeWord(aContext, sw, (const PRUnichar*)aText);
|
||||||
} else {
|
} else {
|
||||||
nsAutoString utf16;
|
nsAutoString utf16;
|
||||||
AppendASCIItoUTF16(nsDependentCSubstring((const char*)aText, aLength),
|
AppendASCIItoUTF16(nsDependentCSubstring((const char*)aText, aLength),
|
||||||
utf16);
|
utf16);
|
||||||
ok = ShapeWord(aContext, sw, utf16.BeginReading());
|
if (utf16.Length() == aLength) {
|
||||||
|
ok = ShapeWord(aContext, sw, utf16.BeginReading());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
NS_WARN_IF_FALSE(ok, "failed to shape word - expect garbled text");
|
NS_WARN_IF_FALSE(ok, "failed to shape word - expect garbled text");
|
||||||
|
|
||||||
|
|
|
@ -210,6 +210,51 @@ gfxUtils::UnpremultiplyImageSurface(gfxImageSurface *aSourceSurface,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gfxUtils::ConvertBGRAtoRGBA(gfxImageSurface *aSourceSurface,
|
||||||
|
gfxImageSurface *aDestSurface) {
|
||||||
|
if (!aDestSurface)
|
||||||
|
aDestSurface = aSourceSurface;
|
||||||
|
|
||||||
|
NS_ABORT_IF_FALSE(aSourceSurface->Format() == aDestSurface->Format() &&
|
||||||
|
aSourceSurface->Width() == aDestSurface->Width() &&
|
||||||
|
aSourceSurface->Height() == aDestSurface->Height() &&
|
||||||
|
aSourceSurface->Stride() == aDestSurface->Stride(),
|
||||||
|
"Source and destination surfaces don't have identical characteristics");
|
||||||
|
|
||||||
|
NS_ABORT_IF_FALSE(aSourceSurface->Stride() == aSourceSurface->Width() * 4,
|
||||||
|
"Source surface stride isn't tightly packed");
|
||||||
|
|
||||||
|
NS_ABORT_IF_FALSE(aSourceSurface->Format() == gfxASurface::ImageFormatARGB32,
|
||||||
|
"Surfaces must be ARGB32");
|
||||||
|
|
||||||
|
PRUint8 *src = aSourceSurface->Data();
|
||||||
|
PRUint8 *dst = aDestSurface->Data();
|
||||||
|
|
||||||
|
PRUint32 dim = aSourceSurface->Width() * aSourceSurface->Height();
|
||||||
|
PRUint8 *srcEnd = src + 4*dim;
|
||||||
|
|
||||||
|
if (src == dst) {
|
||||||
|
PRUint8 buffer[4];
|
||||||
|
for (; src != srcEnd; src += 4) {
|
||||||
|
buffer[0] = src[2];
|
||||||
|
buffer[1] = src[1];
|
||||||
|
buffer[2] = src[0];
|
||||||
|
|
||||||
|
src[0] = buffer[0];
|
||||||
|
src[1] = buffer[1];
|
||||||
|
src[2] = buffer[2];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (; src != srcEnd; src += 4, dst += 4) {
|
||||||
|
dst[0] = src[2];
|
||||||
|
dst[1] = src[1];
|
||||||
|
dst[2] = src[0];
|
||||||
|
dst[3] = src[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
IsSafeImageTransformComponent(gfxFloat aValue)
|
IsSafeImageTransformComponent(gfxFloat aValue)
|
||||||
{
|
{
|
||||||
|
|
|
@ -65,6 +65,9 @@ public:
|
||||||
static void UnpremultiplyImageSurface(gfxImageSurface *aSurface,
|
static void UnpremultiplyImageSurface(gfxImageSurface *aSurface,
|
||||||
gfxImageSurface *aDestSurface = nsnull);
|
gfxImageSurface *aDestSurface = nsnull);
|
||||||
|
|
||||||
|
static void ConvertBGRAtoRGBA(gfxImageSurface *aSourceSurface,
|
||||||
|
gfxImageSurface *aDestSurface = nsnull);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw something drawable while working around limitations like bad support
|
* Draw something drawable while working around limitations like bad support
|
||||||
* for EXTEND_PAD, lack of source-clipping, or cairo / pixman bugs with
|
* for EXTEND_PAD, lack of source-clipping, or cairo / pixman bugs with
|
||||||
|
|
|
@ -209,6 +209,9 @@ void nsPNGDecoder::EndImageFrame()
|
||||||
if (mFrameHasNoAlpha)
|
if (mFrameHasNoAlpha)
|
||||||
mImage.SetFrameHasNoAlpha(numFrames - 1);
|
mImage.SetFrameHasNoAlpha(numFrames - 1);
|
||||||
|
|
||||||
|
// PNG is always non-premult
|
||||||
|
mImage.SetFrameAsNonPremult(numFrames - 1, true);
|
||||||
|
|
||||||
PostInvalidation(mFrameRect);
|
PostInvalidation(mFrameRect);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче