зеркало из https://github.com/mozilla/pjs.git
Merge mozilla-central to mozilla-inbound
This commit is contained in:
Коммит
992d623707
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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=,
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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>");
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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>");
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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">
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
});
|
|
@ -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();
|
||||
}
|
||||
});
|
|
@ -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();
|
||||
}
|
||||
});
|
|
@ -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>");
|
||||
}
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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) {
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче