Merge b2g-inbound to m-c.

This commit is contained in:
Ryan VanderMeulen 2013-10-16 17:01:40 -04:00
commit 400b11cacd
15 changed files with 233 additions and 37 deletions

View File

@ -802,10 +802,7 @@ pref("dom.datastore.enabled", true);
#endif
// DOM Inter-App Communication API.
#ifdef MOZ_WIDGET_GONK
// Enable this only for gonk-specific build but not for desktop build.
pref("dom.inter-app-communication-api.enabled", true);
#endif
// Allow ADB to run for this many hours before disabling
// (only applies when marionette is disabled)

View File

@ -1,4 +1,4 @@
{
"revision": "36aa3e5d226a844b07b3e4b2219f54b549456ec1",
"revision": "86e06b1db110e34eb66826d3b1bdee3a5d57b3a7",
"repo_path": "/integration/gaia-central"
}

View File

@ -66,7 +66,9 @@ nsDOMCameraManager::~nsDOMCameraManager()
/* destructor code */
DOM_CAMERA_LOGT("%s:%d : this=%p\n", __func__, __LINE__, this);
nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
obs->RemoveObserver(this, "xpcom-shutdown");
if (obs) {
obs->RemoveObserver(this, "xpcom-shutdown");
}
}
bool

View File

@ -1062,6 +1062,23 @@ ContactDB.prototype = {
substringResult[event.target.result[i].id] = event.target.result[i];
}
}.bind(this);
} else if (normalized[0] !== "+") {
// We might have an international prefix like '00'
let parsed = PhoneNumberUtils.parse(normalized);
if (parsed && parsed.internationalNumber &&
parsed.nationalNumber &&
parsed.nationalNumber !== normalized &&
parsed.internationalNumber !== normalized) {
if (DEBUG) debug("Search with " + parsed.internationalNumber);
let prefixRequest = index.mozGetAll(parsed.internationalNumber, limit);
prefixRequest.onsuccess = function (event) {
if (DEBUG) debug("Request successful. Record count: " + event.target.result.length);
for (let i in event.target.result) {
substringResult[event.target.result[i].id] = event.target.result[i];
}
}.bind(this);
}
}
request = index.mozGetAll(normalized, limit);

View File

@ -61,6 +61,16 @@ var properties2 = {
tel: [{type: ["work"], value: shortNumber, carrier: "testCarrier"}]
};
var number3 = {
international1: "0041557932012345",
international2: "+557932012345"
};
var properties3 = {
name: "Testname2",
tel: [{value: number3.international2}]
};
var req;
var index = 0;
var createResult1;
@ -237,6 +247,41 @@ var steps = [
}
req.onerror = onFailure;
},
function () {
ok(true, "Adding a new contact with country code");
createResult1 = new mozContact();
createResult1.init(properties3);
req = navigator.mozContacts.save(createResult1);
req.onsuccess = function () {
ok(createResult1.id, "The contact now has an ID.");
sample_id1 = createResult1.id;
next();
};
req.onerror = onFailure;
},
function () {
ok(true, "Searching for international number with prefix");
var options = {filterBy: ["tel"],
filterOp: "match",
filterValue: number3.international1};
req = mozContacts.find(options);
req.onsuccess = function () {
ok(req.result.length == 1, "Found exactly 1 contact.");
findResult1 = req.result[0];
ok(findResult1.id == sample_id1, "Same ID");
next();
};
req.onerror = onFailure;
},
function () {
ok(true, "Deleting database");
req = mozContacts.clear();
req.onsuccess = function () {
ok(true, "Deleted the database");
next();
}
req.onerror = onFailure;
},
function () {
ok(true, "all done!\n");
SimpleTest.finish();

View File

@ -45,15 +45,17 @@
}, cbError);
}
var itemNumber = 60;
function testStoreAdd() {
var objects = [];
for (var i = 0; i < 300; ++i) {
for (var i = 0; i < itemNumber; ++i) {
objects.push(i);
}
function testStoreAddInternal() {
if (!objects.length) {
ok(true, "We inserted 300 items");
ok(true, "We inserted " + itemNumber + " items");
runTest();
return;
}
@ -70,7 +72,7 @@
function testStoreGet() {
var objects = [];
for (var i = 1; i <= 300; ++i) {
for (var i = 1; i <= itemNumber; ++i) {
objects.push(i);
}

View File

@ -136,6 +136,7 @@ SystemMessageManager.prototype = {
dispatchers[aType] = { handler: aHandler, messages: [], isHandling: false };
// Ask for the list of currently pending messages.
this.addMessageListeners("SystemMessageManager:GetPendingMessages:Return");
cpmm.sendAsyncMessage("SystemMessageManager:GetPendingMessages",
{ type: aType,
uri: this._uri,
@ -214,6 +215,8 @@ SystemMessageManager.prototype = {
manifest: this._manifest,
uri: this._uri,
msgID: msg.msgID });
} else if (aMessage.name == "SystemMessageManager:GetPendingMessages:Return") {
this.removeMessageListeners(aMessage.name);
}
let messages = (aMessage.name == "SystemMessageManager:Message")
@ -248,8 +251,7 @@ SystemMessageManager.prototype = {
// nsIDOMGlobalPropertyInitializer implementation.
init: function sysMessMgr_init(aWindow) {
debug("init");
this.initDOMRequestHelper(aWindow, ["SystemMessageManager:Message",
"SystemMessageManager:GetPendingMessages:Return"]);
this.initDOMRequestHelper(aWindow, ["SystemMessageManager:Message"]);
let principal = aWindow.document.nodePrincipal;
this._isInBrowserElement = principal.isInBrowserElement;

View File

@ -1152,6 +1152,7 @@ this.GECKO_ICC_SERVICES = {
ADN: 2,
FDN: 3,
PLMNSEL: 7,
MSISDN: 9,
CBMI: 14,
SPN: 17,
SDN: 18,
@ -1161,6 +1162,7 @@ this.GECKO_ICC_SERVICES = {
BDN: 31,
PNN: 51,
OPL: 52,
MDN: 53,
SPDI: 56
},
usim: {
@ -1170,10 +1172,12 @@ this.GECKO_ICC_SERVICES = {
CBMI: 15,
CBMIR: 16,
SPN: 19,
MSISDN: 21,
DATA_DOWNLOAD_SMS_PP: 28,
DATA_DOWNLOAD_SMS_CB: 29,
PNN: 45,
OPL: 46,
MDN: 47,
SPDI: 51
},
ruim: {

View File

@ -10995,10 +10995,8 @@ let ICCRecordHelper = {
fetchICCRecords: function fetchICCRecords() {
this.readICCID();
RIL.getIMSI();
this.readMSISDN();
this.readAD();
this.readSST();
this.readMBDN();
},
/**
@ -11143,6 +11141,13 @@ let ICCRecordHelper = {
debug("SST: " + str);
}
if (ICCUtilsHelper.isICCServiceAvailable("MSISDN")) {
if (DEBUG) debug("MSISDN: MSISDN is available");
this.readMSISDN();
} else {
if (DEBUG) debug("MSISDN: MSISDN service is not available");
}
// Fetch SPN and PLMN list, if some of them are available.
if (ICCUtilsHelper.isICCServiceAvailable("SPN")) {
if (DEBUG) debug("SPN: SPN is available");
@ -11151,6 +11156,13 @@ let ICCRecordHelper = {
if (DEBUG) debug("SPN: SPN service is not available");
}
if (ICCUtilsHelper.isICCServiceAvailable("MDN")) {
if (DEBUG) debug("MDN: MDN available.");
this.readMBDN();
} else {
if (DEBUG) debug("MDN: MDN service is not available");
}
if (ICCUtilsHelper.isICCServiceAvailable("SPDI")) {
if (DEBUG) debug("SPDI: SPDI available.");
this.readSPDI();

View File

@ -1895,3 +1895,86 @@ add_test(function test_reading_ad_and_parsing_mcc_mnc() {
run_next_test();
});
add_test(function test_reading_optional_efs() {
let worker = newUint8Worker();
let record = worker.ICCRecordHelper;
let gsmPdu = worker.GsmPDUHelper;
let ril = worker.RIL;
let buf = worker.Buf;
let io = worker.ICCIOHelper;
function buildSST(supportedEf) {
let sst = [];
let len = supportedEf.length;
for (let i = 0; i < len; i++) {
let index, bitmask, iccService;
if (ril.appType === CARD_APPTYPE_SIM) {
iccService = GECKO_ICC_SERVICES.sim[supportedEf[i]];
iccService -= 1;
index = Math.floor(iccService / 4);
bitmask = 2 << ((iccService % 4) << 1);
} else if (ril.appType === CARD_APPTYPE_USIM){
iccService = GECKO_ICC_SERVICES.usim[supportedEf[i]];
iccService -= 1;
index = Math.floor(iccService / 8);
bitmask = 1 << ((iccService % 8) << 0);
}
if (sst) {
sst[index] |= bitmask;
}
}
return sst;
}
ril.updateCellBroadcastConfig = function fakeUpdateCellBroadcastConfig() {
// Ignore updateCellBroadcastConfig after reading SST
};
function do_test(sst, supportedEf) {
// Clone supportedEf to local array for testing
let testEf = supportedEf.slice(0);
record.readMSISDN = function fakeReadMSISDN() {
testEf.splice(testEf.indexOf("MSISDN"), 1);
};
record.readMBDN = function fakeReadMBDN() {
testEf.splice(testEf.indexOf("MDN"), 1);
};
io.loadTransparentEF = function fakeLoadTransparentEF(options) {
// Write data size
buf.writeInt32(sst.length * 2);
// Write data
for (let i = 0; i < sst.length; i++) {
gsmPdu.writeHexOctet(sst[i] || 0);
}
// Write string delimiter
buf.writeStringDelimiter(sst.length * 2);
if (options.callback) {
options.callback(options);
}
if (testEf.length !== 0) {
do_print("Un-handled EF: " + JSON.stringify(testEf));
do_check_true(false);
}
};
record.readSST();
}
// TODO: Add all necessary optional EFs eventually
let supportedEf = ["MSISDN", "MDN"];
ril.appType = CARD_APPTYPE_SIM;
do_test(buildSST(supportedEf), supportedEf);
ril.appType = CARD_APPTYPE_USIM;
do_test(buildSST(supportedEf), supportedEf);
run_next_test();
});

View File

@ -198,7 +198,13 @@ ContainerRender(ContainerT* aContainer,
continue;
}
layerToRender->RenderLayer(childOffset, clipRect);
if (layerToRender->HasLayerBeenComposited()) {
// Composer2D will compose this layer so skip GPU composition
// this time & reset composition flag for next composition phase
layerToRender->SetLayerComposited(false);
} else {
layerToRender->RenderLayer(childOffset, clipRect);
}
// invariant: our GL context should be current here, I don't think we can
// assert it though
}

View File

@ -726,6 +726,7 @@ LayerComposite::LayerComposite(LayerManagerComposite *aManager)
, mUseShadowClipRect(false)
, mShadowTransformSetByAnimation(false)
, mDestroyed(false)
, mLayerComposited(false)
{ }
LayerComposite::~LayerComposite()

View File

@ -381,12 +381,18 @@ public:
mShadowTransformSetByAnimation = aSetByAnimation;
}
void SetLayerComposited(bool value)
{
mLayerComposited = value;
}
// These getters can be used anytime.
float GetShadowOpacity() { return mShadowOpacity; }
const nsIntRect* GetShadowClipRect() { return mUseShadowClipRect ? &mShadowClipRect : nullptr; }
const nsIntRegion& GetShadowVisibleRegion() { return mShadowVisibleRegion; }
const gfx3DMatrix& GetShadowTransform() { return mShadowTransform; }
bool GetShadowTransformSetByAnimation() { return mShadowTransformSetByAnimation; }
bool HasLayerBeenComposited() { return mLayerComposited; }
protected:
gfx3DMatrix mShadowTransform;
@ -398,6 +404,7 @@ protected:
bool mUseShadowClipRect;
bool mShadowTransformSetByAnimation;
bool mDestroyed;
bool mLayerComposited;
};

View File

@ -157,11 +157,13 @@ HwcComposer2D::PrepareLayerList(Layer* aLayer,
return true;
}
float opacity = aLayer->GetEffectiveOpacity();
if (opacity < 1) {
uint8_t opacity = std::min(0xFF, (int)(aLayer->GetEffectiveOpacity() * 256.0));
#if ANDROID_VERSION < 18
if (opacity < 0xFF) {
LOGD("%s Layer has planar semitransparency which is unsupported", aLayer->Name());
return false;
}
#endif
nsIntRect clip;
if (!HwcUtils::CalculateClipRect(aParentTransform * aGLWorldTransform,
@ -276,7 +278,7 @@ HwcComposer2D::PrepareLayerList(Layer* aLayer,
hwcLayer.acquireFenceFd = -1;
hwcLayer.releaseFenceFd = -1;
hwcLayer.planeAlpha = 0xFF; // Until plane alpha is enabled
hwcLayer.planeAlpha = opacity;
#else
hwcLayer.compositionType = HwcUtils::HWC_USE_COPYBIT;
#endif
@ -434,6 +436,7 @@ HwcComposer2D::PrepareLayerList(Layer* aLayer,
hwcLayer.transform = colorLayer->GetColor().Packed();
}
mHwcLayerMap.AppendElement(static_cast<LayerComposite*>(aLayer->ImplData()));
mList->numHwLayers++;
return true;
}
@ -461,13 +464,29 @@ HwcComposer2D::TryHwComposition()
Prepare(fbsurface->lastHandle, -1);
bool fullHwcComposite = true;
for (int j = 0; j < idx; j++) {
if (mList->hwLayers[j].compositionType == HWC_FRAMEBUFFER) {
// After prepare, if there is an HWC_FRAMEBUFFER layer,
// it means full HWC Composition is not possible this time
LOGD("GPU or Partial HWC Composition");
return false;
fullHwcComposite = false;
break;
}
}
if (!fullHwcComposite) {
for (int k=0; k < idx; k++) {
if (mList->hwLayers[k].compositionType == HWC_OVERLAY) {
// HWC will compose HWC_OVERLAY layers in partial
// HWC Composition, so set layer composition flag
// on mapped LayerComposite to skip GPU composition
mHwcLayerMap[k]->SetLayerComposited(true);
}
}
return false;
}
// Full HWC Composition
Commit();
@ -554,28 +573,26 @@ HwcComposer2D::Commit()
int err = mHwc->set(mHwc, HWC_NUM_DISPLAY_TYPES, displays);
for (int i = 0; i <= MAX_HWC_LAYERS; i++) {
if (mPrevRelFd[i] <= 0) {
break;
if (!mPrevReleaseFds.IsEmpty()) {
// Wait for previous retire Fence to signal.
// Denotes contents on display have been replaced.
// For buffer-sync, framework should not over-write
// prev buffers until we close prev releaseFenceFds
sp<Fence> fence = new Fence(mPrevReleaseFds[0]);
if (fence->wait(1000) == -ETIME) {
LOGE("Wait timed-out for retireFenceFd %d", mPrevReleaseFds[0]);
}
if (!i) {
// Wait for previous retire Fence to signal.
// Denotes contents on display have been replaced.
// For buffer-sync, framework should not over-write
// prev buffers until we close prev releaseFenceFds
sp<Fence> fence = new Fence(mPrevRelFd[i]);
if (fence->wait(1000) == -ETIME) {
LOGE("Wait timed-out for retireFenceFd %d", mPrevRelFd[i]);
}
for (int i = 0; i < mPrevReleaseFds.Length(); i++) {
close(mPrevReleaseFds[i]);
}
close(mPrevRelFd[i]);
mPrevRelFd[i] = -1;
mPrevReleaseFds.Clear();
}
mPrevRelFd[0] = mList->retireFenceFd;
for (uint32_t j = 0; j < (mList->numHwLayers - 1); j++) {
mPrevReleaseFds.AppendElement(mList->retireFenceFd);
for (uint32_t j=0; j < (mList->numHwLayers - 1); j++) {
if (mList->hwLayers[j].compositionType == HWC_OVERLAY) {
mPrevRelFd[j + 1] = mList->hwLayers[j].releaseFenceFd;
mPrevReleaseFds.AppendElement(mList->hwLayers[j].releaseFenceFd);
mList->hwLayers[j].releaseFenceFd = -1;
}
}
@ -609,12 +626,14 @@ HwcComposer2D::TryRender(Layer* aRoot,
MOZ_ASSERT(Initialized());
if (mList) {
mList->numHwLayers = 0;
mHwcLayerMap.Clear();
}
// XXX: The clear() below means all rect vectors will be have to be
// reallocated. We may want to avoid this if possible
mVisibleRegions.clear();
MOZ_ASSERT(mHwcLayerMap.IsEmpty());
if (!PrepareLayerList(aRoot,
mScreenRect,
gfxMatrix(),

View File

@ -24,8 +24,6 @@
#include <hardware/hwcomposer.h>
#define MAX_HWC_LAYERS 15
namespace mozilla {
namespace layers {
@ -83,7 +81,8 @@ private:
//Holds all the dynamically allocated RectVectors needed
//to render the current frame
std::list<RectVector> mVisibleRegions;
int mPrevRelFd[MAX_HWC_LAYERS + 1];
nsTArray<int> mPrevReleaseFds;
nsTArray<layers::LayerComposite*> mHwcLayerMap;
};
} // namespace mozilla