Merge m-i to m-c.

This commit is contained in:
Kyle Huey 2011-08-22 07:39:22 -04:00
commit f361ed41ed
54 changed files with 891 additions and 277 deletions

View File

@ -256,7 +256,8 @@ FeedWriter.prototype = {
__contentSandbox: null,
get _contentSandbox() {
if (!this.__contentSandbox)
this.__contentSandbox = new Cu.Sandbox(this._window);
this.__contentSandbox = new Cu.Sandbox(this._window,
{sandboxName: 'FeedWriter'});
return this.__contentSandbox;
},

View File

@ -59,7 +59,7 @@ window.onload = function() {
gStateObject = JSON.parse(sessionData.value);
}
catch (exJSON) {
var s = new Cu.Sandbox("about:blank");
var s = new Cu.Sandbox("about:blank", {sandboxName: 'aboutSessionRestore'});
gStateObject = Cu.evalInSandbox("(" + sessionData.value + ")", s);
// If we couldn't parse the string with JSON.parse originally, make sure
// that the value in the textbox will be parsable.

View File

@ -135,7 +135,7 @@ SessionStartup.prototype = {
this._initialState = JSON.parse(iniString);
}
catch (exJSON) {
var s = new Cu.Sandbox("about:blank");
var s = new Cu.Sandbox("about:blank", {sandboxName: 'nsSessionStartup'});
this._initialState = Cu.evalInSandbox("(" + iniString + ")", s);
}

View File

@ -178,7 +178,8 @@ var Scratchpad = {
this._previousLocation != this.gBrowser.contentWindow.location.href) {
let contentWindow = this.gBrowser.selectedBrowser.contentWindow;
this._contentSandbox = new Cu.Sandbox(contentWindow,
{ sandboxPrototype: contentWindow, wantXrays: false });
{ sandboxPrototype: contentWindow, wantXrays: false,
sandboxName: 'scratchpad-content'});
this._previousBrowserWindow = this.browserWindow;
this._previousBrowser = this.gBrowser.selectedBrowser;
@ -211,7 +212,8 @@ var Scratchpad = {
if (!this._chromeSandbox ||
this.browserWindow != this._previousBrowserWindow) {
this._chromeSandbox = new Cu.Sandbox(this.browserWindow,
{ sandboxPrototype: this.browserWindow, wantXrays: false });
{ sandboxPrototype: this.browserWindow, wantXrays: false,
sandboxName: 'scratchpad-chrome'});
this._previousBrowserWindow = this.browserWindow;
}

View File

@ -5,12 +5,17 @@ import os
class DeviceManagerADB(DeviceManager):
def __init__(self, host = None, port = 20701, retrylimit = 5, packageName = "org.mozilla.fennec_unofficial"):
def __init__(self, host = None, port = 20701, retrylimit = 5, packageName = None):
self.host = host
self.port = port
self.retrylimit = retrylimit
self.retries = 0
self._sock = None
if packageName == None:
if os.getenv('USER'):
packageName = 'org.mozilla.fennec_' + os.getenv('USER')
else:
packageName = 'org.mozilla.fennec_'
self.Init(packageName)
def Init(self, packageName):
@ -27,7 +32,11 @@ class DeviceManagerADB(DeviceManager):
self.tmpDir = None
try:
# a test to see if we have root privs
self.checkCmd(["shell", "ls", "/sbin"])
files = self.listFiles("/data/data")
if (len(files) == 1):
if (files[0].find("Permission denied") != -1):
print "NOT running as root"
raise Exception("not running as root")
except:
try:
self.checkCmd(["root"])
@ -98,7 +107,7 @@ class DeviceManagerADB(DeviceManager):
try:
if (not self.dirExists(remoteDir)):
self.mkDirs(remoteDir+"/x")
for root, dirs, files in os.walk(localDir):
for root, dirs, files in os.walk(localDir, followlinks='true'):
relRoot = os.path.relpath(root, localDir)
for file in files:
localFile = os.path.join(root, file)
@ -134,8 +143,12 @@ class DeviceManagerADB(DeviceManager):
# success: True
# failure: False
def fileExists(self, filepath):
self.checkCmd(["shell", "ls", filepath])
return True
p = self.runCmd(["shell", "ls", "-a", filepath])
data = p.stdout.readlines()
if (len(data) == 1):
if (data[0].rstrip() == filepath):
return True
return False
def removeFile(self, filename):
return self.runCmd(["shell", "rm", filename]).stdout.read()
@ -381,18 +394,11 @@ class DeviceManagerADB(DeviceManager):
return devroot + '/fennec'
elif (self.dirExists(devroot + '/firefox')):
return devroot + '/firefox'
elif (self.dirExists('/data/data/org.mozilla.fennec')):
return '/data/data/org.mozilla.fennec'
elif (self.dirExists('/data/data/org.mozilla.firefox')):
return '/data/data/org.mozilla.firefox'
elif (self.dirExists('/data/data/org.mozilla.fennec_unofficial')):
return '/data/data/org.mozilla.fennec_unofficial'
elif (self.dirExists('/data/data/org.mozilla.fennec_aurora')):
return '/data/data/org.mozilla.fennec_aurora'
elif (self.dirExists('/data/data/org.mozilla.firefox_beta')):
return '/data/data/org.mozilla.firefox_beta'
elif (self.packageName and self.dirExists('/data/data/' + self.packageName)):
return '/data/data/' + self.packageName
# Failure (either not installed or not a recognized platform)
print "devicemanagerADB: getAppRoot failed"
return None
# Gets the directory location on the device for a specific test type

View File

@ -153,6 +153,20 @@ xpcshell-tests:
$(LIBXUL_DIST)/bin/xpcshell \
$(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir))
xpcshell-tests-remote: DM_TRANS?=adb
xpcshell-tests-remote:
$(PYTHON) -u $(topsrcdir)/config/pythonpath.py \
-I$(topsrcdir)/build \
-I$(topsrcdir)/build/mobile \
$(topsrcdir)/testing/xpcshell/remotexpcshelltests.py \
--symbols-path=$(DIST)/crashreporter-symbols \
--build-info-json=$(DEPTH)/mozinfo.json \
$(EXTRA_TEST_ARGS) \
--dm_trans=$(DM_TRANS) \
--deviceIP=${TEST_DEVICE} \
--objdir=$(DEPTH) \
$(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir))
# Execute a single test, specified in $(SOLO_FILE), but don't automatically
# start the test. Instead, present the xpcshell prompt so the user can
# attach a debugger and then start the test.
@ -182,6 +196,23 @@ check-one:
$(LIBXUL_DIST)/bin/xpcshell \
$(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir))
check-one-remote: DM_TRANS?=adb
check-one-remote:
$(PYTHON) -u $(topsrcdir)/config/pythonpath.py \
-I$(topsrcdir)/build \
-I$(topsrcdir)/build/mobile \
$(testxpcsrcdir)/remotexpcshelltests.py \
--symbols-path=$(DIST)/crashreporter-symbols \
--build-info-json=$(DEPTH)/mozinfo.json \
--test-path=$(SOLO_FILE) \
--profile-name=$(MOZ_APP_NAME) \
--verbose \
$(EXTRA_TEST_ARGS) \
--dm_trans=$(DM_TRANS) \
--deviceIP=${TEST_DEVICE} \
--objdir=$(DEPTH) \
--noSetup \
$(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir))
endif # XPCSHELL_TESTS
ifdef CPP_UNIT_TESTS

View File

@ -3,4 +3,8 @@ head = head_plugins.js
tail =
[test_bug455213.js]
# Bug 676953: test fails consistently on Android
fail-if = os == "android"
[test_bug471245.js]
# Bug 676953: test fails consistently on Android
fail-if = os == "android"

View File

@ -421,6 +421,7 @@ abstract public class GeckoApp
public void onStart()
{
Log.i(LOG_FILE_NAME, "start");
GeckoAppShell.sendEventToGecko(new GeckoEvent(GeckoEvent.ACTIVITY_START));
super.onStart();
}

View File

@ -72,6 +72,7 @@ public class GeckoEvent {
public static final int SURFACE_CREATED = 13;
public static final int SURFACE_DESTROYED = 14;
public static final int GECKO_EVENT_SYNC = 15;
public static final int ACTIVITY_START = 17;
public static final int IME_COMPOSITION_END = 0;
public static final int IME_COMPOSITION_BEGIN = 1;

View File

@ -3,4 +3,8 @@ head =
tail =
[test_wwauthpromptfactory.js]
# Bug 676955: test fails consistently on Android
fail-if = os == "android"
[test_wwpromptfactory.js]
# Bug 676955: test fails consistently on Android
fail-if = os == "android"

View File

@ -111,6 +111,8 @@ tail =
[test_encode_CP852.js]
[test_encode_CP855.js]
[test_encode_CP857.js]
# Bug 676958: test consistently hangs on Android
skip-if = os == "android"
[test_encode_CP862.js]
[test_encode_CP864.js]
[test_encode_CP874.js]

View File

@ -3,4 +3,6 @@ head =
tail =
[test_ipcshell.js]
# Bug 676963: test fails consistently on Android
fail-if = os == "android"
[test_ipcshell_child.js]

View File

@ -153,6 +153,20 @@ xpcshell-tests:
$(LIBXUL_DIST)/bin/xpcshell \
$(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir))
xpcshell-tests-remote: DM_TRANS?=adb
xpcshell-tests-remote:
$(PYTHON) -u $(topsrcdir)/config/pythonpath.py \
-I$(topsrcdir)/build \
-I$(topsrcdir)/build/mobile \
$(topsrcdir)/testing/xpcshell/remotexpcshelltests.py \
--symbols-path=$(DIST)/crashreporter-symbols \
--build-info-json=$(DEPTH)/mozinfo.json \
$(EXTRA_TEST_ARGS) \
--dm_trans=$(DM_TRANS) \
--deviceIP=${TEST_DEVICE} \
--objdir=$(DEPTH) \
$(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir))
# Execute a single test, specified in $(SOLO_FILE), but don't automatically
# start the test. Instead, present the xpcshell prompt so the user can
# attach a debugger and then start the test.
@ -182,6 +196,23 @@ check-one:
$(LIBXUL_DIST)/bin/xpcshell \
$(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir))
check-one-remote: DM_TRANS?=adb
check-one-remote:
$(PYTHON) -u $(topsrcdir)/config/pythonpath.py \
-I$(topsrcdir)/build \
-I$(topsrcdir)/build/mobile \
$(testxpcsrcdir)/remotexpcshelltests.py \
--symbols-path=$(DIST)/crashreporter-symbols \
--build-info-json=$(DEPTH)/mozinfo.json \
--test-path=$(SOLO_FILE) \
--profile-name=$(MOZ_APP_NAME) \
--verbose \
$(EXTRA_TEST_ARGS) \
--dm_trans=$(DM_TRANS) \
--deviceIP=${TEST_DEVICE} \
--objdir=$(DEPTH) \
--noSetup \
$(foreach dir,$(XPCSHELL_TESTS),$(testxpcobjdir)/$(relativesrcdir)/$(dir))
endif # XPCSHELL_TESTS
ifdef CPP_UNIT_TESTS

View File

@ -1837,7 +1837,9 @@ main(int argc, char **argv, char **envp)
XRE_GetFileFromPath(argv[4], getter_AddRefs(appOmni));
argc-=2;
argv+=2;
}
} else {
appOmni = greOmni;
}
XRE_InitOmnijar(greOmni, appOmni);
argc-=2;

View File

@ -2073,7 +2073,8 @@ nsXPConnect::CreateSandbox(JSContext *cx, nsIPrincipal *principal,
jsval rval = JSVAL_VOID;
AUTO_MARK_JSVAL(ccx, &rval);
nsresult rv = xpc_CreateSandboxObject(cx, &rval, principal, NULL, false);
nsresult rv = xpc_CreateSandboxObject(cx, &rval, principal, NULL, false,
EmptyCString());
NS_ASSERTION(NS_FAILED(rv) || !JSVAL_IS_PRIMITIVE(rval),
"Bad return value from xpc_CreateSandboxObject()!");

View File

@ -3153,7 +3153,7 @@ NS_IMPL_ISUPPORTS0(Identity)
nsresult
xpc_CreateSandboxObject(JSContext * cx, jsval * vp, nsISupports *prinOrSop, JSObject *proto,
bool wantXrays)
bool wantXrays, const nsACString &sandboxName)
{
// Create the sandbox global object
nsresult rv;
@ -3240,6 +3240,10 @@ xpc_CreateSandboxObject(JSContext * cx, jsval * vp, nsISupports *prinOrSop, JSOb
}
}
xpc::CompartmentPrivate *compartmentPrivate =
static_cast<xpc::CompartmentPrivate*>(JS_GetCompartmentPrivate(cx, compartment));
compartmentPrivate->location = sandboxName;
return NS_OK;
}
@ -3351,6 +3355,8 @@ nsXPCComponents_utils_Sandbox::CallOrConstruct(nsIXPConnectWrappedNative *wrappe
JSObject *proto = nsnull;
bool wantXrays = true;
nsCString sandboxName;
if (argc > 1) {
if (!JSVAL_IS_OBJECT(argv[1]))
return ThrowAndFail(NS_ERROR_INVALID_ARG, cx, _retval);
@ -3382,9 +3388,26 @@ nsXPCComponents_utils_Sandbox::CallOrConstruct(nsIXPConnectWrappedNative *wrappe
wantXrays = JSVAL_TO_BOOLEAN(option);
}
if (!JS_HasProperty(cx, optionsObject, "sandboxName", &found))
return NS_ERROR_INVALID_ARG;
if (found) {
if (!JS_GetProperty(cx, optionsObject, "sandboxName", &option) ||
!JSVAL_IS_STRING(option)) {
return ThrowAndFail(NS_ERROR_INVALID_ARG, cx, _retval);
}
char *tmp = JS_EncodeString(cx, JSVAL_TO_STRING(option));
if (!tmp) {
return ThrowAndFail(NS_ERROR_INVALID_ARG, cx, _retval);
}
sandboxName.Adopt(tmp, strlen(tmp));
}
}
rv = xpc_CreateSandboxObject(cx, vp, prinOrSop, proto, wantXrays);
rv = xpc_CreateSandboxObject(cx, vp, prinOrSop, proto, wantXrays, sandboxName);
if (NS_FAILED(rv)) {
return ThrowAndFail(rv, cx, _retval);

View File

@ -1578,22 +1578,30 @@ CompartmentStats::CompartmentStats(JSContext *cx, JSCompartment *c)
{
if(c->principals->codebase)
{
// A hack: replace forward slashes with '\\' so they aren't
// treated as path separators. Users of the reporters
// (such as about:memory) have to undo this change.
name.Assign(c->principals->codebase);
name.ReplaceChar('/', '\\');
// If it's the system compartment, append the address.
// This means that multiple system compartments (and there
// can be many) can be distinguished.
if(c->isSystemCompartment)
{
if (c->data &&
!((xpc::CompartmentPrivate*)c->data)->location.IsEmpty())
{
name.AppendLiteral(", ");
name.Append(((xpc::CompartmentPrivate*)c->data)->location);
}
// ample; 64-bit address max is 18 chars
static const int maxLength = 31;
nsPrintfCString address(maxLength, ", 0x%llx", PRUint64(c));
name.Append(address);
}
// A hack: replace forward slashes with '\\' so they aren't
// treated as path separators. Users of the reporters
// (such as about:memory) have to undo this change.
name.ReplaceChar('/', '\\');
}
else
{

View File

@ -4315,7 +4315,7 @@ xpc_GetJSPrivate(JSObject *obj)
// and used.
nsresult
xpc_CreateSandboxObject(JSContext * cx, jsval * vp, nsISupports *prinOrSop,
JSObject *proto, bool preferXray);
JSObject *proto, bool preferXray, const nsACString &sandboxName);
// Helper for evaluating scripts in a sandbox object created with
// xpc_CreateSandboxObject(). The caller is responsible of ensuring
@ -4394,6 +4394,7 @@ struct CompartmentPrivate
JSObject2JSObjectMap *waiverWrapperMap;
// NB: we don't want this map to hold a strong reference to the wrapper.
nsDataHashtable<nsPtrHashKey<XPCWrappedNative>, JSObject *> *expandoMap;
nsCString location;
bool RegisterExpandoObject(XPCWrappedNative *wn, JSObject *expando) {
if (!expandoMap) {

View File

@ -15,6 +15,8 @@ tail =
[test_import.js]
[test_js_weak_references.js]
[test_localeCompare.js]
# Bug 676965: test fails consistently on Android
fail-if = os == "android"
[test_recursive_import.js]
[test_xpcomutils.js]
[test_unload.js]

View File

@ -83,11 +83,7 @@
#endif
// Size to use for PLArena block allocations.
// XXX: This should be 8192; the subtracted elements are a hack that's
// required to ensure the allocation requests are power-of-two-sized and thus
// avoid lots of wasted memory caused by the heap allocator rounding up request
// sizes. Bug 676457 will fix it properly.
static const size_t ARENA_PAGE_SIZE = 8192 - sizeof(PLArena) - PL_ARENA_CONST_ALIGN_MASK;
static const size_t ARENA_PAGE_SIZE = 8192;
// Freed memory is filled with a poison value, which we arrange to
// form a pointer either to an always-unmapped region of the address

View File

@ -322,6 +322,12 @@ var Browser = {
os.addObserver(SessionHistoryObserver, "browser:purge-session-history", false);
os.addObserver(ContentCrashObserver, "ipc:content-shutdown", false);
os.addObserver(MemoryObserver, "memory-pressure", false);
os.addObserver(ActivityObserver, "application-background", false);
os.addObserver(ActivityObserver, "application-foreground", false);
os.addObserver(ActivityObserver, "system-active", false);
os.addObserver(ActivityObserver, "system-idle", false);
os.addObserver(ActivityObserver, "system-display-on", false);
os.addObserver(ActivityObserver, "system-display-off", false);
// Listens for change in the viewable area
#if MOZ_PLATFORM_MAEMO == 6
@ -486,6 +492,12 @@ var Browser = {
os.removeObserver(SessionHistoryObserver, "browser:purge-session-history");
os.removeObserver(ContentCrashObserver, "ipc:content-shutdown");
os.removeObserver(MemoryObserver, "memory-pressure");
os.removeObserver(ActivityObserver, "application-background", false);
os.removeObserver(ActivityObserver, "application-foreground", false);
os.removeObserver(ActivityObserver, "system-active", false);
os.removeObserver(ActivityObserver, "system-idle", false);
os.removeObserver(ActivityObserver, "system-display-on", false);
os.removeObserver(ActivityObserver, "system-display-off", false);
window.controllers.removeController(this);
window.controllers.removeController(BrowserUI);
@ -2585,6 +2597,34 @@ var MemoryObserver = {
}
};
var ActivityObserver = {
_inBackground : false,
_notActive : false,
_isDisplayOff : false,
observe: function ao_observe(aSubject, aTopic, aData) {
if (aTopic == "application-background") {
this._inBackground = true;
} else if (aTopic == "application-foreground") {
this._inBackground = false;
} else if (aTopic == "system-idle") {
this._notActive = true;
} else if (aTopic == "system-active") {
this._notActive = false;
} else if (aTopic == "system-display-on") {
this._isDisplayOff = false;
} else if (aTopic == "system-display-off") {
this._isDisplayOff = true;
}
let activeTabState = !this._inBackground && !this._notActive && !this._isDisplayOff;
if (Browser.selectedTab.active != activeTabState) {
// On Maemo all backgrounded applications getting portrait orientation
// so if browser had landscape mode then we need timeout in order
// to finish last rotate/paint operation and have nice lookine browser in TS
setTimeout(function() { Browser.selectedTab.active = activeTabState; }, 0);
}
}
};
function getNotificationBox(aBrowser) {
return Browser.getNotificationBox(aBrowser);
}

View File

@ -179,16 +179,13 @@ PP_DEB_FILES = debian/control \
debian/fennec.postinst \
$(NULL)
ifdef MOZ_ENABLE_CONTENTMANAGER
PP_DEB_FILES += debian/fennec.aegis \
$(NULL)
endif
ifeq ($(MOZ_PLATFORM_MAEMO),6)
PP_DEB_FILES += debian/backup \
debian/restore \
debian/fennec.conf \
debian/fennec-cud.sh \
debian/fennec-rfs.sh \
PP_DEB_FILES += debian/fennec.aegis \
debian/backup \
debian/restore \
debian/fennec.conf \
debian/fennec-cud.sh \
debian/fennec-rfs.sh \
debian/fennec.policy \
$(NULL)
endif
@ -242,7 +239,7 @@ endif
# a defined CONTENTMANAGER implicitly means MOZ_PLATFORM_MAEMO is equals 6
# in case you use CONTENTMANGER you need to sign your package to gain tracker access.
ifdef MOZ_ENABLE_CONTENTMANAGER
ifeq ($(MOZ_PLATFORM_MAEMO),6)
if test -e "/usr/bin/aegis-deb-add"; then \
fakeroot aegis-deb-add -control $(DEBDESTDIR)/DEBIAN/control .. debian/fennec.aegis=_aegis; \
else \

View File

@ -1,3 +1,4 @@
#filter substitution
<aegis>
<request>
<credential name="TrackerReadAccess" />

View File

@ -8,4 +8,6 @@ tail =
[test_encoder_apng.js]
[test_encoder_png.js]
[test_imgtools.js]
# Bug 676968: test fails consistently on Android
fail-if = os == "android"
[test_moz_icon_uri.js]

View File

@ -75,7 +75,8 @@ nsProxyAutoConfig.prototype = {
}
// allocate a fresh Sandbox to clear global scope for new PAC script
this._sandBox = new Components.utils.Sandbox(pacURI);
this._sandBox = new Components.utils.Sandbox(pacURI,
{sandboxName: 'nsProxyAutoConfig'});
Components.utils.evalInSandbox(pacUtils, this._sandBox);
// add predefined functions to pac

View File

@ -8,6 +8,8 @@ tail =
[test_aboutblank.js]
[test_auth_proxy.js]
[test_authentication.js]
# Bug 675039: test hangs consistently on Android
skip-if = os == "android"
[test_authpromptwrapper.js]
[test_bug203271.js]
[test_bug248970_cache.js]
@ -38,6 +40,8 @@ tail =
[test_bug455311.js]
[test_bug455598.js]
[test_bug468426.js]
# Bug 675039: test hangs consistently on Android
skip-if = os == "android"
[test_bug468594.js]
[test_bug470716.js]
[test_bug479413.js]
@ -47,6 +51,8 @@ tail =
[test_bug490095.js]
[test_bug504014.js]
[test_bug510359.js]
# Bug 675039: test hangs consistently on Android
skip-if = os == "android"
[test_bug515583.js]
[test_bug528292.js]
[test_bug540566.js]
@ -61,11 +67,21 @@ tail =
[test_bug618835.js]
[test_bug633743.js]
[test_bug650955.js]
# Bug 677427: test fails consistently on Android
fail-if = os == "android"
[test_bug652761.js]
[test_bug651100.js]
# Bug 675044: test fails consistently on Android
fail-if = os == "android"
[test_bug654926.js]
# Bug 675049: test fails consistently on Android
fail-if = os == "android"
[test_bug654926_doom_and_read.js]
# Bug 675049: test fails consistently on Android
fail-if = os == "android"
[test_bug654926_test_seek.js]
# Bug 675049: test fails consistently on Android
fail-if = os == "android"
[test_bug659569.js]
[test_bug660066.js]
[test_bug651185.js]
@ -83,13 +99,29 @@ tail =
[test_event_sink.js]
[test_extract_charset_from_content_type.js]
[test_fallback_no-cache-entry_canceled.js]
# Bug 675039: test hangs consistently on Android
skip-if = os == "android"
[test_fallback_no-cache-entry_passing.js]
# Bug 675039: test hangs consistently on Android
skip-if = os == "android"
[test_fallback_redirect-to-different-origin_canceled.js]
# Bug 675039: test hangs consistently on Android
skip-if = os == "android"
[test_fallback_redirect-to-different-origin_passing.js]
# Bug 675039: test hangs consistently on Android
skip-if = os == "android"
[test_fallback_request-error_canceled.js]
# Bug 675039: test hangs consistently on Android
skip-if = os == "android"
[test_fallback_request-error_passing.js]
# Bug 675039: test hangs consistently on Android
skip-if = os == "android"
[test_fallback_response-error_canceled.js]
# Bug 675039: test hangs consistently on Android
skip-if = os == "android"
[test_fallback_response-error_passing.js]
# Bug 675039: test hangs consistently on Android
skip-if = os == "android"
[test_file_partial_inputstream.js]
[test_file_protocol.js]
[test_filestreams.js]
@ -131,6 +163,8 @@ tail =
[test_simple.js]
[test_sockettransportsvc_available.js]
[test_socks.js]
# Bug 675039: test hangs consistently on Android
skip-if = os == "android"
[test_standardurl.js]
[test_standardurl_port.js]
[test_streamcopier.js]

View File

@ -3,5 +3,11 @@ head =
tail =
[test_datasignatureverifier.js]
# Bug 676972: test hangs consistently on Android
skip-if = os == "android"
[test_hash_algorithms.js]
# Bug 676972: test hangs consistently on Android
skip-if = os == "android"
[test_hmac.js]
# Bug 676972: test hangs consistently on Android
skip-if = os == "android"

View File

@ -5,3 +5,5 @@ tail =
[test_crypto_crypt.js]
[test_crypto_deriveKey.js]
[test_crypto_random.js]
# Bug 676977: test hangs consistently on Android
skip-if = os == "android"

View File

@ -34,7 +34,8 @@ tail =
[test_interval_triggers.js]
[test_jpakeclient.js]
# Bug 618233: this test produces random failures on Windows 7.
skip-if = os == "win"
# Bug 676978: test hangs on Android (see also testing/xpcshell/xpcshell.ini)
skip-if = os == "win" || os == "android"
[test_keys.js]
[test_load_modules.js]
[test_log4moz.js]
@ -60,7 +61,8 @@ skip-if = os == "win"
[test_service_detect_upgrade.js]
[test_service_filelog.js]
# Bug 664090: this test persistently fails on Windows opt builds.
skip-if = os == "win" && !debug
# Bug 676978: test hangs on Android (see also testing/xpcshell/xpcshell.ini)
skip-if = (os == "win" && !debug) || os == "android"
[test_service_getStorageInfo.js]
[test_service_login.js]
[test_service_migratePrefs.js]
@ -71,14 +73,17 @@ skip-if = os == "win" && !debug
[test_service_sync_401.js]
[test_service_sync_checkServerError.js]
# Bug 604565: this test intermittently hangs on OS X debug builds.
skip-if = os == "mac" && debug
# Bug 676978: test hangs on Android (see also testing/xpcshell/xpcshell.ini)
skip-if = (os == "mac" && debug) || os == "android"
[test_service_sync_locked.js]
[test_service_sync_remoteSetup.js]
# Bug 604565: this test intermittently hangs on OS X debug builds.
skip-if = os == "mac" && debug
# Bug 676978: test hangs on Android (see also testing/xpcshell/xpcshell.ini)
skip-if = (os == "mac" && debug) || os == "android"
[test_service_sync_updateEnabledEngines.js]
# Bug 604565: this test intermittently hangs on OS X debug builds.
skip-if = os == "mac" && debug
# Bug 676978: test hangs on Android (see also testing/xpcshell/xpcshell.ini)
skip-if = (os == "mac" && debug) || os == "android"
[test_service_verifyLogin.js]
[test_service_wipeClient.js]
[test_service_wipeServer.js]
@ -87,7 +92,8 @@ skip-if = os == "mac" && debug
[test_syncengine.js]
[test_syncengine_sync.js]
# Bug 604565: this test intermittently hangs on OS X debug builds.
skip-if = os == "mac" && debug
# Bug 676978: test hangs on Android (see also testing/xpcshell/xpcshell.ini)
skip-if = (os == "mac" && debug) || os == "android"
[test_syncscheduler.js]
[test_syncstoragerequest.js]
[test_tab_engine.js]

View File

@ -7,6 +7,8 @@ tail =
[test_bug-429521.js]
[test_bug-444233.js]
[test_chunk_growth.js]
# Bug 676981: test fails consistently on Android
fail-if = os == "android"
[test_connection_executeAsync.js]
[test_js_helpers.js]
[test_levenshtein.js]
@ -30,3 +32,5 @@ tail =
[test_unicode.js]
[test_vacuum.js]
[test_telemetry_vfs.js]
# Bug 676981: test fails consistently on Android
# fail-if = os == "android"

View File

@ -201,6 +201,29 @@ xpcshell-tests:
$(TEST_PATH_ARG) $(EXTRA_TEST_ARGS) \
$(LIBXUL_DIST)/bin/xpcshell
REMOTE_XPCSHELL = \
rm -f ./$@.log && \
$(PYTHON) -u $(topsrcdir)/config/pythonpath.py \
-I$(topsrcdir)/build \
-I$(topsrcdir)/build/mobile \
$(topsrcdir)/testing/xpcshell/remotexpcshelltests.py \
--manifest=$(DEPTH)/_tests/xpcshell/xpcshell.ini \
--build-info-json=$(DEPTH)/mozinfo.json \
--no-logfiles \
--dm_trans=$(DM_TRANS) \
--deviceIP=${TEST_DEVICE} \
--objdir=$(DEPTH) \
$(SYMBOLS_PATH) \
$(TEST_PATH_ARG) $(EXTRA_TEST_ARGS)
xpcshell-tests-remote: DM_TRANS?=adb
xpcshell-tests-remote:
@if [ "${TEST_DEVICE}" != "" -o "$(DM_TRANS)" = "adb" ]; \
then $(call REMOTE_XPCSHELL); $(CHECK_TEST_ERROR); \
else \
echo "please prepare your host with environment variables for TEST_DEVICE"; \
fi
# install and run the mozmill tests
$(DEPTH)/_tests/mozmill:
$(MAKE) -C $(DEPTH)/testing/mozmill install-develop PKG_STAGE=../../_tests

View File

@ -36,265 +36,302 @@
#
# ***** END LICENSE BLOCK ***** */
import re, sys, os, os.path, logging, shutil, signal
from glob import glob
from optparse import OptionParser
from subprocess import Popen, PIPE, STDOUT
from tempfile import mkdtemp
import re, sys, os
import runxpcshelltests as xpcshell
from automationutils import *
import devicemanager
import devicemanager, devicemanagerADB, devicemanagerSUT
# A specialization of XPCShellTests that runs tests on an Android device
# via devicemanager.
class XPCShellRemote(xpcshell.XPCShellTests, object):
def __init__(self, devmgr):
self.device = devmgr
self.testRoot = "/tests/xpcshell"
def __init__(self, devmgr, options, args):
xpcshell.XPCShellTests.__init__(self)
self.profileDir = self.testRoot + '/profile'
self.device.mkDir(self.profileDir)
self.options = options
self.device = devmgr
self.pathMapping = []
self.remoteTestRoot = self.device.getTestRoot("xpcshell")
# Terse directory names are used here ("b" for a binaries directory)
# to minimize the length of the command line used to execute
# xpcshell on the remote device. adb has a limit to the number
# of characters used in a shell command, and the xpcshell command
# line can be quite complex.
self.remoteBinDir = self.remoteJoin(self.remoteTestRoot, "b")
self.remoteScriptsDir = self.remoteTestRoot
self.remoteComponentsDir = self.remoteJoin(self.remoteTestRoot, "c")
self.profileDir = self.remoteJoin(self.remoteTestRoot, "p")
if options.setup:
self.setupUtilities()
self.setupTestDir()
self.remoteAPK = self.remoteJoin(self.remoteBinDir, os.path.basename(options.localAPK))
self.remoteDebugger = options.debugger
self.remoteDebuggerArgs = options.debuggerArgs
#todo: figure out the remote version of this, only used for debuggerInfo
def getcwd(self):
return "/tests/"
def readManifest(self, manifest):
"""Given a manifest file containing a list of test directories,
return a list of absolute paths to the directories contained within."""
def remoteJoin(self, path1, path2):
joined = os.path.join(path1, path2)
joined = joined.replace('\\', '/')
return joined
manifestdir = self.testRoot + '/tests'
testdirs = []
try:
f = self.device.getFile(manifest, "temp.txt")
for line in f.split():
dir = line.rstrip()
path = manifestdir + '/' + dir
testdirs.append(path)
f.close()
except:
pass # just eat exceptions
return testdirs
def remoteForLocal(self, local):
for mapping in self.pathMapping:
if (os.path.abspath(mapping.local) == os.path.abspath(local)):
return mapping.remote
return local
def verifyFilePath(self, fileName):
# approot - path to root of application - firefox or fennec
# xreroot - path to xulrunner binaries - firefox or fennec/xulrunner
# xpcshell - full or relative path to xpcshell binary
#given fileName, returns full path of existing file
if (self.device.fileExists(fileName)):
return fileName
fileName = self.device.getAppRoot() + '/xulrunner/' + fileName.split('/')[-1]
if (self.device.fileExists(fileName)):
return fileName
fileName = self.device.getAppRoot() + '/' + fileName.split('/')[-1]
if (not self.device.fileExists(fileName)):
raise devicemanager.FileError("No File found for: " + str(fileName))
def setupUtilities(self):
remotePrefDir = self.remoteJoin(self.remoteBinDir, "defaults/pref")
if (not self.device.dirExists(remotePrefDir)):
self.device.mkDirs(self.remoteJoin(remotePrefDir, "extra"))
if (not self.device.dirExists(self.remoteScriptsDir)):
self.device.mkDir(self.remoteScriptsDir)
if (not self.device.dirExists(self.remoteComponentsDir)):
self.device.mkDir(self.remoteComponentsDir)
return fileName
local = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'head.js')
self.device.pushFile(local, self.remoteScriptsDir)
def verifyDirPath(self, fileName):
# approot - path to root of application - firefox or fennec
# xreroot - path to xulrunner binaries - firefox or fennec/xulrunner
# xpcshell - full or relative path to xpcshell binary
#given fileName, returns full path of existing file
if (self.device.dirExists(fileName)):
return fileName
fileName = self.device.getAppRoot() + '/' + fileName.split('/')[-1]
if (self.device.dirExists(fileName)):
return fileName
fileName = self.device.getDeviceRoot() + '/' + fileName.split('/')[-1]
if (not self.device.dirExists(fileName)):
raise devicemanager.FileError("No Dir found for: " + str(fileName))
return fileName
localBin = os.path.join(self.options.objdir, "dist/bin")
if not os.path.exists(localBin):
localBin = os.path.join(self.options.objdir, "bin")
if not os.path.exists(localBin):
print >>sys.stderr, "Error: could not find bin in objdir"
sys.exit(1)
def setAbsPath(self):
#testharnessdir is used for head.js
self.testharnessdir = "/tests/xpcshell/"
local = os.path.join(localBin, "xpcshell")
self.device.pushFile(local, self.remoteBinDir)
# If the file exists then we have a full path (no notion of cwd)
self.xpcshell = self.verifyFilePath(self.xpcshell)
if self.xrePath is None:
# If no xrePath, assume it is the directory containing xpcshell
self.xrePath = '/'.join(self.xpcshell.split('/')[:-1])
else:
self.xrePath = self.verifyDirPath(self.xrePath)
local = os.path.join(localBin, "plugin-container")
self.device.pushFile(local, self.remoteBinDir)
# we assume that httpd.js lives in components/ relative to xpcshell
self.httpdJSPath = self.xrePath + '/components/httpd.js'
local = os.path.join(localBin, "components/httpd.js")
self.device.pushFile(local, self.remoteComponentsDir)
local = os.path.join(localBin, "components/httpd.manifest")
self.device.pushFile(local, self.remoteComponentsDir)
local = os.path.join(localBin, "components/test_necko.xpt")
self.device.pushFile(local, self.remoteComponentsDir)
self.device.pushFile(self.options.localAPK, self.remoteBinDir)
localLib = os.path.join(self.options.objdir, "dist/fennec")
if not os.path.exists(localLib):
localLib = os.path.join(self.options.objdir, "fennec/lib")
if not os.path.exists(localLib):
print >>sys.stderr, "Error: could not find libs in objdir"
sys.exit(1)
for file in os.listdir(localLib):
if (file.endswith(".so")):
self.device.pushFile(os.path.join(localLib, file), self.remoteBinDir)
def setupTestDir(self):
xpcDir = os.path.join(self.options.objdir, "_tests/xpcshell")
self.device.pushDir(xpcDir, self.remoteScriptsDir)
def buildTestList(self):
xpcshell.XPCShellTests.buildTestList(self)
uniqueTestPaths = set([])
for test in self.alltests:
uniqueTestPaths.add(test['here'])
for testdir in uniqueTestPaths:
xpcDir = os.path.join(self.options.objdir, "_tests/xpcshell")
abbrevTestDir = os.path.relpath(testdir, xpcDir)
remoteScriptDir = self.remoteJoin(self.remoteScriptsDir, abbrevTestDir)
self.pathMapping.append(PathMapping(testdir, remoteScriptDir))
def buildXpcsCmd(self, testdir):
# <head.js> has to be loaded by xpchell: it can't load itself.
self.env["XPCSHELL_TEST_PROFILE_DIR"] = self.profileDir
self.xpcsCmd = [self.xpcshell, '-g', self.xrePath, '-v', '170', '-j', '-s', \
"--environ:CWD='" + testdir + "'", \
"--environ:XPCSHELL_TEST_PROFILE_DIR='" + self.env["XPCSHELL_TEST_PROFILE_DIR"] + "'", \
'-e', 'const _HTTPD_JS_PATH = \'%s\';' % self.httpdJSPath,
'-f', self.testharnessdir + '/head.js']
self.xpcsCmd = [
self.remoteJoin(self.remoteBinDir, "xpcshell"),
'-r', self.remoteJoin(self.remoteComponentsDir, 'httpd.manifest'),
'--greomni', self.remoteAPK,
'-j', '-s',
'-e', 'const _HTTPD_JS_PATH = "%s";' % self.remoteJoin(self.remoteComponentsDir, 'httpd.js'),
'-e', 'const _HEAD_JS_PATH = "%s";' % self.remoteJoin(self.remoteScriptsDir, 'head.js'),
'-f', self.remoteScriptsDir+'/head.js']
if self.debuggerInfo:
self.xpcsCmd = [self.debuggerInfo["path"]] + self.debuggerInfo["args"] + self.xpcsCmd
if self.remoteDebugger:
# for example, "/data/local/gdbserver" "localhost:12345"
self.xpcsCmd = [
self.remoteDebugger,
self.remoteDebuggerArgs,
self.xpcsCmd]
def getHeadFiles(self, testdir):
# get the list of head and tail files from the directory
testHeadFiles = []
for f in self.device.listFiles(testdir):
hdmtch = re.compile("head_.*\.js")
if (hdmtch.match(f)):
testHeadFiles += [(testdir + '/' + f).replace('/', '//')]
return sorted(testHeadFiles)
def getTailFiles(self, testdir):
testTailFiles = []
# Tails are executed in the reverse order, to "match" heads order,
# as in "h1-h2-h3 then t3-t2-t1".
for f in self.device.listFiles(testdir):
tlmtch = re.compile("tail_.*\.js")
if (tlmtch.match(f)):
testTailFiles += [(testdir + '/' + f).replace('/', '//')]
return reversed(sorted(testTailFiles))
def getHeadFiles(self, test):
self.remoteHere = self.remoteForLocal(test['here'])
return [f.strip() for f in sorted(test['head'].split(' ')) if self.device.fileExists(self.remoteJoin(self.remoteHere, f))]
def getTailFiles(self, test):
return [f.strip() for f in sorted(test['tail'].split(' ')) if self.device.fileExists(self.remoteJoin(self.remoteHere, f))]
def getTestFiles(self, testdir):
testfiles = []
# if a single test file was specified, we only want to execute that test
for f in self.device.listFiles(testdir):
tstmtch = re.compile("test_.*\.js")
if (tstmtch.match(f)):
testfiles += [(testdir + '/' + f).replace('/', '//')]
for f in testfiles:
if (self.singleFile == f.split('/')[-1]):
return [(testdir + '/' + f).replace('/', '//')]
else:
pass
return testfiles
def buildCmdTestFile(self, name):
remoteDir = self.remoteForLocal(os.path.dirname(name))
if remoteDir == self.remoteHere:
remoteName = os.path.basename(name)
else:
remoteName = self.remoteJoin(remoteDir, os.path.basename(name))
return ['-e', 'const _TEST_FILE = ["%s"];' %
replaceBackSlashes(remoteName)]
def setupProfileDir(self):
self.device.removeDir(self.profileDir)
self.device.mkDir(self.profileDir)
self.env["XPCSHELL_TEST_PROFILE_DIR"] = self.profileDir
if self.interactive or self.singleFile:
self.log.info("TEST-INFO | profile dir is %s" % self.profileDir)
return self.profileDir
def setupLeakLogging(self):
filename = "runxpcshelltests_leaks.log"
# Enable leaks (only) detection to its own log file.
leakLogFile = self.profileDir + '/' + filename
self.env["XPCOM_MEM_LEAK_LOG"] = leakLogFile
return leakLogFile
def launchProcess(self, cmd, stdout, stderr, env, cwd):
print "launching : " + " ".join(cmd)
proc = self.device.launchProcess(cmd, cwd=cwd)
# Some xpcshell arguments contain characters that are interpretted
# by the adb shell; enclose these arguments in quotes.
index = 0
for part in cmd:
if (part.find(" ")>=0 or part.find("(")>=0 or part.find(")")>=0 or part.find("\"")>=0):
part = '\''+part+'\''
cmd[index] = part
index = index + 1
xpcshell = self.remoteJoin(self.remoteBinDir, "xpcshell")
shellArgs = "cd "+self.remoteHere
shellArgs += "; LD_LIBRARY_PATH="+self.remoteBinDir
shellArgs += "; export CACHE_PATH="+self.remoteBinDir
shellArgs += "; export GRE_HOME="+self.device.getAppRoot()
shellArgs += "; export XPCSHELL_TEST_PROFILE_DIR="+self.profileDir
shellArgs += "; "+xpcshell+" "
shellArgs += " ".join(cmd[1:])
if self.verbose:
self.log.info(shellArgs)
# If the adb version of devicemanager is used and the arguments passed
# to adb exceed ~1024 characters, the command may not execute.
if len(shellArgs) > 1000:
self.log.info("adb command length is excessive and may cause failure")
proc = self.device.runCmd(["shell", shellArgs])
return proc
def setSignal(self, proc, sig1, sig2):
self.device.signal(proc, sig1, sig2)
def communicate(self, proc):
return self.device.communicate(proc)
return proc.communicate()
def removeDir(self, dirname):
self.device.removeDir(dirname)
def getReturnCode(self, proc):
return self.device.getReturnCode(proc)
return proc.returncode
#TODO: consider creating a separate log dir. We don't have the test file structure,
# so we use filename.log. Would rather see ./logs/filename.log
def createLogFile(self, test, stdout):
def createLogFile(self, test, stdout, leakLogs):
try:
f = None
filename = test.replace('\\', '/').split('/')[-1] + ".log"
f = open(filename, "w")
f.write(stdout)
if os.path.exists(self.leakLogFile):
leaks = open(self.leakLogFile, "r")
for leakLog in leakLogs:
if os.path.exists(leakLog):
leaks = open(leakLog, "r")
f.write(leaks.read())
leaks.close()
finally:
if f <> None:
f.close()
#NOTE: the only difference between this and parent is the " vs ' arond the filename
def buildCmdHead(self, headfiles, tailfiles, xpcscmd):
cmdH = ", ".join(['\'' + f.replace('\\', '/') + '\''
for f in headfiles])
cmdT = ", ".join(['\'' + f.replace('\\', '/') + '\''
for f in tailfiles])
cmdH = xpcscmd + \
['-e', 'const _HEAD_FILES = [%s];' % cmdH] + \
['-e', 'const _TAIL_FILES = [%s];' % cmdT]
return cmdH
class RemoteXPCShellOptions(xpcshell.XPCShellOptions):
def __init__(self):
xpcshell.XPCShellOptions.__init__(self)
self.add_option("--device",
type="string", dest="device", default='',
help="ip address for the device")
def __init__(self):
xpcshell.XPCShellOptions.__init__(self)
defaults = {}
self.add_option("--deviceIP", action="store",
type = "string", dest = "deviceIP",
help = "ip address of remote device to test")
defaults["deviceIP"] = None
self.add_option("--devicePort", action="store",
type = "string", dest = "devicePort",
help = "port of remote device to test")
defaults["devicePort"] = 20701
self.add_option("--dm_trans", action="store",
type = "string", dest = "dm_trans",
help = "the transport to use to communicate with device: [adb|sut]; default=sut")
defaults["dm_trans"] = "sut"
self.add_option("--objdir", action="store",
type = "string", dest = "objdir",
help = "local objdir, containing xpcshell binaries")
defaults["objdir"] = None
self.add_option("--apk", action="store",
type = "string", dest = "localAPK",
help = "local path to Fennec APK")
defaults["localAPK"] = None
self.add_option("--noSetup", action="store_false",
dest = "setup",
help = "do not copy any files to device (to be used only if device is already setup)")
defaults["setup"] = True
self.set_defaults(**defaults)
class PathMapping:
def __init__(self, localDir, remoteDir):
self.local = localDir
self.remote = remoteDir
def main():
parser = RemoteXPCShellOptions()
options, args = parser.parse_args()
dm_none = devicemanagerADB.DeviceManagerADB(None, None)
parser = RemoteXPCShellOptions()
options, args = parser.parse_args()
if len(args) < 2 and options.manifest is None or \
(len(args) < 1 and options.manifest is not None):
print "len(args): " + str(len(args))
print >>sys.stderr, """Usage: %s <path to xpcshell> <test dirs>
or: %s --manifest=test.manifest <path to xpcshell>""" % (sys.argv[0],
sys.argv[0])
sys.exit(1)
if len(args) < 1 and options.manifest is None:
print >>sys.stderr, """Usage: %s <test dirs>
or: %s --manifest=test.manifest """ % (sys.argv[0], sys.argv[0])
sys.exit(1)
if (options.device == ''):
print >>sys.stderr, "Error: Please provide an ip address for the remote device with the --device option"
sys.exit(1)
if (options.dm_trans == "adb"):
if (options.deviceIP):
dm = devicemanagerADB.DeviceManagerADB(options.deviceIP, options.devicePort)
else:
dm = dm_none
else:
dm = devicemanagerSUT.DeviceManagerSUT(options.deviceIP, options.devicePort)
if (options.deviceIP == None):
print "Error: you must provide a device IP to connect to via the --device option"
sys.exit(1)
if options.interactive and not options.testPath:
print >>sys.stderr, "Error: You must specify a test filename in interactive mode!"
sys.exit(1)
dm = devicemanager.DeviceManager(options.device, 20701)
xpcsh = XPCShellRemote(dm)
debuggerInfo = getDebuggerInfo(xpcsh.oldcwd, options.debugger, options.debuggerArgs,
options.debuggerInteractive);
if not options.objdir:
print >>sys.stderr, "Error: You must specify an objdir"
sys.exit(1)
if options.interactive and not options.testPath:
print >>sys.stderr, "Error: You must specify a test filename in interactive mode!"
sys.exit(1)
if not options.localAPK:
for file in os.listdir(os.path.join(options.objdir, "dist")):
if (file.endswith(".apk") and file.startswith("fennec")):
options.localAPK = os.path.join(options.objdir, "dist")
options.localAPK = os.path.join(options.localAPK, file)
print >>sys.stderr, "using APK: " + options.localAPK
break
if not options.localAPK:
print >>sys.stderr, "Error: please specify an APK"
sys.exit(1)
# Zip up the xpcshell directory: 7z a <zipName> xpcshell/*, assuming we are in the xpcshell directory
# TODO: ensure the system has 7z, this is adding a new dependency to the overall system
zipName = 'xpcshell.7z'
try:
Popen(['7z', 'a', zipName, '../xpcshell']).wait()
except:
print "to run these tests remotely, we require 7z to be installed and in your path"
sys.exit(1)
xpcsh = XPCShellRemote(dm, options, args)
if dm.pushFile(zipName, '/tests/xpcshell.7z') == None:
raise devicemanager.FileError("failed to copy xpcshell.7z to device")
if dm.unpackFile('xpcshell.7z') == None:
raise devicemanager.FileError("failed to unpack xpcshell.7z on the device")
if not xpcsh.runTests(xpcshell='xpcshell',
testdirs=args[0:],
**options.__dict__):
sys.exit(1)
if not xpcsh.runTests(args[0],
xrePath=options.xrePath,
symbolsPath=options.symbolsPath,
manifest=options.manifest,
testdirs=args[1:],
testPath=options.testPath,
interactive=options.interactive,
logfiles=options.logfiles,
debuggerInfo=debuggerInfo):
sys.exit(1)
if __name__ == '__main__':
main()

View File

@ -261,7 +261,7 @@ class XPCShellTests(object):
test['head'] is a whitespace delimited list of head files.
return the list of head files as paths including the subdir if the head file exists
On a remote system, this is overloaded to list files in a remote directory structure.
On a remote system, this may be overloaded to list files in a remote directory structure.
"""
return [os.path.join(test['here'], f).strip() for f in sorted(test['head'].split(' ')) if os.path.isfile(os.path.join(test['here'], f))]
@ -270,7 +270,7 @@ class XPCShellTests(object):
test['tail'] is a whitespace delimited list of head files.
return the list of tail files as paths including the subdir if the tail file exists
On a remote system, this is overloaded to list files in a remote directory structure.
On a remote system, this may be overloaded to list files in a remote directory structure.
"""
return [os.path.join(test['here'], f).strip() for f in sorted(test['tail'].split(' ')) if os.path.isfile(os.path.join(test['here'], f))]
@ -280,7 +280,7 @@ class XPCShellTests(object):
When running check-interactive and check-one, the directory is well-defined and
retained for inspection once the tests complete.
On a remote system, we overload this to use a remote path structure.
On a remote system, this may be overloaded to use a remote path structure.
"""
if self.interactive or self.singleFile:
profileDir = os.path.join(gettempdir(), self.profileName, "xpcshellprofile")
@ -301,7 +301,7 @@ class XPCShellTests(object):
"""
Enable leaks (only) detection to its own log file and set environment variables.
On a remote system, we overload this to use a remote filename and path structure
On a remote system, this may be overloaded to use a remote filename and path structure
"""
filename = "runxpcshelltests_leaks.log"
@ -381,12 +381,20 @@ class XPCShellTests(object):
'-e', 'const _HEAD_FILES = [%s];' % cmdH,
'-e', 'const _TAIL_FILES = [%s];' % cmdT]
def buildCmdTestFile(self, name):
"""
Build the command line arguments for the test file.
On a remote system, this may be overloaded to use a remote path structure.
"""
return ['-e', 'const _TEST_FILE = ["%s"];' %
replaceBackSlashes(name)]
def runTests(self, xpcshell, xrePath=None, appPath=None, symbolsPath=None,
manifest=None, testdirs=[], testPath=None,
interactive=False, verbose=False, keepGoing=False, logfiles=True,
thisChunk=1, totalChunks=1, debugger=None,
debuggerArgs=None, debuggerInteractive=False,
profileName=None, mozInfo=None):
profileName=None, mozInfo=None, **otherOptions):
"""Run xpcshell tests.
|xpcshell|, is the xpcshell executable to use to run the tests.
@ -410,6 +418,7 @@ class XPCShellTests(object):
|profileName|, if set, specifies the name of the application for the profile
directory if running only a subset of tests.
|mozInfo|, if set, specifies specifies build configuration information, either as a filename containing JSON, or a dict.
|otherOptions| may be present for the convenience of subclasses
"""
global gotSIGINT
@ -491,8 +500,7 @@ class XPCShellTests(object):
self.leakLogFile = self.setupLeakLogging()
# The test file will have to be loaded after the head files.
cmdT = ['-e', 'const _TEST_FILE = ["%s"];' %
replaceBackSlashes(name)]
cmdT = self.buildCmdTestFile(name)
try:
self.log.info("TEST-INFO | %s | running test ..." % name)
@ -515,8 +523,9 @@ class XPCShellTests(object):
def print_stdout(stdout):
"""Print stdout line-by-line to avoid overflowing buffers."""
self.log.info(">>>>>>>")
for line in stdout.splitlines():
self.log.info(line)
if (stdout):
for line in stdout.splitlines():
self.log.info(line)
self.log.info("<<<<<<<")
result = not ((self.getReturnCode(proc) != 0) or

View File

@ -15,6 +15,8 @@
[include:toolkit/components/commandlines/test/unit/xpcshell.ini]
[include:toolkit/components/contentprefs/tests/unit/xpcshell.ini]
[include:toolkit/components/passwordmgr/test/unit/xpcshell.ini]
# Bug 676989: tests hang on Android
skip-if = os == "android"
[include:toolkit/components/places/tests/migration/xpcshell.ini]
[include:toolkit/components/places/tests/autocomplete/xpcshell.ini]
[include:toolkit/components/places/tests/expiration/xpcshell.ini]
@ -59,6 +61,8 @@
[include:services/crypto/tests/unit/xpcshell.ini]
[include:services/crypto/components/tests/unit/xpcshell.ini]
[include:services/sync/tests/unit/xpcshell.ini]
# Bug 676978: tests hang on Android
skip-if = os == "android"
[include:browser/components/dirprovider/tests/unit/xpcshell.ini]
[include:browser/components/feeds/test/unit/xpcshell.ini]
[include:browser/components/places/tests/unit/xpcshell.ini]

View File

@ -3,3 +3,5 @@ head =
tail =
[test_jsctypes.js]
# Bug 676989: test fails consistently on Android
fail-if = os == "android"

View File

@ -11,8 +11,12 @@ tail =
[test_bug_409179.js]
[test_bug_420230.js]
[test_cancel_download_files_removed.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_download_manager.js]
[test_download_samename.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_history_expiration.js]
[test_memory_db_support.js]
[test_offline_support.js]

View File

@ -8,8 +8,14 @@ tail =
[test_418257.js]
[test_422277.js]
[test_autocomplete_on_value_removed_479089.js]
# Bug 676989: test fails consistently on Android
fail-if = os == "android"
[test_download_embed_bookmarks.js]
# Bug 676989: test fails consistently on Android
fail-if = os == "android"
[test_empty_search.js]
# Bug 676989: test fails consistently on Android
fail-if = os == "android"
[test_enabled.js]
[test_escape_self.js]
[test_ignore_protocol.js]

View File

@ -3,14 +3,24 @@ head = head_expiration.js
tail =
[test_analyze_runs.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_annos_expire_history.js]
[test_annos_expire_never.js]
[test_annos_expire_policy.js]
[test_annos_expire_session.js]
# Bug 676989: test fails consistently on Android
fail-if = os == "android"
[test_notifications.js]
# Bug 676989: test fails consistently on Android
fail-if = os == "android"
[test_notifications_onDeleteURI.js]
[test_notifications_onDeleteVisits.js]
[test_pref_interval.js]
# Bug 676989: test fails consistently on Android
fail-if = os == "android"
[test_pref_maxpages.js]
# Bug 676989: test fails consistently on Android
fail-if = os == "android"
[test_removeAllPages.js]
[test_debug_expiration.js]

View File

@ -13,6 +13,8 @@ tail =
[test_onlyBookmarked.js]
[test_querySerialization.js]
[test_redirectsMode.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_results-as-tag-contents-query.js]
[test_results-as-visit.js]
[test_searchterms-domain.js]
@ -20,5 +22,11 @@ tail =
[test_searchterms-bookmarklets.js]
[test_sort-date-site-grouping.js]
[test_sorting.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_tags.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_transitions.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"

View File

@ -5,6 +5,8 @@ tail =
[test_000_frecency.js]
[test_248970.js]
[test_317472.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_331487.js]
[test_385397.js]
[test_399264_query_to_string.js]
@ -16,6 +18,8 @@ tail =
[test_405497.js]
[test_408221.js]
[test_412132.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_413784.js]
[test_415460.js]
[test_415757.js]
@ -37,9 +41,13 @@ tail =
[test_486978_sort_by_date_queries.js]
[test_536081.js]
[test_adaptive.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_adaptive_bug527311.js]
[test_annotations.js]
[test_asyncExecuteLegacyQueries.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_async_history_api.js]
[test_autocomplete_stopSearch_no_throw.js]
[test_bookmark_catobs.js]
@ -52,12 +60,20 @@ tail =
[test_database_replaceOnStartup.js]
[test_doSetAndLoadFaviconForPage.js]
[test_doSetAndLoadFaviconForPage_failures.js]
# Bug 676989: test fails consistently on Android
fail-if = os == "android"
[test_download_history.js]
# Bug 676989: test fails consistently on Android
fail-if = os == "android"
[test_dynamic_containers.js]
[test_exclude_livemarks.js]
[test_faviconService_expireAllFavicons.js]
[test_favicons.js]
# Bug 676989: test fails consistently on Android
fail-if = os == "android"
[test_frecency.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_getChildIndex.js]
[test_history.js]
[test_history_autocomplete_tags.js]
@ -65,6 +81,8 @@ tail =
[test_history_notifications.js]
[test_history_observer.js]
[test_history_removeAllPages.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_history_sidebar.js]
[test_isvisited.js]
[test_lastModified.js]
@ -79,15 +97,23 @@ tail =
[test_onItemChanged_tags.js]
[test_placeURIs.js]
[test_preventive_maintenance.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_preventive_maintenance_checkAndFixDatabase.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_preventive_maintenance_console.js]
[test_removeVisitsByTimeframe.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_resolveNullBookmarkTitles.js]
[test_result_sort.js]
[test_sql_guid_functions.js]
[test_tag_autocomplete_search.js]
[test_tagging.js]
[test_update_frecency_after_delete.js]
# Bug 676989: test hangs consistently on Android
skip-if = os == "android"
[test_utils_backups_create.js]
[test_utils_getURLsForContainerNode.js]
[test_utils_setAnnotationsFor.js]

View File

@ -4,6 +4,8 @@ tail =
[test_autocomplete.js]
[test_bug_248970.js]
# Bug 676989: test hangs on Android
skip-if = os == "android"
[test_db_corrupt.js]
[test_db_update_v1.js]
[test_db_update_v1b.js]

View File

@ -4,3 +4,5 @@ tail =
[test_nsITelemetry.js]
[test_TelemetryPing.js]
# Bug 676989: test fails consistently on Android
# fail-if = os == "android"

View File

@ -3461,13 +3461,18 @@ var XPIProvider = {
let principal = Cc["@mozilla.org/systemprincipal;1"].
createInstance(Ci.nsIPrincipal);
this.bootstrapScopes[aId] = new Components.utils.Sandbox(principal);
if (!aFile.exists()) {
this.bootstrapScopes[aId] = new Components.utils.Sandbox(principal,
{sandboxName: aFile.path});
ERROR("Attempted to load bootstrap scope from missing directory " + bootstrap.path);
return;
}
let uri = getURIForResourceInFile(aFile, "bootstrap.js").spec;
this.bootstrapScopes[aId] = new Components.utils.Sandbox(principal,
{sandboxName: uri});
let loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
createInstance(Ci.mozIJSSubScriptLoader);
@ -3475,8 +3480,7 @@ var XPIProvider = {
// As we don't want our caller to control the JS version used for the
// bootstrap file, we run loadSubScript within the context of the
// sandbox with the latest JS version set explicitly.
this.bootstrapScopes[aId].__SCRIPT_URI_SPEC__ =
getURIForResourceInFile(aFile, "bootstrap.js").spec;
this.bootstrapScopes[aId].__SCRIPT_URI_SPEC__ = uri;
Components.utils.evalInSandbox(
"Components.classes['@mozilla.org/moz/jssubscript-loader;1'] \
.createInstance(Components.interfaces.mozIJSSubScriptLoader) \

View File

@ -3,35 +3,91 @@ head = head_addons.js
tail =
[test_AddonRepository.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_AddonRepository_cache.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_LightweightThemeManager.js]
[test_badschema.js]
[test_blocklistchange.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bootstrap.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug299716.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug299716_2.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug324121.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug335238.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug371495.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug384052.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug393285.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug394300.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug397778.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug406118.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug424262.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug425657.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug430120.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug449027.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug455906.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug465190.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug468528.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug470377_1.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug470377_2.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug470377_3.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug470377_4.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug514327_1.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug514327_2.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug514327_3.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_bug521905.js]
[test_bug526598.js]
[test_bug541420.js]
@ -39,6 +95,8 @@ tail =
[test_bug554133.js]
[test_bug559800.js]
[test_bug563256.js]
# Bug 676992: test consistently fails on Android
fail-if = os == "android"
[test_bug564030.js]
[test_bug566626.js]
[test_bug567184.js]
@ -53,6 +111,8 @@ tail =
[test_bug596343.js]
[test_bug596607.js]
[test_bug616841.js]
# Bug 676992: test consistently fails on Android
fail-if = os == "android"
[test_bug619730.js]
[test_bug620837.js]
[test_bug655254.js]
@ -63,9 +123,15 @@ tail =
[test_disable.js]
[test_distribution.js]
[test_dss.js]
# Bug 676992: test consistently fails on Android
fail-if = os == "android"
[test_duplicateplugins.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_error.js]
[test_filepointer.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_fuel.js]
[test_general.js]
[test_getresource.js]
@ -83,6 +149,8 @@ tail =
[test_gfxBlacklist_Vendor.js]
[test_gfxBlacklist_prefs.js]
[test_install.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_locale.js]
[test_locked.js]
[test_manifest.js]
@ -91,15 +159,29 @@ tail =
[test_migrate3.js]
[test_permissions.js]
[test_plugins.js]
# Bug 676992: test consistently fails on Android
fail-if = os == "android"
[test_registry.js]
[test_safemode.js]
[test_startup.js]
# Bug 676992: test consistently fails on Android
fail-if = os == "android"
[test_targetPlatforms.js]
[test_theme.js]
# Bug 676992: test consistently fails on Android
fail-if = os == "android"
[test_types.js]
[test_uninstall.js]
[test_update.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_updatecheck.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_updateid.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_upgrade.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"

View File

@ -3,3 +3,5 @@ head =
tail =
[test_0010_timermanager.js]
# Bug 676992: test consistently fails on Android
fail-if = os == "android"

View File

@ -102,6 +102,9 @@ ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2)
CPPSRCS += nsNativeAppSupportUnix.cpp
else
ifeq ($(MOZ_WIDGET_TOOLKIT),qt)
MOCSRCS += moc_nsNativeAppSupportQt.cpp
$(NULL)
CPPSRCS += $(MOCSRCS)
CPPSRCS += nsNativeAppSupportQt.cpp
CPPSRCS += nsQAppInstance.cpp
EXPORTS += nsQAppInstance.h

View File

@ -37,33 +37,92 @@
* ***** END LICENSE BLOCK ***** */
#include <stdlib.h>
#include "nsNativeAppSupportBase.h"
#include "nsString.h"
#include <QTimer>
#include "mozilla/ipc/GeckoChildProcessHost.h"
#include "nsNativeAppSupportQt.h"
#include "nsCOMPtr.h"
#include "nsIObserverService.h"
#include "mozilla/Services.h"
#ifdef MOZ_ENABLE_LIBCONIC
#include <glib-object.h>
#endif
#if (MOZ_PLATFORM_MAEMO == 5)
#include <libosso.h>
#endif
class nsNativeAppSupportQt : public nsNativeAppSupportBase
#ifdef MOZ_ENABLE_QMSYSTEM2
void
nsNativeAppSupportQt::activityChanged(MeeGo::QmActivity::Activity activity)
{
public:
NS_IMETHOD Start(PRBool* aRetVal);
NS_IMETHOD Stop(PRBool* aResult);
#if (MOZ_PLATFORM_MAEMO == 5)
// Osso context must be initialized for maemo5 otherwise we will be killed in ~20 seconds
osso_context_t *m_osso_context;
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
if (!os)
return;
if (MeeGo::QmActivity::Inactive == activity) {
os->NotifyObservers(nsnull, "system-idle", nsnull);
} else {
os->NotifyObservers(nsnull, "system-active", nsnull);
}
}
void
nsNativeAppSupportQt::displayStateChanged(MeeGo::QmDisplayState::DisplayState state)
{
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
if (!os)
return;
switch (state) {
case MeeGo::QmDisplayState::On:
os->NotifyObservers(nsnull, "system-display-on", nsnull);
break;
case MeeGo::QmDisplayState::Off:
os->NotifyObservers(nsnull, "system-display-dimmed", nsnull);
break;
case MeeGo::QmDisplayState::Dimmed:
os->NotifyObservers(nsnull, "system-display-off", nsnull);
break;
default:
NS_WARNING("Unknown display state");
break;
}
}
void nsNativeAppSupportQt::deviceModeChanged(MeeGo::QmDeviceMode::DeviceMode mode)
{
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
if (!os)
return;
switch (mode) {
case MeeGo::QmDeviceMode::DeviceMode::Normal:
os->NotifyObservers(nsnull, "profile-change-net-restore", nsnull);
break;
case MeeGo::QmDeviceMode::DeviceMode::Flight:
os->NotifyObservers(nsnull, "profile-change-net-teardown", nsnull);
break;
case MeeGo::QmDeviceMode::DeviceMode::Error:
default:
NS_WARNING("Unknown DeviceMode");
break;
}
}
void nsNativeAppSupportQt::RefreshStates()
{
activityChanged(mActivity.get());
displayStateChanged(mDisplayState.get());
deviceModeChanged(mDeviceMode.getMode());
}
#endif
};
NS_IMETHODIMP
nsNativeAppSupportQt::Start(PRBool* aRetVal)
{
NS_ASSERTION(gAppData, "gAppData must not be null.");
#ifdef MOZ_ENABLE_QMSYSTEM2
connect(&mActivity, SIGNAL(activityChanged(MeeGo::QmActivity::Activity)), this, SLOT(activityChanged(MeeGo::QmActivity::Activity)));
connect(&mDeviceMode, SIGNAL(deviceModeChanged(MeeGo::QmDeviceMode::DeviceMode)), this, SLOT(deviceModeChanged(MeeGo::QmDeviceMode::DeviceMode)));
connect(&mDisplayState, SIGNAL(displayStateChanged(MeeGo::QmDisplayState::DisplayState)), this, SLOT(displayStateChanged(MeeGo::QmDisplayState::DisplayState)));
// Init states withing next event loop iteration
QTimer::singleShot(0, this, SLOT(RefreshStates()));
#endif
*aRetVal = PR_TRUE;
#ifdef MOZ_ENABLE_LIBCONIC
g_type_init();

View File

@ -0,0 +1,80 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 et sw=2 tw=80: */
/* ***** 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 Corporation code.
*
* The Initial Developer of the Original Code is Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Oleg Romashin <romaxa@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include <stdlib.h>
#include <QObject>
#ifdef MOZ_ENABLE_QMSYSTEM2
#include "qmdevicemode.h"
#include "qmdisplaystate.h"
#include "qmactivity.h"
#endif
#include "nsNativeAppSupportBase.h"
#include "nsString.h"
#ifdef MOZ_ENABLE_LIBCONIC
#include <glib-object.h>
#endif
#if (MOZ_PLATFORM_MAEMO == 5)
#include <libosso.h>
#endif
class nsNativeAppSupportQt : public QObject, public nsNativeAppSupportBase
{
Q_OBJECT
public:
NS_IMETHOD Start(PRBool* aRetVal);
NS_IMETHOD Stop(PRBool* aResult);
#if (MOZ_PLATFORM_MAEMO == 5)
// Osso context must be initialized for maemo5 otherwise we will be killed in ~20 seconds
osso_context_t *m_osso_context;
#endif
#ifdef MOZ_ENABLE_QMSYSTEM2
public Q_SLOTS:
void activityChanged(MeeGo::QmActivity::Activity activity);
void deviceModeChanged(MeeGo::QmDeviceMode::DeviceMode mode);
void displayStateChanged(MeeGo::QmDisplayState::DisplayState state);
void RefreshStates();
private:
MeeGo::QmDeviceMode mDeviceMode;
MeeGo::QmDisplayState mDisplayState;
MeeGo::QmActivity mActivity;
#endif
};

View File

@ -5,4 +5,6 @@ tail = tail_handlerService.js
[test_getTypeFromExtension_ext_to_type_mapping.js]
[test_getTypeFromExtension_with_empty_Content_Type.js]
[test_handlerService.js]
# Bug 676997: test consistently fails on Android
fail-if = os == "android"
[test_punycodeURIs.js]

View File

@ -3,3 +3,5 @@ head =
tail =
[test_encoding.js]
# Bug 676995: test hangs consistently on Android
skip-if = os == "android"

View File

@ -492,6 +492,7 @@ public:
SURFACE_DESTROYED = 14,
GECKO_EVENT_SYNC = 15,
FORCED_RESIZE = 16,
ACTIVITY_START = 17,
dummy_java_enum_list_end
};

View File

@ -328,6 +328,7 @@ nsAppShell::ProcessNextNativeEvent(PRBool mayWait)
mozilla::services::GetObserverService();
NS_NAMED_LITERAL_STRING(minimize, "heap-minimize");
obsServ->NotifyObservers(nsnull, "memory-pressure", minimize.get());
obsServ->NotifyObservers(nsnull, "application-background", nsnull);
break;
}
@ -359,6 +360,14 @@ nsAppShell::ProcessNextNativeEvent(PRBool mayWait)
break;
}
case AndroidGeckoEvent::ACTIVITY_START: {
nsCOMPtr<nsIObserverService> obsServ =
mozilla::services::GetObserverService();
obsServ->NotifyObservers(nsnull, "application-foreground", nsnull);
break;
}
case AndroidGeckoEvent::LOAD_URI: {
nsCOMPtr<nsICommandLineRunner> cmdline
(do_CreateInstance("@mozilla.org/toolkit/command-line;1"));

View File

@ -321,7 +321,7 @@ private:
*/
class MozMGraphicsView : public MWindow
{
Q_OBJECT
public:
MozMGraphicsView(MozQWidget* aTopLevel, QWidget* aParent = nsnull)
: MWindow(aParent)
@ -330,6 +330,22 @@ public:
{
MozMSceneWindow* page = new MozMSceneWindow(aTopLevel);
page->appear(this);
QObject::connect(this, SIGNAL(switcherEntered()), this, SLOT(onSwitcherEntered()));
QObject::connect(this, SIGNAL(switcherExited()), this, SLOT(onSwitcherExited()));
}
public Q_SLOTS:
void onSwitcherEntered() {
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
if (!os)
return;
os->NotifyObservers(nsnull, "application-background", nsnull);
}
void onSwitcherExited() {
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
if (!os)
return;
os->NotifyObservers(nsnull, "application-foreground", nsnull);
}
protected:

View File

@ -6,8 +6,12 @@ tail =
[test_bug332389.js]
[test_bug333505.js]
[test_bug364285-1.js]
# Bug 676998: test fails consistently on Android
fail-if = os == "android"
[test_bug374754.js]
[test_bug476919.js]
# Bug 676998: test fails consistently on Android
fail-if = os == "android"
[test_bug478086.js]
[test_bug656331.js]
[test_compmgr_warnings.js]
@ -15,6 +19,8 @@ tail =
[test_file_equality.js]
[test_hidden_files.js]
[test_home.js]
# Bug 676998: test fails consistently on Android
fail-if = os == "android"
[test_iniProcessor.js]
[test_ioutil.js]
[test_localfile.js]
@ -28,5 +34,9 @@ skip-if = os == "win" # See bug: 676412
[test_streams.js]
[test_stringstream.js]
[test_symlinks.js]
# Bug 676998: test fails consistently on Android
fail-if = os == "android"
[test_systemInfo.js]
# Bug 676998: test fails consistently on Android
fail-if = os == "android"
[test_versioncomparator.js]