From 07ba5749ea1a4804b19b0bf690630002729ac6ba Mon Sep 17 00:00:00 2001 From: Chris Manchester Date: Fri, 28 Sep 2018 00:31:56 +0000 Subject: [PATCH 1/6] Bug 1494139 - Place build script outputs in each package's output directory in the tup backend. r=mshal Differential Revision: https://phabricator.services.mozilla.com/D7135 --HG-- extra : moz-landing-system : lando --- python/mozbuild/mozbuild/backend/tup.py | 36 +++++++++---------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/python/mozbuild/mozbuild/backend/tup.py b/python/mozbuild/mozbuild/backend/tup.py index 4d7e5cc19c2f..94856f1a29ed 100644 --- a/python/mozbuild/mozbuild/backend/tup.py +++ b/python/mozbuild/mozbuild/backend/tup.py @@ -805,19 +805,6 @@ class TupBackend(CommonBackend): rust_build_home = mozpath.join(self.environment.topobjdir, 'toolkit/library/rust') - def get_libloading_outdir(): - for invocation in invocations: - if (invocation['package_name'] == 'libloading' and - invocation['outputs'][0].endswith('.rlib')): - return invocation['env']['OUT_DIR'] - - def get_lmdb_sys_outdir(): - for invocation in invocations: - if (invocation['package_name'] == 'lmdb-sys' and - len(invocation['outputs']) >= 1 and - invocation['outputs'][0].endswith('.rlib')): - return invocation['env']['OUT_DIR'] - def display_name(invocation): output_str = '' if invocation['outputs']: @@ -864,10 +851,11 @@ class TupBackend(CommonBackend): invocation['full-deps'] = set() if os.path.basename(invocation['program']) == 'build-script-build': + out_dir = invocation['env']['OUT_DIR'] for output in cargo_extra_outputs.get(shortname, []): - outputs.append(os.path.join(invocation['env']['OUT_DIR'], output)) + outputs.append(os.path.join(out_dir, output)) - script_stdout = mozpath.join(rust_build_home, + script_stdout = mozpath.join(out_dir, '%s_%s_build_out.txt' % (shortname, invocation['kind'])) command.extend(['>', script_stdout]) @@ -891,14 +879,16 @@ class TupBackend(CommonBackend): for t in inv['target_kind']) def get_output_files(inv): - candidate_file = mozpath.join(rust_build_home, - '%s_%s_build_out.txt' % - (inv['package_name'], - inv['kind'])) - if (candidate_file in all_dep_build_outputs and - candidate_file not in seen_dep_outputs): - dep_build_outputs.append(candidate_file) - seen_dep_outputs.add(candidate_file) + out_dir = inv['env'].get('OUT_DIR') + if out_dir: + candidate_file = mozpath.join(out_dir, + '%s_%s_build_out.txt' % + (inv['package_name'], + inv['kind'])) + if (candidate_file in all_dep_build_outputs and + candidate_file not in seen_dep_outputs): + dep_build_outputs.append(candidate_file) + seen_dep_outputs.add(candidate_file) for dep in inv['deps']: dep_inv = invocations[dep] From 66aa31a4998aa3a355dcb9682076a52277c92f0d Mon Sep 17 00:00:00 2001 From: Chris Manchester Date: Fri, 28 Sep 2018 00:39:44 +0000 Subject: [PATCH 2/6] Bug 1494139 - Add rust build script outputs to the tup backend for upcoming cranelift crates. r=mshal Differential Revision: https://phabricator.services.mozilla.com/D7137 --HG-- extra : moz-landing-system : lando --- .../mozbuild/backend/cargo_build_defs.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/python/mozbuild/mozbuild/backend/cargo_build_defs.py b/python/mozbuild/mozbuild/backend/cargo_build_defs.py index 525dd1f0e878..8eaeaea8d4df 100644 --- a/python/mozbuild/mozbuild/backend/cargo_build_defs.py +++ b/python/mozbuild/mozbuild/backend/cargo_build_defs.py @@ -95,4 +95,38 @@ cargo_extra_outputs = { 'webrender': [ 'shaders.rs', ], + 'cranelift-codegen': [ + 'binemit-arm32.rs', + 'binemit-arm64.rs', + 'binemit-riscv.rs', + 'binemit-x86.rs', + 'encoding-arm32.rs', + 'encoding-arm64.rs', + 'encoding-riscv.rs', + 'encoding-x86.rs', + 'inst_builder.rs', + 'legalize-arm32.rs', + 'legalize-arm64.rs', + 'legalize-riscv.rs', + 'legalize-x86.rs', + 'legalizer.rs', + 'new_types.rs', + 'opcodes.rs', + 'registers-arm32.rs', + 'registers-arm64.rs', + 'registers-riscv.rs', + 'registers-x86.rs', + 'settings-arm32.rs', + 'settings-arm64.rs', + 'settings-riscv.rs', + 'settings-x86.rs', + 'settings.rs', + 'types.rs', + ], + 'target-lexicon': [ + 'host.rs', + ], + 'baldrdash': [ + 'bindings.rs', + ], } From 68771b058d6151460c4828c80a05a798e6df9de7 Mon Sep 17 00:00:00 2001 From: Chris Manchester Date: Fri, 28 Sep 2018 00:38:47 +0000 Subject: [PATCH 3/6] Bug 1494139 - Link rust libraries into programs in the tup backend. r=mshal Differential Revision: https://phabricator.services.mozilla.com/D7136 --HG-- extra : moz-landing-system : lando --- python/mozbuild/mozbuild/backend/tup.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/python/mozbuild/mozbuild/backend/tup.py b/python/mozbuild/mozbuild/backend/tup.py index 94856f1a29ed..d78acec6c403 100644 --- a/python/mozbuild/mozbuild/backend/tup.py +++ b/python/mozbuild/mozbuild/backend/tup.py @@ -463,6 +463,7 @@ class TupBackend(CommonBackend): def _gen_program(self, backend_file, prog): cc_or_cxx = 'CXX' if prog.cxx_link else 'CC' objs, _, _, shared_libs, os_libs, static_libs = self._expand_libs(prog) + static_libs = self._lib_paths(backend_file.objdir, static_libs) shared_libs = self._lib_paths(backend_file.objdir, shared_libs) @@ -471,6 +472,16 @@ class TupBackend(CommonBackend): # accurate once we start building libraries in their final locations. inputs = objs + static_libs + shared_libs + [self._shlibs] + + rust_linked = [l for l in prog.linked_libraries + if isinstance(l, RustLibrary)] + + extra_inputs = [] + if rust_linked: + extra_inputs = [self._rust_output_group(rust_linked[0].output_category) or + self._rust_libs] + static_libs += self._lib_paths(backend_file.objdir, rust_linked) + list_file_name = '%s.list' % prog.name.replace('.', '_') list_file = self._make_list_file(backend_file.objdir, objs, list_file_name) @@ -494,6 +505,7 @@ class TupBackend(CommonBackend): backend_file.rule( cmd=cmd, inputs=inputs, + extra_inputs=extra_inputs, outputs=outputs, display='LINK %o' ) From a4782418dea1d7b5ab253256495ba9092abb9426 Mon Sep 17 00:00:00 2001 From: Mike Shal Date: Fri, 28 Sep 2018 02:33:53 +0000 Subject: [PATCH 4/6] Bug 1494833 - Bump tup version to v0.7.8; r=chmanchester This incorporates some fixes for ccache, icecream, and a better display output (decreasing count instead of an increasing count). It may also let us experiment with incremental rust support, though I think that feature still needs some more work. MozReview-Commit-ID: 7zPGiL9Ob6N Differential Revision: https://phabricator.services.mozilla.com/D7152 --HG-- extra : moz-landing-system : lando --- build/moz.configure/tup.configure | 2 +- taskcluster/scripts/misc/build-tup-linux.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/moz.configure/tup.configure b/build/moz.configure/tup.configure index c8c0dac2fc97..8d702f8fcdfe 100644 --- a/build/moz.configure/tup.configure +++ b/build/moz.configure/tup.configure @@ -13,7 +13,7 @@ tup = check_prog('TUP', ['tup']) @checking('for tup version') @imports('re') def tup_version(tup): - tup_min_version = '0.7.7' + tup_min_version = '0.7.8' out = check_cmd_output(tup, '--version', onerror=lambda: die('Failed to get tup version')) m = re.search(r'tup v?([0-9]+\.[0-9]+\.[0-9]+)', out) diff --git a/taskcluster/scripts/misc/build-tup-linux.sh b/taskcluster/scripts/misc/build-tup-linux.sh index 611ec1733271..16c07a6fa189 100755 --- a/taskcluster/scripts/misc/build-tup-linux.sh +++ b/taskcluster/scripts/misc/build-tup-linux.sh @@ -3,7 +3,7 @@ set -e -v # This script is for building tup on Linux. -TUP_REVISION=e948a999a38fefa0ac0d92f6357f82aca2f9cb17 +TUP_REVISION=v0.7.8 WORKSPACE=$HOME/workspace UPLOAD_DIR=$HOME/artifacts @@ -17,7 +17,7 @@ cd $WORKSPACE/build/src git clone https://github.com/gittup/tup.git cd tup git checkout $TUP_REVISION -echo 'CONFIG_TUP_SERVER=ldpreload' > tup.config +(echo 'CONFIG_TUP_SERVER=ldpreload'; echo 'CONFIG_TUP_USE_SYSTEM_PCRE=n') > tup.config ./bootstrap-ldpreload.sh cd .. tar caf tup.tar.xz tup/tup tup/tup-ldpreload.so tup/tup.1 From 8e84dcb77835f47c0d151aef665efc213232822a Mon Sep 17 00:00:00 2001 From: "Byron Campen [:bwc]" Date: Thu, 27 Sep 2018 18:27:25 +0000 Subject: [PATCH 5/6] Bug 1493765: Stop using NrIce* in PeerConnectionImpl. r=mjf Differential Revision: https://phabricator.services.mozilla.com/D6767 --HG-- extra : moz-landing-system : lando --- .../src/peerconnection/PeerConnectionImpl.cpp | 378 ++---------------- .../src/peerconnection/PeerConnectionImpl.h | 78 +--- .../peerconnection/PeerConnectionMedia.cpp | 346 +++++++++++++++- .../src/peerconnection/PeerConnectionMedia.h | 26 +- 4 files changed, 381 insertions(+), 447 deletions(-) diff --git a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp index 27c852f86cd6..072845f3fc1c 100644 --- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp +++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp @@ -82,7 +82,6 @@ #include "js/GCAnnotations.h" #include "mozilla/PeerIdentity.h" #include "mozilla/dom/RTCCertificate.h" -#include "mozilla/dom/RTCConfigurationBinding.h" #include "mozilla/dom/RTCDTMFSenderBinding.h" #include "mozilla/dom/RTCDTMFToneChangeEvent.h" #include "mozilla/dom/RTCRtpReceiverBinding.h" @@ -413,162 +412,10 @@ PeerConnectionImpl::~PeerConnectionImpl() // to release off a timer (and XPCOM Shutdown) to avoid churn } -/** - * In JS, an RTCConfiguration looks like this: - * - * { "iceServers": [ { url:"stun:stun.example.org" }, - * { url:"turn:turn.example.org?transport=udp", - * username: "jib", credential:"mypass"} ] } - * - * This function converts that into an internal PeerConnectionConfiguration - * object. - */ -nsresult -PeerConnectionConfiguration::Init(const RTCConfiguration& aSrc) -{ - if (aSrc.mIceServers.WasPassed()) { - for (size_t i = 0; i < aSrc.mIceServers.Value().Length(); i++) { - nsresult rv = AddIceServer(aSrc.mIceServers.Value()[i]); - NS_ENSURE_SUCCESS(rv, rv); - } - } - - switch (aSrc.mBundlePolicy) { - case dom::RTCBundlePolicy::Balanced: - setBundlePolicy(kBundleBalanced); - break; - case dom::RTCBundlePolicy::Max_compat: - setBundlePolicy(kBundleMaxCompat); - break; - case dom::RTCBundlePolicy::Max_bundle: - setBundlePolicy(kBundleMaxBundle); - break; - default: - MOZ_CRASH(); - } - - switch (aSrc.mIceTransportPolicy) { - case dom::RTCIceTransportPolicy::Relay: - setIceTransportPolicy(NrIceCtx::ICE_POLICY_RELAY); - break; - case dom::RTCIceTransportPolicy::All: - if (Preferences::GetBool("media.peerconnection.ice.no_host", false)) { - setIceTransportPolicy(NrIceCtx::ICE_POLICY_NO_HOST); - } else { - setIceTransportPolicy(NrIceCtx::ICE_POLICY_ALL); - } - break; - default: - MOZ_CRASH(); - } - return NS_OK; -} - -nsresult -PeerConnectionConfiguration::AddIceServer(const RTCIceServer &aServer) -{ - NS_ENSURE_STATE(aServer.mUrls.WasPassed()); - NS_ENSURE_STATE(aServer.mUrls.Value().IsStringSequence()); - auto &urls = aServer.mUrls.Value().GetAsStringSequence(); - for (size_t i = 0; i < urls.Length(); i++) { - // Without STUN/TURN handlers, NS_NewURI returns nsSimpleURI rather than - // nsStandardURL. To parse STUN/TURN URI's to spec - // http://tools.ietf.org/html/draft-nandakumar-rtcweb-stun-uri-02#section-3 - // http://tools.ietf.org/html/draft-petithuguenin-behave-turn-uri-03#section-3 - // we parse out the query-string, and use ParseAuthority() on the rest - RefPtr url; - nsresult rv = NS_NewURI(getter_AddRefs(url), urls[i]); - NS_ENSURE_SUCCESS(rv, rv); - bool isStun = false, isStuns = false, isTurn = false, isTurns = false; - url->SchemeIs("stun", &isStun); - url->SchemeIs("stuns", &isStuns); - url->SchemeIs("turn", &isTurn); - url->SchemeIs("turns", &isTurns); - if (!(isStun || isStuns || isTurn || isTurns)) { - return NS_ERROR_FAILURE; - } - if (isStuns) { - continue; // TODO: Support STUNS (Bug 1056934) - } - nsAutoCString spec; - rv = url->GetSpec(spec); - NS_ENSURE_SUCCESS(rv, rv); - - // TODO(jib@mozilla.com): Revisit once nsURI supports STUN/TURN (Bug 833509) - int32_t port; - nsAutoCString host; - nsAutoCString transport; - { - uint32_t hostPos; - int32_t hostLen; - nsAutoCString path; - rv = url->GetPathQueryRef(path); - NS_ENSURE_SUCCESS(rv, rv); - - // Tolerate query-string + parse 'transport=[udp|tcp]' by hand. - int32_t questionmark = path.FindChar('?'); - if (questionmark >= 0) { - const nsCString match = NS_LITERAL_CSTRING("transport="); - - for (int32_t i = questionmark, endPos; i >= 0; i = endPos) { - endPos = path.FindCharInSet("&", i + 1); - const nsDependentCSubstring fieldvaluepair = Substring(path, i + 1, - endPos); - if (StringBeginsWith(fieldvaluepair, match)) { - transport = Substring(fieldvaluepair, match.Length()); - ToLowerCase(transport); - } - } - path.SetLength(questionmark); - } - - rv = net_GetAuthURLParser()->ParseAuthority(path.get(), path.Length(), - nullptr, nullptr, - nullptr, nullptr, - &hostPos, &hostLen, &port); - NS_ENSURE_SUCCESS(rv, rv); - if (!hostLen) { - return NS_ERROR_FAILURE; - } - if (hostPos > 1) /* The username was removed */ - return NS_ERROR_FAILURE; - path.Mid(host, hostPos, hostLen); - } - if (port == -1) - port = (isStuns || isTurns)? 5349 : 3478; - - if (isStuns || isTurns) { - // Should we barf if transport is set to udp or something? - transport = kNrIceTransportTls; - } - - if (transport.IsEmpty()) { - transport = kNrIceTransportUdp; - } - - if (isTurn || isTurns) { - NS_ConvertUTF16toUTF8 credential(aServer.mCredential.Value()); - NS_ConvertUTF16toUTF8 username(aServer.mUsername.Value()); - - if (!addTurnServer(host.get(), port, - username.get(), - credential.get(), - transport.get())) { - return NS_ERROR_FAILURE; - } - } else { - if (!addStunServer(host.get(), port, transport.get())) { - return NS_ERROR_FAILURE; - } - } - } - return NS_OK; -} - nsresult PeerConnectionImpl::Initialize(PeerConnectionObserver& aObserver, nsGlobalWindowInner* aWindow, - const PeerConnectionConfiguration& aConfiguration, + const RTCConfiguration& aConfiguration, nsISupports* aThread) { nsresult res; @@ -671,9 +518,7 @@ PeerConnectionImpl::Initialize(PeerConnectionObserver& aObserver, mMedia->SignalCandidate.connect(this, &PeerConnectionImpl::CandidateReady); // Initialize the media object. - res = mMedia->Init(aConfiguration.getStunServers(), - aConfiguration.getTurnServers(), - aConfiguration.getIceTransportPolicy()); + res = mMedia->Init(aConfiguration); if (NS_FAILED(res)) { CSFLogError(LOGTAG, "%s: Couldn't initialize media object", __FUNCTION__); return res; @@ -692,7 +537,22 @@ PeerConnectionImpl::Initialize(PeerConnectionObserver& aObserver, return res; } - res = mJsepSession->SetBundlePolicy(aConfiguration.getBundlePolicy()); + JsepBundlePolicy bundlePolicy; + switch (aConfiguration.mBundlePolicy) { + case dom::RTCBundlePolicy::Balanced: + bundlePolicy = kBundleBalanced; + break; + case dom::RTCBundlePolicy::Max_compat: + bundlePolicy = kBundleMaxCompat; + break; + case dom::RTCBundlePolicy::Max_bundle: + bundlePolicy = kBundleMaxBundle; + break; + default: + MOZ_CRASH(); + } + + res = mJsepSession->SetBundlePolicy(bundlePolicy); if (NS_FAILED(res)) { CSFLogError(LOGTAG, "%s: Couldn't set bundle policy, res=%u, error=%s", __FUNCTION__, @@ -715,15 +575,7 @@ PeerConnectionImpl::Initialize(PeerConnectionObserver& aObserver, MOZ_ASSERT(aThread); mThread = do_QueryInterface(aThread); - PeerConnectionConfiguration converted; - nsresult res = converted.Init(aConfiguration); - if (NS_FAILED(res)) { - CSFLogError(LOGTAG, "%s: Invalid RTCConfiguration", __FUNCTION__); - rv.Throw(res); - return; - } - - res = Initialize(aObserver, &aWindow, converted, aThread); + nsresult res = Initialize(aObserver, &aWindow, aConfiguration, aThread); if (NS_FAILED(res)) { rv.Throw(res); return; @@ -2804,40 +2656,6 @@ PeerConnectionImpl::GetName() return mName; } -static mozilla::dom::PCImplIceConnectionState -toDomIceConnectionState(NrIceCtx::ConnectionState state) { - switch (state) { - case NrIceCtx::ICE_CTX_INIT: - return PCImplIceConnectionState::New; - case NrIceCtx::ICE_CTX_CHECKING: - return PCImplIceConnectionState::Checking; - case NrIceCtx::ICE_CTX_CONNECTED: - return PCImplIceConnectionState::Connected; - case NrIceCtx::ICE_CTX_COMPLETED: - return PCImplIceConnectionState::Completed; - case NrIceCtx::ICE_CTX_FAILED: - return PCImplIceConnectionState::Failed; - case NrIceCtx::ICE_CTX_DISCONNECTED: - return PCImplIceConnectionState::Disconnected; - case NrIceCtx::ICE_CTX_CLOSED: - return PCImplIceConnectionState::Closed; - } - MOZ_CRASH(); -} - -static mozilla::dom::PCImplIceGatheringState -toDomIceGatheringState(NrIceCtx::GatheringState state) { - switch (state) { - case NrIceCtx::ICE_CTX_GATHER_INIT: - return PCImplIceGatheringState::New; - case NrIceCtx::ICE_CTX_GATHER_STARTED: - return PCImplIceGatheringState::Gathering; - case NrIceCtx::ICE_CTX_GATHER_COMPLETE: - return PCImplIceGatheringState::Complete; - } - MOZ_CRASH(); -} - void PeerConnectionImpl::CandidateReady(const std::string& candidate, const std::string& transportId) { @@ -2935,13 +2753,11 @@ static bool isFailed(PCImplIceConnectionState state) { } void PeerConnectionImpl::IceConnectionStateChange( - NrIceCtx* ctx, - NrIceCtx::ConnectionState state) { + dom::PCImplIceConnectionState domState) { PC_AUTO_ENTER_API_CALL_VOID_RETURN(false); CSFLogDebug(LOGTAG, "%s", __FUNCTION__); - auto domState = toDomIceConnectionState(state); if (domState == mIceConnectionState) { // no work to be done since the states are the same. // this can happen during ICE rollback situations. @@ -3008,15 +2824,13 @@ void PeerConnectionImpl::IceConnectionStateChange( } void -PeerConnectionImpl::IceGatheringStateChange( - NrIceCtx* ctx, - NrIceCtx::GatheringState state) +PeerConnectionImpl::IceGatheringStateChange(dom::PCImplIceGatheringState state) { PC_AUTO_ENTER_API_CALL_VOID_RETURN(false); CSFLogDebug(LOGTAG, "%s", __FUNCTION__); - mIceGatheringState = toDomIceGatheringState(state); + mIceGatheringState = state; // Would be nice if we had a means of converting one of these dom enums // to a string that wasn't almost as much text as this switch statement... @@ -3094,8 +2908,8 @@ PeerConnectionImpl::BuildStatsQuery_m( // a ref instead of making multiple calls. NrIceCtx uses threadsafe refcounting. // NOTE: Do this after all other failure tests, to ensure we don't // accidentally release the Ctx on Mainthread. - query->iceCtx = mMedia->ice_ctx(); - if (!query->iceCtx) { + query->media = mMedia; + if (!query->media) { CSFLogError(LOGTAG, "Could not build stats query, no ice_ctx"); return NS_ERROR_UNEXPECTED; } @@ -3151,117 +2965,10 @@ PeerConnectionImpl::BuildStatsQuery_m( return rv; } -static void ToRTCIceCandidateStats( - const std::vector& candidates, - RTCStatsType candidateType, - const nsString& componentId, - DOMHighResTimeStamp now, - RTCStatsReportInternal* report) { - - MOZ_ASSERT(report); - for (const auto& candidate : candidates) { - RTCIceCandidateStats cand; - cand.mType.Construct(candidateType); - NS_ConvertASCIItoUTF16 codeword(candidate.codeword.c_str()); - cand.mComponentId.Construct(componentId); - cand.mId.Construct(codeword); - cand.mTimestamp.Construct(now); - cand.mCandidateType.Construct( - RTCStatsIceCandidateType(candidate.type)); - cand.mIpAddress.Construct( - NS_ConvertASCIItoUTF16(candidate.cand_addr.host.c_str())); - cand.mPortNumber.Construct(candidate.cand_addr.port); - cand.mTransport.Construct( - NS_ConvertASCIItoUTF16(candidate.cand_addr.transport.c_str())); - if (candidateType == RTCStatsType::Local_candidate) { - cand.mMozLocalTransport.Construct( - NS_ConvertASCIItoUTF16(candidate.local_addr.transport.c_str())); - } - report->mIceCandidateStats.Value().AppendElement(cand, fallible); - if (candidate.trickled) { - report->mTrickledIceCandidateStats.Value().AppendElement(cand, fallible); - } - } -} - -static void RecordIceStats_s( - const NrIceMediaStream& mediaStream, - bool internalStats, - DOMHighResTimeStamp now, - RTCStatsReportInternal* report) { - - NS_ConvertASCIItoUTF16 transportId(mediaStream.GetId().c_str()); - - std::vector candPairs; - nsresult res = mediaStream.GetCandidatePairs(&candPairs); - if (NS_FAILED(res)) { - CSFLogError(LOGTAG, - "%s: Error getting candidate pairs for transport id \"%s\"", - __FUNCTION__, mediaStream.GetId().c_str()); - return; - } - - for (auto& candPair : candPairs) { - NS_ConvertASCIItoUTF16 codeword(candPair.codeword.c_str()); - NS_ConvertASCIItoUTF16 localCodeword(candPair.local.codeword.c_str()); - NS_ConvertASCIItoUTF16 remoteCodeword(candPair.remote.codeword.c_str()); - // Only expose candidate-pair statistics to chrome, until we've thought - // through the implications of exposing it to content. - - RTCIceCandidatePairStats s; - s.mId.Construct(codeword); - s.mTransportId.Construct(transportId); - s.mTimestamp.Construct(now); - s.mType.Construct(RTCStatsType::Candidate_pair); - s.mLocalCandidateId.Construct(localCodeword); - s.mRemoteCandidateId.Construct(remoteCodeword); - s.mNominated.Construct(candPair.nominated); - s.mWritable.Construct(candPair.writable); - s.mReadable.Construct(candPair.readable); - s.mPriority.Construct(candPair.priority); - s.mSelected.Construct(candPair.selected); - s.mBytesSent.Construct(candPair.bytes_sent); - s.mBytesReceived.Construct(candPair.bytes_recvd); - s.mLastPacketSentTimestamp.Construct(candPair.ms_since_last_send); - s.mLastPacketReceivedTimestamp.Construct(candPair.ms_since_last_recv); - s.mState.Construct(RTCStatsIceCandidatePairState(candPair.state)); - s.mComponentId.Construct(candPair.component_id); - report->mIceCandidatePairStats.Value().AppendElement(s, fallible); - } - - std::vector candidates; - if (NS_SUCCEEDED(mediaStream.GetLocalCandidates(&candidates))) { - ToRTCIceCandidateStats(candidates, - RTCStatsType::Local_candidate, - transportId, - now, - report); - // add the local candidates unparsed string to a sequence - for (const auto& candidate : candidates) { - report->mRawLocalCandidates.Value().AppendElement( - NS_ConvertASCIItoUTF16(candidate.label.c_str()), fallible); - } - } - candidates.clear(); - - if (NS_SUCCEEDED(mediaStream.GetRemoteCandidates(&candidates))) { - ToRTCIceCandidateStats(candidates, - RTCStatsType::Remote_candidate, - transportId, - now, - report); - // add the remote candidates unparsed string to a sequence - for (const auto& candidate : candidates) { - report->mRawRemoteCandidates.Value().AppendElement( - NS_ConvertASCIItoUTF16(candidate.label.c_str()), fallible); - } - } -} - nsresult PeerConnectionImpl::ExecuteStatsQuery_s(RTCStatsQuery *query) { - ASSERT_ON_THREAD(query->iceCtx->thread()); + ASSERT_ON_THREAD(query->media->GetSTSThread()); // Gather stats from pipelines provided (can't touch mMedia + stream on STS) @@ -3485,22 +3192,16 @@ PeerConnectionImpl::ExecuteStatsQuery_s(RTCStatsQuery *query) { } if (query->grabAllLevels) { - for (const auto& stream : query->iceCtx->GetStreams()) { - RecordIceStats_s(*stream, - query->internalStats, - query->now, - query->report); - } - } else if (query->iceCtx->GetStream(query->transportId)) { - RecordIceStats_s(*query->iceCtx->GetStream(query->transportId), - query->internalStats, - query->now, - query->report); + query->media->GetAllIceStats_s(query->internalStats, + query->now, + query->report); + } else { + query->media->GetIceStats_s(query->transportId, + query->internalStats, + query->now, + query->report); } - // NrIceCtx must be destroyed on STS, so it is not safe - // to dispatch it back to main. - query->iceCtx = nullptr; return NS_OK; } @@ -3509,8 +3210,8 @@ void PeerConnectionImpl::GetStatsForPCObserver_s( nsAutoPtr query) { MOZ_ASSERT(query); - MOZ_ASSERT(query->iceCtx); - ASSERT_ON_THREAD(query->iceCtx->thread()); + MOZ_ASSERT(query->media); + ASSERT_ON_THREAD(query->media->GetSTSThread()); nsresult rv = PeerConnectionImpl::ExecuteStatsQuery_s(query.get()); @@ -3571,15 +3272,6 @@ PeerConnectionImpl::RecordIceRestartStatistics(JsepSdpType type) } } -void -PeerConnectionImpl::IceStreamReady(NrIceMediaStream *aStream) -{ - PC_AUTO_ENTER_API_CALL_NO_CHECK(); - MOZ_ASSERT(aStream); - - CSFLogDebug(LOGTAG, "%s: %s", __FUNCTION__, aStream->name().c_str()); -} - //Telemetry for when calls start void PeerConnectionImpl::startCallTelem() { diff --git a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h index 26f947523d00..af4ee1c5b85e 100644 --- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h +++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h @@ -18,8 +18,6 @@ #include "nsIWeakReferenceUtils.h" // for the definition of nsWeakPtr #include "IPeerConnection.h" #include "sigslot.h" -#include "nricectx.h" -#include "nricemediastream.h" #include "nsComponentManagerUtils.h" #include "nsPIDOMWindow.h" #include "nsIUUIDGenerator.h" @@ -39,6 +37,7 @@ #include "mozilla/dom/PeerConnectionImplEnumsBinding.h" #include "mozilla/dom/RTCPeerConnectionBinding.h" // mozPacketDumpType, maybe move? #include "mozilla/dom/RTCRtpTransceiverBinding.h" +#include "mozilla/dom/RTCConfigurationBinding.h" #include "PrincipalChangeObserver.h" #include "StreamTracks.h" @@ -61,10 +60,6 @@ class nsDOMDataChannel; namespace mozilla { class DataChannel; class DtlsIdentity; -class NrIceCtx; -class NrIceMediaStream; -class NrIceStunServer; -class NrIceTurnServer; class MediaPipeline; class TransceiverImpl; @@ -114,12 +109,8 @@ using mozilla::dom::PeerConnectionObserver; using mozilla::dom::RTCConfiguration; using mozilla::dom::RTCIceServer; using mozilla::dom::RTCOfferOptions; -using mozilla::NrIceCtx; -using mozilla::NrIceMediaStream; using mozilla::DtlsIdentity; using mozilla::ErrorResult; -using mozilla::NrIceStunServer; -using mozilla::NrIceTurnServer; using mozilla::PeerIdentity; class PeerConnectionWrapper; @@ -135,59 +126,6 @@ class PCUuidGenerator : public mozilla::JsepUuidGenerator { nsCOMPtr mGenerator; }; -class PeerConnectionConfiguration -{ -public: - PeerConnectionConfiguration() - : mBundlePolicy(kBundleBalanced), - mIceTransportPolicy(NrIceCtx::ICE_POLICY_ALL) {} - - bool addStunServer(const std::string& addr, uint16_t port, - const char* transport) - { - UniquePtr server(NrIceStunServer::Create(addr, port, transport)); - if (!server) { - return false; - } - addStunServer(*server); - return true; - } - bool addTurnServer(const std::string& addr, uint16_t port, - const std::string& username, - const std::string& pwd, - const char* transport) - { - // TODO(ekr@rtfm.com): Need support for SASLprep for - // username and password. Bug # ??? - std::vector password(pwd.begin(), pwd.end()); - - UniquePtr server(NrIceTurnServer::Create(addr, port, username, password, - transport)); - if (!server) { - return false; - } - addTurnServer(*server); - return true; - } - void addStunServer(const NrIceStunServer& server) { mStunServers.push_back (server); } - void addTurnServer(const NrIceTurnServer& server) { mTurnServers.push_back (server); } - const std::vector& getStunServers() const { return mStunServers; } - const std::vector& getTurnServers() const { return mTurnServers; } - void setBundlePolicy(JsepBundlePolicy policy) { mBundlePolicy = policy;} - JsepBundlePolicy getBundlePolicy() const { return mBundlePolicy; } - void setIceTransportPolicy(NrIceCtx::Policy policy) { mIceTransportPolicy = policy;} - NrIceCtx::Policy getIceTransportPolicy() const { return mIceTransportPolicy; } - - nsresult Init(const RTCConfiguration& aSrc); - nsresult AddIceServer(const RTCIceServer& aServer); - -private: - std::vector mStunServers; - std::vector mTurnServers; - JsepBundlePolicy mBundlePolicy; - NrIceCtx::Policy mIceTransportPolicy; -}; - // Not an inner class so we can forward declare. class RTCStatsQuery { public: @@ -207,7 +145,7 @@ class RTCStatsQuery { bool internalStats; nsTArray> pipelines; std::string transportId; - RefPtr iceCtx; + RefPtr media; bool grabAllLevels; DOMHighResTimeStamp now; }; @@ -288,17 +226,14 @@ public: virtual const std::string& GetName(); // ICE events - void IceConnectionStateChange(NrIceCtx* ctx, - NrIceCtx::ConnectionState state); - void IceGatheringStateChange(NrIceCtx* ctx, - NrIceCtx::GatheringState state); + void IceConnectionStateChange(dom::PCImplIceConnectionState state); + void IceGatheringStateChange(dom::PCImplIceGatheringState state); void UpdateDefaultCandidate(const std::string& defaultAddr, uint16_t defaultPort, const std::string& defaultRtcpAddr, uint16_t defaultRtcpPort, const std::string& transportId); void EndOfLocalCandidates(const std::string& transportId); - void IceStreamReady(NrIceMediaStream *aStream); static void ListenThread(void *aData); static void ConnectThread(void *aData); @@ -320,12 +255,9 @@ public: return mWindow; } - // Initialize PeerConnection from a PeerConnectionConfiguration object - // (used directly by unit-tests, and indirectly by the JS entry point) - // This is necessary because RTCConfiguration can't be used by unit-tests nsresult Initialize(PeerConnectionObserver& aObserver, nsGlobalWindowInner* aWindow, - const PeerConnectionConfiguration& aConfiguration, + const RTCConfiguration& aConfiguration, nsISupports* aThread); // Initialize PeerConnection from an RTCConfiguration object (JS entrypoint) diff --git a/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.cpp b/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.cpp index 65a27b38b89f..f9607cfe4ec3 100644 --- a/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.cpp +++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.cpp @@ -131,8 +131,7 @@ PeerConnectionMedia::StunAddrsHandler::OnStunAddrsAvailable( // If parent process returns 0 STUN addresses, change ICE connection // state to failed. if (!pcm_->mStunAddrs.Length()) { - pcm_->SignalIceConnectionStateChange(pcm_->mIceCtx.get(), - NrIceCtx::ICE_CTX_FAILED); + pcm_->SignalIceConnectionStateChange(dom::PCImplIceConnectionState::Failed); } pcm_ = nullptr; @@ -240,9 +239,129 @@ PeerConnectionMedia::InitProxy() return NS_OK; } -nsresult PeerConnectionMedia::Init(const std::vector& stun_servers, - const std::vector& turn_servers, - NrIceCtx::Policy policy) +static nsresult addNrIceServer(const nsString& aIceUrl, + const dom::RTCIceServer& aIceServer, + std::vector* aStunServersOut, + std::vector* aTurnServersOut) +{ + // Without STUN/TURN handlers, NS_NewURI returns nsSimpleURI rather than + // nsStandardURL. To parse STUN/TURN URI's to spec + // http://tools.ietf.org/html/draft-nandakumar-rtcweb-stun-uri-02#section-3 + // http://tools.ietf.org/html/draft-petithuguenin-behave-turn-uri-03#section-3 + // we parse out the query-string, and use ParseAuthority() on the rest + RefPtr url; + nsresult rv = NS_NewURI(getter_AddRefs(url), aIceUrl); + NS_ENSURE_SUCCESS(rv, rv); + bool isStun = false, isStuns = false, isTurn = false, isTurns = false; + url->SchemeIs("stun", &isStun); + url->SchemeIs("stuns", &isStuns); + url->SchemeIs("turn", &isTurn); + url->SchemeIs("turns", &isTurns); + if (!(isStun || isStuns || isTurn || isTurns)) { + return NS_ERROR_FAILURE; + } + if (isStuns) { + return NS_OK; // TODO: Support STUNS (Bug 1056934) + } + + nsAutoCString spec; + rv = url->GetSpec(spec); + NS_ENSURE_SUCCESS(rv, rv); + + // TODO(jib@mozilla.com): Revisit once nsURI supports STUN/TURN (Bug 833509) + int32_t port; + nsAutoCString host; + nsAutoCString transport; + { + uint32_t hostPos; + int32_t hostLen; + nsAutoCString path; + rv = url->GetPathQueryRef(path); + NS_ENSURE_SUCCESS(rv, rv); + + // Tolerate query-string + parse 'transport=[udp|tcp]' by hand. + int32_t questionmark = path.FindChar('?'); + if (questionmark >= 0) { + const nsCString match = NS_LITERAL_CSTRING("transport="); + + for (int32_t i = questionmark, endPos; i >= 0; i = endPos) { + endPos = path.FindCharInSet("&", i + 1); + const nsDependentCSubstring fieldvaluepair = Substring(path, i + 1, + endPos); + if (StringBeginsWith(fieldvaluepair, match)) { + transport = Substring(fieldvaluepair, match.Length()); + ToLowerCase(transport); + } + } + path.SetLength(questionmark); + } + + rv = net_GetAuthURLParser()->ParseAuthority(path.get(), path.Length(), + nullptr, nullptr, + nullptr, nullptr, + &hostPos, &hostLen, &port); + NS_ENSURE_SUCCESS(rv, rv); + if (!hostLen) { + return NS_ERROR_FAILURE; + } + if (hostPos > 1) { + /* The username was removed */ + return NS_ERROR_FAILURE; + } + path.Mid(host, hostPos, hostLen); + } + if (port == -1) { + port = (isStuns || isTurns)? 5349 : 3478; + } + + if (isStuns || isTurns) { + // Should we barf if transport is set to udp or something? + transport = kNrIceTransportTls; + } + + if (transport.IsEmpty()) { + transport = kNrIceTransportUdp; + } + + if (isTurn || isTurns) { + std::string pwd(NS_ConvertUTF16toUTF8(aIceServer.mCredential.Value()).get()); + std::string username(NS_ConvertUTF16toUTF8(aIceServer.mUsername.Value()).get()); + + std::vector password(pwd.begin(), pwd.end()); + + UniquePtr server(NrIceTurnServer::Create(host.get(), port, username, password, transport.get())); + if (!server) { + return NS_ERROR_FAILURE; + } + aTurnServersOut->emplace_back(std::move(*server)); + } else { + UniquePtr server(NrIceStunServer::Create(host.get(), port, transport.get())); + if (!server) { + return NS_ERROR_FAILURE; + } + aStunServersOut->emplace_back(std::move(*server)); + } + return NS_OK; +} + +static NrIceCtx::Policy toNrIcePolicy(dom::RTCIceTransportPolicy aPolicy) +{ + switch (aPolicy) { + case dom::RTCIceTransportPolicy::Relay: + return NrIceCtx::ICE_POLICY_RELAY; + case dom::RTCIceTransportPolicy::All: + if (Preferences::GetBool("media.peerconnection.ice.no_host", false)) { + return NrIceCtx::ICE_POLICY_NO_HOST; + } else { + return NrIceCtx::ICE_POLICY_ALL; + } + default: + MOZ_CRASH(); + } + return NrIceCtx::ICE_POLICY_ALL; +} + +nsresult PeerConnectionMedia::Init(const dom::RTCConfiguration& aConfiguration) { nsresult rv = InitProxy(); NS_ENSURE_SUCCESS(rv, rv); @@ -253,29 +372,48 @@ nsresult PeerConnectionMedia::Init(const std::vector& stun_serv InitLocalAddrs(); NrIceCtx::InitializeGlobals(mParent->GetAllowIceLoopback(), - ice_tcp, - mParent->GetAllowIceLinkLocal()); + ice_tcp, + mParent->GetAllowIceLinkLocal()); // TODO(ekr@rtfm.com): need some way to set not offerer later // Looks like a bug in the NrIceCtx API. - mIceCtx = NrIceCtx::Create("PC:" + mParentName, policy); + mIceCtx = NrIceCtx::Create("PC:" + mParentName, + toNrIcePolicy(aConfiguration.mIceTransportPolicy)); if(!mIceCtx) { CSFLogError(LOGTAG, "%s: Failed to create Ice Context", __FUNCTION__); return NS_ERROR_FAILURE; } - if (NS_FAILED(rv = mIceCtx->SetStunServers(stun_servers))) { + std::vector stunServers; + std::vector turnServers; + + if (aConfiguration.mIceServers.WasPassed()) { + for (const auto& iceServer : aConfiguration.mIceServers.Value()) { + NS_ENSURE_STATE(iceServer.mUrls.WasPassed()); + NS_ENSURE_STATE(iceServer.mUrls.Value().IsStringSequence()); + for (const auto& iceUrl : iceServer.mUrls.Value().GetAsStringSequence()) { + rv = addNrIceServer(iceUrl, iceServer, &stunServers, &turnServers); + if (NS_FAILED(rv)) { + CSFLogError(LOGTAG, "%s: invalid STUN/TURN server: %s", + __FUNCTION__, NS_ConvertUTF16toUTF8(iceUrl).get()); + return rv; + } + } + } + } + + if (NS_FAILED(rv = mIceCtx->SetStunServers(stunServers))) { CSFLogError(LOGTAG, "%s: Failed to set stun servers", __FUNCTION__); return rv; } // Give us a way to globally turn off TURN support bool disabled = Preferences::GetBool("media.peerconnection.turn.disable", false); if (!disabled) { - if (NS_FAILED(rv = mIceCtx->SetTurnServers(turn_servers))) { + if (NS_FAILED(rv = mIceCtx->SetTurnServers(turnServers))) { CSFLogError(LOGTAG, "%s: Failed to set turn servers", __FUNCTION__); return rv; } - } else if (!turn_servers.empty()) { + } else if (!turnServers.empty()) { CSFLogError(LOGTAG, "%s: Setting turn servers disabled", __FUNCTION__); } if (NS_FAILED(rv = mDNSResolver->Init())) { @@ -283,12 +421,11 @@ nsresult PeerConnectionMedia::Init(const std::vector& stun_serv return rv; } if (NS_FAILED(rv = - mIceCtx->SetResolver(mDNSResolver->AllocateResolver()))) { + mIceCtx->SetResolver(mDNSResolver->AllocateResolver()))) { CSFLogError(LOGTAG, "%s: Failed to get dns resolver", __FUNCTION__); return rv; } ConnectSignals(mIceCtx.get()); - return NS_OK; } @@ -517,7 +654,7 @@ PeerConnectionMedia::UpdateTransportFlows(const JsepTransceiver& aTransceiver) // have enqueued this function unless it was still active and // the ICE data is destroyed on the STS. static void -FinalizeTransportFlow_s(RefPtr aPCMedia, +FinalizeTransportFlow_s(const RefPtr& aIceCtx, nsAutoPtr aPacketDumper, const RefPtr& aFlow, const std::string& aId, @@ -529,8 +666,7 @@ FinalizeTransportFlow_s(RefPtr aPCMedia, TransportLayerPacketDumper* srtpDumper(new TransportLayerPacketDumper( std::move(aPacketDumper), dom::mozPacketDumpType::Srtp)); - aIceLayer->SetParameters(aPCMedia->ice_media_stream(aId), - aIsRtcp ? 2 : 1); + aIceLayer->SetParameters(aIceCtx->GetStream(aId), aIsRtcp ? 2 : 1); // TODO(bug 854518): Process errors. (void)aIceLayer->Init(); (void)aDtlsLayer->Init(); @@ -632,9 +768,8 @@ PeerConnectionMedia::UpdateTransportFlow(bool aIsRtcp, nsAutoPtr packetDumper(new PacketDumper(mParent)); - RefPtr pcMedia(this); rv = GetSTSThread()->Dispatch( - WrapRunnableNM(FinalizeTransportFlow_s, pcMedia, packetDumper, flow, + WrapRunnableNM(FinalizeTransportFlow_s, mIceCtx, packetDumper, flow, aTransport.mTransportId, aIsRtcp, ice.release(), dtls.release(), srtp.release()), NS_DISPATCH_NORMAL); @@ -967,6 +1102,143 @@ PeerConnectionMedia::ShutdownMediaTransport_s() NS_DISPATCH_NORMAL); } + +void +PeerConnectionMedia::GetIceStats_s( + const std::string& aTransportId, + bool internalStats, + DOMHighResTimeStamp now, + RTCStatsReportInternal* report) const +{ + if (mIceCtx) { + auto stream = mIceCtx->GetStream(aTransportId); + if (stream) { + GetIceStats_s(*stream, internalStats, now, report); + } + } +} + +void +PeerConnectionMedia::GetAllIceStats_s( + bool internalStats, + DOMHighResTimeStamp now, + RTCStatsReportInternal* report) const +{ + if (mIceCtx) { + for (const auto& stream : mIceCtx->GetStreams()) { + GetIceStats_s(*stream, internalStats, now, report); + } + } +} + +static void ToRTCIceCandidateStats( + const std::vector& candidates, + RTCStatsType candidateType, + const nsString& componentId, + DOMHighResTimeStamp now, + RTCStatsReportInternal* report) { + + MOZ_ASSERT(report); + for (const auto& candidate : candidates) { + RTCIceCandidateStats cand; + cand.mType.Construct(candidateType); + NS_ConvertASCIItoUTF16 codeword(candidate.codeword.c_str()); + cand.mComponentId.Construct(componentId); + cand.mId.Construct(codeword); + cand.mTimestamp.Construct(now); + cand.mCandidateType.Construct( + RTCStatsIceCandidateType(candidate.type)); + cand.mIpAddress.Construct( + NS_ConvertASCIItoUTF16(candidate.cand_addr.host.c_str())); + cand.mPortNumber.Construct(candidate.cand_addr.port); + cand.mTransport.Construct( + NS_ConvertASCIItoUTF16(candidate.cand_addr.transport.c_str())); + if (candidateType == RTCStatsType::Local_candidate) { + cand.mMozLocalTransport.Construct( + NS_ConvertASCIItoUTF16(candidate.local_addr.transport.c_str())); + } + report->mIceCandidateStats.Value().AppendElement(cand, fallible); + if (candidate.trickled) { + report->mTrickledIceCandidateStats.Value().AppendElement(cand, fallible); + } + } +} + +void +PeerConnectionMedia::GetIceStats_s( + const NrIceMediaStream& aStream, + bool internalStats, + DOMHighResTimeStamp now, + RTCStatsReportInternal* report) const +{ + NS_ConvertASCIItoUTF16 transportId(aStream.GetId().c_str()); + + std::vector candPairs; + nsresult res = aStream.GetCandidatePairs(&candPairs); + if (NS_FAILED(res)) { + CSFLogError(LOGTAG, + "%s: Error getting candidate pairs for transport id \"%s\"", + __FUNCTION__, aStream.GetId().c_str()); + return; + } + + for (auto& candPair : candPairs) { + NS_ConvertASCIItoUTF16 codeword(candPair.codeword.c_str()); + NS_ConvertASCIItoUTF16 localCodeword(candPair.local.codeword.c_str()); + NS_ConvertASCIItoUTF16 remoteCodeword(candPair.remote.codeword.c_str()); + // Only expose candidate-pair statistics to chrome, until we've thought + // through the implications of exposing it to content. + + RTCIceCandidatePairStats s; + s.mId.Construct(codeword); + s.mTransportId.Construct(transportId); + s.mTimestamp.Construct(now); + s.mType.Construct(RTCStatsType::Candidate_pair); + s.mLocalCandidateId.Construct(localCodeword); + s.mRemoteCandidateId.Construct(remoteCodeword); + s.mNominated.Construct(candPair.nominated); + s.mWritable.Construct(candPair.writable); + s.mReadable.Construct(candPair.readable); + s.mPriority.Construct(candPair.priority); + s.mSelected.Construct(candPair.selected); + s.mBytesSent.Construct(candPair.bytes_sent); + s.mBytesReceived.Construct(candPair.bytes_recvd); + s.mLastPacketSentTimestamp.Construct(candPair.ms_since_last_send); + s.mLastPacketReceivedTimestamp.Construct(candPair.ms_since_last_recv); + s.mState.Construct(RTCStatsIceCandidatePairState(candPair.state)); + s.mComponentId.Construct(candPair.component_id); + report->mIceCandidatePairStats.Value().AppendElement(s, fallible); + } + + std::vector candidates; + if (NS_SUCCEEDED(aStream.GetLocalCandidates(&candidates))) { + ToRTCIceCandidateStats(candidates, + RTCStatsType::Local_candidate, + transportId, + now, + report); + // add the local candidates unparsed string to a sequence + for (const auto& candidate : candidates) { + report->mRawLocalCandidates.Value().AppendElement( + NS_ConvertASCIItoUTF16(candidate.label.c_str()), fallible); + } + } + candidates.clear(); + + if (NS_SUCCEEDED(aStream.GetRemoteCandidates(&candidates))) { + ToRTCIceCandidateStats(candidates, + RTCStatsType::Remote_candidate, + transportId, + now, + report); + // add the remote candidates unparsed string to a sequence + for (const auto& candidate : candidates) { + report->mRawRemoteCandidates.Value().AppendElement( + NS_ConvertASCIItoUTF16(candidate.label.c_str()), fallible); + } + } +} + nsresult PeerConnectionMedia::AddTransceiver( JsepTransceiver* aJsepTransceiver, @@ -1197,12 +1469,46 @@ PeerConnectionMedia::GetDefaultCandidates(const NrIceMediaStream& aStream, } } +static mozilla::dom::PCImplIceConnectionState +toDomIceConnectionState(NrIceCtx::ConnectionState state) { + switch (state) { + case NrIceCtx::ICE_CTX_INIT: + return PCImplIceConnectionState::New; + case NrIceCtx::ICE_CTX_CHECKING: + return PCImplIceConnectionState::Checking; + case NrIceCtx::ICE_CTX_CONNECTED: + return PCImplIceConnectionState::Connected; + case NrIceCtx::ICE_CTX_COMPLETED: + return PCImplIceConnectionState::Completed; + case NrIceCtx::ICE_CTX_FAILED: + return PCImplIceConnectionState::Failed; + case NrIceCtx::ICE_CTX_DISCONNECTED: + return PCImplIceConnectionState::Disconnected; + case NrIceCtx::ICE_CTX_CLOSED: + return PCImplIceConnectionState::Closed; + } + MOZ_CRASH(); +} + +static mozilla::dom::PCImplIceGatheringState +toDomIceGatheringState(NrIceCtx::GatheringState state) { + switch (state) { + case NrIceCtx::ICE_CTX_GATHER_INIT: + return PCImplIceGatheringState::New; + case NrIceCtx::ICE_CTX_GATHER_STARTED: + return PCImplIceGatheringState::Gathering; + case NrIceCtx::ICE_CTX_GATHER_COMPLETE: + return PCImplIceGatheringState::Complete; + } + MOZ_CRASH(); +} + void PeerConnectionMedia::IceGatheringStateChange_m(NrIceCtx* ctx, NrIceCtx::GatheringState state) { ASSERT_ON_THREAD(mMainThread); - SignalIceGatheringStateChange(ctx, state); + SignalIceGatheringStateChange(toDomIceGatheringState(state)); } void @@ -1210,7 +1516,7 @@ PeerConnectionMedia::IceConnectionStateChange_m(NrIceCtx* ctx, NrIceCtx::ConnectionState state) { ASSERT_ON_THREAD(mMainThread); - SignalIceConnectionStateChange(ctx, state); + SignalIceConnectionStateChange(toDomIceConnectionState(state)); } void diff --git a/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.h b/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.h index 25d7648d7a98..0071562f264c 100644 --- a/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.h +++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.h @@ -50,18 +50,17 @@ class PeerConnectionMedia : public sigslot::has_slots<> { explicit PeerConnectionMedia(PeerConnectionImpl *parent); PeerConnectionImpl* GetPC() { return mParent; } - nsresult Init(const std::vector& stun_servers, - const std::vector& turn_servers, - NrIceCtx::Policy policy); + nsresult Init(const dom::RTCConfiguration& aConfiguration); // WARNING: This destroys the object! void SelfDestruct(); - RefPtr ice_ctx() const { return mIceCtx; } - - RefPtr ice_media_stream( - const std::string& aTransportId) const { - return mIceCtx->GetStream(aTransportId); - } + void GetIceStats_s(const std::string& aTransportId, + bool internalStats, + DOMHighResTimeStamp now, + RTCStatsReportInternal* report) const; + void GetAllIceStats_s(bool internalStats, + DOMHighResTimeStamp now, + RTCStatsReportInternal* report) const; // Ensure ICE transports exist that we might need when offer/answer concludes void EnsureTransports(const JsepSession& aSession); @@ -161,9 +160,9 @@ class PeerConnectionMedia : public sigslot::has_slots<> { bool aPrivacyRequested); // ICE state signals - sigslot::signal2 + sigslot::signal1 SignalIceGatheringStateChange; - sigslot::signal2 + sigslot::signal1 SignalIceConnectionStateChange; // This passes a candidate:... attribute and transport id sigslot::signal2 SignalCandidate; @@ -291,6 +290,11 @@ class PeerConnectionMedia : public sigslot::has_slots<> { return mProxyResolveCompleted && mLocalAddrsCompleted; } + void GetIceStats_s(const NrIceMediaStream& aStream, + bool internalStats, + DOMHighResTimeStamp now, + RTCStatsReportInternal* report) const; + // The parent PC PeerConnectionImpl *mParent; // and a loose handle on it for event driven stuff From 74e03a4f3dfc6f9ff8d89a8bc8c659b91927dee1 Mon Sep 17 00:00:00 2001 From: Timothy Guan-tin Chien Date: Fri, 28 Sep 2018 00:23:15 +0000 Subject: [PATCH 6/6] Bug 1493741 - Don't generate elements around UA Widget shadow root r=emilio This patch make nsCSSFrameConstructor::CreateGeneratedContentItem() early returns if the originating element contains an UA Widget shadow root. Differential Revision: https://phabricator.services.mozilla.com/D6828 --HG-- extra : moz-landing-system : lando --- layout/base/nsCSSFrameConstructor.cpp | 6 ++++++ layout/generic/crashtests/1493741.html | 6 ++++++ layout/generic/crashtests/crashtests.list | 1 + 3 files changed, 13 insertions(+) create mode 100644 layout/generic/crashtests/1493741.html diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index 43a12e2999a9..9fa8cf4b0ccd 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -1795,6 +1795,12 @@ nsCSSFrameConstructor::CreateGeneratedContentItem(nsFrameConstructorState& aStat aPseudoElement == CSSPseudoElementType::after, "unexpected aPseudoElement"); + if (aParentFrame && aParentFrame->IsHTMLVideoFrame()) { + // Video frames may not be leafs when backed by an UA widget, but we still don't want to expose generated content. + MOZ_ASSERT(aOriginatingElement.GetShadowRoot()->IsUAWidget()); + return; + } + ServoStyleSet* styleSet = mPresShell->StyleSet(); // Probe for the existence of the pseudo-element diff --git a/layout/generic/crashtests/1493741.html b/layout/generic/crashtests/1493741.html new file mode 100644 index 000000000000..59ba5df1c427 --- /dev/null +++ b/layout/generic/crashtests/1493741.html @@ -0,0 +1,6 @@ + + diff --git a/layout/generic/crashtests/crashtests.list b/layout/generic/crashtests/crashtests.list index 085630ed4835..fb348f97bbb4 100644 --- a/layout/generic/crashtests/crashtests.list +++ b/layout/generic/crashtests/crashtests.list @@ -713,4 +713,5 @@ load 1490032.html load 1490685.html load 1493708.html load 1493710.html +load 1493741.html load 1494380.html