This commit is contained in:
Ryan VanderMeulen 2014-01-13 17:30:32 -05:00
Родитель 3a3061758d d5ca098e3a
Коммит eb03fb5939
25 изменённых файлов: 318 добавлений и 121 удалений

Просмотреть файл

@ -20,7 +20,7 @@ LIBS += \
$(DEPTH)/widget/gonk/libdisplay/$(LIB_PREFIX)display.$(LIB_SUFFIX) \
$(MOZ_ZLIB_LIBS) \
$(NULL)
ifeq ($(ANDROID_VERSION),$(findstring $(ANDROID_VERSION),17 18))
ifeq ($(ANDROID_VERSION),$(findstring $(ANDROID_VERSION),17 18 19))
LIBS += \
-lgui \
-lsuspend \

Просмотреть файл

@ -86,13 +86,15 @@ DirectoryProvider.prototype = {
// getUpdateDir will set persistent to false since it may toggle between
// /data/local/ and /mnt/sdcard based on free space and/or availability
// of the sdcard.
return this.getUpdateDir(persistent, UPDATES_DIR);
// before download, check if free space is 2.1 times of update.mar
return this.getUpdateDir(persistent, UPDATES_DIR, 2.1);
}
if (prop == XRE_OS_UPDATE_APPLY_TO_DIR) {
// getUpdateDir will set persistent to false since it may toggle between
// /data/local/ and /mnt/sdcard based on free space and/or availability
// of the sdcard.
return this.getUpdateDir(persistent, FOTA_DIR);
// before apply, check if free space is 1.1 times of update.mar
return this.getUpdateDir(persistent, FOTA_DIR, 1.1);
}
#else
// In desktop builds, coreAppsDir is the same as the profile directory.
@ -171,7 +173,7 @@ DirectoryProvider.prototype = {
return null;
},
getUpdateDir: function dp_getUpdateDir(persistent, subdir) {
getUpdateDir: function dp_getUpdateDir(persistent, subdir, multiple) {
let defaultUpdateDir = this.getDefaultUpdateDir();
persistent.value = false;
@ -189,7 +191,7 @@ DirectoryProvider.prototype = {
return defaultUpdateDir;
}
let requiredSpace = selectedPatch.size * 2;
let requiredSpace = selectedPatch.size * multiple;
let updateDir = this.findUpdateDirWithFreeSpace(requiredSpace, subdir);
if (updateDir) {
return updateDir;

Просмотреть файл

@ -1,4 +1,4 @@
{
"revision": "458c7c1031a8ee2666b8b4c62301bacd74833332",
"revision": "449764bc60bafa78cec7aa6cad0d65e558ab7473",
"repo_path": "/integration/gaia-central"
}

Просмотреть файл

@ -245,6 +245,11 @@ if test -n "$gonkdir" ; then
MOZ_B2G_CAMERA=1
MOZ_OMX_DECODER=1
AC_SUBST(MOZ_OMX_DECODER)
;;
19)
GONK_INCLUDES="-I$gonkdir/frameworks/native/include"
MOZ_NFC=1
;;
*)
AC_MSG_ERROR([Unsupported platform version: $ANDROID_VERSION])

Просмотреть файл

@ -324,10 +324,13 @@ MovieFragmentBox::MovieFragmentBox(uint32_t aType, ISOControl* aControl)
, mTrackType(aType)
{
boxes.AppendElement(new MovieFragmentHeaderBox(mTrackType, aControl));
// Always adds flags_data_offset_present in each TrackFragmentBox, Android
// parser requires this flag to calculate the correct bitstream offset.
if (mTrackType & Audio_Track) {
boxes.AppendElement(
new TrackFragmentBox(Audio_Track,
flags_sample_size_present,
flags_sample_size_present | flags_data_offset_present,
aControl));
}
if (mTrackType & Video_Track) {

Просмотреть файл

@ -688,10 +688,11 @@ BrowserElementChild.prototype = {
let self = this;
let maxWidth = data.json.args.width;
let maxHeight = data.json.args.height;
let mimeType = data.json.args.mimeType;
let domRequestID = data.json.id;
let takeScreenshotClosure = function() {
self._takeScreenshot(maxWidth, maxHeight, domRequestID);
self._takeScreenshot(maxWidth, maxHeight, mimeType, domRequestID);
};
let maxDelayMS = 2000;
@ -712,7 +713,7 @@ BrowserElementChild.prototype = {
* the desired maxWidth and maxHeight, and given the DOMRequest ID associated
* with the request from the parent.
*/
_takeScreenshot: function(maxWidth, maxHeight, domRequestID) {
_takeScreenshot: function(maxWidth, maxHeight, mimeType, domRequestID) {
// You can think of the screenshotting algorithm as carrying out the
// following steps:
//
@ -728,10 +729,14 @@ BrowserElementChild.prototype = {
// - Crop the viewport so its width is no larger than maxWidth and its
// height is no larger than maxHeight.
//
// - Set mozOpaque to true and background color to solid white
// if we are taking a JPEG screenshot, keep transparent if otherwise.
//
// - Return a screenshot of the page's viewport scaled and cropped per
// above.
debug("Taking a screenshot: maxWidth=" + maxWidth +
", maxHeight=" + maxHeight +
", mimeType=" + mimeType +
", domRequestID=" + domRequestID + ".");
if (!content) {
@ -749,19 +754,22 @@ BrowserElementChild.prototype = {
let canvasWidth = Math.min(maxWidth, Math.round(content.innerWidth * scale));
let canvasHeight = Math.min(maxHeight, Math.round(content.innerHeight * scale));
let transparent = (mimeType !== 'image/jpeg');
var canvas = content.document
.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
canvas.mozOpaque = true;
if (!transparent)
canvas.mozOpaque = true;
canvas.width = canvasWidth;
canvas.height = canvasHeight;
var ctx = canvas.getContext("2d");
ctx.scale(scale, scale);
ctx.drawWindow(content, 0, 0, content.innerWidth, content.innerHeight,
"rgb(255,255,255)");
transparent ? "rgba(255,255,255,0)" : "rgb(255,255,255)");
// Take a JPEG screenshot to hack around the fact that we can't specify
// opaque PNG. This requires us to unpremultiply the alpha channel, which
// Take a JPEG screenshot by default instead of PNG with alpha channel.
// This requires us to unpremultiply the alpha channel, which
// is expensive on ARM processors because they lack a hardware integer
// division instruction.
canvas.toBlob(function(blob) {
@ -769,7 +777,7 @@ BrowserElementChild.prototype = {
id: domRequestID,
successRv: blob
});
}, 'image/jpeg');
}, mimeType);
},
_recvFireCtxCallback: function(data) {

Просмотреть файл

@ -547,16 +547,19 @@ BrowserElementParent.prototype = {
return this._sendDOMRequest('purge-history');
},
_getScreenshot: function(_width, _height) {
_getScreenshot: function(_width, _height, _mimeType) {
let width = parseInt(_width);
let height = parseInt(_height);
let mimeType = (typeof _mimeType === 'string') ?
_mimeType.trim().toLowerCase() : 'image/jpeg';
if (isNaN(width) || isNaN(height) || width < 0 || height < 0) {
throw Components.Exception("Invalid argument",
Cr.NS_ERROR_INVALID_ARG);
}
return this._sendDOMRequest('get-screenshot',
{width: width, height: height});
{width: width, height: height,
mimeType: mimeType});
},
_recvNextPaint: function(data) {

Просмотреть файл

@ -15,20 +15,30 @@ function runTest() {
iframe1.src = 'data:text/html,<html>' +
'<body style="background:green">hello</body></html>';
var screenshotArrayBuffers = [];
var screenshotImageDatas = [];
var numLoaded = 0;
function screenshotTaken(screenshotArrayBuffer) {
screenshotArrayBuffers.push(screenshotArrayBuffer);
if (screenshotArrayBuffers.length === 1) {
function screenshotTaken(screenshotImageData) {
screenshotImageDatas.push(screenshotImageData);
if (screenshotImageDatas.length === 1) {
ok(true, 'Got initial non blank screenshot');
iframe1.src = 'data:text/html,<html>' +
'<body style="background:blue">hello</body></html>';
// Wait until screenshotArrayBuffer !== screenshotArrayBuffers[0].
waitForScreenshot(function(screenshotArrayBuffer) {
var view1 = new Int8Array(screenshotArrayBuffer);
var view2 = new Int8Array(screenshotArrayBuffers[0]);
var view = screenshotImageData.data;
if (view[3] !== 255) {
ok(false, 'The first pixel of initial screenshot is not opaque');
SimpleTest.finish();
return;
}
ok(true, 'Verified the first pixel of initial screenshot is opaque');
iframe1.src = 'data:text/html,<html>' +
'<body style="background:transparent">hello</body></html>';
// Wait until screenshotImageData !== screenshotImageDatas[0].
waitForScreenshot(function(screenshotImageData) {
var view1 = screenshotImageData.data;
var view2 = screenshotImageDatas[0].data;
if (view1.length != view2.length) {
return true;
}
@ -40,51 +50,101 @@ function runTest() {
}
return false;
});
}, 'image/png');
}
else if (screenshotArrayBuffers.length === 2) {
else if (screenshotImageDatas.length === 2) {
ok(true, 'Got updated screenshot after source page changed');
var view = screenshotImageData.data;
if (view[3] !== 0) {
// The case here will always fail when oop'd on Firefox Desktop,
// but not on B2G Emulator
// See https://bugzil.la/878003#c20
var isB2G = (navigator.platform === '');
info('navigator.platform: ' + navigator.platform);
if (!isB2G && browserElementTestHelpers.getOOPByDefaultPref()) {
todo(false, 'The first pixel of updated screenshot is not transparent');
} else {
ok(false, 'The first pixel of updated screenshot is not transparent');
}
SimpleTest.finish();
return;
}
ok(true, 'Verified the first pixel of updated screenshot is transparent');
SimpleTest.finish();
}
}
// We continually take screenshots until we get one that we are
// happy with.
function waitForScreenshot(filter) {
function gotScreenshotArrayBuffer() {
// |this| is the FileReader whose result contains the screenshot as an
// ArrayBuffer.
function waitForScreenshot(filter, mimeType) {
function gotImage(e) {
// |this| is the Image.
URL.revokeObjectURL(this.src);
if (e.type === 'error' || !this.width || !this.height) {
tryAgain();
if (filter(this.result)) {
screenshotTaken(this.result);
return;
}
var canvas = document.createElement('canvas');
canvas.width = canvas.height = 1000;
var ctx = canvas.getContext('2d');
ctx.drawImage(this, 0, 0);
var imageData = ctx.getImageData(0, 0, 1000, 1000);
if (filter(imageData)) {
screenshotTaken(imageData);
return;
}
tryAgain();
}
function tryAgain() {
if (--attempts === 0) {
ok(false, 'Timed out waiting for correct screenshot');
SimpleTest.finish();
} else {
setTimeout(function() {
iframe1.getScreenshot(1000, 1000).onsuccess = getScreenshotArrayBuffer;
iframe1.getScreenshot(1000, 1000, mimeType).onsuccess =
getScreenshotImageData;
}, 200);
}
}
function getScreenshotArrayBuffer(e) {
var fr = new FileReader();
fr.onloadend = gotScreenshotArrayBuffer;
fr.readAsArrayBuffer(e.target.result);
function getScreenshotImageData(e) {
var blob = e.target.result;
if (blob.type !== mimeType) {
ok(false, 'MIME type of screenshot taken incorrect');
SimpleTest.finish();
}
if (blob.size === 0) {
tryAgain();
return;
}
var img = new Image();
img.src = URL.createObjectURL(blob);
img.onload = img.onerror = gotImage;
}
var attempts = 10;
iframe1.getScreenshot(1000, 1000).onsuccess = getScreenshotArrayBuffer;
iframe1.getScreenshot(1000, 1000, mimeType).onsuccess =
getScreenshotImageData;
}
function iframeLoadedHandler() {
numLoaded++;
if (numLoaded === 2) {
waitForScreenshot(function(screenshotArrayBuffer) {
return screenshotArrayBuffer.byteLength != 0;
});
waitForScreenshot(function(screenshotImageData) {
return true;
}, 'image/jpeg');
}
}

Просмотреть файл

@ -11,6 +11,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=753595
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=753595">Mozilla Bug 753595</a>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=878003">Mozilla Bug 878003</a>
<script type="application/javascript;version=1.7" src='browserElement_GetScreenshot.js'>
</script>

Просмотреть файл

@ -428,19 +428,26 @@ this.NetworkStatsService = {
debug("clear stats for network " + network.id + " of type " + network.type);
if (!this._networks[netId]) {
let error = "Invalid networkType";
let result = null;
// Check if network is valid but has not established a connection yet.
// Check if network is valid but has not established a connection yet. If it is not
// found in RIL networks, it can be a SIM network used in the past having sample
// in the database.
let rilNetworks = this.getRilNetworks();
if (rilNetworks[netId]) {
error = null;
result = true;
}
if (!rilNetworks[netId]) {
// Check if it is available in the DB.
this._db.isNetworkAvailable(network, function(aError, aResult) {
if (aResult) {
this._db.clearInterfaceStats(network, function onDBCleared(aError, aResult) {
mm.sendAsyncMessage("NetworkStats:Clear:Return",
{ id: msg.id, error: aError, result: aResult });
});
return;
}
mm.sendAsyncMessage("NetworkStats:Clear:Return",
{ id: msg.id, error: error, result: result });
return;
mm.sendAsyncMessage("NetworkStats:Clear:Return",
{ id: msg.id, error: "Invalid networkType", result: null });
});
return;
}
}
this._db.clearInterfaceStats(network, function onDBCleared(aError, aResult) {

Просмотреть файл

@ -694,7 +694,27 @@ function RadioInterfaceLayer() {
let options = {
debug: debugPref,
cellBroadcastDisabled: false,
clirMode: RIL.CLIR_DEFAULT
clirMode: RIL.CLIR_DEFAULT,
quirks: {
callstateExtraUint32:
libcutils.property_get("ro.moz.ril.callstate_extra_int", "false") === "true",
v5Legacy:
libcutils.property_get("ro.moz.ril.v5_legacy", "true") === "true",
requestUseDialEmergencyCall:
libcutils.property_get("ro.moz.ril.dial_emergency_call", "false") === "true",
simAppStateExtraFields:
libcutils.property_get("ro.moz.ril.simstate_extra_field", "false") === "true",
extraUint2ndCall:
libcutils.property_get("ro.moz.ril.extra_int_2nd_call", "false") == "true",
haveQueryIccLockRetryCount:
libcutils.property_get("ro.moz.ril.query_icc_count", "false") == "true",
sendStkProfileDownload:
libcutils.property_get("ro.moz.ril.send_stk_profile_dl", "false") == "true",
dataRegistrationOnDemand:
libcutils.property_get("ro.moz.ril.data_reg_on_demand", "false") == "true"
},
rilEmergencyNumbers: libcutils.property_get("ril.ecclist") ||
libcutils.property_get("ro.ril.ecclist")
};
try {

Просмотреть файл

@ -38,7 +38,7 @@
"use strict";
importScripts("ril_consts.js", "systemlibs.js");
importScripts("ril_consts.js");
importScripts("resource://gre/modules/workers/require.js");
// set to true in ril_consts.js to see debug messages
@ -53,6 +53,7 @@ if (!this.debug) {
};
}
let RIL_EMERGENCY_NUMBERS;
const DEFAULT_EMERGENCY_NUMBERS = ["112", "911"];
// Timeout value for emergency callback mode.
@ -74,23 +75,22 @@ const MMI_MAX_LENGTH_SHORT_CODE = 2;
const MMI_END_OF_USSD = "#";
let RILQUIRKS_CALLSTATE_EXTRA_UINT32 = libcutils.property_get("ro.moz.ril.callstate_extra_int", "false") === "true";
let RILQUIRKS_CALLSTATE_EXTRA_UINT32;
// This may change at runtime since in RIL v6 and later, we get the version
// number via the UNSOLICITED_RIL_CONNECTED parcel.
let RILQUIRKS_V5_LEGACY = libcutils.property_get("ro.moz.ril.v5_legacy", "true") === "true";
let RILQUIRKS_REQUEST_USE_DIAL_EMERGENCY_CALL = libcutils.property_get("ro.moz.ril.dial_emergency_call", "false") === "true";
let RILQUIRKS_SIM_APP_STATE_EXTRA_FIELDS = libcutils.property_get("ro.moz.ril.simstate_extra_field", "false") === "true";
let RILQUIRKS_V5_LEGACY;
let RILQUIRKS_REQUEST_USE_DIAL_EMERGENCY_CALL;
let RILQUIRKS_SIM_APP_STATE_EXTRA_FIELDS;
// Needed for call-waiting on Peak device
let RILQUIRKS_EXTRA_UINT32_2ND_CALL = libcutils.property_get("ro.moz.ril.extra_int_2nd_call", "false") == "true";
let RILQUIRKS_EXTRA_UINT32_2ND_CALL;
// On the emulator we support querying the number of lock retries
let RILQUIRKS_HAVE_QUERY_ICC_LOCK_RETRY_COUNT = libcutils.property_get("ro.moz.ril.query_icc_count", "false") == "true";
let RILQUIRKS_HAVE_QUERY_ICC_LOCK_RETRY_COUNT;
// Ril quirk to Send STK Profile Download
let RILQUIRKS_SEND_STK_PROFILE_DOWNLOAD = libcutils.property_get("ro.moz.ril.send_stk_profile_dl", "false") == "true";
let RILQUIRKS_SEND_STK_PROFILE_DOWNLOAD;
// Ril quirk to attach data registration on demand.
let RILQUIRKS_DATA_REGISTRATION_ON_DEMAND =
libcutils.property_get("ro.moz.ril.data_reg_on_demand", "false") == "true";
let RILQUIRKS_DATA_REGISTRATION_ON_DEMAND;
// Marker object.
let PENDING_NETWORK_TYPE = {};
@ -111,7 +111,7 @@ let Buf = {
// Maps tokens we send out with requests to the request type, so that
// when we get a response parcel back, we know what request it was for.
this.mTokenRequestMap = {};
this.mTokenRequestMap = new Map();
},
/**
@ -125,7 +125,7 @@ let Buf = {
let token = this.readInt32();
let error = this.readInt32();
options = this.mTokenRequestMap[token];
options = this.mTokenRequestMap.get(token);
if (!options) {
if (DEBUG) {
debug("Suspicious uninvited request found: " + token + ". Ignored!");
@ -133,7 +133,7 @@ let Buf = {
return;
}
delete this.mTokenRequestMap[token];
this.mTokenRequestMap.delete(token);
request_type = options.rilRequestType;
options.rilRequestError = error;
@ -174,7 +174,7 @@ let Buf = {
}
options.rilRequestType = type;
options.rilRequestError = null;
this.mTokenRequestMap[this.mToken] = options;
this.mTokenRequestMap.set(this.mToken, options);
this.mToken++;
return this.mToken;
},
@ -2912,12 +2912,8 @@ let RIL = {
* The number to look up.
*/
_isEmergencyNumber: function(number) {
// Check read-write ecclist property first.
let numbers = libcutils.property_get("ril.ecclist");
if (!numbers) {
// Then read-only ecclist property since others RIL only uses this.
numbers = libcutils.property_get("ro.ril.ecclist");
}
// Check ril provided numbers first.
let numbers = RIL_EMERGENCY_NUMBERS;
if (numbers) {
numbers = numbers.split(",");
@ -3585,11 +3581,8 @@ let RIL = {
}
// Set flag for outgoing emergency call.
if (newCall.isOutgoing && this._isEmergencyNumber(newCall.number)) {
newCall.isEmergency = true;
} else {
newCall.isEmergency = false;
}
newCall.isEmergency = newCall.isOutgoing &&
this._isEmergencyNumber(newCall.number);
// Add to our map.
if (newCall.isMpty) {
@ -4962,6 +4955,16 @@ let RIL = {
CLIENT_ID = options.clientId;
this.cellBroadcastDisabled = options.cellBroadcastDisabled;
this.clirMode = options.clirMode;
RIL_EMERGENCY_NUMBERS = options.rilEmergencyNumbers;
let quirks = options.quirks;
RILQUIRKS_CALLSTATE_EXTRA_UINT32 = quirks.callstateExtraUint32;
RILQUIRKS_V5_LEGACY = quirks.v5Legacy;
RILQUIRKS_REQUEST_USE_DIAL_EMERGENCY_CALL = quirks.requestUseDialEmergencyCall;
RILQUIRKS_SIM_APP_STATE_EXTRA_FIELDS = quirks.simAppStateExtraFields;
RILQUIRKS_EXTRA_UINT32_2ND_CALL = quirks.extraUint2ndCall;
RILQUIRKS_HAVE_QUERY_ICC_LOCK_RETRY_COUNT = quirks.haveQueryIccLockRetryCount;
RILQUIRKS_SEND_STK_PROFILE_DOWNLOAD = quirks.sendStkProfileDownload;
RILQUIRKS_DATA_REGISTRATION_ON_DEMAND = quirks.dataRegistrationOnDemand;
}
};

Просмотреть файл

@ -310,11 +310,16 @@ this.WifiCommand = function(aControlMessage, aInterface) {
doBooleanCommand("BLACKLIST clear", "OK", callback);
};
command.setSuspendOptimizations = function (enabled, callback) {
command.setSuspendOptimizationsICS = function (enabled, callback) {
doBooleanCommand("DRIVER SETSUSPENDOPT " + (enabled ? 0 : 1),
"OK", callback);
};
command.setSuspendOptimizationsJB = function (enabled, callback) {
doBooleanCommand("DRIVER SETSUSPENDMODE " + (enabled ? 1 : 0),
"OK", callback);
};
command.connectToSupplicant = function(callback) {
voidControlMessage("connect_to_supplicant", callback);
};

Просмотреть файл

@ -1156,7 +1156,9 @@ var WifiManager = (function() {
manager.getHttpProxyNetwork = getHttpProxyNetwork;
manager.setHttpProxy = setHttpProxy;
manager.configureHttpProxy = configureHttpProxy;
manager.setSuspendOptimizations = wifiCommand.setSuspendOptimizations;
manager.setSuspendOptimizations = (sdkVersion >= 16)
? wifiCommand.setSuspendOptimizationsJB
: wifiCommand.setSuspendOptimizationsICS;
manager.setStaticIpMode = setStaticIpMode;
manager.getRssiApprox = wifiCommand.getRssiApprox;
manager.getLinkSpeed = wifiCommand.getLinkSpeed;

Просмотреть файл

@ -44,13 +44,33 @@ void
ParamTraits<MagicGrallocBufferHandle>::Write(Message* aMsg,
const paramType& aParam)
{
#if ANDROID_VERSION >= 19
sp<GraphicBuffer> flattenable = aParam.mGraphicBuffer;
#else
Flattenable *flattenable = aParam.mGraphicBuffer.get();
#endif
size_t nbytes = flattenable->getFlattenedSize();
size_t nfds = flattenable->getFdCount();
char data[nbytes];
int fds[nfds];
#if ANDROID_VERSION >= 19
// Make a copy of "data" and "fds" for flatten() to avoid casting problem
void *pdata = (void *)data;
int *pfds = fds;
flattenable->flatten(pdata, nbytes, pfds, nfds);
// In Kitkat, flatten() will change the value of nbytes and nfds, which dues
// to multiple parcelable object consumption. The actual size and fd count
// which returned by getFlattenedSize() and getFdCount() are not changed.
// So we change nbytes and nfds back by call corresponding calls.
nbytes = flattenable->getFlattenedSize();
nfds = flattenable->getFdCount();
#else
flattenable->flatten(data, nbytes, fds, nfds);
#endif
aMsg->WriteSize(nbytes);
aMsg->WriteSize(nfds);
@ -96,9 +116,17 @@ ParamTraits<MagicGrallocBufferHandle>::Read(const Message* aMsg,
}
sp<GraphicBuffer> buffer(new GraphicBuffer());
#if ANDROID_VERSION >= 19
// Make a copy of "data" and "fds" for unflatten() to avoid casting problem
void const *pdata = (void const *)data;
int const *pfds = fds;
if (NO_ERROR == buffer->unflatten(pdata, nbytes, pfds, nfds)) {
#else
Flattenable *flattenable = buffer.get();
if (NO_ERROR == flattenable->unflatten(data, nbytes, fds, nfds)) {
#endif
aResult->mGraphicBuffer = buffer;
return true;
}
@ -128,8 +156,6 @@ ImageFormatForPixelFormat(android::PixelFormat aFormat)
return gfxImageFormatRGB24;
case PIXEL_FORMAT_RGB_565:
return gfxImageFormatRGB16_565;
case PIXEL_FORMAT_A_8:
return gfxImageFormatA8;
default:
MOZ_CRASH("Unknown gralloc pixel format");
}
@ -146,8 +172,6 @@ PixelFormatForImageFormat(gfxImageFormat aFormat)
return android::PIXEL_FORMAT_RGBX_8888;
case gfxImageFormatRGB16_565:
return android::PIXEL_FORMAT_RGB_565;
case gfxImageFormatA8:
return android::PIXEL_FORMAT_A_8;
default:
MOZ_CRASH("Unknown gralloc pixel format");
}
@ -168,8 +192,6 @@ BytesPerPixelForPixelFormat(android::PixelFormat aFormat)
case PIXEL_FORMAT_RGBA_5551:
case PIXEL_FORMAT_RGBA_4444:
return 2;
case PIXEL_FORMAT_A_8:
return 1;
default:
return 0;
}

Просмотреть файл

@ -229,9 +229,6 @@ GrallocTextureClientOGL::AllocateForSurface(gfx::IntSize aSize,
case gfx::SurfaceFormat::R5G6B5:
format = android::PIXEL_FORMAT_RGB_565;
break;
case gfx::SurfaceFormat::A8:
format = android::PIXEL_FORMAT_A_8;
break;
default:
NS_WARNING("Unsupported surface format");
return false;

Просмотреть файл

@ -31,8 +31,6 @@ SurfaceFormatForAndroidPixelFormat(android::PixelFormat aFormat,
return swapRB ? gfx::SurfaceFormat::B8G8R8X8 : gfx::SurfaceFormat::R8G8B8X8;
case android::PIXEL_FORMAT_RGB_565:
return gfx::SurfaceFormat::R5G6B5;
case android::PIXEL_FORMAT_A_8:
return gfx::SurfaceFormat::A8;
case HAL_PIXEL_FORMAT_YCbCr_422_SP:
case HAL_PIXEL_FORMAT_YCrCb_420_SP:
case HAL_PIXEL_FORMAT_YCbCr_422_I:
@ -71,7 +69,6 @@ TextureTargetForAndroidPixelFormat(android::PixelFormat aFormat)
case android::PIXEL_FORMAT_RGBA_8888:
case android::PIXEL_FORMAT_RGBX_8888:
case android::PIXEL_FORMAT_RGB_565:
case android::PIXEL_FORMAT_A_8:
return LOCAL_GL_TEXTURE_2D;
default:
if (aFormat >= 0x100 && aFormat <= 0x1FF) {

Просмотреть файл

@ -1262,8 +1262,6 @@ Deprecated_SurfaceFormatForAndroidPixelFormat(android::PixelFormat aFormat,
return swapRB ? SurfaceFormat::B8G8R8X8 : SurfaceFormat::R8G8B8X8;
case android::PIXEL_FORMAT_RGB_565:
return SurfaceFormat::R5G6B5;
case android::PIXEL_FORMAT_A_8:
return SurfaceFormat::A8;
case HAL_PIXEL_FORMAT_YCbCr_422_SP:
case HAL_PIXEL_FORMAT_YCrCb_420_SP:
case HAL_PIXEL_FORMAT_YCbCr_422_I:
@ -1301,7 +1299,6 @@ Deprecated_TextureTargetForAndroidPixelFormat(android::PixelFormat aFormat)
case android::PIXEL_FORMAT_RGBA_8888:
case android::PIXEL_FORMAT_RGBX_8888:
case android::PIXEL_FORMAT_RGB_565:
case android::PIXEL_FORMAT_A_8:
return LOCAL_GL_TEXTURE_2D;
default:
if (aFormat >= 0x100 && aFormat <= 0x1FF) {

Просмотреть файл

@ -592,8 +592,6 @@ LinearScanAllocator::populateSafepoints()
if (payloadAlloc->isArgument() &&
(!payload->canonicalSpill() || payload->canonicalSpill() == payloadAlloc))
{
JS_ASSERT(typeAlloc->isArgument());
JS_ASSERT(!type->canonicalSpill() || type->canonicalSpill() == typeAlloc);
continue;
}

Просмотреть файл

@ -602,7 +602,6 @@ void RTSPSource::onDisconnected(const sp<AMessage> &msg) {
void RTSPSource::finishDisconnectIfPossible() {
if (mState != DISCONNECTED) {
mHandler->disconnect();
return;
}
(new AMessage)->postReply(mDisconnectReplyID);

Просмотреть файл

@ -239,7 +239,7 @@
"content/events/test/test_bug574663.html":"",
"content/events/test/test_bug607464.html":"",
"content/events/test/test_wheel_default_action.html":"",
"content/base/test/test_bug682592.html":"",
"content/base/test/test_bug682592.html":"",
"content/html/document/test/test_bug369370.html":"",
"content/svg/content/test/test_text_selection.html":"Mouse selection not workin on b2g",
"content/svg/content/test/test_SVGAnimatedImageSMILDisabled.html":"",
@ -260,8 +260,9 @@
"docshell/test/navigation/test_reserved.html":"",
"docshell/test/test_bug413310.html":"",
"dom/imptests/html/webgl":"",
"dom/imptests/html/webgl":"",
"dom/battery/test/test_battery_basics.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_Alert.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_AppFramePermission.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_AppWindowNamespace.html":"",
@ -269,7 +270,32 @@
"dom/browser-element/mochitest/test_browserElement_inproc_BrowserWindowNamespace.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_CloseApp.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_CloseFromOpener.html":"",
"dom/browser-element/":"",
"dom/browser-element/mochitest/test_browserElement_inproc_ErrorSecurity.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_FrameWrongURI.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_KeyEvents.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_OpenMixedProcess.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_OpenNamed.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_OpenWindow.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_OpenWindowDifferentOrigin.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_OpenWindowInFrame.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_OpenWindowRejected.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_SecurityChange.html":"",
"dom/browser-element/mochitest/test_browserElement_inproc_TargetBlank.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_AppFramePermission.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_AppWindowNamespace.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_Auth.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_BrowserWindowNamespace.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_ErrorSecurity.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_FrameWrongURI.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_OpenMixedProcess.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_OpenNamed.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_OpenWindow.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_OpenWindowDifferentOrigin.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_OpenWindowInFrame.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_OpenWindowRejected.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_SecurityChange.html":"",
"dom/browser-element/mochitest/test_browserElement_oop_TargetBlank.html":"",
"dom/file/test/test_progress_events.html":"All of these fail fairly regularly with: UnknownError: The operation failed for reasons unrelated to the database itself and not covered by any other error code. at http://mochi.test:8888/tests/dom/file/test/helpers.js:126",
"dom/file/test/test_request_readyState.html":"",

Просмотреть файл

@ -606,9 +606,12 @@ GetOSApplyToDir(nsACString& applyToDir)
NS_ASSERTION(ds, "Can't get directory service");
nsCOMPtr<nsIFile> osApplyToDir;
DebugOnly<nsresult> rv = ds->Get(XRE_OS_UPDATE_APPLY_TO_DIR, NS_GET_IID(nsIFile),
nsresult rv = ds->Get(XRE_OS_UPDATE_APPLY_TO_DIR, NS_GET_IID(nsIFile),
getter_AddRefs(osApplyToDir));
NS_ASSERTION(NS_SUCCEEDED(rv), "Can't get the OS applyTo dir");
if (NS_FAILED(rv)) {
LOG(("Can't get the OS applyTo dir"));
return rv;
}
return osApplyToDir->GetNativePath(applyToDir);
}
@ -1115,14 +1118,20 @@ nsUpdateProcessor::ProcessUpdate(nsIUpdate* aUpdate)
// This needs to be done on the main thread, so we pass it along in
// BackgroundThreadInfo
nsresult rv = GetOSApplyToDir(osApplyToDir);
NS_ASSERTION(NS_SUCCEEDED(rv), "Can't get the OS apply to dir");
if (NS_FAILED(rv)) {
LOG(("Can't get the OS apply to dir"));
return rv;
}
SetOSApplyToDir(aUpdate, osApplyToDir);
mInfo.mIsOSUpdate = true;
rv = NS_NewNativeLocalFile(osApplyToDir, false,
getter_AddRefs(mInfo.mOSApplyToDir));
NS_ASSERTION(NS_SUCCEEDED(rv), "Can't create nsIFile for OS apply to dir");
if (NS_FAILED(rv)) {
LOG(("Can't create nsIFile for OS apply to dir"));
return rv;
}
}
#endif

Просмотреть файл

@ -49,30 +49,44 @@ namespace android {
* This implements the (main) framebuffer management. This class
* was adapted from the version in SurfaceFlinger
*/
FramebufferSurface::FramebufferSurface(int disp, uint32_t width, uint32_t height, uint32_t format, sp<IGraphicBufferAlloc>& alloc) :
ConsumerBase(new BufferQueue(true, alloc)),
FramebufferSurface::FramebufferSurface(int disp, uint32_t width, uint32_t height, uint32_t format,
sp<BufferQueue>& bq) :
#if ANDROID_VERSION >= 19
ConsumerBase(bq, true),
#else
ConsumerBase(bq),
#endif
mDisplayType(disp),
mCurrentBufferSlot(-1),
mCurrentBuffer(0),
lastHandle(0)
{
mName = "FramebufferSurface";
mBufferQueue->setConsumerName(mName);
mBufferQueue->setConsumerUsageBits(GRALLOC_USAGE_HW_FB |
GRALLOC_USAGE_HW_RENDER |
GRALLOC_USAGE_HW_COMPOSER);
mBufferQueue->setDefaultBufferFormat(format);
mBufferQueue->setDefaultBufferSize(width, height);
mBufferQueue->setSynchronousMode(true);
mBufferQueue->setDefaultMaxBufferCount(NUM_FRAMEBUFFER_SURFACE_BUFFERS);
#if ANDROID_VERSION >= 19
sp<IGraphicBufferConsumer> consumer = mConsumer;
#else
sp<BufferQueue> consumer = mBufferQueue;
consumer->setSynchronousMode(true);
#endif
consumer->setConsumerName(mName);
consumer->setConsumerUsageBits(GRALLOC_USAGE_HW_FB |
GRALLOC_USAGE_HW_RENDER |
GRALLOC_USAGE_HW_COMPOSER);
consumer->setDefaultBufferFormat(format);
consumer->setDefaultBufferSize(width, height);
consumer->setDefaultMaxBufferCount(NUM_FRAMEBUFFER_SURFACE_BUFFERS);
}
status_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence) {
Mutex::Autolock lock(mMutex);
BufferQueue::BufferItem item;
#if ANDROID_VERSION >= 19
status_t err = acquireBufferLocked(&item, 0);
#else
status_t err = acquireBufferLocked(&item);
#endif
if (err == BufferQueue::NO_BUFFER_AVAILABLE) {
outBuffer = mCurrentBuffer;
return NO_ERROR;
@ -92,8 +106,13 @@ status_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>&
if (mCurrentBufferSlot != BufferQueue::INVALID_BUFFER_SLOT &&
item.mBuf != mCurrentBufferSlot) {
// Release the previous buffer.
#if ANDROID_VERSION >= 19
err = releaseBufferLocked(mCurrentBufferSlot, mCurrentBuffer,
EGL_NO_DISPLAY, EGL_NO_SYNC_KHR);
#else
err = releaseBufferLocked(mCurrentBufferSlot, EGL_NO_DISPLAY,
EGL_NO_SYNC_KHR);
#endif
if (err != NO_ERROR && err != BufferQueue::STALE_BUFFER_SLOT) {
ALOGE("error releasing buffer: %s (%d)", strerror(-err), err);
return err;
@ -136,7 +155,11 @@ status_t FramebufferSurface::setReleaseFenceFd(int fenceFd) {
if (fenceFd >= 0) {
sp<Fence> fence(new Fence(fenceFd));
if (mCurrentBufferSlot != BufferQueue::INVALID_BUFFER_SLOT) {
#if ANDROID_VERSION >= 19
status_t err = addReleaseFence(mCurrentBufferSlot, mCurrentBuffer, fence);
#else
status_t err = addReleaseFence(mCurrentBufferSlot, fence);
#endif
ALOGE_IF(err, "setReleaseFenceFd: failed to add the fence: %s (%d)",
strerror(-err), err);
}
@ -158,6 +181,10 @@ void FramebufferSurface::dump(String8& result) {
ConsumerBase::dump(result);
}
void FramebufferSurface::dump(String8& result, const char* prefix) {
ConsumerBase::dump(result);
}
// ----------------------------------------------------------------------------
}; // namespace android
// ----------------------------------------------------------------------------

Просмотреть файл

@ -34,13 +34,14 @@ class HWComposer;
class FramebufferSurface : public ConsumerBase {
public:
FramebufferSurface(int disp, uint32_t width, uint32_t height, uint32_t format, sp<IGraphicBufferAlloc>& alloc);
FramebufferSurface(int disp, uint32_t width, uint32_t height, uint32_t format, sp<BufferQueue>& bq);
bool isUpdateOnDemand() const { return false; }
status_t setUpdateRectangle(const Rect& updateRect);
status_t compositionComplete();
virtual void dump(String8& result);
virtual void dump(String8& result, const char* prefix);
// setReleaseFenceFd stores a fence file descriptor that will signal when the
// current buffer is no longer being read. This fence will be returned to

Просмотреть файл

@ -114,12 +114,17 @@ GonkDisplayJB::GonkDisplayJB()
mBootAnimBuffer = mAlloc->createGraphicBuffer(mWidth, mHeight, surfaceformat, usage, &error);
}
mFBSurface = new FramebufferSurface(0, mWidth, mHeight, surfaceformat, mAlloc);
#if ANDROID_VERSION >= 19
sp<BufferQueue> bq = new BufferQueue(mAlloc);
#else
sp<BufferQueue> bq = new BufferQueue(true, mAlloc);
#endif
mFBSurface = new FramebufferSurface(0, mWidth, mHeight, surfaceformat, bq);
#if ANDROID_VERSION == 17
sp<SurfaceTextureClient> stc = new SurfaceTextureClient(static_cast<sp<ISurfaceTexture> >(mFBSurface->getBufferQueue()));
#else
sp<Surface> stc = new Surface(static_cast<sp<IGraphicBufferProducer> >(mFBSurface->getBufferQueue()));
sp<Surface> stc = new Surface(static_cast<sp<IGraphicBufferProducer> >(bq));
#endif
mSTClient = stc;