Merge b2ginbound to central, a=merge

This commit is contained in:
Wes Kocher 2015-10-22 16:50:22 -07:00
commit 276a64cd67
62 changed files with 426 additions and 203 deletions

View File

@ -244,6 +244,9 @@ pref("security.alternate_certificate_error_page", "certerror");
pref("security.warn_viewing_mixed", false); // Warning is disabled. See Bug 616712.
// Block insecure active content on https pages
pref("security.mixed_content.block_active_content", true);
// 2 = strict certificate pinning checks.
// This default preference is more strict than Firefox because B2G
// currently does not have a way to install local root certificates.

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="f4c7fbf7a3ae24315b7937c77cdaf7cdb127ff86"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
@ -123,7 +123,7 @@
<project name="platform/system/media" path="system/media" revision="c1332c21c608f4932a6d7e83450411cde53315ef"/>
<default remote="caf" revision="LNX.LA.3.5.2.1.1" sync-j="4"/>
<!-- Platform common things -->
<project name="device-shinano-common" path="device/sony/shinano-common" remote="b2g" revision="4a5672c356ba539095109d827ba103cd8dfdcf1a"/>
<project name="device-shinano-common" path="device/sony/shinano-common" remote="b2g" revision="070ec6f75572a336b7b80db406b11398e5089626"/>
<project name="device/generic/armv7-a-neon" path="device/generic/armv7-a-neon" revision="1bb28abbc215f45220620af5cd60a8ac1be93722"/>
<project name="device/qcom/common" path="device/qcom/common" revision="2501e5940ba69ece7654ff85611c76ae5bda299c"/>
<project name="codeaurora_kernel_msm" path="kernel" remote="b2g" revision="d620691cad7aee780018e98159ff03bf99840317"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="f4c7fbf7a3ae24315b7937c77cdaf7cdb127ff86"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>

View File

@ -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="29ce8ec8606e59f582375234440812b046346513"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="f4c7fbf7a3ae24315b7937c77cdaf7cdb127ff86"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="4ace9aaee0e048dfda11bb787646c59982a3dc80"/>

View File

@ -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="29ce8ec8606e59f582375234440812b046346513"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="f4c7fbf7a3ae24315b7937c77cdaf7cdb127ff86"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="0c28789b9957913be975eb002a22323f93585d4c"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="f4c7fbf7a3ae24315b7937c77cdaf7cdb127ff86"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="c9d4fe680662ee44a4bdea42ae00366f5df399cf">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="f4c7fbf7a3ae24315b7937c77cdaf7cdb127ff86"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>

View File

@ -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="29ce8ec8606e59f582375234440812b046346513"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="f4c7fbf7a3ae24315b7937c77cdaf7cdb127ff86"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="4ace9aaee0e048dfda11bb787646c59982a3dc80"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="f4c7fbf7a3ae24315b7937c77cdaf7cdb127ff86"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>

View File

@ -1,9 +1,9 @@
{
"git": {
"git_revision": "29ce8ec8606e59f582375234440812b046346513",
"git_revision": "f4c7fbf7a3ae24315b7937c77cdaf7cdb127ff86",
"remote": "https://git.mozilla.org/releases/gaia.git",
"branch": ""
},
"revision": "9ba6b51b109bb675c8c8c2687c75b088df7e50ac",
"revision": "4112549b51a4790f29bfb983c1f04fc5f4cc569e",
"repo_path": "integration/gaia-central"
}

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="f4c7fbf7a3ae24315b7937c77cdaf7cdb127ff86"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>

View File

@ -18,7 +18,7 @@
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="f4c7fbf7a3ae24315b7937c77cdaf7cdb127ff86"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="0c28789b9957913be975eb002a22323f93585d4c"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="c9d4fe680662ee44a4bdea42ae00366f5df399cf">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="f4c7fbf7a3ae24315b7937c77cdaf7cdb127ff86"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>

View File

@ -774,6 +774,11 @@ AudioChannelService::SetAudioChannelMuted(nsPIDOMWindow* aWindow,
MOZ_ASSERT(aWindow);
MOZ_ASSERT(aWindow->IsOuterWindow());
if (aAudioChannel == AudioChannel::System) {
// Workaround for bug1183033, system channel type can always playback.
return;
}
AudioChannelWindow* winData = GetOrCreateWindowData(aWindow);
winData->mChannels[(uint32_t)aAudioChannel].mMuted = aMuted;
RefreshAgentsVolume(aWindow);

View File

@ -175,7 +175,10 @@ private:
{
explicit AudioChannelWindow(uint64_t aWindowID)
: mWindowID(aWindowID)
{}
{
// Workaround for bug1183033, system channel type can always playback.
mChannels[(int16_t)AudioChannel::System].mMuted = false;
}
uint64_t mWindowID;
AudioChannelConfig mChannels[NUMBER_OF_AUDIO_CHANNELS];

View File

@ -77,6 +77,7 @@
#include "nsIAppsService.h"
#include "mozIApplication.h"
#include "WidgetUtils.h"
#include "nsIPresentationService.h"
#ifdef MOZ_MEDIA_NAVIGATOR
#include "mozilla/dom/MediaDevices.h"
@ -2620,6 +2621,64 @@ Navigator::HasTVSupport(JSContext* aCx, JSObject* aGlobal)
return status == nsIPrincipal::APP_STATUS_CERTIFIED;
}
/* static */
bool
Navigator::HasPresentationSupport(JSContext* aCx, JSObject* aGlobal)
{
JS::Rooted<JSObject*> global(aCx, aGlobal);
nsCOMPtr<nsPIDOMWindow> win = GetWindowFromGlobal(global);
if (NS_WARN_IF(!win)) {
return false;
}
// Grant access if it has the permission.
if (CheckPermission(win, "presentation")) {
return true;
}
// Grant access to browser receiving pages and their same-origin iframes. (App
// pages should be controlled by "presentation" permission in app manifests.)
mozilla::dom::ContentChild* cc =
mozilla::dom::ContentChild::GetSingleton();
if (!cc || !cc->IsForBrowser()) {
return false;
}
nsCOMPtr<nsIDOMWindow> top;
nsresult rv = win->GetTop(getter_AddRefs(top));
if (NS_WARN_IF(NS_FAILED(rv))) {
return false;
}
nsCOMPtr<nsIScriptObjectPrincipal> sop = do_QueryInterface(win);
nsCOMPtr<nsIScriptObjectPrincipal> topSop = do_QueryInterface(top);
if (!sop || !topSop) {
return false;
}
nsIPrincipal* principal = sop->GetPrincipal();
nsIPrincipal* topPrincipal = topSop->GetPrincipal();
if (!principal || !topPrincipal || !principal->Subsumes(topPrincipal)) {
return false;
}
nsCOMPtr<nsPIDOMWindow> piTop = do_QueryInterface(top);
if (!piTop || !(piTop = piTop->GetCurrentInnerWindow())) {
return false;
}
nsCOMPtr<nsIPresentationService> presentationService =
do_GetService(PRESENTATION_SERVICE_CONTRACTID);
if (NS_WARN_IF(!presentationService)) {
return false;
}
nsAutoString sessionId;
presentationService->GetExistentSessionIdAtLaunch(piTop->WindowID(), sessionId);
return !sessionId.IsEmpty();
}
/* static */
bool
Navigator::IsE10sEnabled(JSContext* aCx, JSObject* aGlobal)

View File

@ -335,6 +335,8 @@ public:
static bool HasTVSupport(JSContext* aCx, JSObject* aGlobal);
static bool HasPresentationSupport(JSContext* aCx, JSObject* aGlobal);
static bool IsE10sEnabled(JSContext* aCx, JSObject* aGlobal);
nsPIDOMWindow* GetParentObject() const

View File

@ -1590,6 +1590,11 @@ HTMLMediaElement::Seek(double aTime,
// MediaDecoderReaders.
mPlayingBeforeSeek = IsPotentiallyPlaying();
// Set the Variable if the Seekstarted while active playing
if (mPlayingThroughTheAudioChannel) {
mPlayingThroughTheAudioChannelBeforeSeek = true;
}
// The media backend is responsible for dispatching the timeupdate
// event if it changes the playback position as a result of the seek.
LOG(LogLevel::Debug, ("%p SetCurrentTime(%f) starting seek", this, aTime));
@ -3545,10 +3550,6 @@ void HTMLMediaElement::PlaybackEnded()
void HTMLMediaElement::SeekStarted()
{
DispatchAsyncEvent(NS_LITERAL_STRING("seeking"));
// Set the Variable if the Seekstarted while active playing
if(mPlayingThroughTheAudioChannel) {
mPlayingThroughTheAudioChannelBeforeSeek = true;
}
}
void HTMLMediaElement::SeekCompleted()

View File

@ -28,8 +28,7 @@ function finish() {
function testConnectionAvailable() {
return new Promise(function(aResolve, aReject) {
ok(navigator.presentation, "navigator.presentation should be available in OOP pages.");
ok(!navigator.presentation.receiver, "Non-receiving OOP pages shouldn't get a presentation receiver instance.");
ok(!navigator.presentation, "navigator.presentation shouldn't be available in non-receiving OOP pages.");
aResolve();
});
}

View File

@ -34,8 +34,8 @@ var connection;
function testConnectionAvailable() {
return new Promise(function(aResolve, aReject) {
ok(navigator.presentation, "navigator.presentation should be available.");
ok(navigator.presentation.receiver, "navigator.presentation.receiver should be available.");
ok(navigator.presentation, "navigator.presentation should be available in OOP receiving pages.");
ok(navigator.presentation.receiver, "navigator.presentation.receiver should be available in OOP receiving pages.");
navigator.presentation.receiver.getConnection().then(
function(aConnection) {
@ -54,6 +54,16 @@ function testConnectionAvailable() {
});
}
function testConnectionAvailableInnerIframe() {
return new Promise(function(aResolve, aReject) {
var iframe = document.createElement('iframe');
iframe.setAttribute('src', './file_presentation_receiver_inner_iframe_oop.html');
document.body.appendChild(iframe);
aResolve();
});
}
function testConnectionReady() {
return new Promise(function(aResolve, aReject) {
connection.onstatechange = function() {
@ -94,6 +104,7 @@ function testTerminateConnection() {
}
testConnectionAvailable().
then(testConnectionAvailableInnerIframe).
then(testConnectionReady).
then(testIncomingMessage).
then(testTerminateConnection).

View File

@ -32,9 +32,6 @@ function setup() {
gScript.sendAsyncMessage('trigger-device-add');
// Create a receiver OOP iframe.
SpecialPowers.addPermission('presentation', true, { url: receiverUrl,
appId: SpecialPowers.Ci.nsIScriptSecurityManager.NO_APP_ID,
isInBrowserElement: true });
var receiverIframe = document.createElement('iframe');
receiverIframe.setAttribute('remote', 'true');
receiverIframe.setAttribute('mozbrowser', 'true');
@ -72,9 +69,6 @@ function setup() {
obs.notifyObservers(promise, 'setup-request-promise', null);
// Create a non-receiver OOP iframe.
SpecialPowers.addPermission('presentation', true, { url: nonReceiverUrl,
appId: SpecialPowers.Ci.nsIScriptSecurityManager.NO_APP_ID,
isInBrowserElement: true });
var nonReceiverIframe = document.createElement('iframe');
nonReceiverIframe.setAttribute('remote', 'true');
nonReceiverIframe.setAttribute('mozbrowser', 'true');

View File

@ -32,7 +32,7 @@ function verifyInitialState() {
}
function verifyMtu(aInterfaceName, aMtu) {
runEmulatorShellCmdSafe(['ip', 'link', 'show', 'dev', aInterfaceName])
return runEmulatorShellCmdSafe(['ip', 'link', 'show', 'dev', aInterfaceName])
.then(aLines => {
// Sample output:
//
@ -59,9 +59,7 @@ function testDefaultDataCallMtu() {
log("= testDefaultDataCallMtu =");
return setDataEnabledAndWait(true)
.then(aNetworkInfo => {
verifyMtu(aNetworkInfo.name, TEST_MTU1);
})
.then(aNetworkInfo => verifyMtu(aNetworkInfo.name, TEST_MTU1))
.then(() => setDataEnabledAndWait(false));
}
@ -72,9 +70,7 @@ function testNonDefaultDataCallMtu() {
log("doTestNonDefaultDataCallMtu: " + aType);
return setupDataCallAndWait(aType)
.then(aNetworkInfo => {
verifyMtu(aNetworkInfo.name, TEST_MTU2);
})
.then(aNetworkInfo => verifyMtu(aNetworkInfo.name, TEST_MTU2))
.then(() => deactivateDataCallAndWait(aType));
}

View File

@ -433,7 +433,7 @@ partial interface Navigator {
};
partial interface Navigator {
[Throws, Pref="dom.presentation.enabled", CheckAnyPermissions="presentation", SameObject]
[Throws, Pref="dom.presentation.enabled", Func="Navigator::HasPresentationSupport", SameObject]
readonly attribute Presentation? presentation;
};

View File

@ -5,7 +5,7 @@
*/
[Pref="dom.presentation.enabled",
CheckAnyPermissions="presentation"]
Func="Navigator::HasPresentationSupport"]
interface Presentation : EventTarget {
/*
* This should be used by the UA as the default presentation request for the

View File

@ -5,7 +5,7 @@
*/
[Pref="dom.presentation.enabled",
CheckAnyPermissions="presentation"]
Func="Navigator::HasPresentationSupport"]
interface PresentationAvailability : EventTarget {
/*
* If there is at least one device discovered by UA, the value is |true|.

View File

@ -18,7 +18,7 @@ enum PresentationConnectionState
};
[Pref="dom.presentation.enabled",
CheckAnyPermissions="presentation"]
Func="Navigator::HasPresentationSupport"]
interface PresentationConnection : EventTarget {
/*
* Unique id for all existing connections.

View File

@ -7,7 +7,7 @@
[Constructor(DOMString type,
optional PresentationConnectionAvailableEventInit eventInitDict),
Pref="dom.presentation.enabled",
CheckAnyPermissions="presentation"]
Func="Navigator::HasPresentationSupport"]
interface PresentationConnectionAvailableEvent : Event
{
[SameObject]

View File

@ -5,7 +5,7 @@
*/
[Pref="dom.presentation.enabled",
CheckAnyPermissions="presentation"]
Func="Navigator::HasPresentationSupport"]
interface PresentationReceiver : EventTarget {
/*
* Get the first connected presentation connection in a receiving browsing

View File

@ -6,7 +6,7 @@
[Constructor(DOMString url),
Pref="dom.presentation.enabled",
CheckAnyPermissions="presentation"]
Func="Navigator::HasPresentationSupport"]
interface PresentationRequest : EventTarget {
/*
* A requesting page use start() to start a new connection, and it will be

View File

@ -13,5 +13,5 @@ RUN pip install awscli
RUN npm install -g bower gulp apm grunt-cli
# Set a default command useful for debugging
ENTRYPOINT ["validate_task.py"]
ENTRYPOINT ["bootstrap.py"]

View File

@ -1 +1 @@
0.0.22
0.1.5

View File

@ -0,0 +1,131 @@
#!/usr/bin/env python
from __future__ import print_function
import os
import json
import urllib2
import sys
import re
import subprocess
import shutil
HOME = os.getenv('HOME')
WORKSPACE = os.path.join(HOME, 'workspace')
ARTIFACTS_PUBLIC = os.path.normpath(os.path.join(HOME, 'artifacts-public'))
SCRIPTS_PATH = os.path.join(HOME, 'bin')
COMMANDS = {
'phone': 'build-phone.sh',
'phone-ota': 'build-phone-ota.sh',
'dolphin': 'build-dolphin.sh'
}
# Be careful when adding username containing '.', as it expands to any character
# in regular expressions. It must be escaped properly:
# right: r'foo\.bar',
# wrong: 'foo.bar' # matches fooabar, foo1bar, foo_bar, etc
github_allowed_accounts = [
'walac',
'nhirata',
'selenamarie',
'ShakoHo',
]
bitbucket_allowed_accounts = [
'walac',
'selenamarie',
]
def build_repo_matcher():
github_expr = r'(github\.com/(' + '|'.join(github_allowed_accounts) + ')/)'
bitbucket_expr = r'(bitbucket\.org/(' + '|'.join(bitbucket_allowed_accounts) + ')/)'
mozilla_expr = r'((hg|git)\.mozilla\.org)'
expr = r'^https?://(' + '|'.join((github_expr, bitbucket_expr, mozilla_expr)) + ')'
return re.compile(expr)
repo_matcher = build_repo_matcher()
def get_task(taskid):
return json.load(urllib2.urlopen('https://queue.taskcluster.net/v1/task/' + taskid))
def check_repo(repo):
if not repo_matcher.match(repo):
print('Invalid repository "{}"'.format(repo), file=sys.stderr)
return -1
return 0
# Cleanup artifacts and known credentials. This is to avoid a malicious
# task to map a directory containing sensible files expose secret files.
def cleanup(task):
payload = task['payload']
for key, value in payload.get('artifacts', {}).items():
shutil.rmtree(value['path'], ignore_errors=True)
shutil.rmtree(os.path.join(HOME, '.aws'), ignore_errors=True)
try:
os.remove(os.path.join(HOME, 'socorro.token'))
except (IOError, OSError):
pass
def check_task(task):
repositories_to_check = [
'GECKO_HEAD_REPOSITORY',
'GECKO_BASE_REPOSITORY',
]
payload = task['payload']
for repo in repositories_to_check:
if repo not in payload['env']:
print('Repository {} is not in payload.env.'.format(repo), file=sys.stderr)
return -1
ret = check_repo(payload['env'][repo])
if ret != 0:
return ret
for key, value in payload.get('artifacts', {}).items():
if key.startswith('public') and \
os.path.normpath(value['path']) != ARTIFACTS_PUBLIC:
print('{} cannot be a public artifact.'.format(value['path']),
file=sys.stderr)
return -1
if sys.argv[1] not in COMMANDS:
print("Invalid build command '{}', valid commands are '{}'".format(sys.argv[1], ", ".join(COMMANDS.keys())))
return -1
return 0
def run():
command = COMMANDS[sys.argv[1]]
checkout_gecko = ['checkout-gecko', WORKSPACE]
cd_scripts = ['cd', SCRIPTS_PATH]
build = ['buildbot_step', '"Build"', os.path.join(SCRIPTS_PATH, command), WORKSPACE]
and_ = ['&&']
command = ' '.join(checkout_gecko + and_ + cd_scripts + and_ + build)
try:
return subprocess.call(command, shell=True)
except subprocess.CalledProcessError as e:
return e.returncode
def main():
taskid = os.getenv('TASK_ID')
# If the task id is None, we assume we are running docker locally
if taskid is not None:
task = get_task(taskid)
ret = check_task(task)
if ret != 0:
cleanup(task)
return ret
if len(sys.argv) > 1:
return run()
if __name__ == '__main__':
sys.exit(main())

View File

@ -4,7 +4,7 @@
DIRNAME=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
PATH=$DIRNAME:$PATH
WORKSPACE=$1
export WORKSPACE=$HOME/workspace
gecko_objdir=/home/worker/objdir-gecko/objdir
@ -16,7 +16,10 @@ test $GECKO_HEAD_REV # Should be an hg revision to pull down
test $TARGET
test $VARIANT
. ../builder/setup-ccache.sh
export CCACHE_DIR=$WORKSPACE/ccache
ccache -M 12G
ccache -s
# Figure out where the remote manifest is so we can use caches for it.
MANIFEST=$(repository-url.py $GECKO_HEAD_REPOSITORY $GECKO_HEAD_REV b2g/config/$TARGET/sources.xml)

View File

@ -1,67 +0,0 @@
#!/usr/bin/env python
from __future__ import print_function
import os
import os.path
import json
import urllib2
import sys
import re
import subprocess
repo_matcher = re.compile(r'[a-z]+://(hg|git)\.mozilla\.org')
def get_task(taskid):
return json.load(urllib2.urlopen('https://queue.taskcluster.net/v1/task/' + taskid))
def check_task(task):
payload = task['payload']
if 'GECKO_HEAD_REPOSITORY' not in payload['env']:
print('Task has no head gecko repository', file=sys.stderr)
return -1
repo = payload['env']['GECKO_HEAD_REPOSITORY']
# if it is not a mozilla repository, fail
if not repo_matcher.match(repo):
print('Invalid head repository', repo, file=sys.stderr)
return -1
if 'GECKO_BASE_REPOSITORY' not in payload['env']:
print('Task has no base gecko repository', file=sys.stderr)
return -1
repo = payload['env']['GECKO_BASE_REPOSITORY']
if not repo_matcher.match(repo):
print('Invalid base repository', repo, file=sys.stderr)
return -1
locations = task["extra"]["locations"]
if "img" in locations:
img = locations["img"]
if img.startswith("public"):
print('Cannot upload images to public', file=sys.stderr)
return -1
return 0
def main():
taskid = os.getenv('TASK_ID')
# If the task id is None, we assume we are running docker locally
if taskid is not None:
task = get_task(taskid)
ret = check_task(task)
if ret != 0:
return ret
if len(sys.argv) > 1:
try:
return subprocess.call(sys.argv[1:], shell=True)
except subprocess.CalledProcessError as e:
return e.returncode
return 0
if __name__ == '__main__':
sys.exit(main())

View File

@ -23,13 +23,13 @@ task:
# revision/project params defined originally here https://github.com/taskcluster/taskcluster-try/blob/master/try/instantiate.js
REVISION: 'tip'
GECKO_HEAD_REPOSITORY: 'http://hg.mozilla.org/mozilla-central'
GECKO_BASE_REPOSITORY: 'git@github.com:mozilla/gecko-dev.git'
GECKO_BASE_REPOSITORY: 'http://github.com/mozilla/gecko-dev'
image: 'quay.io/mozilla/phone-builder:0.0.1'
maxRunTime: 14400
command:
- build-phone.sh
- phone
artifacts:
'private/build':

View File

@ -0,0 +1,52 @@
taskId: 1
task:
metadata:
source: http://todo.com/soon
owner: user@domain.com
name: B2G flame-kk opt
description: B2G flame-kk opt
workerType: b2gbuild
provisionerId: aws-provisioner
scopes:
- 'docker-worker:cache:build-phone-objects'
- 'docker-worker:image:{{#docker_image}}phone-builder{{/docker_image}}'
payload:
cache:
build-phone-objects: '/home/worker/object-folder-flame-kk-1'
env:
TARGET: 'flame-kk'
B2G_DEBUG: '1'
# revision/project params defined originally here https://github.com/taskcluster/taskcluster-try/blob/master/try/instantiate.js
REVISION: 'tip'
GECKO_HEAD_REPOSITORY: 'http://hg.mozilla.org/mozilla-central'
GECKO_BASE_REPOSITORY: 'https://hg.mozilla.org/mozilla-central'
image: '{{#docker_image}}phone-builder{{/docker_image}}'
maxRunTime: 14400
command:
- build-phone.sh
artifacts:
'private/build':
type: directory
path: '/home/worker/artifacts/'
expires: '{{#from_now}}1 year{{/from_now}}'
extra:
# Rather then enforcing particular conventions we require that all build
# tasks provide the "build" extra field to specify where the build and tests
# files are located.
locations:
build: 'private/build/b2g-android-arm.tar.gz'
img: 'private/build/flame-kk.zip'
tests: 'private/build/gaia.zip'
symbols: 'private/build/b2g-crashreporter-symbols.zip'
sources: 'private/build/sources.xml'
treeherder:
symbol: B

View File

@ -22,14 +22,14 @@ task:
B2G_DEBUG: '1'
# revision/project params defined originally here https://github.com/taskcluster/taskcluster-try/blob/master/try/instantiate.js
REVISION: 'tip'
GECKO_HEAD_REPOSITORY: 'git@github.com:mozilla/gecko-dev.git'
GECKO_HEAD_REPOSITORY: 'http://bitbucket.org/mozilla/gecko-dev'
GECKO_BASE_REPOSITORY: 'http://hg.mozilla.org/mozilla-central'
image: 'quay.io/mozilla/phone-builder:0.0.1'
maxRunTime: 14400
command:
- build-phone.sh
- phone
artifacts:
'private/build':

View File

@ -29,7 +29,7 @@ task:
maxRunTime: 14400
command:
- build-phone.sh
- phone
artifacts:
'public/build':
@ -41,10 +41,11 @@ task:
# tasks provide the "build" extra field to specify where the build and tests
# files are located.
locations:
build: 'public/build/emulator.tar.gz'
tests: 'public/build/b2g-tests.zip'
symbols: 'public/build/b2g-crashreporter-symbols.zip'
sources: 'public/build/sources.xml'
build: 'private/build/emulator.tar.gz'
tests: 'private/build/b2g-tests.zip'
symbols: 'private/build/b2g-crashreporter-symbols.zip'
sources: 'private/build/sources.xml'
img: 'private/build/image.zip'
treeherder:
symbol: B

View File

@ -4,28 +4,31 @@ import unittest
import sys
import yaml
sys.path.append('../bin')
from validate_task import check_task
from bootstrap import check_task
import glob
def load_task(task_file):
content = open(task_file, 'r')
return yaml.load(content)['task']
task = yaml.load(content)['task']
sys.argv[1:] = task['payload']['command']
return task
class TaskValidationTest(unittest.TestCase):
def test_valid_task(self):
task = load_task('valid.yml')
self.assertEquals(check_task(task), 0)
def __init__(self, methodName='runTest'):
super(TaskValidationTest, self).__init__(methodName)
sys.argv.append('')
def test_invalid_base_repo(self):
task = load_task('invalid_base_repo.yml')
self.assertEquals(check_task(task), -1)
def test_valid_tasks(self):
valid_tasks = glob.glob('valid*.yml')
for t in valid_tasks:
task = load_task(t)
self.assertEqual(check_task(task), 0)
def test_invalid_head_repo(self):
task = load_task('invalid_head_repo.yml')
self.assertEquals(check_task(task), -1)
def test_public_artifact(self):
task = load_task('public.yml')
self.assertEquals(check_task(task), -1)
def test_invalid_tasks(self):
invalid_tasks = glob.glob('invalid*.yml')
for t in invalid_tasks:
task = load_task(t)
self.assertNotEquals(check_task(task), 0)
if __name__ == '__main__':
unittest.main()

View File

@ -23,13 +23,13 @@ task:
# revision/project params defined originally here https://github.com/taskcluster/taskcluster-try/blob/master/try/instantiate.js
REVISION: 'tip'
GECKO_HEAD_REPOSITORY: 'http://hg.mozilla.org/mozilla-central'
GECKO_BASE_REPOSITORY: 'http://hg.mozilla.org/mozilla-central'
GECKO_BASE_REPOSITORY: 'https://hg.mozilla.org/mozilla-central'
image: '{{#docker_image}}phone-builder{{/docker_image}}'
maxRunTime: 14400
command:
- build-phone.sh
- phone
artifacts:
'private/build':

View File

@ -0,0 +1,52 @@
taskId: 1
task:
metadata:
source: http://todo.com/soon
owner: user@domain.com
name: B2G flame-kk opt
description: B2G flame-kk opt
workerType: b2gbuild
provisionerId: aws-provisioner
scopes:
- 'docker-worker:cache:build-phone-objects'
- 'docker-worker:image:{{#docker_image}}phone-builder{{/docker_image}}'
payload:
cache:
build-phone-objects: '/home/worker/object-folder-flame-kk-1'
env:
TARGET: 'flame-kk'
B2G_DEBUG: '1'
# revision/project params defined originally here https://github.com/taskcluster/taskcluster-try/blob/master/try/instantiate.js
REVISION: 'tip'
GECKO_HEAD_REPOSITORY: 'http://github.com/walac/gecko-dev'
GECKO_BASE_REPOSITORY: 'https://bitbucket.org/walac/gecko-dev'
image: '{{#docker_image}}phone-builder{{/docker_image}}'
maxRunTime: 14400
command:
- phone
artifacts:
'private/build':
type: directory
path: '/home/worker/artifacts/'
expires: '{{#from_now}}1 year{{/from_now}}'
extra:
# Rather then enforcing particular conventions we require that all build
# tasks provide the "build" extra field to specify where the build and tests
# files are located.
locations:
build: 'private/build/b2g-android-arm.tar.gz'
img: 'private/build/flame-kk.zip'
tests: 'private/build/gaia.zip'
symbols: 'private/build/b2g-crashreporter-symbols.zip'
sources: 'private/build/sources.xml'
treeherder:
symbol: B

View File

@ -123,6 +123,30 @@ builds:
types:
opt:
task: tasks/builds/b2g_dolphin_512_eng.yml
nexus-4:
platforms:
- b2g
types:
opt:
task: tasks/builds/b2g_nexus_4_user.yml
nexus-4-eng:
platforms:
- b2g
types:
opt:
task: tasks/builds/b2g_nexus_4_eng.yml
nexus-5l:
platforms:
- b2g
types:
opt:
task: tasks/builds/b2g_nexus_5l_user.yml
nexus-5l-eng:
platforms:
- b2g
types:
opt:
task: tasks/builds/b2g_nexus_5l_eng.yml
android-api-11:
platforms:
- Android

View File

@ -23,10 +23,7 @@ task:
B2G_SYSTEM_APPS: '1'
MOZHARNESS_CONFIG: b2g/taskcluster-spark.py
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone.sh $HOME/workspace
- phone
extra:
treeherderEnv:
- production

View File

@ -23,10 +23,7 @@ task:
B2G_SYSTEM_APPS: '1'
MOZHARNESS_CONFIG: b2g/taskcluster-spark.py
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone.sh $HOME/workspace
- phone
extra:
treeherderEnv:
- production

View File

@ -13,10 +13,7 @@ task:
DEBUG: 0
MOZHARNESS_CONFIG: b2g/taskcluster-spark-ota.py
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone-ota.sh $HOME/workspace
- phone-ota
extra:
treeherder:

View File

@ -15,10 +15,7 @@ task:
maxRunTime: 7200
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-dolphin.sh $HOME/workspace
- dolphin
extra:
# Rather then enforcing particular conventions we require that all build

View File

@ -20,10 +20,7 @@ task:
DEBUG: 0
VARIANT: userdebug
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone.sh $HOME/workspace
- phone
extra:
treeherderEnv:
- production

View File

@ -19,10 +19,7 @@ task:
TARGET: 'flame-kk'
DEBUG: 0
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone.sh $HOME/workspace
- phone
extra:
treeherderEnv:
- production

View File

@ -12,10 +12,7 @@ task:
TARGET: 'flame-kk'
DEBUG: 0
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone-ota.sh $HOME/workspace
- phone-ota
extra:
treeherder:

View File

@ -16,7 +16,6 @@ task:
build-flame-kk-spark-eng-objdir-gecko-{{project}}: /home/worker/objdir-gecko
env:
TARGET: 'flame-kk'
MOZHARNESS_CONFIG: b2g/taskcluster-spark.py
extra:
treeherderEnv:
- staging

View File

@ -15,11 +15,6 @@ task:
env:
TARGET: 'nexus-4'
DEBUG: 0
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone.sh $HOME/workspace
extra:
treeherderEnv:
- production

View File

@ -17,11 +17,6 @@ task:
env:
TARGET: 'nexus-4-kk'
DEBUG: 0
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone.sh $HOME/workspace
extra:
treeherderEnv:
- production

View File

@ -18,10 +18,7 @@ task:
TARGET: 'nexus-4-kk'
DEBUG: 0
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone.sh $HOME/workspace
- phone
extra:
treeherderEnv:
- production

View File

@ -17,10 +17,7 @@ task:
TARGET: 'nexus-4'
DEBUG: 0
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone.sh $HOME/workspace
- phone
extra:
treeherderEnv:
- production

View File

@ -15,11 +15,6 @@ task:
env:
TARGET: 'nexus-5-l'
DEBUG: 0
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone.sh $HOME/workspace
extra:
treeherderEnv:
- production

View File

@ -17,10 +17,7 @@ task:
TARGET: 'nexus-5-l'
DEBUG: 0
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone.sh $HOME/workspace
- phone
extra:
treeherderEnv:
- production

View File

@ -14,7 +14,4 @@ task:
GAIA_KEYBOARD_LAYOUTS: 'en,pt-BR,es,de,fr,pl,zh-Hans-Pinyin,zh-Hant-Zhuyin,en-Dvorak'
B2G_UPDATE_CHANNEL: 'default'
command:
- >
checkout-gecko workspace &&
cd ./workspace/gecko/testing/taskcluster/scripts/phone-builder &&
buildbot_step 'Build' ./build-phone.sh $HOME/workspace
- phone

View File

@ -276,6 +276,9 @@ class B2GXPCShellRunner(MozbuildObject):
log = kwargs.pop("log")
self.log_manager.enable_unstructured()
if kwargs["device_name"].startswith('emulator') and 'x86' in kwargs["device_name"]:
kwargs["emulator"] = 'x86'
if kwargs["xpcshell"] is None:
kwargs["xpcshell"] = "xpcshell"
if kwargs["b2g_path"] is None:
@ -304,9 +307,6 @@ class B2GXPCShellRunner(MozbuildObject):
if kwargs["use_device_libs"] is None:
kwargs["use_device_libs"] = True
if kwargs["device_name"].startswith('emulator') and 'x86' in kwargs["device_name"]:
kwargs["emulator"] = 'x86'
parser = parser_b2g()
options = argparse.Namespace(**kwargs)
rv = runtestsb2g.run_remote_xpcshell(parser, options, log)