Merge mozilla-central to mozilla-inbound

This commit is contained in:
Matt Brubeck 2011-09-29 17:36:40 -07:00
commit 36eff84bc6
45 changed files with 541 additions and 596 deletions

View File

@ -49,6 +49,18 @@ namespace statistics {
inline void A11yInitialized()
{ Telemetry::Accumulate(Telemetry::A11Y_INSTANTIATED, true); }
/**
* Report that ISimpleDOM* has been used.
*/
inline void ISimpleDOMUsed()
{ Telemetry::Accumulate(Telemetry::ISIMPLE_DOM_USAGE, 1); }
/**
* Report that IAccessibleTable has been used.
*/
inline void IAccessibleTableUsed()
{ Telemetry::Accumulate(Telemetry::IACCESSIBLE_TABLE_USAGE, 1); }
} // namespace statistics
} // namespace a11y
} // namespace mozilla

View File

@ -49,10 +49,13 @@
#include "nsIWinAccessNode.h"
#include "nsAccessNodeWrap.h"
#include "nsWinUtils.h"
#include "Statistics.h"
#include "nsCOMPtr.h"
#include "nsString.h"
using namespace mozilla::a11y;
#define CANT_QUERY_ASSERTION_MSG \
"Subclass of CAccessibleTable doesn't implement nsIAccessibleTable"\
@ -64,6 +67,7 @@ CAccessibleTable::QueryInterface(REFIID iid, void** ppv)
*ppv = NULL;
if (IID_IAccessibleTable == iid) {
statistics::IAccessibleTableUsed();
*ppv = static_cast<IAccessibleTable*>(this);
(reinterpret_cast<IUnknown*>(*ppv))->AddRef();
return S_OK;

View File

@ -46,6 +46,7 @@
#include "nsCoreUtils.h"
#include "nsRootAccessible.h"
#include "nsWinUtils.h"
#include "Statistics.h"
#include "nsAttrName.h"
#include "nsIDocument.h"
@ -59,6 +60,7 @@
#include "mozilla/Preferences.h"
using namespace mozilla;
using namespace mozilla::a11y;
/// the accessible library and cached methods
HINSTANCE nsAccessNodeWrap::gmAccLib = nsnull;
@ -120,11 +122,14 @@ STDMETHODIMP nsAccessNodeWrap::QueryInterface(REFIID iid, void** ppv)
{
*ppv = nsnull;
if (IID_IUnknown == iid || IID_ISimpleDOMNode == iid)
if (IID_IUnknown == iid) {
*ppv = static_cast<ISimpleDOMNode*>(this);
if (nsnull == *ppv)
} else if (IID_ISimpleDOMNode == iid) {
statistics::ISimpleDOMUsed();
*ppv = static_cast<ISimpleDOMNode*>(this);
} else {
return E_NOINTERFACE; //iid not supported.
}
(reinterpret_cast<IUnknown*>(*ppv))->AddRef();
return S_OK;

View File

@ -43,6 +43,7 @@
#include "nsIAccessibilityService.h"
#include "nsRootAccessible.h"
#include "nsWinUtils.h"
#include "Statistics.h"
#include "nsIDocShell.h"
#include "nsIDocShellTreeNode.h"
@ -54,6 +55,8 @@
#include "nsIViewManager.h"
#include "nsIWebNavigation.h"
using namespace mozilla::a11y;
/* For documentation of the accessibility architecture,
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
*/
@ -91,12 +94,11 @@ STDMETHODIMP nsDocAccessibleWrap::QueryInterface(REFIID iid, void** ppv)
{
*ppv = NULL;
if (IID_ISimpleDOMDocument == iid)
*ppv = static_cast<ISimpleDOMDocument*>(this);
if (NULL == *ppv)
if (IID_ISimpleDOMDocument != iid)
return nsHyperTextAccessibleWrap::QueryInterface(iid, ppv);
statistics::ISimpleDOMUsed();
*ppv = static_cast<ISimpleDOMDocument*>(this);
(reinterpret_cast<IUnknown*>(*ppv))->AddRef();
return S_OK;
}

View File

@ -41,6 +41,7 @@
#include "nsCoreUtils.h"
#include "nsDocAccessible.h"
#include "Statistics.h"
#include "nsIFrame.h"
#include "nsFontMetrics.h"
#include "nsPresContext.h"
@ -48,6 +49,8 @@
#include "gfxFont.h"
using namespace mozilla::a11y;
////////////////////////////////////////////////////////////////////////////////
// nsTextAccessibleWrap Accessible
////////////////////////////////////////////////////////////////////////////////
@ -72,11 +75,14 @@ STDMETHODIMP nsTextAccessibleWrap::QueryInterface(REFIID iid, void** ppv)
{
*ppv = nsnull;
if (IID_IUnknown == iid || IID_ISimpleDOMText == iid)
if (IID_IUnknown == iid) {
*ppv = static_cast<ISimpleDOMText*>(this);
if (nsnull == *ppv)
} else if (IID_ISimpleDOMText == iid) {
statistics::ISimpleDOMUsed();
*ppv = static_cast<ISimpleDOMText*>(this);
} else {
return nsAccessibleWrap::QueryInterface(iid, ppv);
}
(reinterpret_cast<IUnknown*>(*ppv))->AddRef();
return S_OK;

View File

@ -5930,12 +5930,6 @@ fi
dnl ========================================================
dnl Installer
dnl ========================================================
case "$target_os" in
aix*|solaris*|linux*|mingw*|os2*)
MOZ_INSTALLER=1
;;
esac
MOZ_ARG_DISABLE_BOOL(installer,
[ --disable-installer Disable building of installer],
MOZ_INSTALLER=,

View File

@ -27,14 +27,10 @@ window.onload = function () {
window3.close();
xpcCleanupWindows();
SpecialPowers.setBoolPref("dom.block_multiple_popups", gBlockMultiplePopups);
SimpleTest.finish();
}, 4);
}
var gBlockMultiplePopups = SpecialPowers.getBoolPref("dom.block_multiple_popups");
SpecialPowers.setBoolPref("dom.block_multiple_popups", false);
var window0 = window.open("http://test1.example.org:80/tests/docshell/test/navigation/parent.html", "window0", "width=10,height=10");
var window1 = window.open("http://test1.example.org:80/tests/docshell/test/navigation/parent.html", "window1", "width=10,height=10");
var window2 = window.open("http://test1.example.org:80/tests/docshell/test/navigation/parent.html", "window2", "width=10,height=10");

View File

@ -9,9 +9,6 @@
iframe { width: 90%; height: 50px; }
</style>
<script>
var gBlockMultiplePopups = SpecialPowers.getBoolPref("dom.block_multiple_popups");
SpecialPowers.setBoolPref("dom.block_multiple_popups", false);
var headerHTML = "<html><head>" +
"<script src='/tests/SimpleTest/EventUtils.js'></scr" + "ipt>" +
"<script src='NavigationUtils.js'></scr" + "ipt>" +
@ -74,7 +71,6 @@ xpcWaitForFinishedFrames(function() {
window3.close();
xpcCleanupWindows();
SpecialPowers.setBoolPref("dom.block_multiple_popups", gBlockMultiplePopups);
SimpleTest.finish();
}, 4);

View File

@ -26,14 +26,10 @@ window.onload = function () {
opener3.close();
xpcCleanupWindows();
SpecialPowers.setBoolPref("dom.block_multiple_popups", gBlockMultiplePopups);
SimpleTest.finish();
}, 6);
}
var gBlockMultiplePopups = SpecialPowers.getBoolPref("dom.block_multiple_popups");
SpecialPowers.setBoolPref("dom.block_multiple_popups", false);
//opener0 = window.open("http://test1.example.org:80/tests/docshell/test/navigation/open.html#window0", "_blank", "width=10,height=10");
opener1 = window.open("http://test1.example.org:80/tests/docshell/test/navigation/open.html#window1", "_blank", "width=10,height=10");
opener2 = window.open("http://test1.example.org:80/tests/docshell/test/navigation/open.html#window2", "_blank", "width=10,height=10");

View File

@ -9,9 +9,6 @@
iframe { width: 90%; height: 50px; }
</style>
<script>
var gBlockMultiplePopups = SpecialPowers.getBoolPref("dom.block_multiple_popups");
SpecialPowers.setBoolPref("dom.block_multiple_popups", false);
function testChild0() {
if (!window.window0)
window0 = window.open("navigate.html#opener.frames[0],location", "window0", "width=10,height=10");
@ -44,7 +41,6 @@ xpcWaitForFinishedFrames(function() {
window3.close();
xpcCleanupWindows();
SpecialPowers.setBoolPref("dom.block_multiple_popups", gBlockMultiplePopups);
SimpleTest.finish();
}, 4);

View File

@ -9,9 +9,6 @@
iframe { width: 90%; height: 50px; }
</style>
<script>
var gBlockMultiplePopups = SpecialPowers.getBoolPref("dom.block_multiple_popups");
SpecialPowers.setBoolPref("dom.block_multiple_popups", false);
window.onload = function () {
document.getElementById('active').innerHTML =
'<iframe src="http://test1.example.org:80/tests/docshell/test/navigation/navigate.html#parent.frames[0],location"></iframe>' +
@ -26,7 +23,6 @@ window.onload = function () {
isBlank(frames[3], "Should not be able to navigate off-domain sibling by targeted hyperlink.");
xpcCleanupWindows();
SpecialPowers.setBoolPref("dom.block_multiple_popups", gBlockMultiplePopups);
SimpleTest.finish();
}, 4);
}

View File

@ -39,14 +39,10 @@ window.onmessage = function (ev) {
ok(compareSnapshots(one, two, true)[0], "Popups should look identical");
ok(compareSnapshots(one, three, false)[0], "Popups should not look identical");
SpecialPowers.setBoolPref("dom.block_multiple_popups", gBlockMultiplePopups);
SimpleTest.finish();
}
}
var gBlockMultiplePopups = SpecialPowers.getBoolPref("dom.block_multiple_popups");
SpecialPowers.setBoolPref("dom.block_multiple_popups", false);
var win2 = window.open("data:text/html,<script>window.onload = function() { opener.postMessage('loaded', '*'); }</" + "script><body>Should show</body>");
var win3 = window.open("data:text/html,<script>window.onload = function() { opener.postMessage('loaded', '*'); }</" + "script><body></body>");

View File

@ -39,14 +39,10 @@ window.onmessage = function (ev) {
ok(compareSnapshots(one, two, true)[0], "Popups should look identical");
ok(compareSnapshots(one, three, false)[0], "Popups should not look identical");
SpecialPowers.setBoolPref("dom.block_multiple_popups", gBlockMultiplePopups);
SimpleTest.finish();
}
}
var gBlockMultiplePopups = SpecialPowers.getBoolPref("dom.block_multiple_popups");
SpecialPowers.setBoolPref("dom.block_multiple_popups", false);
var win2 = window.open("data:text/html,<script>window.onload = function() { opener.postMessage('loaded', '*'); }</" + "script><body>Should show</body>", "", "height=500,width=500");
var win3 = window.open("data:text/html,<script>window.onload = function() { opener.postMessage('loaded', '*'); }</" + "script><body></body>", "", "height=500,width=500");

View File

@ -268,7 +268,6 @@ static nsIEntropyCollector *gEntropyCollector = nsnull;
static PRInt32 gRefCnt = 0;
static PRInt32 gOpenPopupSpamCount = 0;
static PopupControlState gPopupControlState = openAbused;
static PopupOpenedState gPopupOpenedState = noTrack;
static PRInt32 gRunningTimeoutDepth = 0;
static bool gMouseDown = false;
static bool gDragServiceDisabled = false;
@ -1714,30 +1713,6 @@ nsGlobalWindow::GetPopupControlState() const
return gPopupControlState;
}
PopupOpenedState
GetPopupOpenedState()
{
return gPopupOpenedState;
}
PopupOpenedState
nsGlobalWindow::GetPopupOpenedState() const
{
return ::GetPopupOpenedState();
}
void
SetPopupOpenedState(PopupOpenedState aValue)
{
gPopupOpenedState = aValue;
}
void
nsGlobalWindow::SetPopupOpenedState(PopupOpenedState aValue) const
{
::SetPopupOpenedState(aValue);
}
#define WINDOWSTATEHOLDER_IID \
{0x0b917c3e, 0xbd50, 0x4683, {0xaf, 0xc9, 0xc7, 0x81, 0x07, 0xae, 0x33, 0x26}}
@ -5739,21 +5714,6 @@ nsGlobalWindow::RevisePopupAbuseLevel(PopupControlState aControl)
abuse = openOverridden;
}
if (Preferences::GetBool("dom.block_multiple_popups", true)) {
// Do not allow opening more than one popup per event.
switch (GetPopupOpenedState()) {
case noOpenedPopup:
SetPopupOpenedState(openedPopup);
break;
case openedPopup:
abuse = openOverridden;
break;
case noTrack:
default:
break;
}
}
return abuse;
}

View File

@ -353,8 +353,6 @@ public:
virtual NS_HIDDEN_(PopupControlState) PushPopupControlState(PopupControlState state, bool aForce) const;
virtual NS_HIDDEN_(void) PopPopupControlState(PopupControlState state) const;
virtual NS_HIDDEN_(PopupControlState) GetPopupControlState() const;
virtual NS_HIDDEN_(PopupOpenedState) GetPopupOpenedState() const;
virtual NS_HIDDEN_(void) SetPopupOpenedState(PopupOpenedState aValue) const;
virtual NS_HIDDEN_(nsresult) SaveWindowState(nsISupports **aState);
virtual NS_HIDDEN_(nsresult) RestoreWindowState(nsISupports *aState);

View File

@ -69,14 +69,6 @@ enum PopupControlState {
openOverridden // disallow window open
};
// PopupOpenedState helps track abuse of opened popups while the privilege has
// been given.
enum PopupOpenedState {
noTrack = -1, // Don't track opened popups.
noOpenedPopup = 0, // Tracking opened popups but none opened yet.
openedPopup = 1 // Tracking opened popups and one has been opened.
};
class nsIDocShell;
class nsIContent;
class nsIDocument;
@ -304,8 +296,6 @@ public:
bool aForce) const = 0;
virtual void PopPopupControlState(PopupControlState state) const = 0;
virtual PopupControlState GetPopupControlState() const = 0;
virtual void SetPopupOpenedState(PopupOpenedState aValue) const = 0;
virtual PopupOpenedState GetPopupOpenedState() const = 0;
// Returns an object containing the window's state. This also suspends
// all running timeouts in the window.
@ -697,12 +687,6 @@ PushPopupControlState(PopupControlState aState, bool aForce);
void
PopPopupControlState(PopupControlState aState);
PopupOpenedState
GetPopupOpenedState();
void
SetPopupOpenedState(PopupOpenedState aState);
#define NS_AUTO_POPUP_STATE_PUSHER nsAutoPopupStatePusherInternal
#else
#define NS_AUTO_POPUP_STATE_PUSHER nsAutoPopupStatePusherExternal
@ -720,28 +704,19 @@ public:
#ifdef _IMPL_NS_LAYOUT
NS_AUTO_POPUP_STATE_PUSHER(PopupControlState aState, bool aForce = false)
: mOldState(::PushPopupControlState(aState, aForce))
, mPreviousOpenState(::GetPopupOpenedState())
{
SetPopupOpenedState(mPreviousOpenState == openedPopup ? openedPopup
: noOpenedPopup);
}
~NS_AUTO_POPUP_STATE_PUSHER()
{
PopPopupControlState(mOldState);
SetPopupOpenedState(mPreviousOpenState);
}
#else
NS_AUTO_POPUP_STATE_PUSHER(nsPIDOMWindow *aWindow, PopupControlState aState)
: mWindow(aWindow)
, mOldState(openAbused)
, mPreviousOpenState(noTrack)
: mWindow(aWindow), mOldState(openAbused)
{
if (aWindow) {
mOldState = aWindow->PushPopupControlState(aState, PR_FALSE);
mPreviousOpenState = aWindow->GetPopupOpenedState();
aWindow->SetPopupOpenedState(mPreviousOpenState == openedPopup ? openedPopup
: noOpenedPopup);
}
}
@ -749,7 +724,6 @@ public:
{
if (mWindow) {
mWindow->PopPopupControlState(mOldState);
mWindow->SetPopupOpenedState(mPreviousOpenState);
}
}
#endif
@ -759,7 +733,6 @@ protected:
nsCOMPtr<nsPIDOMWindow> mWindow;
#endif
PopupControlState mOldState;
PopupOpenedState mPreviousOpenState;
private:
// Hide so that this class can only be stack-allocated

View File

@ -55,7 +55,6 @@ _BROWSER_FILES = \
browser_autofocus_preference.js \
browser_popup_blocker_save_open_panel.js \
browser_bug396843.js \
browser_popup_blocker_multiple_popups.js \
$(NULL)
libs:: $(_BROWSER_FILES)

View File

@ -1,300 +0,0 @@
/**
* In this test, we check that the content can't open more than one popup at a
* time (depending on "dom.allow_mulitple_popups" preference value).
*/
let wm = Cc["@mozilla.org/appshell/window-mediator;1"]
.getService(Ci.nsIWindowMediator);
let ww = Cc["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Ci.nsIWindowWatcher);
let prefs = Cc["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
let gMultiplePopupsPref;
let gCurrentTest = -1;
let gTests = [
test1,
test2,
test3,
test4,
test5,
test6,
];
function cleanUpPopups()
{
let windowEnumerator = wm.getEnumerator(null);
while (windowEnumerator.hasMoreElements()) {
let win = windowEnumerator.getNext();
// Close all windows except ourself and the browser test harness window.
if (win != window && !win.closed &&
win.document.documentElement.getAttribute("id") != "browserTestHarness") {
win.close();
}
}
}
function cleanUp()
{
prefs.setBoolPref("dom.block_multiple_popups", gMultiplePopupsPref);
cleanUpPopups(window);
}
function nextOrFinish()
{
gCurrentTest++;
if (gCurrentTest >= gTests.length) {
finish();
return;
}
gTests[gCurrentTest]();
}
function test()
{
waitForExplicitFinish();
gMultiplePopupsPref = prefs.getBoolPref("dom.block_multiple_popups");
nextOrFinish();
}
/**
* Two window.open();
*/
function test1()
{
prefs.setBoolPref("dom.block_multiple_popups", true);
gBrowser.selectedTab.linkedBrowser.addEventListener("load", function () {
gBrowser.selectedTab.linkedBrowser.removeEventListener("load", arguments.callee, true);
gBrowser.addEventListener("DOMPopupBlocked", function() {
gBrowser.removeEventListener("DOMPopupBlocked", arguments.callee, true);
ok(true, "The popup has been blocked");
cleanUp();
nextOrFinish();
}, true);
waitForFocus(function() {
var button = gBrowser.selectedTab.linkedBrowser.contentDocument.getElementsByTagName('button')[0];
EventUtils.synthesizeMouseAtCenter(button, {}, gBrowser.selectedTab.linkedBrowser.contentWindow);
});
}, true);
gBrowser.selectedTab.linkedBrowser.loadURI("data:text/html,<!DOCTYPE html><html><body><script>function openPopups() { window.open('data:text/html,foo', '', 'foo'); window.open('data:text/html,bar', '', 'foo'); }</script><button onclick='openPopups();'>click</button></body></html>");
}
/**
* window.open followed by w.open with w being the first popup.
*/
function test2()
{
prefs.setBoolPref("dom.block_multiple_popups", true);
let gPopupsCount = 0;
gBrowser.selectedTab.linkedBrowser.addEventListener("load", function () {
gBrowser.selectedTab.linkedBrowser.removeEventListener("load", arguments.callee, true);
ww.registerNotification(function(aSubject, aTopic, aData) {
if (aTopic != "domwindowopened") {
return;
}
gPopupsCount++;
if (gPopupsCount > 1) {
return;
}
executeSoon(function() {
executeSoon(function() {
executeSoon(function() {
executeSoon(function() {
ww.unregisterNotification(arguments.callee);
is(gPopupsCount, 1, "Only one popup appeared");
cleanUp();
nextOrFinish();
});
});
});
});
});
waitForFocus(function() {
var button = gBrowser.selectedTab.linkedBrowser.contentDocument.getElementsByTagName('button')[0];
EventUtils.synthesizeMouseAtCenter(button, {}, gBrowser.selectedTab.linkedBrowser.contentWindow);
});
}, true);
gBrowser.selectedTab.linkedBrowser.loadURI("data:text/html,<!DOCTYPE html><html><body><script>function openPopups() { var w = window.open('data:text/html,foo', '', 'foo'); w.open('data:text/html,bar', '', 'foo'); }</script><button onclick='openPopups();'>click</button></body></html>");
}
/**
* window.open followed by w.open with w being the first popup and the second popup being actually a tab.
*/
function test3()
{
prefs.setBoolPref("dom.block_multiple_popups", true);
let gPopupsCount = 0;
gBrowser.selectedTab.linkedBrowser.addEventListener("load", function () {
gBrowser.selectedTab.linkedBrowser.removeEventListener("load", arguments.callee, true);
ww.registerNotification(function(aSubject, aTopic, aData) {
if (aTopic != "domwindowopened") {
return;
}
gPopupsCount++;
if (gPopupsCount > 1) {
return;
}
executeSoon(function() {
executeSoon(function() {
executeSoon(function() {
executeSoon(function() {
ww.unregisterNotification(arguments.callee);
is(gPopupsCount, 1, "Only one popup appeared");
cleanUp();
nextOrFinish();
});
});
});
});
});
waitForFocus(function() {
var button = gBrowser.selectedTab.linkedBrowser.contentDocument.getElementsByTagName('button')[0];
EventUtils.synthesizeMouseAtCenter(button, {}, gBrowser.selectedTab.linkedBrowser.contentWindow);
});
}, true);
gBrowser.selectedTab.linkedBrowser.loadURI("data:text/html,<!DOCTYPE html><html><body><script>function openPopups() { var w = window.open('data:text/html,foo', '', 'foo'); w.open('data:text/html,bar', '', ''); }</script><button onclick='openPopups();'>click</button></body></html>");
}
/**
* window.open and .click() on the element opening the window.
*/
function test4()
{
prefs.setBoolPref("dom.block_multiple_popups", true);
gBrowser.selectedTab.linkedBrowser.addEventListener("load", function () {
gBrowser.selectedTab.linkedBrowser.removeEventListener("load", arguments.callee, true);
gBrowser.addEventListener("DOMPopupBlocked", function() {
gBrowser.removeEventListener("DOMPopupBlocked", arguments.callee, true);
ok(true, "The popup has been blocked");
cleanUp();
nextOrFinish();
}, true);
waitForFocus(function() {
var button = gBrowser.selectedTab.linkedBrowser.contentDocument.getElementsByTagName('button')[0];
EventUtils.synthesizeMouseAtCenter(button, {}, gBrowser.selectedTab.linkedBrowser.contentWindow);
});
}, true);
gBrowser.selectedTab.linkedBrowser.loadURI("data:text/html,<!DOCTYPE html><html><body><script>var r = false; function openPopups() { window.open('data:text/html,foo', '', 'foo'); if (!r) { document.getElementsByTagName('button')[0].click(); r=true; } }</script><button onclick='openPopups();'>click</button></body></html>");
}
/**
* Two window.open from the chrome.
*/
function test5()
{
prefs.setBoolPref("dom.block_multiple_popups", true);
let gPopupsCount = 0;
ww.registerNotification(function(aSubject, aTopic, aData) {
if (aTopic != "domwindowopened") {
return;
}
gPopupsCount++;
if (gPopupsCount != 2) {
return;
}
executeSoon(function() {
executeSoon(function() {
executeSoon(function() {
executeSoon(function() {
ww.unregisterNotification(arguments.callee);
is(gPopupsCount, 2, "Both window appeared");
cleanUp();
nextOrFinish();
});
});
});
});
});
window.open("data:text/html,foo", '', 'foo');
window.open("data:text/html,foo", '', 'foo');
}
/**
* Two window.open with the pref being disabled.
*/
function test6()
{
prefs.setBoolPref("dom.block_multiple_popups", false);
let gPopupsCount = 0;
gBrowser.selectedTab.linkedBrowser.addEventListener("load", function () {
gBrowser.selectedTab.linkedBrowser.removeEventListener("load", arguments.callee, true);
ww.registerNotification(function(aSubject, aTopic, aData) {
if (aTopic != "domwindowopened") {
return;
}
gPopupsCount++;
if (gPopupsCount != 2) {
return;
}
executeSoon(function() {
executeSoon(function() {
executeSoon(function() {
executeSoon(function() {
ww.unregisterNotification(arguments.callee);
is(gPopupsCount, 2, "Both window appeared");
cleanUp();
nextOrFinish();
});
});
});
});
});
waitForFocus(function() {
var button = gBrowser.selectedTab.linkedBrowser.contentDocument.getElementsByTagName('button')[0];
EventUtils.synthesizeMouseAtCenter(button, {}, gBrowser.selectedTab.linkedBrowser.contentWindow);
});
}, true);
gBrowser.selectedTab.linkedBrowser.loadURI("data:text/html,<!DOCTYPE html><html><body><script>function openPopups() { window.open('data:text/html,foo', '', 'foo'); window.open('data:text/html,bar', '', 'foo'); }</script><button onclick='openPopups();'>click</button></body></html>");
}

View File

@ -28,9 +28,6 @@ SimpleTest.waitForExplicitFinish();
var wins = [];
var gBlockMultiplePopups = SpecialPowers.getBoolPref("dom.block_multiple_popups");
SpecialPowers.setBoolPref("dom.block_multiple_popups", false);
function r(base, tail) {
return base.replace(/\/[^\/]*$/, "/" + tail);
}
@ -156,7 +153,6 @@ function handleTestEnd() {
setTimeout(startThirdBatch, 0);
}
} else if (!--numTestsSet3) {
SpecialPowers.setBoolPref("dom.block_multiple_popups", gBlockMultiplePopups);
SimpleTest.finish();
}
}

View File

@ -23,13 +23,8 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=406375
SimpleTest.waitForExplicitFinish();
function runTest() {
var blockMultiplePopups = SpecialPowers.getBoolPref("dom.block_multiple_popups");
SpecialPowers.setBoolPref("dom.block_multiple_popups", false);
window.showModalDialog("file_bug406375.html");
ok(true, "This test should not hang");
SpecialPowers.setBoolPref("dom.block_multiple_popups", blockMultiplePopups);
SimpleTest.finish();
}

View File

@ -242,9 +242,6 @@ var expectedState;
function runtests()
{
var blockMultiplePopups = SpecialPowers.getBoolPref("dom.block_multiple_popups");
SpecialPowers.setBoolPref("dom.block_multiple_popups", false);
registerMockPromptService();
enableDialogLoopBlocking();
@ -351,8 +348,6 @@ function runtests()
mockPromptFactoryRegisterer.unregister();
mockPromptServiceRegisterer.unregister();
SpecialPowers.setBoolPref("dom.block_multiple_popups", blockMultiplePopups);
SimpleTest.finish();
}

View File

@ -4,7 +4,7 @@
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=662519
-->
<window title="Mozilla Bug 662519 and Bug 675574"
<window title="Mozilla Bug 662519"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
@ -12,9 +12,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=662519
<body xmlns="http://www.w3.org/1999/xhtml">
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=662519"
target="_blank">Mozilla Bug 662519</a>
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=675574"
target="_blank">Mozilla Bug 675574</a>
<button onclick="window.open('data:text/html,foo', '', 'foo'); window.open('data:text/html,bar', '', 'bar');">click</button>
</body>
<!-- test code goes here -->
@ -23,93 +20,35 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=662519
/** Test for Bug 662519 **/
let Cc = Components.classes;
let Ci = Components.interfaces;
SimpleTest.waitForExplicitFinish();
// We have to enable dom.disable_open_during_load which is disabled
// by the test harness.
let prefs = Cc["@mozilla.org/preferences-service;1"]
.getService(Ci.nsIPrefBranch);
let gLastDomLoadValue = prefs.getBoolPref("dom.disable_open_during_load");
let gMultiplePopupsPref = prefs.getBoolPref("dom.block_multiple_popups");
let prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
var gLastDomLoadValue = prefs.getBoolPref("dom.disable_open_during_load");
prefs.setBoolPref("dom.disable_open_during_load", true);
prefs.setBoolPref("dom.block_multiple_popups", true);
function test1() {
let w = window.open("data:text/html,foobar", "", "width=200,height=200");
ok(w, "The window object shouldn't be null");
let w = window.open("data:text/html,foobar", "", "width=200,height=200");
ok(w, "The window object shouldn't be null");
SimpleTest.waitForFocus(function() {
w.close();
ok(true, "The popup appeared");
SimpleTest.waitForFocus(function() {
w.close();
ok(true, "The popup appeared");
let w = window.open("data:text/html,foobar", "", "width=200,height=200");
ok(w, "The window object shouldn't be null");
SimpleTest.waitForFocus(function() {
let w = window.open("data:text/html,foobar", "", "width=200,height=200");
ok(w, "The window object shouldn't be null");
w.close();
SimpleTest.waitForFocus(function() {
w.close();
ok(true, "The popup appeared");
test2();
}, w, false);
});
}, w, false);
}
function test2() {
let ww = Cc["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Ci.nsIWindowWatcher);
let gPopupsCount = 0;
ww.registerNotification(function(aSubject, aTopic, aData) {
if (aTopic != "domwindowopened") {
return;
}
gPopupsCount++;
if (gPopupsCount != 2) {
return;
}
SimpleTest.executeSoon(function() {
SimpleTest.executeSoon(function() {
SimpleTest.executeSoon(function() {
SimpleTest.executeSoon(function() {
ww.unregisterNotification(arguments.callee);
is(gPopupsCount, 2, "Both window appeared");
// Clean-up and finish.
let windowEnumerator = wm.getEnumerator(null);
while (windowEnumerator.hasMoreElements()) {
let win = windowEnumerator.getNext();
// Close all windows except ourself.
if (win != window && !win.closed) {
win.close();
}
}
prefs.setBoolPref("dom.block_multiple_popups", gMultiplePopupsPref);
ok(true, "The popup appeared");
prefs.setBoolPref("dom.disable_open_during_load", gLastDomLoadValue);
SimpleTest.finish();
});
});
});
});
}, w, false);
});
EventUtils.synthesizeMouseAtCenter(document.getElementsByTagName('button')[0], {});
}
SimpleTest.waitForFocus(test1);
}, w, false);
]]>
</script>
</window>

View File

@ -87,7 +87,7 @@ static void OutputMessage(const std::string &aString, int aLevel) {
}
#else
if (aLevel >= sGfxLogLevel) {
printf(aString.c_str());
printf("%s", aString.c_str());
}
#endif
}

View File

@ -1,3 +1,43 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set ts=8 sw=4 et tw=99 ft=cpp:
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla SpiderMonkey JavaScript code.
*
* The Initial Developer of the Original Code is
* the Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chris Leary <cdleary@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "LifoAlloc.h"
#include <new>

View File

@ -14,18 +14,19 @@
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla SpiderMonkey JavaScript 1.9 code, released
* June 12, 2009.
* The Original Code is Mozilla SpiderMonkey JavaScript code.
*
* The Initial Developer of the Original Code is
* the Mozilla Corporation.
* the Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chris Leary <cdleary@mozilla.com>
* Chris Leary <cdleary@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to

View File

@ -292,3 +292,32 @@ BEGIN_TEST(testDebugger_singleStepThrow)
return JSTRAP_CONTINUE;
}
END_TEST(testDebugger_singleStepThrow)
BEGIN_TEST(testDebugger_emptyObjectPropertyIterator)
{
JSObject *obj = JS_NewObject(cx, NULL, NULL, NULL);
JSScopeProperty *prop = NULL;
CHECK(!JS_PropertyIterator(obj, &prop));
CHECK(!prop);
return true;
}
END_TEST(testDebugger_emptyObjectPropertyIterator)
BEGIN_TEST(testDebugger_nonEmptyObjectPropertyIterator)
{
jsval v;
EVAL("({a: 15})", &v);
JSObject *obj = JSVAL_TO_OBJECT(v);
JSScopeProperty *prop = NULL;
CHECK(JS_PropertyIterator(obj, &prop));
JSPropertyDesc desc;
CHECK(JS_GetPropertyDesc(cx, obj, prop, &desc));
CHECK_EQUAL(JSVAL_IS_INT(desc.value), true);
CHECK_EQUAL(JSVAL_TO_INT(desc.value), 15);
CHECK(!JS_PropertyIterator(obj, &prop));
CHECK(!prop);
return true;
}
END_TEST(testDebugger_nonEmptyObjectPropertyIterator)

View File

@ -847,14 +847,14 @@ JS_PropertyIterator(JSObject *obj, JSScopeProperty **iteratorp)
/* The caller passes null in *iteratorp to get things started. */
shape = (Shape *) *iteratorp;
if (!shape) {
if (!shape)
shape = obj->lastProperty();
} else {
else
shape = shape->previous();
if (!shape->previous()) {
JS_ASSERT(JSID_IS_EMPTY(shape->propid));
shape = NULL;
}
if (!shape->previous()) {
JS_ASSERT(JSID_IS_EMPTY(shape->propid));
shape = NULL;
}
return *iteratorp = reinterpret_cast<JSScopeProperty *>(const_cast<Shape *>(shape));

View File

@ -123,23 +123,27 @@ nsResizerFrame::HandleEvent(nsPresContext* aPresContext,
}
mMouseDownRect = rect.ToNearestPixels(aPresContext->AppUnitsPerDevPixel());
doDefault = PR_FALSE;
}
else {
// If there is no window, then resizing isn't allowed.
if (!window)
break;
doDefault = PR_FALSE;
// ask the widget implementation to begin a resize drag if it can
Direction direction = GetDirection();
nsresult rv = aEvent->widget->BeginResizeDrag(aEvent,
direction.mHorizontal, direction.mVertical);
if (rv == NS_ERROR_NOT_IMPLEMENTED && window) {
// if there's no native resize support, we need to do window
// resizing ourselves
window->GetPositionAndSize(&mMouseDownRect.x, &mMouseDownRect.y,
&mMouseDownRect.width, &mMouseDownRect.height);
}
else {
// for native drags, don't set the fields below
doDefault = PR_FALSE;
break;
}
// for native drags, don't set the fields below
if (rv != NS_ERROR_NOT_IMPLEMENTED)
break;
// if there's no native resize support, we need to do window
// resizing ourselves
window->GetPositionAndSize(&mMouseDownRect.x, &mMouseDownRect.y,
&mMouseDownRect.width, &mMouseDownRect.height);
}
// we're tracking
@ -149,8 +153,6 @@ nsResizerFrame::HandleEvent(nsPresContext* aPresContext,
mMouseDownPoint = aEvent->refPoint + aEvent->widget->WidgetToScreenOffset();
nsIPresShell::SetCapturingContent(GetContent(), CAPTURE_IGNOREALLOWED);
doDefault = PR_FALSE;
}
}
break;
@ -358,7 +360,7 @@ nsResizerFrame::GetContentToResize(nsIPresShell* aPresShell, nsIBaseWindow** aWi
// don't allow resizers in content shells, except for the viewport
// scrollbar which doesn't have a parent
nsIContent* nonNativeAnon = mContent->FindFirstNonNativeAnonymous();
if (nonNativeAnon && !nonNativeAnon->GetParent()) {
if (!nonNativeAnon || nonNativeAnon->GetParent()) {
return nsnull;
}
}

View File

@ -55,7 +55,9 @@ _CHROME_FILES = test_bug381167.xhtml \
$(NULL)
ifneq (mobile,$(MOZ_BUILD_APP))
_TEST_FILES += test_resizer.xul \
_TEST_FILES = test_resizer_incontent.xul
_CHROME_FILES += test_resizer.xul \
window_resizer.xul \
window_resizer_element.xul \
$(NULL)

View File

@ -68,6 +68,7 @@ var tests = [
synthesizeMouse(scroller, x, y, { type: "mouseup" }, window);
},
function() {
scroller.onscroll = null;
ok(true, "Clicking the scrollbar should scroll");
finish();
}

View File

@ -1,14 +1,13 @@
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="/tests/SimpleTest/test.css" type="text/css"?>
<?xml-stylesheet href="data:text/css,description {min-width: 1px; padding: 2px;}" type="text/css"?>
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
<!--
XUL <resizer> tests
-->
<window title="XUL resizer tests"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"/>
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"/>
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
<!-- test results are displayed in the html:body -->
<body xmlns="http://www.w3.org/1999/xhtml">
@ -68,7 +67,6 @@ XUL <resizer> tests
}
if (/Mac/.test(navigator.platform)) {
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");
window.open("window_resizer.xul", "_blank", "left=200,top=200,outerWidth=300,outerHeight=300,chrome");
}
else {
@ -79,18 +77,8 @@ XUL <resizer> tests
}
}
function nextResizerTest()
{
// try opening the test again as a chrome window
if (step++ == 2)
window.open("window_resizer.xul", "_blank", "left=200,top=200,outerWidth=300,outerHeight=300");
else
lastResizerTest();
}
function lastResizerTest()
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");
window.open("window_resizer_element.xul", "_blank", "left=200,top=200,outerWidth=300,outerHeight=300,chrome");
}

View File

@ -0,0 +1,42 @@
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="/tests/SimpleTest/test.css" type="text/css"?>
<!--
This test ensures that a resizer in content doesn't resize the window.
-->
<window title="XUL resizer in content test"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"/>
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"/>
<!-- test results are displayed in the html:body -->
<body xmlns="http://www.w3.org/1999/xhtml">
</body>
<!-- test code goes here -->
<script type="application/javascript"><![CDATA[
SimpleTest.waitForExplicitFinish();
function testResizer()
{
var oldScreenX = window.screenX;
var oldScreenY = window.screenY;
var oldWidth = window.outerWidth;
var oldHeight = window.outerHeight;
var resizer = document.getElementById("resizer");
synthesizeMouseAtCenter(resizer, { type:"mousedown" });
synthesizeMouse(resizer, 32, 32, { type:"mousemove" });
synthesizeMouse(resizer, 32, 32, { type:"mouseup" });
is(window.screenX, oldScreenX, "window not moved for non-chrome window screenX");
is(window.screenY, oldScreenY, "window not moved for non-chrome window screenY");
is(window.outerWidth, oldWidth, "window not moved for non-chrome window outerWidth");
is(window.outerHeight, oldHeight, "window not moved for non-chrome window outerHeight");
SimpleTest.finish();
}
SimpleTest.waitForFocus(testResizer);
]]></script>
<resizer id="resizer" dir="bottomend" width="16" height="16"/>
</window>

View File

@ -2,7 +2,7 @@
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
screenX="200" screenY="200" width="300" height="300"
onload="setTimeout(doTest, 0)">
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
<script><![CDATA[
var is = window.opener.SimpleTest.is;
@ -46,22 +46,14 @@ function doTest() {
synthesizeMouse(root, offsetX, offsetY, { type:"mousedown" });
synthesizeMouse(root, offsetX + mouseX*scale, offsetY + mouseY*scale, { type:"mousemove" });
if (window instanceof Components.interfaces.nsIDOMChromeWindow) {
is(window.screenX*screenScale, newExpectX,
"Bad x for " + dx + "," + dy + " moving " + mouseX + "," + mouseY);
is(window.screenY*screenScale, newExpectY,
"Bad y for " + dx + "," + dy + " moving " + mouseX + "," + mouseY);
is(window.outerWidth, newExpectXMost - newExpectX,
"Bad width for " + dx + "," + dy + " moving " + mouseX + "," + mouseY);
is(window.outerHeight, newExpectYMost - newExpectY,
"Bad height for " + dx + "," + dy + " moving " + mouseX + "," + mouseY);
}
else {
is(window.screenX, oldScreenX, "window not moved for non-chrome window screenX");
is(window.screenY, oldScreenY, "window not moved for non-chrome window screenY");
is(window.outerWidth, oldWidth, "window not moved for non-chrome window outerWidth");
is(window.outerHeight, oldHeight, "window not moved for non-chrome window outerHeight");
}
is(window.screenX*screenScale, newExpectX,
"Bad x for " + dx + "," + dy + " moving " + mouseX + "," + mouseY);
is(window.screenY*screenScale, newExpectY,
"Bad y for " + dx + "," + dy + " moving " + mouseX + "," + mouseY);
is(window.outerWidth, newExpectXMost - newExpectX,
"Bad width for " + dx + "," + dy + " moving " + mouseX + "," + mouseY);
is(window.outerHeight, newExpectYMost - newExpectY,
"Bad height for " + dx + "," + dy + " moving " + mouseX + "," + mouseY);
// move it back before we release! Adjust for any window movement
synthesizeMouse(root, offsetX - (newExpectX - expectX),
@ -98,7 +90,7 @@ function doTest() {
});
window.close();
window.opener.nextResizerTest();
window.opener.lastResizerTest();
}
]]></script>
<hbox id="container" flex="1">

View File

@ -1,7 +1,7 @@
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
align="start">
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
<script><![CDATA[
var is = window.opener.SimpleTest.is;
@ -43,15 +43,16 @@ function testResizer(resizerid, noShrink, hResize, vResize, testid)
" " + testid + " height moving " + mouseX + "," + mouseY);
// release
synthesizeMouse(document.documentElement, originalX + 5 + mouseX * scale,
originalY + 5 + mouseY * scale, { type:"mouseup" }); }
originalY + 5 + mouseY * scale, { type:"mouseup" });
// return to the original size
synthesizeMouse(document.documentElement, originalX + 5 + mouseX * scale,
originalY + 5 + mouseY * scale, { type:"dblclick" }); }
originalY + 5 + mouseY * scale, { type:"dblclick" });
var newrect = document.getElementById(resizerid + "-container").getBoundingClientRect();
is(Math.round(newrect.width), Math.round(rect.width), "resize element " + resizerid +
" " + testid + " doubleclicking to restore original size");
is(Math.round(newrect.height), Math.round(rect.height), "resize element " + resizerid +
" " + testid + " doubleclicking to restore original size");
}
}
}

View File

@ -97,6 +97,10 @@ _BROWSER_FILES = \
browser_thumbnails.js \
browser_install.xml \
browser_upgrade.rdf\
browser_localerepository.js \
browser_localerepository_pref.js \
browser_localerepository_buildid.js \
locales_list.sjs \
mock_autocomplete.json\
$(NULL)

View File

@ -0,0 +1,39 @@
var localeList = serverRoot + "locales_list.sjs";
var PREF_LOCALE_LIST = "extensions.getLocales.get.url";
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource://gre/modules/LocaleRepository.jsm");
function test() {
waitForExplicitFinish();
runNextTest();
}
function end_test() {
Services.prefs.clearUserPref(PREF_LOCALE_LIST);
}
registerCleanupFunction(end_test);
gTests.push({
desc: "Test getting a list of compatable locales",
run: function() {
Services.prefs.setCharPref(PREF_LOCALE_LIST, localeList);
LocaleRepository.getLocales(this.listLoaded);
},
listLoaded: function(aLocales) {
is(aLocales.length, 1, "Correct number of locales were found");
isnot(aLocales[0].addon, null, "Locale has an addon");
is(aLocales[0].xpiURL, "http://www.example.com/mylocale.xpi", "Locale has correct xpi url");
is(aLocales[0].xpiHash, null, "Locale has correct hash");
is(aLocales[0].addon.id, "langpack-test-1@firefox-mobile.mozilla.org", "Locale has correct id");
is(aLocales[0].addon.name, "Test Locale", "Locale has correct name");
is(aLocales[0].addon.type, "language", "Locale has correct type");
is(aLocales[0].addon.targetLocale, "test", "Locale has correct target locale");
is(aLocales[0].addon.version, "1.0", "Locale has correct version");
runNextTest();
}
});

View File

@ -0,0 +1,41 @@
var localeList = serverRoot + "locales_list.sjs";
var PREF_LOCALE_LIST = "extensions.getLocales.get.url";
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource://gre/modules/LocaleRepository.jsm");
function test() {
waitForExplicitFinish();
runNextTest();
}
function end_test() {
Services.prefs.clearUserPref(PREF_LOCALE_LIST);
}
registerCleanupFunction(end_test);
gTests.push({
desc: "Test dynamically changing extensions.getLocales.get.url",
run: function() {
Services.prefs.setCharPref(PREF_LOCALE_LIST, localeList + "?buildid=%BUILDID_EXPANDED%");
LocaleRepository.getLocales(this.listLoaded.bind(this), {buildID: "00001122334455"});
},
listLoaded: function(aLocales) {
is(aLocales.length, 1, "Correct number of locales were found");
is(aLocales[0].addon.name, "0000-11-22-33-44-55", "Buildid was correctly replaced");
Services.prefs.setCharPref(PREF_LOCALE_LIST, localeList + "?buildid=%BUILDID_EXPANDED%");
LocaleRepository.getLocales(this.secondListLoaded.bind(this));
},
secondListLoaded: function(aLocales) {
is(aLocales.length, 1, "Correct number of locales were found");
let buildID = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).QueryInterface(Ci.nsIXULRuntime).appBuildID;
is(aLocales[0].addon.name.replace(/-/g, ""), buildID, "Buildid was correctly replaced");
runNextTest();
}
});

View File

@ -0,0 +1,35 @@
var localeList = serverRoot + "locales_list.sjs";
var PREF_LOCALE_LIST = "extensions.getLocales.get.url";
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource://gre/modules/LocaleRepository.jsm");
function test() {
waitForExplicitFinish();
runNextTest();
}
function end_test() {
Services.prefs.clearUserPref(PREF_LOCALE_LIST);
}
registerCleanupFunction(end_test);
gTests.push({
desc: "Test dynamically changing extensions.getLocales.get.url",
run: function() {
Services.prefs.setCharPref(PREF_LOCALE_LIST, localeList);
LocaleRepository.getLocales(this.listLoaded.bind(this));
},
listLoaded: function(aLocales) {
is(aLocales.length, 1, "Correct number of locales were found");
Services.prefs.setCharPref(PREF_LOCALE_LIST, localeList + "?numvalid=2");
LocaleRepository.getLocales(this.secondListLoaded.bind(this));
},
secondListLoaded: function(aLocales) {
is(aLocales.length, 2, "Correct number of locales were found");
runNextTest();
}
});

View File

@ -0,0 +1,121 @@
let fennecID = "{a23983c0-fd0e-11dc-95ff-0800200c9a66}";
Components.utils.import("resource://gre/modules/Services.jsm");
function getLocale(aLocaleParams, aAppParams) {
let l = {
TARGETLOCALE: "test",
NAME: "Test Locale",
VERSION: "1.0",
INSTALL: "http://www.example.com/mylocale.xpi",
TYPENUMBER: 5,
TYPENAME: "Language Pack (Application)",
IDNUMBER: "",
};
let a = {
APPNAME: "Fennec",
MINVERSION: "4.0", MAXVERSION: "*",
APPID: fennecID
};
if (aLocaleParams) {
for (var entry in aLocaleParams) {
l[entry] = aLocaleParams[entry];
}
}
if (aAppParams) {
for (var entry in aAppParams) {
a[entry] = aAppParams[entry];
}
}
l.app = a;
return l;
}
let appTemplate = "<application>" +
"<name>{APPNAME}</name>" +
"<min_version>{MINVERSION}</min_version>" +
"<max_version>{MAXVERSION}</max_version>" +
"<appID>{APPID}</appID>" +
"</application>";
let template = "<addon>"+
"<target_locale>{TARGETLOCALE}</target_locale>" +
"<name>{NAME}</name>"+
"<type id=\"{TYPENUMBER}\">{TYPENAME}</type>"+
"<guid>langpack-{TARGETLOCALE}-{IDNUMBER}@firefox-mobile.mozilla.org</guid>"+
"<version>{VERSION}</version>"+
"<status id=\"4\">Public</status>"+
"<compatible_applications>{APPS}</compatible_applications>"+
"<all_compatible_os><os>ALL</os></all_compatible_os>"+
"<install os=\"ALL\">{INSTALL}</install><strings>\n" +
"title=TITLE\n" +
"continueIn=CONTINUEIN\n" +
"name=NAME\n" +
"choose=CHOOSE\n" +
"chooseLanguage=CHOOSELANGUAGE\n" +
"cancel=CANCEL\n" +
"continue=CONTINUE\n" +
"installing=INSTALLING\n" +
"installerror=INSTALLERROR\n" +
"loading=LOADING" +
"</strings>"+
"</addon>";
function handleRequest(request, response) {
response.setStatusLine(request.httpVersion, 200, "OK");
response.setHeader("Content-Type", "text/xml", false);
response.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
response.write("<addons>");
let locales = [];
let query = decodeURIComponent(request.queryString || "").split("=");
switch(query[0]) {
case "numvalid":
let numValid = parseInt(query[1]);
for (let i = 0; i < numValid; i++) {
locales.push( getLocale({IDNUMBER: i}) );
}
break;
case "buildid":
locales.push( getLocale({IDNUMBER: 1, NAME: query[1]}) );
break;
default :
locales.push( getLocale({IDNUMBER: 1}) );
/* These locales should fail in the LocaleRepository */
locales.push( getLocale({IDNUMBER: 1}) ); // no duplicate ids
locales.push( getLocale({IDNUMBER: 2, INSTALL: "INVALID_URL"}) );
locales.push( getLocale({IDNUMBER: 3}, {APPID: "INVALID_ID"}) );
locales.push( getLocale({IDNUMBER: 3}, {MAXVERSION: "0"}) );
locales.push( getLocale({IDNUMBER: 4, TARGETLOCALE: ""}) );
locales.push( getLocale({IDNUMBER: 5, NAME: ""}) );
locales.push( getLocale({IDNUMBER: 6, VERSION: ""}) );
locales.push( getLocale({IDNUMBER: 7, TYPENUMBER: ""}) );
break;
}
for(var i = 0; i < locales.length; i++) {
let t = template;
t = t.replace(/{TARGETLOCALE}/g, locales[i].TARGETLOCALE);
t = t.replace(/{NAME}/, locales[i].NAME);
t = t.replace(/{VERSION}/, locales[i].VERSION);
t = t.replace(/{INSTALL}/, locales[i].INSTALL);
t = t.replace(/{TYPENUMBER}/, locales[i].TYPENUMBER);
t = t.replace(/{TYPENAME}/, locales[i].TYPENAME);
t = t.replace(/{IDNUMBER}/, locales[i].IDNUMBER)
let a = appTemplate;
a = a.replace(/{APPNAME}/, locales[i].app.APPNAME);
a = a.replace(/{MINVERSION}/, locales[i].app.MINVERSION);
a = a.replace(/{MAXVERSION}/, locales[i].app.MAXVERSION);
a = a.replace(/{APPID}/, locales[i].app.APPID);
t = t.replace(/{APPS}/, a);
response.write(t);
}
response.write("</addons>");
}

View File

@ -45,8 +45,6 @@ Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/AddonManager.jsm");
Cu.import("resource://gre/modules/NetUtil.jsm");
var gServiceURL = Services.prefs.getCharPref("extensions.getLocales.get.url");
// A map between XML keys to LocaleSearchResult keys for string values
// that require no extra parsing from XML
const STRING_KEY_MAP = {
@ -83,7 +81,7 @@ var LocaleRepository = {
},
getLocales: function getLocales(aCallback, aFilters) {
let url = gServiceURL;
let url = Services.prefs.getCharPref("extensions.getLocales.get.url");
if (!url) {
aCallback([]);
@ -93,7 +91,7 @@ var LocaleRepository = {
let buildID = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).QueryInterface(Ci.nsIXULRuntime).appBuildID;
if (aFilters) {
if (aFilters.buildID)
buildid = aFilters.buildID;
buildID = aFilters.buildID;
}
buildID = buildID.substring(0,4) + "-" + buildID.substring(4).replace(/\d{2}(?=\d)/g, "$&-");
url = url.replace(/%BUILDID_EXPANDED%/g, buildID);
@ -166,7 +164,7 @@ var LocaleRepository = {
addon.type = "language";
break;
default:
WARN("Unknown type id when parsing addon: " + id);
this.log("Unknown type id when parsing addon: " + id);
}
break;
case "authors":
@ -219,7 +217,12 @@ var LocaleRepository = {
return null;
result.xpiURL = xpiURL;
addon.sourceURI = NetUtil.newURI(xpiURL);
try {
addon.sourceURI = NetUtil.newURI(xpiURL);
} catch(ex) {
this.log("Addon has invalid uri: " + addon.sourceURI);
addon.sourceURI = null;
}
let size = parseInt(node.getAttribute("size"));
addon.size = (size >= 0) ? size : null;
@ -270,7 +273,7 @@ var LocaleRepository = {
continue;
// Ignore add-on missing a required attribute
let requiredAttributes = ["id", "name", "version", "type", "targetLocale"];
let requiredAttributes = ["id", "name", "version", "type", "targetLocale", "sourceURI"];
if (requiredAttributes.some(function(aAttribute) !result.addon[aAttribute]))
continue;

View File

@ -562,8 +562,6 @@ pref("capability.policy.default.Clipboard.cutcopy", "noAccess");
pref("capability.policy.default.Clipboard.paste", "noAccess");
// Scripts & Windows prefs
pref("dom.block_multiple_popups", true);
pref("dom.disable_image_src_set", false);
pref("dom.disable_window_flip", false);
pref("dom.disable_window_move_resize", false);

View File

@ -24,8 +24,6 @@ var testPage = "";
// Assign a function to this variable to have a clean up at the end
var testCleanUp = null;
// Backup the dom.block_multiple_popups pref value to re-set it on finish.
var blockMultiplePopupsPref;
// Internal variables
var _windowCount = 0;
@ -69,8 +67,6 @@ window.onload = function onLoad()
if (openTwoWindows)
{
_windowCount = 2;
blockMultiplePopupsPref = SpecialPowers.getBoolPref("dom.block_multiple_popups");
SpecialPowers.setBoolPref("dom.block_multiple_popups", false);
window.open(secureTestLocation, "_new1", "");
window.open(secureTestLocation, "_new2", "");
}
@ -92,10 +88,7 @@ function onMessageReceived(event)
{
if (testCleanUp)
testCleanUp();
if (openTwoWindows) {
SpecialPowers.setBoolPref("dom.block_multiple_popups", blockMultiplePopupsPref);
}
SimpleTest.finish();
}
break;

View File

@ -53,6 +53,8 @@
* a11y telemetry
*/
HISTOGRAM(A11Y_INSTANTIATED, 0, 1, 2, BOOLEAN, "has accessibility support been instantiated")
HISTOGRAM(ISIMPLE_DOM_USAGE, 0, 1, 2, BOOLEAN, "have the ISimpleDOM* accessibility interfaces been used")
HISTOGRAM(IACCESSIBLE_TABLE_USAGE, 0, 1, 2, BOOLEAN, "has the IAccessibleTable accessibility interface been used")
HISTOGRAM(CYCLE_COLLECTOR, 1, 10000, 50, EXPONENTIAL, "Time spent on one cycle collection (ms)")
HISTOGRAM(CYCLE_COLLECTOR_VISITED_REF_COUNTED, 1, 300000, 50, EXPONENTIAL, "Number of ref counted objects visited by the cycle collector")

View File

@ -2,15 +2,17 @@
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
<!--
XUL Widget Test for radio buttons
XUL Widget Test for tabboxes
-->
<window title="Radio Buttons" width="500" height="600"
<window title="Tabbox Test" width="500" height="600"
onload="setTimeout(test_tabbox, 0);"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" 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" src="xul_selectcontrol.js"/>
<vbox id="tabboxes">
<tabbox id="tabbox">
<tabs id="tabs">
<tab id="tab1" label="Tab 1"/>
@ -48,6 +50,24 @@
</tabpanels>
</tabbox>
</vbox>
<tabbox id="tabbox-nofocus">
<textbox id="textbox-extra" hidden="true"/>
<tabs>
<tab label="Tab 1" value="one"/>
<tab id="tab-nofocus" label="Tab 2" value="two"/>
</tabs>
<tabpanels>
<tabpanel>
<button id="tab-nofocus-button" label="Label"/>
</tabpanel>
<tabpanel id="tabpanel-nofocusinpaneltab">
<label id="tablabel" value="Label"/>
</tabpanel>
</tabpanels>
</tabbox>
<!-- test results are displayed in the html:body -->
<body xmlns="http://www.w3.org/1999/xhtml" style="height: 300px; overflow: auto;"/>
@ -99,7 +119,7 @@ function test_tabbox()
test_tabs(tabs);
SimpleTest.finish();
test_tabbox_focus();
}
function test_tabpanels(tabpanels, tabbox)
@ -155,6 +175,44 @@ function test_tabpanels_State(tabpanels, testid, index, panel)
is(tabpanels.selectedPanel, panel, testid + " selectedPanel");
}
function test_tabbox_focus()
{
$("tabboxes").hidden = true;
$(document.activeElement).blur();
var tabbox = $("tabbox-nofocus");
var tab = $("tab-nofocus");
tab.addEventListener("focus", function () {
tab.removeEventListener("focus", arguments.callee, true);
ok(document.activeElement, tab, "focus in tab with no focusable elements");
tabbox.selectedIndex = 0;
$("tab-nofocus-button").focus();
tab.addEventListener("focus", function () {
tab.removeEventListener("focus", arguments.callee, true);
ok(document.activeElement, tab, "focus in tab with no focusable elements, but with something in another tab focused");
var textboxExtra = $("textbox-extra");
textboxExtra.addEventListener("focus", function () {
textboxExtra.removeEventListener("focus", arguments.callee, true);
ok(document.activeElement, textboxExtra, "focus in tab with focus currently in textbox that is sibling of tabs");
SimpleTest.finish();
}, true);
tabbox.selectedIndex = 0;
textboxExtra.hidden = false;
synthesizeMouseAtCenter(tab, { });
}, true);
synthesizeMouseAtCenter(tab, { });
}, true);
synthesizeMouseAtCenter(tab, { });
}
]]>
</script>

View File

@ -477,16 +477,19 @@
aNewTab.focus();
}
else if (this.getAttribute("setfocus") != "false") {
document.commandDispatcher.advanceFocusIntoSubtree(this.tabbox.selectedPanel);
let selectedPanel = this.tabbox.selectedPanel;
document.commandDispatcher.advanceFocusIntoSubtree(selectedPanel);
// Make sure that the focus doesn't move outside the tabbox
if (this.tabbox) {
try {
let el = document.commandDispatcher.focusedElement;
while (el && el != this.tabbox)
while (el && el != this.tabbox.tabpanels) {
if (el == this.tabbox || el == selectedPanel)
return;
el = el.parentNode;
if (el != this.tabbox)
aNewTab.focus();
}
aNewTab.focus();
} catch(e) {
}
}