diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 39c1b43180d..111a698f058 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -8038,6 +8038,10 @@ var gIdentityHandler = {
delete this._identityIconCountryLabel;
return this._identityIconCountryLabel = document.getElementById("identity-icon-country-label");
},
+ get _identityIcon () {
+ delete this._identityIcon;
+ return this._identityIcon = document.getElementById("page-proxy-favicon");
+ },
/**
* Rebuild cache of the elements that may or may not exist depending
@@ -8047,9 +8051,11 @@ var gIdentityHandler = {
delete this._identityBox;
delete this._identityIconLabel;
delete this._identityIconCountryLabel;
+ delete this._identityIcon;
this._identityBox = document.getElementById("identity-box");
this._identityIconLabel = document.getElementById("identity-icon-label");
this._identityIconCountryLabel = document.getElementById("identity-icon-country-label");
+ this._identityIcon = document.getElementById("page-proxy-favicon");
},
/**
@@ -8354,7 +8360,7 @@ var gIdentityHandler = {
}, false);
// Now open the popup, anchored off the primary chrome element
- this._identityPopup.openPopup(this._identityBox, "bottomcenter topleft");
+ this._identityPopup.openPopup(this._identityIcon, "bottomcenter topleft");
},
onPopupShown : function(event) {
diff --git a/browser/components/migration/content/migration.js b/browser/components/migration/content/migration.js
index b7c9c7f46a6..1affb3599fe 100644
--- a/browser/components/migration/content/migration.js
+++ b/browser/components/migration/content/migration.js
@@ -18,7 +18,6 @@ var MigrationWizard = {
_wiz: null,
_migrator: null,
_autoMigrate: null,
- _bookmarks: false,
init: function ()
{
@@ -64,34 +63,15 @@ var MigrationWizard = {
// 1 - Import Source
onImportSourcePageShow: function ()
{
- // Reference to the "From File" radio button
- var fromfile = null;
-
- // init is not called when openDialog opens the wizard, so check for bookmarks here.
- if ("arguments" in window && window.arguments[0] == "bookmarks") {
- this._bookmarks = true;
-
- fromfile = document.getElementById("fromfile");
- fromfile.hidden = false;
-
- var importBookmarks = document.getElementById("importBookmarks");
- importBookmarks.hidden = false;
-
- var importAll = document.getElementById("importAll");
- importAll.hidden = true;
- }
-
this._wiz.canRewind = false;
- // The migrator to select. If the "fromfile" migrator is available, use it
- // as the default in case we have no other migrators.
- var selectedMigrator = fromfile;
+ var selectedMigrator = null;
// Figure out what source apps are are available to import from:
var group = document.getElementById("importSourceGroup");
for (var i = 0; i < group.childNodes.length; ++i) {
var migratorKey = group.childNodes[i].id;
- if (migratorKey != "nothing" && migratorKey != "fromfile") {
+ if (migratorKey != "nothing") {
var migrator = MigrationUtils.getMigrator(migratorKey);
if (migrator) {
// Save this as the first selectable item, if we don't already have
@@ -128,9 +108,7 @@ var MigrationWizard = {
{
var newSource = document.getElementById("importSourceGroup").selectedItem.id;
- if (newSource == "nothing" || newSource == "fromfile") {
- if(newSource == "fromfile")
- window.opener.fromFile = true;
+ if (newSource == "nothing") {
document.documentElement.cancel();
return false;
}
@@ -152,8 +130,6 @@ var MigrationWizard = {
else {
if (this._autoMigrate)
this._wiz.currentPage.next = "homePageImport";
- else if (this._bookmarks)
- this._wiz.currentPage.next = "migrating"
else
this._wiz.currentPage.next = "importItems";
@@ -205,8 +181,6 @@ var MigrationWizard = {
// If we're automigrating or just doing bookmarks don't show the item selection page
if (this._autoMigrate)
this._wiz.currentPage.next = "homePageImport";
- else if (this._bookmarks)
- this._wiz.currentPage.next = "migrating"
},
// 3 - ImportItems
@@ -352,10 +326,6 @@ var MigrationWizard = {
if (this._autoMigrate)
this._itemsFlags = this._migrator.getMigrateData(this._selectedProfile, this._autoMigrate);
- // When importing bookmarks, show only bookmarks
- if (this._bookmarks)
- this._itemsFlags = 32;
-
this._listItems("migratingItems");
setTimeout(this.onMigratingMigrate, 0, this);
},
diff --git a/browser/components/migration/content/migration.xul b/browser/components/migration/content/migration.xul
index cc53a7bff94..b16bfc6843b 100644
--- a/browser/components/migration/content/migration.xul
+++ b/browser/components/migration/content/migration.xul
@@ -71,7 +71,6 @@
-
diff --git a/browser/locales/en-US/chrome/browser/migration/migration.dtd b/browser/locales/en-US/chrome/browser/migration/migration.dtd
index 86e9d0b1cc5..0b4b7763875 100644
--- a/browser/locales/en-US/chrome/browser/migration/migration.dtd
+++ b/browser/locales/en-US/chrome/browser/migration/migration.dtd
@@ -15,8 +15,6 @@
-
-
diff --git a/content/canvas/crashtests/743499-negative-size.html b/content/canvas/crashtests/743499-negative-size.html
new file mode 100644
index 00000000000..7cfcd55b2a7
--- /dev/null
+++ b/content/canvas/crashtests/743499-negative-size.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/content/canvas/crashtests/745818-large-source.html b/content/canvas/crashtests/745818-large-source.html
new file mode 100644
index 00000000000..a5be76be06e
--- /dev/null
+++ b/content/canvas/crashtests/745818-large-source.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/content/canvas/crashtests/crashtests.list b/content/canvas/crashtests/crashtests.list
index 708c07a2764..c3f6bfcfd3b 100644
--- a/content/canvas/crashtests/crashtests.list
+++ b/content/canvas/crashtests/crashtests.list
@@ -6,3 +6,6 @@ load 0px-size-font-667225.html
load texImage2D.html
load 729116.html
load 745699-1.html
+# this test crashes in a bunch places still
+#load 745818-large-source.html
+load 743499-negative-size.html
diff --git a/content/canvas/src/nsCanvasRenderingContext2DAzure.cpp b/content/canvas/src/nsCanvasRenderingContext2DAzure.cpp
index 1aa005ca807..99d0b95afab 100644
--- a/content/canvas/src/nsCanvasRenderingContext2DAzure.cpp
+++ b/content/canvas/src/nsCanvasRenderingContext2DAzure.cpp
@@ -1973,7 +1973,7 @@ nsCanvasRenderingContext2DAzure::CreatePattern(nsIDOMHTMLElement *image,
}
// Ignore nsnull cairo surfaces! See bug 666312.
- if (!res.mSurface->CairoSurface()) {
+ if (!res.mSurface->CairoSurface() || res.mSurface->CairoStatus()) {
return NS_OK;
}
diff --git a/dom/system/gonk/RadioInterfaceLayer.js b/dom/system/gonk/RadioInterfaceLayer.js
index ab751cdb307..c16a390b1f9 100644
--- a/dom/system/gonk/RadioInterfaceLayer.js
+++ b/dom/system/gonk/RadioInterfaceLayer.js
@@ -150,7 +150,7 @@ function RadioInterfaceLayer() {
this.radioState = {
radioState: RIL.GECKO_RADIOSTATE_UNAVAILABLE,
cardState: RIL.GECKO_CARDSTATE_UNAVAILABLE,
- msisdn: null,
+ icc: null,
// These objects implement the nsIDOMMozMobileConnectionInfo interface,
// although the actual implementation lives in the content process.
@@ -173,6 +173,7 @@ function RadioInterfaceLayer() {
Services.obs.addObserver(this, "xpcom-shutdown", false);
this._sentSmsEnvelopes = {};
+ this.portAddressedSmsApps = {};
}
RadioInterfaceLayer.prototype = {
@@ -276,8 +277,8 @@ RadioInterfaceLayer.prototype = {
" dst=" + message.dstFlag +
" timestamp=" + message.localTimeStampInMS);
break;
- case "siminfo":
- this.radioState.msisdn = message.msisdn;
+ case "iccinfochange":
+ this.radioState.icc = message;
break;
default:
throw new Error("Don't know about this message type: " + message.type);
@@ -460,8 +461,26 @@ RadioInterfaceLayer.prototype = {
}
},
+ portAddressedSmsApps: null,
handleSmsReceived: function handleSmsReceived(message) {
debug("handleSmsReceived: " + JSON.stringify(message));
+
+ // Dispatch to registered handler if application port addressing is
+ // available. Note that the destination port can possibly be zero when
+ // representing a UDP/TCP port.
+ if (message.header.destinationPort != null) {
+ let handler = this.portAddressedSmsApps[message.header.destinationPort];
+ if (handler) {
+ handler(message);
+ }
+ return;
+ }
+
+ if (message.encoding == RIL.PDU_DCS_MSG_CODING_8BITS_ALPHABET) {
+ // Don't know how to handle binary data yet.
+ return;
+ }
+
let id = gSmsDatabaseService.saveReceivedMessage(message.sender || null,
message.fullBody || null,
message.timestamp);
diff --git a/dom/system/gonk/ril_consts.js b/dom/system/gonk/ril_consts.js
index 4c4eaf1d1b8..63ae5125244 100644
--- a/dom/system/gonk/ril_consts.js
+++ b/dom/system/gonk/ril_consts.js
@@ -373,34 +373,35 @@ const CALL_PRESENTATION_UNKNOWN = 2;
const CALL_PRESENTATION_PAYPHONE = 3;
// ICC commands, see TS 27.007 +CRSM commands
-const ICC_COMMAND_READ_BINARY = 0xb0;
-const ICC_COMMAND_UPDATE_BINARY = 0xd6;
-const ICC_COMMAND_READ_RECORD = 0xb2;
-const ICC_COMMAND_UPDATE_RECORD = 0xdc;
const ICC_COMMAND_SEEK = 0xa2;
+const ICC_COMMAND_READ_BINARY = 0xb0;
+const ICC_COMMAND_READ_RECORD = 0xb2;
const ICC_COMMAND_GET_RESPONSE = 0xc0;
+const ICC_COMMAND_UPDATE_BINARY = 0xd6;
+const ICC_COMMAND_UPDATE_RECORD = 0xdc;
// ICC constants, GSM SIM file ids from TS 51.011
-const ICC_EF_ADN = 0x6F3A;
-const ICC_EF_FDN = 0x6F3B;
-const ICC_EF_SDN = 0x6F49;
-const ICC_EF_EXT1 = 0x6F4A;
-const ICC_EF_EXT2 = 0x6F4B;
-const ICC_EF_EXT3 = 0x6F4C;
-const ICC_EF_EXT6 = 0x6fc8; // Ext record for EF[MBDN]
-const ICC_EF_MWIS = 0x6FCA;
-const ICC_EF_MBDN = 0x6fc7;
-const ICC_EF_PNN = 0x6fc5;
-const ICC_EF_SPN = 0x6F46;
-const ICC_EF_SMS = 0x6F3C;
-const ICC_EF_ICCID = 0x2fe2;
-const ICC_EF_AD = 0x6FAD;
-const ICC_EF_MBI = 0x6fc9;
+const ICC_EF_ICCID = 0x2fe2;
+const ICC_EF_IMG = 0x4f20;
+const ICC_EF_SST = 0x6f38;
+const ICC_EF_UST = 0x6f38; // For USIM
+const ICC_EF_ADN = 0x6f3a;
+const ICC_EF_FDN = 0x6f3b;
+const ICC_EF_SMS = 0x6f3c;
const ICC_EF_MSISDN = 0x6f40;
-const ICC_EF_SPDI = 0x6fcd;
-const ICC_EF_SST = 0x6f38;
-const ICC_EF_CFIS = 0x6FCB;
-const ICC_EF_IMG = 0x4f20;
+const ICC_EF_SPN = 0x6f46;
+const ICC_EF_SDN = 0x6f49;
+const ICC_EF_EXT1 = 0x6f4a;
+const ICC_EF_EXT2 = 0x6f4b;
+const ICC_EF_EXT3 = 0x6f4c;
+const ICC_EF_AD = 0x6fad;
+const ICC_EF_PNN = 0x6fc5;
+const ICC_EF_MBDN = 0x6fc7;
+const ICC_EF_EXT6 = 0x6fc8; // Ext record for EF[MBDN]
+const ICC_EF_MBI = 0x6fc9;
+const ICC_EF_MWIS = 0x6fca;
+const ICC_EF_CFIS = 0x6fcb;
+const ICC_EF_SPDI = 0x6fcd;
// Types of files TS 11.11 9.3
const TYPE_RFU = 0;
@@ -408,6 +409,7 @@ const TYPE_MF = 1;
const TYPE_DF = 2;
const TYPE_EF = 4;
+const RESPONSE_DATA_FILE_SIZE = 2;
const RESPONSE_DATA_FILE_ID_1 = 4;
const RESPONSE_DATA_FILE_ID_2 = 5;
const RESPONSE_DATA_FILE_TYPE = 6;
@@ -425,9 +427,9 @@ const EF_TYPE_TRANSPARENT = 0;
const EF_TYPE_LINEAR_FIXED = 1;
const EF_TYPE_CYCLIC = 3;
-// For retriveing MSISDN
-const FOOTER_SIZE_BYTES = 14;
-const MAX_NUMBER_SIZE_BYTES = 11;
+// For retrieving MSISDN, TS 151.011 clause 10.5.5
+const MSISDN_FOOTER_SIZE_BYTES = 14;
+const MSISDN_MAX_NUMBER_SIZE_BYTES = 10;
// READ_RECORD mode, TS 102.221
const READ_RECORD_ABSOLUTE_MODE = 4;
@@ -439,6 +441,7 @@ const GET_RESPONSE_EF_SIZE_BYTES = 15;
// EF path
const EF_PATH_MF_SIM = "3f00";
const EF_PATH_DF_TELECOM = "7f10";
+const EF_PATH_DF_GSM = "7f20";
// Status code of sw1 for ICC I/O,
// see GSM11.11 and TS 51.011 clause 9.4, and ISO 7816-4
@@ -655,6 +658,10 @@ const PDU_IEI_ENHANCED_VOICE_MAIL_INFORMATION = 0x23;
const PDU_IEI_NATIONAL_LANGUAGE_SINGLE_SHIFT = 0x24;
const PDU_IEI_NATIONAL_LANGUAGE_LOCKING_SHIFT = 0x25;
+// Application Port Addressing, see 3GPP TS 23.040 9.2.3.24.3
+const PDU_APA_RESERVED_8BIT_PORTS = 240;
+const PDU_APA_VALID_16BIT_PORTS = 49152;
+
// 7bit alphabet escape character. The encoded value of this code point is left
// undefined in official spec. Its code value is internally assigned to \uffff,
// in Unicode basic multilingual plane.
diff --git a/dom/system/gonk/ril_worker.js b/dom/system/gonk/ril_worker.js
index f26a8c9d9da..2d3e7350987 100644
--- a/dom/system/gonk/ril_worker.js
+++ b/dom/system/gonk/ril_worker.js
@@ -75,6 +75,8 @@ const UINT16_SIZE = 2;
const UINT32_SIZE = 4;
const PARCEL_SIZE_SIZE = UINT32_SIZE;
+const PDU_HEX_OCTET_SIZE = 4;
+
let RILQUIRKS_CALLSTATE_EXTRA_UINT32 = false;
let RILQUIRKS_DATACALLSTATE_DOWN_IS_UP = false;
// This flag defaults to true since on RIL v6 and later, we get the
@@ -202,6 +204,51 @@ let Buf = {
* These are all little endian, apart from readParcelSize();
*/
+ /**
+ * Ensure position specified is readable.
+ *
+ * @param index
+ * Data position in incoming parcel, valid from 0 to
+ * this.currentParcelSize.
+ */
+ ensureIncomingAvailable: function ensureIncomingAvailable(index) {
+ if (index >= this.currentParcelSize) {
+ throw new Error("Trying to read data beyond the parcel end!");
+ } else if (index < 0) {
+ throw new Error("Trying to read data before the parcel begin!");
+ }
+ },
+
+ /**
+ * Seek in current incoming parcel.
+ *
+ * @param offset
+ * Seek offset in relative to current position.
+ */
+ seekIncoming: function seekIncoming(offset) {
+ // Translate to 0..currentParcelSize
+ let cur = this.currentParcelSize - this.readAvailable;
+
+ let newIndex = cur + offset;
+ this.ensureIncomingAvailable(newIndex);
+
+ // ... incomingReadIndex -->|
+ // 0 new cur currentParcelSize
+ // |================|=======|===================|
+ // |<-- cur -->|<- readAvailable ->|
+ // |<-- newIndex -->|<-- new readAvailable -->|
+ this.readAvailable = this.currentParcelSize - newIndex;
+
+ // Translate back:
+ if (this.incomingReadIndex < cur) {
+ // The incomingReadIndex is wrapped.
+ newIndex += this.INCOMING_BUFFER_LENGTH;
+ }
+ newIndex += (this.incomingReadIndex - cur);
+ newIndex %= this.INCOMING_BUFFER_LENGTH;
+ this.incomingReadIndex = newIndex;
+ },
+
readUint8Unchecked: function readUint8Unchecked() {
let value = this.incomingBytes[this.incomingReadIndex];
this.incomingReadIndex = (this.incomingReadIndex + 1) %
@@ -210,9 +257,9 @@ let Buf = {
},
readUint8: function readUint8() {
- if (!this.readAvailable) {
- throw new Error("Trying to read data beyond the parcel end!");
- }
+ // Translate to 0..currentParcelSize
+ let cur = this.currentParcelSize - this.readAvailable;
+ this.ensureIncomingAvailable(cur);
this.readAvailable--;
return this.readUint8Unchecked();
@@ -567,9 +614,12 @@ let RIL = {
*/
IMEI: null,
IMEISV: null,
- IMSI: null,
SMSC: null,
- MSISDN: null,
+
+ /**
+ * ICC information, such as MSISDN, IMSI, ...etc.
+ */
+ iccInfo: {},
voiceRegistrationState: {},
dataRegistrationState: {},
@@ -766,10 +816,10 @@ let RIL = {
*
* @param command
* The I/O command, one of the ICC_COMMAND_* constants.
- * @param fileid
+ * @param fileId
* The file to operate on, one of the ICC_EF_* constants.
- * @param pathid
- * String type, check pathid from TS 27.007 +CRSM
+ * @param pathId
+ * String type, check the 'pathid' parameter from TS 27.007 +CRSM.
* @param p1, p2, p3
* Arbitrary integer parameters for the command.
* @param data
@@ -780,8 +830,8 @@ let RIL = {
iccIO: function iccIO(options) {
let token = Buf.newParcel(REQUEST_SIM_IO, options);
Buf.writeUint32(options.command);
- Buf.writeUint32(options.fileid);
- Buf.writeString(options.pathid);
+ Buf.writeUint32(options.fileId);
+ Buf.writeString(options.pathId);
Buf.writeUint32(options.p1);
Buf.writeUint32(options.p2);
Buf.writeUint32(options.p3);
@@ -792,19 +842,183 @@ let RIL = {
Buf.sendParcel();
},
+ /**
+ * Fetch ICC records.
+ */
+ fetchICCRecords: function fetchICCRecords() {
+ this.getIMSI();
+ this.getMSISDN();
+ this.getAD();
+ this.getUST();
+ },
+
+ /**
+ * Update the ICC information to RadioInterfaceLayer.
+ */
+ _handleICCInfoChange: function _handleICCInfoChange() {
+ this.iccInfo.type = "iccinfochange";
+ this.sendDOMMessage(this.iccInfo);
+ },
+
+ getIMSI: function getIMSI() {
+ Buf.simpleRequest(REQUEST_GET_IMSI);
+ },
+
/**
* Read the MSISDN from the ICC.
*/
getMSISDN: function getMSISDN() {
+ function callback() {
+ let length = Buf.readUint32();
+ // Each octet is encoded into two chars.
+ let recordLength = length / 2;
+ // Skip prefixed alpha identifier
+ Buf.seekIncoming((recordLength - MSISDN_FOOTER_SIZE_BYTES) *
+ PDU_HEX_OCTET_SIZE);
+
+ // Dialling Number/SSC String
+ let len = GsmPDUHelper.readHexOctet();
+ if (len > MSISDN_MAX_NUMBER_SIZE_BYTES) {
+ debug("ICC_EF_MSISDN: invalid length of BCD number/SSC contents - " + len);
+ return;
+ }
+ this.iccInfo.MSISDN = GsmPDUHelper.readAddress(len);
+ let delimiter = Buf.readUint16();
+ if (!(length & 1)) {
+ delimiter |= Buf.readUint16();
+ }
+ if (DEBUG) {
+ if (delimiter != 0) {
+ debug("Something's wrong, found string delimiter: " + delimiter);
+ }
+ }
+
+ if (DEBUG) debug("MSISDN: " + this.iccInfo.MSISDN);
+ if (this.iccInfo.MSISDN) {
+ this._handleICCInfoChange();
+ }
+ }
+
this.iccIO({
- command: ICC_COMMAND_GET_RESPONSE,
- fileid: ICC_EF_MSISDN,
- pathid: EF_PATH_MF_SIM + EF_PATH_DF_TELECOM,
- p1: 0, // For GET_RESPONSE, p1 = 0
- p2: 0, // For GET_RESPONSE, p2 = 0
- p3: GET_RESPONSE_EF_SIZE_BYTES,
- data: null,
- pin2: null,
+ command: ICC_COMMAND_GET_RESPONSE,
+ fileId: ICC_EF_MSISDN,
+ pathId: EF_PATH_MF_SIM + EF_PATH_DF_TELECOM,
+ p1: 0, // For GET_RESPONSE, p1 = 0
+ p2: 0, // For GET_RESPONSE, p2 = 0
+ p3: GET_RESPONSE_EF_SIZE_BYTES,
+ data: null,
+ pin2: null,
+ type: EF_TYPE_LINEAR_FIXED,
+ callback: callback,
+ });
+ },
+
+ /**
+ * Read the AD from the ICC.
+ */
+ getAD: function getAD() {
+ function callback() {
+ let length = Buf.readUint32();
+ // Each octet is encoded into two chars.
+ let len = length / 2;
+ this.iccInfo.AD = GsmPDUHelper.readHexOctetArray(len);
+ let delimiter = Buf.readUint16();
+ if (!(length & 1)) {
+ delimiter |= Buf.readUint16();
+ }
+ if (DEBUG) {
+ if (delimiter != 0) {
+ debug("Something's wrong, found string delimiter: " + delimiter);
+ }
+ }
+
+ if (DEBUG) {
+ let str = "";
+ for (let i = 0; i < this.iccInfo.AD.length; i++) {
+ str += this.iccInfo.AD[i] + ", ";
+ }
+ debug("AD: " + str);
+ }
+
+ if (this.iccInfo.IMSI) {
+ // MCC is the first 3 digits of IMSI
+ this.iccInfo.MCC = this.iccInfo.IMSI.substr(0,3);
+ // The 4th byte of the response is the length of MNC
+ this.iccInfo.MNC = this.iccInfo.IMSI.substr(3, this.iccInfo.AD[3]);
+ if (DEBUG) debug("MCC: " + this.iccInfo.MCC + " MNC: " + this.iccInfo.MNC);
+ this._handleICCInfoChange();
+ }
+ }
+
+ this.iccIO({
+ command: ICC_COMMAND_GET_RESPONSE,
+ fileId: ICC_EF_AD,
+ pathId: EF_PATH_MF_SIM + EF_PATH_DF_GSM,
+ p1: 0, // For GET_RESPONSE, p1 = 0
+ p2: 0, // For GET_RESPONSE, p2 = 0
+ p3: GET_RESPONSE_EF_SIZE_BYTES,
+ data: null,
+ pin2: null,
+ type: EF_TYPE_TRANSPARENT,
+ callback: callback,
+ });
+ },
+
+ /**
+ * Get whether specificed USIM service is available.
+ *
+ * @param service
+ * Service id, valid in 1..N. See 3GPP TS 31.102 4.2.8.
+ * @return
+ * true if the service is enabled,
+ * false otherwise.
+ */
+ isUSTServiceAvailable: function isUSTServiceAvailable(service) {
+ service -= 1;
+ let index = service / 8;
+ let bitmask = 1 << (service % 8);
+ return this.UST && (index < this.UST.length) && (this.UST[index] & bitmask);
+ },
+
+ /**
+ * Read the UST from the ICC.
+ */
+ getUST: function getUST() {
+ function callback() {
+ let length = Buf.readUint32();
+ // Each octet is encoded into two chars.
+ let len = length / 2;
+ this.iccInfo.UST = GsmPDUHelper.readHexOctetArray(len);
+ let delimiter = Buf.readUint16();
+ if (!(length & 1)) {
+ delimiter |= Buf.readUint16();
+ }
+ if (DEBUG) {
+ if (delimiter != 0) {
+ debug("Something's wrong, found string delimiter: " + delimiter);
+ }
+ }
+
+ if (DEBUG) {
+ let str = "";
+ for (let i = 0; i < this.iccInfo.UST.length; i++) {
+ str += this.iccInfo.UST[i] + ", ";
+ }
+ debug("UST: " + str);
+ }
+ }
+
+ this.iccIO({
+ command: ICC_COMMAND_GET_RESPONSE,
+ fileId: ICC_EF_UST,
+ pathId: EF_PATH_MF_SIM + EF_PATH_DF_GSM,
+ p1: 0, // For GET_RESPONSE, p1 = 0
+ p2: 0, // For GET_RESPONSE, p2 = 0
+ p3: GET_RESPONSE_EF_SIZE_BYTES,
+ data: null,
+ pin2: null,
+ type: EF_TYPE_TRANSPARENT,
+ callback: callback,
});
},
@@ -1263,7 +1477,7 @@ let RIL = {
case CARD_APPSTATE_READY:
this.requestNetworkInfo();
this.getSignalStrength();
- this.getMSISDN();
+ this.fetchICCRecords();
newCardState = GECKO_CARDSTATE_READY;
break;
case CARD_APPSTATE_UNKNOWN:
@@ -1281,33 +1495,119 @@ let RIL = {
},
/**
- * Process the MSISDN ICC I/O response.
+ * Process a ICC_COMMAND_GET_RESPONSE type command for REQUEST_SIM_IO.
*/
- _processMSISDNResponse: function _processMSISDNResponse(options) {
+ _processICCIOGetResponse: function _processICCIOGetResponse(options) {
+ let length = Buf.readUint32();
+
+ // The format is from TS 51.011, clause 9.2.1
+
+ // Skip RFU, data[0] data[1]
+ Buf.seekIncoming(2 * PDU_HEX_OCTET_SIZE);
+
+ // File size, data[2], data[3]
+ let fileSize = (GsmPDUHelper.readHexOctet() << 8) |
+ GsmPDUHelper.readHexOctet();
+
+ // 2 bytes File id. data[4], data[5]
+ let fileId = (GsmPDUHelper.readHexOctet() << 8) |
+ GsmPDUHelper.readHexOctet();
+ if (fileId != options.fileId) {
+ if (DEBUG) {
+ debug("Expected file ID " + options.fileId + " but read " + fileId);
+ }
+ return;
+ }
+
+ // Type of file, data[6]
+ let fileType = GsmPDUHelper.readHexOctet();
+ if (fileType != TYPE_EF) {
+ if (DEBUG) {
+ debug("Unexpected file type " + fileType);
+ }
+ return;
+ }
+
+ // Skip 1 byte RFU, data[7],
+ // 3 bytes Access conditions, data[8] data[9] data[10],
+ // 1 byte File status, data[11],
+ // 1 byte Length of the following data, data[12].
+ Buf.seekIncoming(((RESPONSE_DATA_STRUCTURE - RESPONSE_DATA_FILE_TYPE - 1) *
+ PDU_HEX_OCTET_SIZE));
+
+ // Read Structure of EF, data[13]
+ let efType = GsmPDUHelper.readHexOctet();
+ if (efType != options.type) {
+ if (DEBUG) {
+ debug("Expected EF type " + options.type + " but read " + efType);
+ }
+ return;
+ }
+
+ // Length of a record, data[14]
+ let recordSize = GsmPDUHelper.readHexOctet();
+
+ let delimiter = Buf.readUint16();
+ if (!(length & 1)) {
+ delimiter |= Buf.readUint16();
+ }
+ if (DEBUG) {
+ if (delimiter != 0) {
+ debug("Something's wrong, found string delimiter: " + delimiter);
+ }
+ }
+
+ switch (options.type) {
+ case EF_TYPE_LINEAR_FIXED:
+ // Reuse the options object and update some properties.
+ options.command = ICC_COMMAND_READ_RECORD;
+ options.p1 = 1; // Record number, always use the 1st record
+ options.p2 = READ_RECORD_ABSOLUTE_MODE;
+ options.p3 = recordSize;
+ this.iccIO(options);
+ break;
+ case EF_TYPE_TRANSPARENT:
+ // Reuse the options object and update some properties.
+ options.command = ICC_COMMAND_READ_BINARY;
+ options.p3 = fileSize;
+ this.iccIO(options);
+ break;
+ }
+ },
+
+ /**
+ * Process a ICC_COMMAND_READ_RECORD type command for REQUEST_SIM_IO.
+ */
+ _processICCIOReadRecord: function _processICCIOReadRecord(options) {
+ if (options.callback) {
+ options.callback.call(this);
+ }
+ },
+
+ /**
+ * Process a ICC_COMMAND_READ_BINARY type command for REQUEST_SIM_IO.
+ */
+ _processICCIOReadBinary: function _processICCIOReadBinary(options) {
+ if (options.callback) {
+ options.callback.call(this);
+ }
+ },
+
+ /**
+ * Process ICC I/O response.
+ */
+ _processICCIO: function _processICCIO(options) {
switch (options.command) {
case ICC_COMMAND_GET_RESPONSE:
- let response = Buf.readString();
- let recordSize = parseInt(
- response.substr(RESPONSE_DATA_RECORD_LENGTH * 2, 2), 16) & 0xff;
- let options = {
- command: ICC_COMMAND_READ_RECORD,
- fileid: ICC_EF_MSISDN,
- pathid: EF_PATH_MF_SIM + EF_PATH_DF_TELECOM,
- p1: 1, // Record number, MSISDN is always in the 1st record
- p2: READ_RECORD_ABSOLUTE_MODE,
- p3: recordSize,
- data: null,
- pin2: null,
- };
- this.iccIO(options);
+ this._processICCIOGetResponse(options);
break;
case ICC_COMMAND_READ_RECORD:
- // Ignore 2 bytes prefix, which is 4 chars
- let number = GsmPDUHelper.readStringAsBCD().toString().substr(4);
- if (DEBUG) debug("MSISDN: " + number);
- this.MSISDN = number || null;
- this.sendDOMMessage({type: "siminfo", msisdn: this.MSISDN});
+ this._processICCIOReadRecord(options);
+ break;
+
+ case ICC_COMMAND_READ_BINARY:
+ this._processICCIOReadBinary(options);
break;
}
},
@@ -1550,7 +1850,13 @@ let RIL = {
if (message.header && (message.header.segmentMaxSeq > 1)) {
message = this._processReceivedSmsSegment(message);
} else {
- message.fullBody = message.body;
+ if (message.encoding == PDU_DCS_MSG_CODING_8BITS_ALPHABET) {
+ message.fullData = message.data;
+ delete message.data;
+ } else {
+ message.fullBody = message.body;
+ delete message.body;
+ }
}
if (message) {
@@ -1629,7 +1935,7 @@ let RIL = {
* Helper for processing received multipart SMS.
*
* @return null for handled segments, and an object containing full message
- * body once all segments are received.
+ * body/data once all segments are received.
*/
_processReceivedSmsSegment: function _processReceivedSmsSegment(original) {
let hash = original.sender + ":" + original.header.segmentRef;
@@ -1652,7 +1958,13 @@ let RIL = {
return null;
}
- options.segments[seq] = original.body;
+ if (options.encoding == PDU_DCS_MSG_CODING_8BITS_ALPHABET) {
+ options.segments[seq] = original.data;
+ delete original.data;
+ } else {
+ options.segments[seq] = original.body;
+ delete original.body;
+ }
options.receivedSegments++;
if (options.receivedSegments < options.segmentMaxSeq) {
if (DEBUG) {
@@ -1666,9 +1978,23 @@ let RIL = {
delete this._receivedSmsSegmentsMap[hash];
// Rebuild full body
- options.fullBody = "";
- for (let i = 1; i <= options.segmentMaxSeq; i++) {
- options.fullBody += options.segments[i];
+ if (options.encoding == PDU_DCS_MSG_CODING_8BITS_ALPHABET) {
+ // Uint8Array doesn't have `concat`, so we have to merge all segements
+ // by hand.
+ let fullDataLen = 0;
+ for (let i = 1; i <= options.segmentMaxSeq; i++) {
+ fullDataLen += options.segments[i].length;
+ }
+
+ options.fullData = new Uint8Array(fullDataLen);
+ for (let d= 0, i = 1; i <= options.segmentMaxSeq; i++) {
+ let data = options.segments[i];
+ for (let j = 0; j < data.length; j++) {
+ options.fullData[d++] = data[j];
+ }
+ }
+ } else {
+ options.fullBody = options.segments.join("");
}
if (DEBUG) {
@@ -1869,7 +2195,7 @@ RIL[REQUEST_GET_IMSI] = function REQUEST_GET_IMSI(length, options) {
return;
}
- this.IMSI = Buf.readString();
+ this.iccInfo.IMSI = Buf.readString();
};
RIL[REQUEST_HANGUP] = function REQUEST_HANGUP(length, options) {
if (options.rilRequestError) {
@@ -2106,18 +2432,13 @@ RIL[REQUEST_SIM_IO] = function REQUEST_SIM_IO(length, options) {
// See GSM11.11, TS 51.011 clause 9.4, and ISO 7816-4 for the error
// description.
if (DEBUG) {
- debug("ICC I/O Error EF id = " + options.fileid.toString(16) +
+ debug("ICC I/O Error EF id = " + options.fileId.toString(16) +
" command = " + options.command.toString(16) +
"(" + sw1.toString(16) + "/" + sw2.toString(16) + ")");
}
return;
}
-
- switch (options.fileid) {
- case ICC_EF_MSISDN:
- this._processMSISDNResponse(options);
- break;
- }
+ this._processICCIO(options);
};
RIL[REQUEST_SEND_USSD] = null;
RIL[REQUEST_CANCEL_USSD] = null;
@@ -2559,6 +2880,17 @@ let GsmPDUHelper = {
this.writeHexNibble(octet);
},
+ /**
+ * Read an array of hex-encoded octets.
+ */
+ readHexOctetArray: function readHexOctetArray(length) {
+ let array = new Uint8Array(length);
+ for (let i = 0; i < length; i++) {
+ array[i] = this.readHexOctet();
+ }
+ return array;
+ },
+
/**
* Convert an octet (number) to a BCD number.
*
@@ -2863,6 +3195,35 @@ let GsmPDUHelper = {
}
break;
}
+ case PDU_IEI_APPLICATION_PORT_ADDREESING_SCHEME_8BIT: {
+ let dstp = this.readHexOctet();
+ let orip = this.readHexOctet();
+ dataAvailable -= 2;
+ if ((dstp < PDU_APA_RESERVED_8BIT_PORTS)
+ || (orip < PDU_APA_RESERVED_8BIT_PORTS)) {
+ // 3GPP TS 23.040 clause 9.2.3.24.3: "A receiving entity shall
+ // ignore any information element where the value of the
+ // Information-Element-Data is Reserved or not supported"
+ break;
+ }
+ header.destinationPort = dstp;
+ header.originatorPort = orip;
+ break;
+ }
+ case PDU_IEI_APPLICATION_PORT_ADDREESING_SCHEME_16BIT: {
+ let dstp = (this.readHexOctet() << 8) | this.readHexOctet();
+ let orip = (this.readHexOctet() << 8) | this.readHexOctet();
+ dataAvailable -= 4;
+ // 3GPP TS 23.040 clause 9.2.3.24.4: "A receiving entity shall
+ // ignore any information element where the value of the
+ // Information-Element-Data is Reserved or not supported"
+ if ((dstp < PDU_APA_VALID_16BIT_PORTS)
+ && (orip < PDU_APA_VALID_16BIT_PORTS)) {
+ header.destinationPort = dstp;
+ header.originatorPort = orip;
+ }
+ break;
+ }
case PDU_IEI_CONCATENATED_SHORT_MESSAGES_16BIT: {
let ref = (this.readHexOctet() << 8) | this.readHexOctet();
let max = this.readHexOctet();
@@ -3014,6 +3375,55 @@ let GsmPDUHelper = {
msg.epid = PDU_PID_DEFAULT;
},
+ /**
+ * Read TP-Data-Coding-Scheme(TP-DCS)
+ *
+ * @param msg
+ * message object for output.
+ *
+ * @see 3GPP TS 23.040 9.2.3.10, 3GPP TS 23.038 4.
+ */
+ readDataCodingScheme: function readDataCodingScheme(msg) {
+ let dcs = this.readHexOctet();
+
+ // 7 bit is the default fallback encoding.
+ let encoding = PDU_DCS_MSG_CODING_7BITS_ALPHABET;
+ switch (dcs & 0xC0) {
+ case 0x0:
+ // bits 7..4 = 00xx
+ switch (dcs & 0x0C) {
+ case 0x4:
+ encoding = PDU_DCS_MSG_CODING_8BITS_ALPHABET;
+ break;
+ case 0x8:
+ encoding = PDU_DCS_MSG_CODING_16BITS_ALPHABET;
+ break;
+ }
+ break;
+ case 0xC0:
+ // bits 7..4 = 11xx
+ switch (dcs & 0x30) {
+ case 0x20:
+ encoding = PDU_DCS_MSG_CODING_16BITS_ALPHABET;
+ break;
+ case 0x30:
+ if (!dcs & 0x04) {
+ encoding = PDU_DCS_MSG_CODING_8BITS_ALPHABET;
+ }
+ break;
+ }
+ break;
+ default:
+ // Falling back to default encoding.
+ break;
+ }
+
+ msg.dcs = dcs;
+ msg.encoding = encoding;
+
+ if (DEBUG) debug("PDU: message encoding is " + encoding + " bit.");
+ },
+
/**
* Read GSM TP-Service-Centre-Time-Stamp(TP-SCTS).
*
@@ -3051,50 +3461,15 @@ let GsmPDUHelper = {
* length of user data to read in octets.
*/
readUserData: function readUserData(msg, length) {
- let dcs = msg.dcs;
if (DEBUG) {
debug("Reading " + length + " bytes of user data.");
- debug("Coding scheme: " + dcs);
}
- // 7 bit is the default fallback encoding.
- let encoding = PDU_DCS_MSG_CODING_7BITS_ALPHABET;
- switch (dcs & 0xC0) {
- case 0x0:
- // bits 7..4 = 00xx
- switch (dcs & 0x0C) {
- case 0x4:
- encoding = PDU_DCS_MSG_CODING_8BITS_ALPHABET;
- break;
- case 0x8:
- encoding = PDU_DCS_MSG_CODING_16BITS_ALPHABET;
- break;
- }
- break;
- case 0xC0:
- // bits 7..4 = 11xx
- switch (dcs & 0x30) {
- case 0x20:
- encoding = PDU_DCS_MSG_CODING_16BITS_ALPHABET;
- break;
- case 0x30:
- if (!dcs & 0x04) {
- encoding = PDU_DCS_MSG_CODING_8BITS_ALPHABET;
- }
- break;
- }
- break;
- default:
- // Falling back to default encoding.
- break;
- }
-
- if (DEBUG) debug("PDU: message encoding is " + encoding + " bit.");
let paddingBits = 0;
if (msg.udhi) {
msg.header = this.readUserDataHeader();
- if (encoding == PDU_DCS_MSG_CODING_7BITS_ALPHABET) {
+ if (msg.encoding == PDU_DCS_MSG_CODING_7BITS_ALPHABET) {
let headerBits = (msg.header.length + 1) * 8;
let headerSeptets = Math.ceil(headerBits / 7);
@@ -3106,7 +3481,8 @@ let GsmPDUHelper = {
}
msg.body = null;
- switch (encoding) {
+ msg.data = null;
+ switch (msg.encoding) {
case PDU_DCS_MSG_CODING_7BITS_ALPHABET:
// 7 bit encoding allows 140 octets, which means 160 characters
// ((140x8) / 7 = 160 chars)
@@ -3121,7 +3497,7 @@ let GsmPDUHelper = {
langShiftIndex);
break;
case PDU_DCS_MSG_CODING_8BITS_ALPHABET:
- // Unsupported.
+ msg.data = this.readHexOctetArray(length);
break;
case PDU_DCS_MSG_CODING_16BITS_ALPHABET:
msg.body = this.readUCS2String(length);
@@ -3157,6 +3533,7 @@ let GsmPDUHelper = {
// the receiving entity shall for TP-DCS assume a value of 0x00, i.e. the
// 7bit default alphabet.` ~ 3GPP 23.040 9.2.3.27
msg.dcs = 0;
+ msg.encoding = PDU_DCS_MSG_CODING_7BITS_ALPHABET;
// TP-Protocol-Identifier
if (pi & PDU_PI_PROTOCOL_IDENTIFIER) {
@@ -3164,7 +3541,7 @@ let GsmPDUHelper = {
}
// TP-Data-Coding-Scheme
if (pi & PDU_PI_DATA_CODING_SCHEME) {
- msg.dcs = this.readHexOctet();
+ this.readDataCodingScheme(msg);
}
// TP-User-Data-Length
if (pi & PDU_PI_USER_DATA_LENGTH) {
@@ -3194,7 +3571,9 @@ let GsmPDUHelper = {
pid: null, // M O M O O M
epid: null, // M O M O O M
dcs: null, // M O M O O X
+ encoding: null, // M O M O O X
body: null, // M O M O O O
+ data: null, // M O M O O O
timestamp: null, // M X X X X X
status: null, // X X X X M X
scts: null, // X X X M M X
@@ -3246,7 +3625,7 @@ let GsmPDUHelper = {
// - TP-Protocolo-Identifier -
this.readProtocolIndicator(msg);
// - TP-Data-Coding-Scheme -
- msg.dcs = this.readHexOctet();
+ this.readDataCodingScheme(msg);
// - TP-Service-Center-Time-Stamp -
msg.timestamp = this.readTimestamp();
// - TP-User-Data-Length -
diff --git a/gfx/2d/DrawTargetCG.cpp b/gfx/2d/DrawTargetCG.cpp
index b3a3c693ca2..26ece77ac27 100644
--- a/gfx/2d/DrawTargetCG.cpp
+++ b/gfx/2d/DrawTargetCG.cpp
@@ -873,7 +873,7 @@ DrawTargetCG::Init(const IntSize &aSize, SurfaceFormat &)
{
// XXX: we should come up with some consistent semantics for dealing
// with zero area drawtargets
- if (aSize.width == 0 || aSize.height == 0 ||
+ if (aSize.width <= 0 || aSize.height <= 0 ||
// 32767 is the maximum size supported by cairo
// we clamp to that to make it easier to interoperate
aSize.width > 32767 || aSize.height > 32767) {
diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in
index 3336eb08d4f..d4c52adb3b0 100644
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -10,7 +10,7 @@
#endif
>
+ android:targetSdkVersion="11"/>
#include ../sync/manifests/SyncAndroidManifest_permissions.xml.in
diff --git a/mobile/android/base/GeckoApp.java b/mobile/android/base/GeckoApp.java
index 6aa06957be6..5379c601b85 100644
--- a/mobile/android/base/GeckoApp.java
+++ b/mobile/android/base/GeckoApp.java
@@ -630,7 +630,8 @@ abstract public class GeckoApp
}
void handleLocationChange(final int tabId, final String uri,
- final String documentURI, final String contentType) {
+ final String documentURI, final String contentType,
+ final boolean sameDocument) {
final Tab tab = Tabs.getInstance().getTab(tabId);
if (tab == null)
return;
@@ -642,19 +643,10 @@ abstract public class GeckoApp
hideAboutHome();
}
- String oldBaseURI = tab.getURL();
tab.updateURL(uri);
tab.setDocumentURI(documentURI);
- tab.setContentType(contentType);
- String baseURI = uri;
- if (baseURI.indexOf('#') != -1)
- baseURI = uri.substring(0, uri.indexOf('#'));
-
- if (oldBaseURI != null && oldBaseURI.indexOf('#') != -1)
- oldBaseURI = oldBaseURI.substring(0, oldBaseURI.indexOf('#'));
-
- if (baseURI.equals(oldBaseURI)) {
+ if (sameDocument) {
mMainHandler.post(new Runnable() {
public void run() {
if (Tabs.getInstance().isSelectedTab(tab)) {
@@ -665,6 +657,7 @@ abstract public class GeckoApp
return;
}
+ tab.setContentType(contentType);
tab.updateFavicon(null);
tab.updateFaviconURL(null);
tab.updateSecurityMode("unknown");
@@ -868,8 +861,9 @@ abstract public class GeckoApp
final String uri = message.getString("uri");
final String documentURI = message.getString("documentURI");
final String contentType = message.getString("contentType");
+ final boolean sameDocument = message.getBoolean("sameDocument");
Log.i(LOGTAG, "URI - " + uri);
- handleLocationChange(tabId, uri, documentURI, contentType);
+ handleLocationChange(tabId, uri, documentURI, contentType, sameDocument);
} else if (event.equals("Content:SecurityChange")) {
final int tabId = message.getInt("tabID");
final String mode = message.getString("mode");
@@ -877,6 +871,7 @@ abstract public class GeckoApp
handleSecurityChange(tabId, mode);
} else if (event.equals("Content:StateChange")) {
final int tabId = message.getInt("tabID");
+ final String uri = message.getString("uri");
final boolean success = message.getBoolean("success");
int state = message.getInt("state");
Log.i(LOGTAG, "State - " + state);
@@ -884,7 +879,7 @@ abstract public class GeckoApp
if ((state & GeckoAppShell.WPL_STATE_START) != 0) {
Log.i(LOGTAG, "Got a document start");
final boolean showProgress = message.getBoolean("showProgress");
- handleDocumentStart(tabId, showProgress);
+ handleDocumentStart(tabId, showProgress, uri);
} else if ((state & GeckoAppShell.WPL_STATE_STOP) != 0) {
Log.i(LOGTAG, "Got a document stop");
handleDocumentStop(tabId, success);
@@ -1190,11 +1185,12 @@ abstract public class GeckoApp
});
}
- void handleDocumentStart(int tabId, final boolean showProgress) {
+ void handleDocumentStart(int tabId, final boolean showProgress, String uri) {
final Tab tab = Tabs.getInstance().getTab(tabId);
if (tab == null)
return;
+ tab.updateURL(uri);
tab.setState(Tab.STATE_LOADING);
tab.updateSecurityMode("unknown");
@@ -1202,7 +1198,7 @@ abstract public class GeckoApp
public void run() {
if (Tabs.getInstance().isSelectedTab(tab)) {
mBrowserToolbar.setSecurityMode(tab.getSecurityMode());
- if (showProgress)
+ if (showProgress && tab.getState() == Tab.STATE_LOADING)
mBrowserToolbar.setProgressVisibility(true);
}
Tabs.getInstance().notifyListeners(tab, Tabs.TabEvents.START);
@@ -2163,7 +2159,8 @@ abstract public class GeckoApp
Log.i(LOGTAG, "application paused");
GeckoAppShell.sendEventToGecko(GeckoEvent.createPauseEvent(true));
- mConnectivityReceiver.unregisterFor(mAppContext);
+ if (mConnectivityReceiver != null)
+ mConnectivityReceiver.unregisterFor(mAppContext);
GeckoNetworkManager.getInstance().stop();
GeckoScreenOrientationListener.getInstance().stop();
}
@@ -2174,7 +2171,8 @@ abstract public class GeckoApp
if (checkLaunchState(LaunchState.GeckoRunning))
GeckoAppShell.sendEventToGecko(GeckoEvent.createResumeEvent(true));
- mConnectivityReceiver.registerFor(mAppContext);
+ if (mConnectivityReceiver != null)
+ mConnectivityReceiver.registerFor(mAppContext);
GeckoNetworkManager.getInstance().start();
GeckoScreenOrientationListener.getInstance().start();
}
diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js
index 4820e0aa7c4..a5c1872c56a 100644
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -2084,6 +2084,7 @@ Tab.prototype = {
let uri = browser.currentURI.spec;
let documentURI = "";
let contentType = "";
+ let sameDocument = (aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT) != 0;
if (browser.contentDocument) {
documentURI = browser.contentDocument.documentURIObject.spec;
contentType = browser.contentDocument.contentType;
@@ -2099,13 +2100,14 @@ Tab.prototype = {
tabID: this.id,
uri: uri,
documentURI: documentURI,
- contentType: contentType
+ contentType: contentType,
+ sameDocument: sameDocument
}
};
sendMessageToJava(message);
- if ((aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT) == 0) {
+ if (!sameDocument) {
// XXX This code assumes that this is the earliest hook we have at which
// browser.contentDocument is changed to the new document we're loading
this.contentDocumentIsDisplayed = false;
diff --git a/toolkit/components/search/tests/xpcshell/test_nodb_pluschanges.js b/toolkit/components/search/tests/xpcshell/test_nodb_pluschanges.js
index 062ecad9ff9..374e48e2e5c 100644
--- a/toolkit/components/search/tests/xpcshell/test_nodb_pluschanges.js
+++ b/toolkit/components/search/tests/xpcshell/test_nodb_pluschanges.js
@@ -23,6 +23,7 @@ do_load_httpd_js();
function run_test()
{
+ do_print("Preparing test");
removeMetadata();
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "2");
do_load_manifest("data/chrome.manifest");
@@ -33,17 +34,22 @@ function run_test()
let search = Services.search;
+ do_print("Setting up observer");
function observer(aSubject, aTopic, aData) {
+ do_print("Observing topic " + aTopic);
if ("engine-added" == aData) {
let engine1 = search.getEngineByName("Test search engine");
let engine2 = search.getEngineByName("Sherlock test search engine");
- dumpn("Got engine 2: "+engine2);
+ do_print("Currently, engine1 is " + engine1);
+ do_print("Currently, engine2 is " + engine2);
if(engine1 && engine2)
{
search.moveEngine(engine1, 0);
search.moveEngine(engine2, 1);
+ do_print("Next step is forcing flush");
do_timeout(0,
function() {
+ do_print("Forcing flush");
// Force flush
// Note: the timeout is needed, to avoid some reentrency
// issues in nsSearchService.
@@ -53,19 +59,22 @@ function run_test()
afterCommit(
function()
{
+ do_print("Commit complete");
// Check that search-metadata.json has been created
let metadata = gProfD.clone();
metadata.append("search-metadata.json");
do_check_true(metadata.exists());
// Check that the entries are placed as specified correctly
- let stream = NetUtil.newChannel(metadata).open();
+ let stream = NetUtil.newChannel(metadata).open();
let json = parseJsonFromStream(stream);
do_check_eq(json["[app]/test-search-engine.xml"].order, 1);
do_check_eq(json["[profile]/sherlock-test-search-engine.xml"].order, 2);
- httpServer.stop(function() {});
- stream.close(); // Stream must be closed under Windows
- removeMetadata();
+
+ do_print("Cleaning up");
+ httpServer.stop(function() {});
+ stream.close(); // Stream must be closed under Windows
+ removeMetadata();
do_test_finished();
}
);
@@ -84,4 +93,8 @@ function run_test()
Ci.nsISearchEngine.DATA_TEXT,
"http://localhost:4444/data/ico-size-16x16-png.ico",
false);
+
+ do_timeout(120000, function() {
+ do_throw("Timeout");
+ });
}
diff --git a/webapprt/win/webapprt.cpp b/webapprt/win/webapprt.cpp
index cfbad093e62..347df3ec7cd 100644
--- a/webapprt/win/webapprt.cpp
+++ b/webapprt/win/webapprt.cpp
@@ -287,6 +287,7 @@ namespace {
NS_ENSURE_SUCCESS(rv, rv);
SetAllocatedString(webShellAppData->profile, profile);
+ SetAllocatedString(webShellAppData->name, profile);
nsCOMPtr directory;
rv = XRE_GetFileFromPath(rtPath, getter_AddRefs(directory));
diff --git a/widget/android/AndroidJavaWrappers.cpp b/widget/android/AndroidJavaWrappers.cpp
index 4b3ed90b44c..aeb682f10f0 100644
--- a/widget/android/AndroidJavaWrappers.cpp
+++ b/widget/android/AndroidJavaWrappers.cpp
@@ -521,6 +521,7 @@ AndroidGeckoEvent::Init(JNIEnv *jenv, jobject jobj)
case SCREENSHOT: {
mMetaState = jenv->GetIntField(jobj, jMetaStateField);
ReadPointArray(mPoints, jenv, jPoints, 2);
+ break;
}
case SCREENORIENTATION_CHANGED: {
@@ -702,8 +703,8 @@ AndroidGeckoLayerClient::SyncViewportInfo(const nsIntRect& aDisplayPort, float a
NS_ABORT_IF_FALSE(viewTransformJObj, "No view transform object!");
viewTransform.Init(viewTransformJObj);
- aScrollOffset = nsIntPoint(viewTransform.GetX(), viewTransform.GetY());
- aScaleX = aScaleY = viewTransform.GetScale();
+ aScrollOffset = nsIntPoint(viewTransform.GetX(env), viewTransform.GetY(env));
+ aScaleX = aScaleY = viewTransform.GetScale(env);
}
jobject
@@ -829,27 +830,24 @@ AndroidLayerRendererFrame::EndDrawing()
}
float
-AndroidViewTransform::GetX()
+AndroidViewTransform::GetX(JNIEnv *env)
{
- JNIEnv *env = GetJNIForThread();
if (!env)
return 0.0f;
return env->GetFloatField(wrapped_obj, jXField);
}
float
-AndroidViewTransform::GetY()
+AndroidViewTransform::GetY(JNIEnv *env)
{
- JNIEnv *env = GetJNIForThread();
if (!env)
return 0.0f;
return env->GetFloatField(wrapped_obj, jYField);
}
float
-AndroidViewTransform::GetScale()
+AndroidViewTransform::GetScale(JNIEnv *env)
{
- JNIEnv *env = GetJNIForThread();
if (!env)
return 0.0f;
return env->GetFloatField(wrapped_obj, jScaleField);
diff --git a/widget/android/AndroidJavaWrappers.h b/widget/android/AndroidJavaWrappers.h
index 72c6b83ecc9..691a0b0543d 100644
--- a/widget/android/AndroidJavaWrappers.h
+++ b/widget/android/AndroidJavaWrappers.h
@@ -162,9 +162,9 @@ public:
AndroidViewTransform() {}
AndroidViewTransform(jobject jobj) { Init(jobj); }
- float GetX();
- float GetY();
- float GetScale();
+ float GetX(JNIEnv *env);
+ float GetY(JNIEnv *env);
+ float GetScale(JNIEnv *env);
private:
static jclass jViewTransformClass;