This commit is contained in:
Phil Ringnalda 2015-03-08 13:34:08 -07:00
Родитель bb17128a40 71741ed376
Коммит 1f21ae9b68
22 изменённых файлов: 220 добавлений и 20 удалений

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

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="ef937d1aca7c4cf89ecb5cc43ae8c21c2000a9db">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="373c9ddb916631facbae3d6f70fb82f3ff501411"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="fea83511df9ccba64259346bc02ebf2c417a12c2"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2e85143db5d5f6edc4c2b97263c02b558fee757e"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>

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

@ -19,7 +19,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="373c9ddb916631facbae3d6f70fb82f3ff501411"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="fea83511df9ccba64259346bc02ebf2c417a12c2"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2e85143db5d5f6edc4c2b97263c02b558fee757e"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="93f9ba577f68d772093987c2f1c0a4ae293e1802"/>

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

@ -17,7 +17,7 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="373c9ddb916631facbae3d6f70fb82f3ff501411"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="fea83511df9ccba64259346bc02ebf2c417a12c2"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2e85143db5d5f6edc4c2b97263c02b558fee757e"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="c42985975f2bbc42859b9136ed348186d989b93d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="86bd499afd662d5320a675f5da97656c742299c4"/>

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

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="ef937d1aca7c4cf89ecb5cc43ae8c21c2000a9db">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="373c9ddb916631facbae3d6f70fb82f3ff501411"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="fea83511df9ccba64259346bc02ebf2c417a12c2"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2e85143db5d5f6edc4c2b97263c02b558fee757e"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>

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

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="52775e03a2d8532429dff579cb2cd56718e488c3">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="373c9ddb916631facbae3d6f70fb82f3ff501411"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="fea83511df9ccba64259346bc02ebf2c417a12c2"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2e85143db5d5f6edc4c2b97263c02b558fee757e"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>

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

@ -19,7 +19,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="373c9ddb916631facbae3d6f70fb82f3ff501411"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="fea83511df9ccba64259346bc02ebf2c417a12c2"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2e85143db5d5f6edc4c2b97263c02b558fee757e"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="93f9ba577f68d772093987c2f1c0a4ae293e1802"/>

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

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="ef937d1aca7c4cf89ecb5cc43ae8c21c2000a9db">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="373c9ddb916631facbae3d6f70fb82f3ff501411"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="fea83511df9ccba64259346bc02ebf2c417a12c2"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2e85143db5d5f6edc4c2b97263c02b558fee757e"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>

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

@ -17,7 +17,7 @@
</project>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="373c9ddb916631facbae3d6f70fb82f3ff501411"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="fea83511df9ccba64259346bc02ebf2c417a12c2"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2e85143db5d5f6edc4c2b97263c02b558fee757e"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="c42985975f2bbc42859b9136ed348186d989b93d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="86bd499afd662d5320a675f5da97656c742299c4"/>

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

@ -1,9 +1,9 @@
{
"git": {
"git_revision": "373c9ddb916631facbae3d6f70fb82f3ff501411",
"git_revision": "fea83511df9ccba64259346bc02ebf2c417a12c2",
"remote": "https://git.mozilla.org/releases/gaia.git",
"branch": ""
},
"revision": "c7db5bba15e070f4068e46914193cd98ac6ae91f",
"revision": "4b6bb4cbe4e23651f258584586c4185872d1da01",
"repo_path": "integration/gaia-central"
}

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

@ -17,7 +17,7 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="373c9ddb916631facbae3d6f70fb82f3ff501411"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="fea83511df9ccba64259346bc02ebf2c417a12c2"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2e85143db5d5f6edc4c2b97263c02b558fee757e"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="c42985975f2bbc42859b9136ed348186d989b93d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="86bd499afd662d5320a675f5da97656c742299c4"/>

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

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="52775e03a2d8532429dff579cb2cd56718e488c3">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="373c9ddb916631facbae3d6f70fb82f3ff501411"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="fea83511df9ccba64259346bc02ebf2c417a12c2"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2e85143db5d5f6edc4c2b97263c02b558fee757e"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>

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

@ -118,6 +118,7 @@ loop.conversation = (function(mozL10n) {
var dispatcher = new loop.Dispatcher();
var client = new loop.Client();
var sdkDriver = new loop.OTSdkDriver({
isDesktop: true,
dispatcher: dispatcher,
sdk: OT
});
@ -137,10 +138,12 @@ loop.conversation = (function(mozL10n) {
});
var conversationStore = new loop.store.ConversationStore(dispatcher, {
client: client,
isDesktop: true,
mozLoop: navigator.mozLoop,
sdkDriver: sdkDriver
});
var activeRoomStore = new loop.store.ActiveRoomStore(dispatcher, {
isDesktop: true,
mozLoop: navigator.mozLoop,
sdkDriver: sdkDriver
});

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

@ -118,6 +118,7 @@ loop.conversation = (function(mozL10n) {
var dispatcher = new loop.Dispatcher();
var client = new loop.Client();
var sdkDriver = new loop.OTSdkDriver({
isDesktop: true,
dispatcher: dispatcher,
sdk: OT
});
@ -137,10 +138,12 @@ loop.conversation = (function(mozL10n) {
});
var conversationStore = new loop.store.ConversationStore(dispatcher, {
client: client,
isDesktop: true,
mozLoop: navigator.mozLoop,
sdkDriver: sdkDriver
});
var activeRoomStore = new loop.store.ActiveRoomStore(dispatcher, {
isDesktop: true,
mozLoop: navigator.mozLoop,
sdkDriver: sdkDriver
});

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

@ -55,6 +55,8 @@ loop.store.ActiveRoomStore = (function() {
throw new Error("Missing option sdkDriver");
}
this._sdkDriver = options.sdkDriver;
this._isDesktop = options.isDesktop || false;
},
/**
@ -356,6 +358,21 @@ loop.store.ActiveRoomStore = (function() {
* @param {sharedActions.ConnectionFailure} actionData
*/
connectionFailure: function(actionData) {
/**
* XXX This is a workaround for desktop machines that do not have a
* camera installed. As we don't yet have device enumeration, when
* we do, this can be removed (bug 1138851), and the sdk should handle it.
*/
if (this._isDesktop &&
actionData.reason === FAILURE_DETAILS.UNABLE_TO_PUBLISH_MEDIA &&
this.getStoreState().videoMuted === false) {
// We failed to publish with media, so due to the bug, we try again without
// video.
this.setStoreState({videoMuted: true});
this._sdkDriver.retryPublishWithoutVideo();
return;
}
// Treat all reasons as something failed. In theory, clientDisconnected
// could be a success case, but there's no way we should be intentionally
// sending that and still have the window open.

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

@ -10,8 +10,9 @@ loop.store = loop.store || {};
(function() {
var sharedActions = loop.shared.actions;
var CALL_TYPES = loop.shared.utils.CALL_TYPES;
var REST_ERRNOS = loop.shared.utils.REST_ERRNOS;
var FAILURE_DETAILS = loop.shared.utils.FAILURE_DETAILS;
/**
* Websocket states taken from:
* https://docs.services.mozilla.com/loop/apis.html#call-progress-state-change-progress
@ -132,6 +133,7 @@ loop.store = loop.store || {};
this.client = options.client;
this.sdkDriver = options.sdkDriver;
this.mozLoop = options.mozLoop;
this._isDesktop = options.isDesktop || false;
},
/**
@ -141,6 +143,21 @@ loop.store = loop.store || {};
* @param {sharedActions.ConnectionFailure} actionData The action data.
*/
connectionFailure: function(actionData) {
/**
* XXX This is a workaround for desktop machines that do not have a
* camera installed. As we don't yet have device enumeration, when
* we do, this can be removed (bug 1138851), and the sdk should handle it.
*/
if (this._isDesktop &&
actionData.reason === FAILURE_DETAILS.UNABLE_TO_PUBLISH_MEDIA &&
this.getStoreState().videoMuted === false) {
// We failed to publish with media, so due to the bug, we try again without
// video.
this.setStoreState({videoMuted: true});
this.sdkDriver.retryPublishWithoutVideo();
return;
}
this._endSession();
this.setStoreState({
callState: CALL_STATES.TERMINATED,

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

@ -33,6 +33,21 @@ loop.OTSdkDriver = (function() {
"setupStreamElements",
"setMute"
]);
/**
* XXX This is a workaround for desktop machines that do not have a
* camera installed. As we don't yet have device enumeration, when
* we do, this can be removed (bug 1138851), and the sdk should handle it.
*/
if ("isDesktop" in options && options.isDesktop &&
!window.MediaStreamTrack.getSources) {
// If there's no getSources function, the sdk defines its own and caches
// the result. So here we define the "normal" one which doesn't get cached, so
// we can change it later.
window.MediaStreamTrack.getSources = function(callback) {
callback([{kind: "audio"}, {kind: "video"}]);
};
}
};
OTSdkDriver.prototype = {
@ -57,9 +72,19 @@ loop.OTSdkDriver = (function() {
this.getRemoteElement = actionData.getRemoteElementFunc;
this.publisherConfig = actionData.publisherConfig;
this.sdk.on("exception", this._onOTException.bind(this));
// At this state we init the publisher, even though we might be waiting for
// the initial connect of the session. This saves time when setting up
// the media.
this._publishLocalStreams();
},
/**
* Internal function to publish a local stream.
* XXX This can be simplified when bug 1138851 is actioned.
*/
_publishLocalStreams: function() {
this.publisher = this.sdk.initPublisher(this.getLocalElement(),
this._getCopyPublisherConfig());
this.publisher.on("streamCreated", this._onLocalStreamCreated.bind(this));
@ -69,6 +94,17 @@ loop.OTSdkDriver = (function() {
this._onAccessDialogOpened.bind(this));
},
/**
* Forces the sdk into not using video, and starts publishing again.
* XXX This is part of the work around that will be removed by bug 1138851.
*/
retryPublishWithoutVideo: function() {
window.MediaStreamTrack.getSources = function(callback) {
callback([{kind: "audio"}]);
};
this._publishLocalStreams();
},
/**
* Handles the setMute action. Informs the published stream to mute
* or unmute audio as appropriate.
@ -436,6 +472,22 @@ loop.OTSdkDriver = (function() {
}));
},
_onOTException: function(event) {
if (event.code === OT.ExceptionCodes.UNABLE_TO_PUBLISH &&
event.message === "GetUserMedia") {
// We free up the publisher here in case the store wants to try
// grabbing the media again.
if (this.publisher) {
this.publisher.off("accessAllowed accessDenied accessDialogOpened streamCreated");
this.publisher.destroy();
delete this.publisher;
}
this.dispatcher.dispatch(new sharedActions.ConnectionFailure({
reason: FAILURE_DETAILS.UNABLE_TO_PUBLISH_MEDIA
}));
}
},
/**
* Handles publishing of property changes to a stream.
*/

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

@ -36,6 +36,7 @@ loop.shared.utils = (function(mozL10n) {
var FAILURE_DETAILS = {
MEDIA_DENIED: "reason-media-denied",
UNABLE_TO_PUBLISH_MEDIA: "unable-to-publish-media",
COULD_NOT_CONNECT: "reason-could-not-connect",
NETWORK_DISCONNECTED: "reason-network-disconnected",
EXPIRED_OR_INVALID: "reason-expired-or-invalid",

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

@ -41,6 +41,7 @@ describe("loop.store.ActiveRoomStore", function () {
connectSession: sinon.stub(),
disconnectSession: sinon.stub(),
forceDisconnectAll: sinon.stub().callsArg(0),
retryPublishWithoutVideo: sinon.stub(),
startScreenShare: sinon.stub(),
switchAcquiredWindow: sinon.stub(),
endScreenShare: sinon.stub().returns(true)
@ -609,6 +610,26 @@ describe("loop.store.ActiveRoomStore", function () {
});
});
it("should retry publishing if on desktop, and in the videoMuted state", function() {
store._isDesktop = true;
store.connectionFailure(new sharedActions.ConnectionFailure({
reason: FAILURE_DETAILS.UNABLE_TO_PUBLISH_MEDIA
}));
sinon.assert.calledOnce(fakeSdkDriver.retryPublishWithoutVideo);
});
it("should set videoMuted to try when retrying publishing", function() {
store._isDesktop = true;
store.connectionFailure(new sharedActions.ConnectionFailure({
reason: FAILURE_DETAILS.UNABLE_TO_PUBLISH_MEDIA
}));
expect(store.getStoreState().videoMuted).eql(true);
});
it("should store the failure reason", function() {
store.connectionFailure(connectionFailureAction);

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

@ -9,6 +9,7 @@ describe("loop.store.ConversationStore", function () {
var CALL_STATES = loop.store.CALL_STATES;
var WS_STATES = loop.store.WS_STATES;
var WEBSOCKET_REASONS = loop.shared.utils.WEBSOCKET_REASONS;
var FAILURE_DETAILS = loop.shared.utils.FAILURE_DETAILS;
var sharedActions = loop.shared.actions;
var sharedUtils = loop.shared.utils;
var sandbox, dispatcher, client, store, fakeSessionData, sdkDriver;
@ -56,7 +57,8 @@ describe("loop.store.ConversationStore", function () {
};
sdkDriver = {
connectSession: sinon.stub(),
disconnectSession: sinon.stub()
disconnectSession: sinon.stub(),
retryPublishWithoutVideo: sinon.stub()
};
wsCancelSpy = sinon.spy();
@ -135,6 +137,26 @@ describe("loop.store.ConversationStore", function () {
store.setStoreState({windowId: "42"});
});
it("should retry publishing if on desktop, and in the videoMuted state", function() {
store._isDesktop = true;
store.connectionFailure(new sharedActions.ConnectionFailure({
reason: FAILURE_DETAILS.UNABLE_TO_PUBLISH_MEDIA
}));
sinon.assert.calledOnce(sdkDriver.retryPublishWithoutVideo);
});
it("should set videoMuted to try when retrying publishing", function() {
store._isDesktop = true;
store.connectionFailure(new sharedActions.ConnectionFailure({
reason: FAILURE_DETAILS.UNABLE_TO_PUBLISH_MEDIA
}));
expect(store.getStoreState().videoMuted).eql(true);
});
it("should disconnect the session", function() {
store.connectionFailure(
new sharedActions.ConnectionFailure({reason: "fake"}));

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

@ -10,6 +10,7 @@ describe("loop.OTSdkDriver", function () {
var FAILURE_DETAILS = loop.shared.utils.FAILURE_DETAILS;
var STREAM_PROPERTIES = loop.shared.utils.STREAM_PROPERTIES;
var SCREEN_SHARE_STATES = loop.shared.utils.SCREEN_SHARE_STATES;
var sandbox;
var dispatcher, driver, publisher, sdk, session, sessionData;
var fakeLocalElement, fakeRemoteElement, fakeScreenElement;
@ -52,9 +53,15 @@ describe("loop.OTSdkDriver", function () {
}
}, Backbone.Events);
sdk = {
sdk = _.extend({
initPublisher: sinon.stub().returns(publisher),
initSession: sinon.stub().returns(session)
}, Backbone.Events);
window.OT = {
ExceptionCodes: {
UNABLE_TO_PUBLISH: 1500
}
};
driver = new loop.OTSdkDriver({
@ -94,6 +101,37 @@ describe("loop.OTSdkDriver", function () {
});
});
describe("#retryPublishWithoutVideo", function() {
beforeEach(function() {
sdk.initPublisher.returns(publisher);
driver.setupStreamElements(new sharedActions.SetupStreamElements({
getLocalElementFunc: function() {return fakeLocalElement;},
getRemoteElementFunc: function() {return fakeRemoteElement;},
publisherConfig: publisherConfig
}));
});
it("should make MediaStreamTrack.getSources return without a video source", function(done) {
driver.retryPublishWithoutVideo();
window.MediaStreamTrack.getSources(function(sources) {
expect(sources.some(function(src) {
return src.kind === "video";
})).eql(false);
done();
});
});
it("should call initPublisher", function() {
driver.retryPublishWithoutVideo();
sinon.assert.calledTwice(sdk.initPublisher);
sinon.assert.calledWith(sdk.initPublisher, fakeLocalElement, publisherConfig);
});
});
describe("#setMute", function() {
beforeEach(function() {
sdk.initPublisher.returns(publisher);
@ -627,6 +665,32 @@ describe("loop.OTSdkDriver", function () {
sinon.assert.calledOnce(fakeEvent.preventDefault);
});
});
describe("exception", function() {
describe("Unable to publish (GetUserMedia)", function() {
it("should destroy the publisher", function() {
sdk.trigger("exception", {
code: OT.ExceptionCodes.UNABLE_TO_PUBLISH,
message: "GetUserMedia"
});
sinon.assert.calledOnce(publisher.destroy);
});
it("should dispatch a ConnectionFailure action", function() {
sdk.trigger("exception", {
code: OT.ExceptionCodes.UNABLE_TO_PUBLISH,
message: "GetUserMedia"
});
sinon.assert.calledOnce(dispatcher.dispatch);
sinon.assert.calledWithExactly(dispatcher.dispatch,
new sharedActions.ConnectionFailure({
reason: FAILURE_DETAILS.UNABLE_TO_PUBLISH_MEDIA
}));
});
});
});
});
describe("Events (screenshare)", function() {

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

@ -42,9 +42,9 @@ function spawnTest () {
let firstInterval = OverviewView.getTimeInterval();
info("First interval start time: " + firstInterval.startTime);
info("First interval end time: " + firstInterval.endTime);
ok(firstInterval.startTime - 10 < Number.EPSILON,
is(Math.round(firstInterval.startTime), 10,
"The interval's start time was properly set.");
ok(firstInterval.endTime - 20 < Number.EPSILON,
is(Math.round(firstInterval.endTime), 20,
"The interval's end time was properly set.");
// Get/set another time interval and make sure there's no event propagation.

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

@ -3,11 +3,11 @@
== min-height-1.html min-height-1-ref.html
== max-width-1.html max-width-1-ref.html
== max-height-1.html max-height-1-ref.html
# bug 1019840 skip width-special-values-image & width-special-values-block on b2g
# due to a race condition in imgRequestProxyCode
# bug 1019840 skip width-special-values-image, width-special-values-block,
# width-special-values-image-block on b2g due to a race condition in imgRequestProxyCode
skip-if(B2G) == width-special-values-block.html width-special-values-block-ref.html
== width-special-values-float.html width-special-values-block-ref.html
== width-special-values-image-block.html width-special-values-image-block-ref.html
skip-if(B2G) == width-special-values-image-block.html width-special-values-image-block-ref.html
skip-if(B2G) == width-special-values-image.html width-special-values-image-ref.html
== width-special-values-block-intrinsic.html width-special-values-block-intrinsic-ref.html
== width-special-values-float-intrinsic.html width-special-values-block-intrinsic-ref.html