merge mozilla-central to autoland. r=merge a=merge

This commit is contained in:
Sebastian Hengst 2017-10-21 00:16:08 +02:00
Родитель 75da806f11 8d0319bfa2
Коммит aa75559a2f
49 изменённых файлов: 374 добавлений и 176 удалений

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

@ -109,6 +109,4 @@ jobs:
by-project:
# No default branch
mozilla-central:
# Buildbot start time is 10:02am UTC, until we are able to
# disable buildbot scheduling, use +12h
- {hour: 22, minute: 0}
- {hour: 10, minute: 0}

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

@ -4,6 +4,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/a11y/AccessibleHandler.h"
#include "mozilla/a11y/Compatibility.h"
#include "mozilla/a11y/PlatformChild.h"
#include "mozilla/mscom/EnsureMTA.h"
@ -12,6 +13,7 @@
#include "Accessible2.h"
#include "Accessible2_2.h"
#include "AccessibleHypertext2.h"
#include "AccessibleTable2.h"
#include "AccessibleTableCell.h"
#include "AccessibleHypertext2_i.c"
@ -28,15 +30,18 @@ namespace a11y {
static const mozilla::mscom::ArrayData sPlatformChildArrayData[] = {
{IID_IEnumVARIANT, 3, 1, VT_DISPATCH, IID_IDispatch, 2},
{IID_IAccessible2, 30, 1, VT_UNKNOWN | VT_BYREF, IID_IAccessibleRelation, 2},
{IID_IAccessibleRelation, 7, 1, VT_UNKNOWN | VT_BYREF, IID_IUnknown, 2},
{IID_IAccessible2_2, 48, 2, VT_UNKNOWN | VT_BYREF, IID_IUnknown, 3,
{IID_IAccessibleRelation, 7, 1, VT_UNKNOWN | VT_BYREF, NEWEST_IA2_IID, 2},
{IID_IAccessible2_2, 48, 2, VT_UNKNOWN | VT_BYREF, NEWEST_IA2_IID, 3,
mozilla::mscom::ArrayData::Flag::eAllocatedByServer},
{IID_IAccessibleTableCell, 4, 0, VT_UNKNOWN | VT_BYREF, IID_IUnknown, 1,
{IID_IAccessibleTableCell, 4, 0, VT_UNKNOWN | VT_BYREF, NEWEST_IA2_IID, 1,
mozilla::mscom::ArrayData::Flag::eAllocatedByServer},
{IID_IAccessibleTableCell, 7, 0, VT_UNKNOWN | VT_BYREF, IID_IUnknown, 1,
{IID_IAccessibleTableCell, 7, 0, VT_UNKNOWN | VT_BYREF, NEWEST_IA2_IID, 1,
mozilla::mscom::ArrayData::Flag::eAllocatedByServer},
{IID_IAccessibleHypertext2, 25, 0, VT_UNKNOWN | VT_BYREF, IID_IUnknown, 1,
mozilla::mscom::ArrayData::Flag::eAllocatedByServer}
{IID_IAccessibleHypertext2, 25, 0, VT_UNKNOWN | VT_BYREF,
IID_IAccessibleHyperlink, 1,
mozilla::mscom::ArrayData::Flag::eAllocatedByServer},
{IID_IAccessibleTable2, 12, 0, VT_UNKNOWN | VT_BYREF,
NEWEST_IA2_IID, 1, mozilla::mscom::ArrayData::Flag::eAllocatedByServer}
};
// Type libraries are thread-neutral, so we can register those from any

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

@ -1625,6 +1625,15 @@
const textToSubURI = Components.classes["@mozilla.org/intl/texttosuburi;1"]
.getService(Components.interfaces.nsITextToSubURI);
title = textToSubURI.unEscapeNonAsciiURI(characterSet, title);
// If it's a long data: URI that uses base64 encoding, truncate to
// a reasonable length rather than trying to display the entire thing.
// We can't shorten arbitrary URIs like this, as bidi etc might mean
// we need the trailing characters for display. But a base64-encoded
// data-URI is plain ASCII, so this is OK for tab-title display.
// (See bug 1408854.)
if (title.length > 500 && title.match(/^data:[^,]+;base64,/)) {
title = title.substring(0, 500) + "\u2026";
}
} catch (ex) { /* Do nothing. */ }
} else {
// Still no title? Fall back to our untitled string.

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

@ -628,6 +628,15 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
}
}
if (aNodesWithProperties && aNode->HasProperties()) {
bool ok = aNodesWithProperties->AppendObject(aNode);
MOZ_RELEASE_ASSERT(ok, "Out of memory");
if (aClone) {
ok = aNodesWithProperties->AppendObject(clone);
MOZ_RELEASE_ASSERT(ok, "Out of memory");
}
}
if (aDeep && (!aClone || !aNode->IsNodeOfType(nsINode::eATTRIBUTE))) {
// aNode's children.
for (nsIContent* cloneChild = aNode->GetFirstChild();
@ -687,18 +696,6 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
}
#endif
if (aNodesWithProperties && aNode->HasProperties()) {
bool ok = aNodesWithProperties->AppendObject(aNode);
if (aClone) {
ok = ok && aNodesWithProperties->AppendObject(clone);
}
if (NS_WARN_IF(!ok)) {
aError.Throw(NS_ERROR_OUT_OF_MEMORY);
return nullptr;
}
}
return clone.forget();
}

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

@ -7835,7 +7835,7 @@ fail-if = (os == 'android' && android_version == '10')
[generated/test_conformance__glsl__misc__shader-precision-format-obeyed.html]
[generated/test_conformance__glsl__misc__shader-struct-scope.html]
[generated/test_conformance__glsl__misc__shader-uniform-packing-restrictions.html]
skip-if = (os == 'android') || (os == 'win' && os_version == '6.1' && debug)
skip-if = (os == 'android') || (os == 'win' && os_version == '6.1' && debug) || (os == 'linux' && debug)
[generated/test_conformance__glsl__misc__shader-varying-packing-restrictions.html]
[generated/test_conformance__glsl__misc__shader-with-256-character-define.html]
[generated/test_conformance__glsl__misc__shader-with-256-character-identifier.frag.html]

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

@ -533,8 +533,8 @@ skip-if = (os == 'android')
[generated/test_conformance__context__context-release-with-workers.html]
skip-if = (os == 'android')
[generated/test_conformance__glsl__misc__shader-uniform-packing-restrictions.html]
# Frequent timeout on win7 debug.
skip-if = (os == 'android') || (os == 'win' && os_version == '6.1' && debug)
# Frequent timeout on win7 and linux debug.
skip-if = (os == 'android') || (os == 'win' && os_version == '6.1' && debug) || (os == 'linux' && debug)
[generated/test_conformance__glsl__bugs__complex-glsl-does-not-crash.html]
skip-if = (os == 'android')

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

@ -237,7 +237,7 @@ public:
bool Activated() const
{
return mActivated;
return mStream;
}
bool Stopped() const
@ -266,10 +266,6 @@ public:
PrincipalHandle GetPrincipalHandle() const;
private:
// true after this listener has been Activate()d in a WindowListener.
// MainThread only.
bool mActivated;
// true after this listener has had all devices stopped. MainThread only.
bool mStopped;
@ -3545,8 +3541,7 @@ MediaManager::IsActivelyCapturingOrHasAPermission(uint64_t aWindowId)
}
SourceListener::SourceListener()
: mActivated(false)
, mStopped(false)
: mStopped(false)
, mFinished(false)
, mRemoved(false)
, mAudioStopped(false)
@ -3565,7 +3560,7 @@ SourceListener::Register(GetUserMediaWindowListener* aListener)
MOZ_ASSERT(false, "Already registered");
return;
}
if (mActivated) {
if (Activated()) {
MOZ_ASSERT(false, "Already activated");
return;
}
@ -3586,12 +3581,16 @@ SourceListener::Activate(SourceMediaStream* aStream,
LOG(("SourceListener %p activating audio=%p video=%p", this, aAudioDevice, aVideoDevice));
if (mActivated) {
if (mStopped) {
MOZ_ASSERT(false, "Cannot activate stopped source listener");
return;
}
if (Activated()) {
MOZ_ASSERT(false, "Already activated");
return;
}
mActivated = true;
mMainThreadCheck = GetCurrentVirtualThread();
mStream = aStream;
mAudioDevice = aAudioDevice;
@ -3616,13 +3615,24 @@ SourceListener::Stop()
mStopped = true;
if (!Activated()) {
MOZ_ASSERT(false, "There are no devices or any source stream to stop");
return;
}
if (mAudioDevice && !mAudioStopped) {
StopTrack(kAudioTrack);
}
if (mVideoDevice && !mVideoStopped) {
StopTrack(kVideoTrack);
}
RefPtr<SourceMediaStream> source = GetSourceStream();
RefPtr<SourceMediaStream> source = mStream;
if (!source) {
MOZ_ASSERT(false, "Can't end tracks. No source stream.");
return;
}
MediaManager::PostTask(NewTaskFrom([source]() {
MOZ_ASSERT(MediaManager::IsInMediaThread());
source->EndAllTrackAndFinish();
@ -3653,7 +3663,11 @@ SourceListener::StopTrack(TrackID aTrackID)
MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread");
RefPtr<MediaDevice> device;
RefPtr<SourceMediaStream> source;
if (!Activated()) {
MOZ_ASSERT(false, "No device to stop");
return;
}
switch (aTrackID) {
case kAudioTrack: {
@ -3667,7 +3681,6 @@ SourceListener::StopTrack(TrackID aTrackID)
return;
}
device = mAudioDevice;
source = GetSourceStream();
mAudioStopped = true;
break;
}
@ -3682,7 +3695,6 @@ SourceListener::StopTrack(TrackID aTrackID)
return;
}
device = mVideoDevice;
source = GetSourceStream();
mVideoStopped = true;
break;
}
@ -3692,6 +3704,7 @@ SourceListener::StopTrack(TrackID aTrackID)
}
}
RefPtr<SourceMediaStream> source = mStream;
MediaManager::PostTask(NewTaskFrom([device, source, aTrackID]() {
device->GetSource()->Stop(source, aTrackID);
device->Deallocate();
@ -3748,10 +3761,7 @@ SourceMediaStream*
SourceListener::GetSourceStream()
{
NS_ASSERTION(mStream,"Getting stream from never-activated SourceListener");
if (!mStream) {
return nullptr;
}
return mStream->AsSourceStream();
return mStream;
}
void
@ -3856,7 +3866,7 @@ SourceListener::NotifyRemoved()
LOG(("SourceListener removed, mFinished = %d", (int) mFinished));
mRemoved = true;
if (!mFinished) {
if (Activated() && !mFinished) {
NotifyFinished();
}
@ -3867,7 +3877,7 @@ bool
SourceListener::CapturingVideo() const
{
MOZ_ASSERT(NS_IsMainThread());
return mActivated && mVideoDevice && !mVideoStopped &&
return Activated() && mVideoDevice && !mVideoStopped &&
!mVideoDevice->GetSource()->IsAvailable() &&
mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Camera &&
(!mVideoDevice->GetSource()->IsFake() ||
@ -3878,7 +3888,7 @@ bool
SourceListener::CapturingAudio() const
{
MOZ_ASSERT(NS_IsMainThread());
return mActivated && mAudioDevice && !mAudioStopped &&
return Activated() && mAudioDevice && !mAudioStopped &&
!mAudioDevice->GetSource()->IsAvailable() &&
(!mAudioDevice->GetSource()->IsFake() ||
Preferences::GetBool("media.navigator.permission.fake"));
@ -3888,7 +3898,7 @@ bool
SourceListener::CapturingScreen() const
{
MOZ_ASSERT(NS_IsMainThread());
return mActivated && mVideoDevice && !mVideoStopped &&
return Activated() && mVideoDevice && !mVideoStopped &&
!mVideoDevice->GetSource()->IsAvailable() &&
mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Screen;
}
@ -3897,7 +3907,7 @@ bool
SourceListener::CapturingWindow() const
{
MOZ_ASSERT(NS_IsMainThread());
return mActivated && mVideoDevice && !mVideoStopped &&
return Activated() && mVideoDevice && !mVideoStopped &&
!mVideoDevice->GetSource()->IsAvailable() &&
mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Window;
}
@ -3906,7 +3916,7 @@ bool
SourceListener::CapturingApplication() const
{
MOZ_ASSERT(NS_IsMainThread());
return mActivated && mVideoDevice && !mVideoStopped &&
return Activated() && mVideoDevice && !mVideoStopped &&
!mVideoDevice->GetSource()->IsAvailable() &&
mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Application;
}
@ -3915,7 +3925,7 @@ bool
SourceListener::CapturingBrowser() const
{
MOZ_ASSERT(NS_IsMainThread());
return mActivated && mVideoDevice && !mVideoStopped &&
return Activated() && mVideoDevice && !mVideoStopped &&
!mVideoDevice->GetSource()->IsAvailable() &&
mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Browser;
}

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

@ -0,0 +1,71 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
// test nonsecure third party persistence across sessions, for the cases:
// 1) network.cookie.thirdparty.nonsecureSessionOnly = false
// 2) network.cookie.thirdparty.nonsecureSessionOnly = true
"use strict";
var test_generator = do_run_test();
function run_test() {
do_test_pending();
test_generator.next();
}
function finish_test() {
do_execute_soon(function() {
test_generator.return();
do_test_finished();
});
}
function* do_run_test() {
// Set up a profile.
let profile = do_get_profile();
// Create URIs and channels pointing to foo.com and bar.com.
// We will use these to put foo.com into first and third party contexts.
var spec1 = "http://foo.com/foo.html";
var spec2 = "https://bar.com/bar.html";
var uri1 = NetUtil.newURI(spec1);
var uri2 = NetUtil.newURI(spec2);
var channel1 = NetUtil.newChannel({uri: uri1, loadUsingSystemPrincipal: true});
var channel2 = NetUtil.newChannel({uri: uri2, loadUsingSystemPrincipal: true});
// Force the channel URI to be used when determining the originating URI of
// the channel.
var httpchannel1 = channel1.QueryInterface(Ci.nsIHttpChannelInternal);
var httpchannel2 = channel2.QueryInterface(Ci.nsIHttpChannelInternal);
httpchannel1.forceAllowThirdPartyCookie = true;
httpchannel2.forceAllowThirdPartyCookie = true;
// test with cookies enabled and nonsecure third party cookies persistent.
Services.prefs.setIntPref("network.cookie.cookieBehavior", 0);
Services.prefs.setBoolPref("network.cookie.thirdparty.nonsecureSessionOnly", false);
do_set_cookies(uri1, channel2, false, [1, 2, 3, 4]); // third-party HTTP
do_set_cookies(uri2, channel1, false, [1, 2, 3, 4]); // third-party HTTPS
// fake a profile change
do_close_profile(test_generator);
yield;
do_load_profile();
do_check_eq(Services.cookies.countCookiesFromHost(uri1.host), 4); // HTTP cookies OK
do_check_eq(Services.cookies.countCookiesFromHost(uri2.host), 4); // HTTPS cookies OK
// test with nonsecure third party cookies for session only.
Services.prefs.setBoolPref("network.cookie.thirdparty.nonsecureSessionOnly", true);
Services.cookies.removeAll();
do_set_cookies(uri1, channel2, false, [1, 2, 3, 4]); // third-party HTTP
do_set_cookies(uri2, channel1, false, [1, 2, 3, 4]); // third-party HTTPS
// fake a profile change
do_close_profile(test_generator);
yield;
do_load_profile();
do_check_eq(Services.cookies.countCookiesFromHost(uri1.host), 0); // no HTTP cookies!
do_check_eq(Services.cookies.countCookiesFromHost(uri2.host), 4); // HTTPS cookies OK
finish_test();
}

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

@ -13,6 +13,7 @@ skip-if = true # Bug 863738
[test_cookies_read.js]
[test_cookies_sync_failure.js]
[test_cookies_thirdparty.js]
[test_cookies_thirdparty_nonsecure_session.js]
[test_cookies_thirdparty_session.js]
[test_domain_eviction.js]
[test_eviction.js]

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

@ -54,11 +54,6 @@ parent:
WebRenderScrollData aScrollData,
OpUpdateResource[] aResourceUpdates, Shmem[] aSmallShmems, Shmem[] aLargeShmems,
IdNamespace aIdNamespace, TimeStamp txnStartTime, TimeStamp fwdTime);
sync SetDisplayListSync(IntSize aSize, WebRenderParentCommand[] commands, OpDestroy[] toDestroy, uint64_t fwdTransactionId, uint64_t transactionId,
LayoutSize aContentSize, ByteBuffer aDL, BuiltDisplayListDescriptor aDLDesc,
WebRenderScrollData aScrollData,
OpUpdateResource[] aResourceUpdates, Shmem[] aSmallShmems, Shmem[] aLargeShmems,
IdNamespace aIdNamespace, TimeStamp txnStartTime, TimeStamp fwdTime);
async EmptyTransaction(FocusTarget focusTarget,
WebRenderParentCommand[] commands, OpDestroy[] toDestroy, uint64_t fwdTransactionId, uint64_t transactionId,
IdNamespace aIdNamespace, TimeStamp txnStartTime, TimeStamp fwdTime);

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

@ -272,7 +272,10 @@ AsyncImagePipelineManager::ApplyAsyncImages()
// We don't need to update the display list, either because we can't or because
// the previous one is still up to date.
// We may, however, have updated some resources.
mApi->UpdateResources(resourceUpdates);
mApi->UpdatePipelineResources(resourceUpdates, pipelineId, epoch);
if (pipeline->mCurrentTexture) {
HoldExternalImage(pipelineId, epoch, pipeline->mCurrentTexture->AsWebRenderTextureHost());
}
continue;
}

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

@ -122,7 +122,6 @@ WebRenderBridgeChild::EndTransaction(const wr::LayoutSize& aContentSize,
wr::BuiltDisplayList& aDL,
wr::IpcResourceUpdateQueue& aResources,
const gfx::IntSize& aSize,
bool aIsSync,
uint64_t aTransactionId,
const WebRenderScrollData& aScrollData,
const mozilla::TimeStamp& aTxnStartTime)
@ -142,19 +141,11 @@ WebRenderBridgeChild::EndTransaction(const wr::LayoutSize& aContentSize,
nsTArray<ipc::Shmem> largeShmems;
aResources.Flush(resourceUpdates, smallShmems, largeShmems);
if (aIsSync) {
this->SendSetDisplayListSync(aSize, mParentCommands, mDestroyedActors,
GetFwdTransactionId(), aTransactionId,
aContentSize, dlData, aDL.dl_desc, aScrollData,
Move(resourceUpdates), Move(smallShmems), Move(largeShmems),
mIdNamespace, aTxnStartTime, fwdTime);
} else {
this->SendSetDisplayList(aSize, mParentCommands, mDestroyedActors,
GetFwdTransactionId(), aTransactionId,
aContentSize, dlData, aDL.dl_desc, aScrollData,
Move(resourceUpdates), Move(smallShmems), Move(largeShmems),
mIdNamespace, aTxnStartTime, fwdTime);
}
this->SendSetDisplayList(aSize, mParentCommands, mDestroyedActors,
GetFwdTransactionId(), aTransactionId,
aContentSize, dlData, aDL.dl_desc, aScrollData,
Move(resourceUpdates), Move(smallShmems), Move(largeShmems),
mIdNamespace, aTxnStartTime, fwdTime);
mParentCommands.Clear();
mDestroyedActors.Clear();

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

@ -73,7 +73,7 @@ public:
wr::BuiltDisplayList& dl,
wr::IpcResourceUpdateQueue& aResources,
const gfx::IntSize& aSize,
bool aIsSync, uint64_t aTransactionId,
uint64_t aTransactionId,
const WebRenderScrollData& aScrollData,
const mozilla::TimeStamp& aTxnStartTime);
void EndEmptyTransaction(const FocusTarget& aFocusTarget,

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

@ -590,30 +590,6 @@ WebRenderBridgeParent::RecvSetDisplayList(const gfx::IntSize& aSize,
return IPC_OK();
}
mozilla::ipc::IPCResult
WebRenderBridgeParent::RecvSetDisplayListSync(const gfx::IntSize &aSize,
InfallibleTArray<WebRenderParentCommand>&& aCommands,
InfallibleTArray<OpDestroy>&& aToDestroy,
const uint64_t& aFwdTransactionId,
const uint64_t& aTransactionId,
const wr::LayoutSize& aContentSize,
const wr::ByteBuffer& dl,
const wr::BuiltDisplayListDescriptor& dlDesc,
const WebRenderScrollData& aScrollData,
nsTArray<OpUpdateResource>&& aResourceUpdates,
nsTArray<ipc::Shmem>&& aSmallShmems,
nsTArray<ipc::Shmem>&& aLargeShmems,
const wr::IdNamespace& aIdNamespace,
const TimeStamp& aTxnStartTime,
const TimeStamp& aFwdTime)
{
return RecvSetDisplayList(aSize, Move(aCommands), Move(aToDestroy),
aFwdTransactionId, aTransactionId,
aContentSize, dl, dlDesc, aScrollData,
Move(aResourceUpdates), Move(aSmallShmems), Move(aLargeShmems),
aIdNamespace, aTxnStartTime, aFwdTime);
}
mozilla::ipc::IPCResult
WebRenderBridgeParent::RecvEmptyTransaction(const FocusTarget& aFocusTarget,
InfallibleTArray<WebRenderParentCommand>&& aCommands,

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

@ -91,21 +91,6 @@ public:
const wr::IdNamespace& aIdNamespace,
const TimeStamp& aTxnStartTime,
const TimeStamp& aFwdTime) override;
mozilla::ipc::IPCResult RecvSetDisplayListSync(const gfx::IntSize& aSize,
InfallibleTArray<WebRenderParentCommand>&& aCommands,
InfallibleTArray<OpDestroy>&& aToDestroy,
const uint64_t& aFwdTransactionId,
const uint64_t& aTransactionId,
const wr::LayoutSize& aContentSize,
const wr::ByteBuffer& dl,
const wr::BuiltDisplayListDescriptor& dlDesc,
const WebRenderScrollData& aScrollData,
nsTArray<OpUpdateResource>&& aResourceUpdates,
nsTArray<ipc::Shmem>&& aSmallShmems,
nsTArray<ipc::Shmem>&& aLargeShmems,
const wr::IdNamespace& aIdNamespace,
const TimeStamp& aTxnStartTime,
const TimeStamp& aFwdTime) override;
mozilla::ipc::IPCResult RecvEmptyTransaction(const FocusTarget& aFocusTarget,
InfallibleTArray<WebRenderParentCommand>&& aCommands,
InfallibleTArray<OpDestroy>&& aToDestroy,

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

@ -188,6 +188,7 @@ WebRenderImageHost::SetCurrentTextureHost(TextureHost* aTexture)
}
if (mWrBridge &&
!mAsyncRef &&
!!mCurrentTextureHost &&
mCurrentTextureHost != aTexture &&
mCurrentTextureHost->AsWebRenderTextureHost()) {

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

@ -299,7 +299,6 @@ WebRenderLayerManager::EndTransactionWithoutLayer(nsDisplayList* aDisplayList,
mScrollData.SetPaintSequenceNumber(mPaintSequenceNumber);
}
bool sync = mTarget != nullptr;
mLatestTransactionId = mTransactionIdAllocator->GetTransactionId(/*aThrottle*/ true);
TimeStamp transactionStart = mTransactionIdAllocator->GetTransactionStart();
@ -323,9 +322,8 @@ WebRenderLayerManager::EndTransactionWithoutLayer(nsDisplayList* aDisplayList,
mLastDisplayListSize = dl.dl.inner.capacity;
{
AUTO_PROFILER_TRACING("Paint", sync ? "ForwardDPTransactionSync"
: "ForwardDPTransaction");
WrBridge()->EndTransaction(contentSize, dl, resourceUpdates, size.ToUnknownSize(), sync,
AUTO_PROFILER_TRACING("Paint", "ForwardDPTransaction");
WrBridge()->EndTransaction(contentSize, dl, resourceUpdates, size.ToUnknownSize(),
mLatestTransactionId, mScrollData, transactionStart);
}

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

@ -2975,7 +2975,7 @@ gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
uint32_t aRunStart, // position in the textrun
uint32_t aRunLength,
Script aRunScript,
bool aVertical)
ShapedTextFlags aOrientation)
{
if (aRunLength == 0) {
return true;
@ -3002,6 +3002,9 @@ gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
uint32_t wordCacheCharLimit =
gfxPlatform::GetPlatform()->WordCacheCharLimit();
bool vertical =
aOrientation == ShapedTextFlags::TEXT_ORIENT_VERTICAL_UPRIGHT;
// If spaces can participate in shaping (e.g. within lookups for automatic
// fractions), need to shape without using the word cache which segments
// textruns on space boundaries. Word cache can be used if the textrun
@ -3012,7 +3015,7 @@ gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
TEXT_PERF_INCR(tp, wordCacheSpaceRules);
return ShapeTextWithoutWordCache(aDrawTarget, aString,
aRunStart, aRunLength,
aRunScript, aVertical,
aRunScript, vertical,
rounding, aTextRun);
}
}
@ -3065,7 +3068,7 @@ gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
aRunStart + wordStart,
length,
aRunScript,
aVertical,
vertical,
rounding,
aTextRun);
if (!ok) {
@ -3083,7 +3086,7 @@ gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
}
gfxShapedWord* sw = GetShapedWord(aDrawTarget,
aString + wordStart, length,
hash, aRunScript, aVertical,
hash, aRunScript, vertical,
appUnitsPerDevUnit,
wordFlags, rounding, tp);
if (sw) {
@ -3095,16 +3098,12 @@ gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
if (boundary) {
// word was terminated by a space: add that to the textrun
gfx::ShapedTextFlags orientation =
flags & gfx::ShapedTextFlags::TEXT_ORIENT_MASK;
if (orientation == gfx::ShapedTextFlags::TEXT_ORIENT_VERTICAL_MIXED) {
orientation = aVertical ?
gfx::ShapedTextFlags::TEXT_ORIENT_VERTICAL_UPRIGHT :
gfx::ShapedTextFlags::TEXT_ORIENT_VERTICAL_SIDEWAYS_RIGHT;
}
MOZ_ASSERT(aOrientation !=
ShapedTextFlags::TEXT_ORIENT_VERTICAL_MIXED,
"text-orientation:mixed should be resolved earlier");
if (boundary != ' ' ||
!aTextRun->SetSpaceGlyphIfSimple(this, aRunStart + i, ch,
orientation)) {
aOrientation)) {
// Currently, the only "boundary" characters we recognize are
// space and no-break space, which are both 8-bit, so we force
// that flag (below). If we ever change IsBoundarySpace, we
@ -3115,7 +3114,7 @@ gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
gfxShapedWord *sw =
GetShapedWord(aDrawTarget, &boundary, 1,
gfxShapedWord::HashMix(0, boundary),
aRunScript, aVertical, appUnitsPerDevUnit,
aRunScript, vertical, appUnitsPerDevUnit,
flags | gfx::ShapedTextFlags::TEXT_IS_8BIT,
rounding, tp);
if (sw) {
@ -3149,7 +3148,7 @@ gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
if (GetFontEntry()->IsUserFont() && HasCharacter(ch)) {
ShapeFragmentWithoutWordCache(aDrawTarget, aString + i,
aRunStart + i, 1,
aRunScript, aVertical,
aRunScript, vertical,
rounding, aTextRun);
} else {
aTextRun->SetMissingGlyph(aRunStart + i, ch, this);
@ -3172,7 +3171,7 @@ gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
uint32_t aRunStart,
uint32_t aRunLength,
Script aRunScript,
bool aVertical);
ShapedTextFlags aOrientation);
template bool
gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
gfxTextRun *aTextRun,
@ -3180,7 +3179,7 @@ gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
uint32_t aRunStart,
uint32_t aRunLength,
Script aRunScript,
bool aVertical);
ShapedTextFlags aOrientation);
template<>
bool
@ -3211,8 +3210,6 @@ gfxFont::InitFakeSmallCapsRun(DrawTarget *aDrawTarget,
RunCaseAction runAction = kNoChange;
uint32_t runStart = 0;
bool vertical =
aOrientation == gfx::ShapedTextFlags::TEXT_ORIENT_VERTICAL_UPRIGHT;
for (uint32_t i = 0; i <= aLength; ++i) {
uint32_t extraCodeUnits = 0; // Will be set to 1 if we need to consume
@ -3275,7 +3272,7 @@ gfxFont::InitFakeSmallCapsRun(DrawTarget *aDrawTarget,
if (!f->SplitAndInitTextRun(aDrawTarget, aTextRun,
aText + runStart,
aOffset + runStart, runLength,
aScript, vertical)) {
aScript, aOrientation)) {
ok = false;
}
break;
@ -3319,7 +3316,7 @@ gfxFont::InitFakeSmallCapsRun(DrawTarget *aDrawTarget,
if (!f->SplitAndInitTextRun(aDrawTarget, tempRun.get(),
convertedString.BeginReading(),
0, convertedString.Length(),
aScript, vertical)) {
aScript, aOrientation)) {
ok = false;
} else {
RefPtr<gfxTextRun> mergedRun(
@ -3340,7 +3337,7 @@ gfxFont::InitFakeSmallCapsRun(DrawTarget *aDrawTarget,
if (!f->SplitAndInitTextRun(aDrawTarget, aTextRun,
convertedString.BeginReading(),
aOffset + runStart, runLength,
aScript, vertical)) {
aScript, aOrientation)) {
ok = false;
}
}

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

@ -1826,7 +1826,7 @@ public:
uint32_t aRunStart,
uint32_t aRunLength,
Script aRunScript,
bool aVertical);
mozilla::gfx::ShapedTextFlags aOrientation);
// Get a ShapedWord representing the given text (either 8- or 16-bit)
// for use in setting up a gfxTextRun.

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

@ -2569,10 +2569,23 @@ gfxFontGroup::InitScriptRun(DrawTarget* aDrawTarget,
gfxFont *mainFont = GetFirstValidFont();
ShapedTextFlags orientation =
aTextRun->GetFlags() & ShapedTextFlags::TEXT_ORIENT_MASK;
if (orientation != ShapedTextFlags::TEXT_ORIENT_HORIZONTAL &&
(aRunScript == Script::MONGOLIAN || aRunScript == Script::PHAGS_PA)) {
// Mongolian and Phags-pa text should ignore text-orientation and
// always render in its "native" vertical mode, implemented by fonts
// as sideways-right (i.e as if shaped horizontally, and then the
// entire line is rotated to render vertically). Therefore, we ignore
// the aOrientation value from the textrun's flags, and make all
// vertical Mongolian/Phags-pa use sideways-right.
orientation = ShapedTextFlags::TEXT_ORIENT_VERTICAL_SIDEWAYS_RIGHT;
}
uint32_t runStart = 0;
AutoTArray<gfxTextRange,3> fontRanges;
ComputeRanges(fontRanges, aString, aLength, aRunScript,
aTextRun->GetFlags() & ShapedTextFlags::TEXT_ORIENT_MASK);
ComputeRanges(fontRanges, aString, aLength, aRunScript, orientation);
uint32_t numRanges = fontRanges.Length();
bool missingChars = false;
@ -2580,8 +2593,6 @@ gfxFontGroup::InitScriptRun(DrawTarget* aDrawTarget,
const gfxTextRange& range = fontRanges[r];
uint32_t matchedLength = range.Length();
gfxFont *matchedFont = range.font;
bool vertical =
range.orientation == ShapedTextFlags::TEXT_ORIENT_VERTICAL_UPRIGHT;
// create the glyph run for this range
if (matchedFont && mStyle.noFallbackVariantFeatures) {
// common case - just do glyph layout and record the
@ -2594,7 +2605,7 @@ gfxFontGroup::InitScriptRun(DrawTarget* aDrawTarget,
aOffset + runStart,
matchedLength,
aRunScript,
vertical)) {
range.orientation)) {
// glyph layout failed! treat as missing glyphs
matchedFont = nullptr;
}
@ -2634,7 +2645,7 @@ gfxFontGroup::InitScriptRun(DrawTarget* aDrawTarget,
aOffset + runStart,
matchedLength,
aRunScript,
vertical)) {
range.orientation)) {
// glyph layout failed! treat as missing glyphs
matchedFont = nullptr;
}
@ -2679,7 +2690,7 @@ gfxFontGroup::InitScriptRun(DrawTarget* aDrawTarget,
aOffset + runStart,
matchedLength,
aRunScript,
vertical)) {
range.orientation)) {
// glyph layout failed! treat as missing glyphs
matchedFont = nullptr;
}

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

@ -50,6 +50,7 @@ RenderDXGITextureHostOGL::RenderDXGITextureHostOGL(WindowsHandle aHandle,
MOZ_COUNT_CTOR_INHERITED(RenderDXGITextureHostOGL, RenderTextureHostOGL);
MOZ_ASSERT(mFormat != gfx::SurfaceFormat::NV12 ||
(mSize.width % 2 == 0 && mSize.height % 2 == 0));
MOZ_ASSERT(aHandle);
}
RenderDXGITextureHostOGL::~RenderDXGITextureHostOGL()
@ -82,6 +83,9 @@ RenderDXGITextureHostOGL::EnsureLockable()
// The non-nv12 format.
// Use eglCreatePbufferFromClientBuffer get the gl handle from the d3d
// shared handle.
if (!egl->IsExtensionSupported(gl::GLLibraryEGL::ANGLE_d3d_share_handle_client_buffer)) {
return false;
}
// Get gl texture handle from shared handle.
EGLint pbufferAttributes[] = {
@ -116,9 +120,8 @@ RenderDXGITextureHostOGL::EnsureLockable()
// use EGLStream to get the converted gl handle from d3d nv12 texture.
if (!egl->IsExtensionSupported(gl::GLLibraryEGL::NV_stream_consumer_gltexture_yuv) ||
!egl->IsExtensionSupported(gl::GLLibraryEGL::ANGLE_stream_producer_d3d_texture_nv12))
{
return false;
!egl->IsExtensionSupported(gl::GLLibraryEGL::ANGLE_stream_producer_d3d_texture_nv12)) {
return false;
}
// Fetch the D3D11 device.
@ -277,6 +280,7 @@ RenderDXGIYCbCrTextureHostOGL::RenderDXGIYCbCrTextureHostOGL(WindowsHandle (&aHa
// The size should be even.
MOZ_ASSERT(mSize.width % 2 == 0);
MOZ_ASSERT(mSize.height % 2 == 0);
MOZ_ASSERT(aHandles[0] && aHandles[1] && aHandles[2]);
}
RenderDXGIYCbCrTextureHostOGL::~RenderDXGIYCbCrTextureHostOGL()

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

@ -430,6 +430,12 @@ WebRenderAPI::UpdateResources(ResourceUpdateQueue& aUpdates)
wr_api_update_resources(mDocHandle, aUpdates.Raw());
}
void
WebRenderAPI::UpdatePipelineResources(ResourceUpdateQueue& aUpdates, PipelineId aPipeline, Epoch aEpoch)
{
wr_api_update_pipeline_resources(mDocHandle, aPipeline, aEpoch, aUpdates.Raw());
}
ResourceUpdateQueue::ResourceUpdateQueue()
{
mUpdates = wr_resource_updates_new();

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

@ -158,6 +158,8 @@ public:
void UpdateResources(ResourceUpdateQueue& aUpdates);
void UpdatePipelineResources(ResourceUpdateQueue& aUpdates, PipelineId aPipeline, Epoch aEpoch);
void SetFrameStartTime(const TimeStamp& aTime);
void RunOnRenderThread(UniquePtr<RendererEvent> aEvent);

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

@ -814,6 +814,18 @@ pub extern "C" fn wr_api_update_resources(
dh.api.update_resources(resource_updates);
}
#[no_mangle]
pub extern "C" fn wr_api_update_pipeline_resources(
dh: &mut DocumentHandle,
pipeline_id: WrPipelineId,
epoch: WrEpoch,
resources: &mut ResourceUpdates
) {
let resource_updates = mem::replace(resources, ResourceUpdates::new());
dh.api.update_pipeline_resources(resource_updates, dh.document_id, pipeline_id, epoch);
}
#[no_mangle]
pub extern "C" fn wr_api_set_root_pipeline(dh: &mut DocumentHandle,
pipeline_id: WrPipelineId) {

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

@ -914,6 +914,13 @@ void wr_api_set_window_parameters(DocumentHandle *aDh,
int32_t aHeight)
WR_FUNC;
WR_INLINE
void wr_api_update_pipeline_resources(DocumentHandle *aDh,
WrPipelineId aPipelineId,
WrEpoch aEpoch,
ResourceUpdates *aResources)
WR_FUNC;
WR_INLINE
void wr_api_update_resources(DocumentHandle *aDh,
ResourceUpdates *aResources)

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

@ -1017,8 +1017,6 @@ description =
description =
[PWebRenderBridge::Create]
description =
[PWebRenderBridge::SetDisplayListSync]
description =
[PWebRenderBridge::GetSnapshot]
description =
[PWebRenderBridge::SetTestSampleTime]

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

@ -2119,6 +2119,10 @@ PromiseAllResolveElementFunction(JSContext* cx, unsigned argc, Value* vp)
// See comment for PerformPromiseAll, step 3 for why we unwrap here.
valuesObj = UncheckedUnwrap(valuesObj);
}
if (JS_IsDeadWrapper(valuesObj)) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_DEAD_OBJECT);
return false;
}
RootedNativeObject values(cx, &valuesObj->as<NativeObject>());
// Step 6 (moved under step 10).

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

@ -2771,7 +2771,7 @@ class CloneBufferObject : public NativeObject {
nbytes = JS_GetStringLength(str);
}
if (nbytes % sizeof(uint64_t) != 0) {
if (nbytes == 0 || (nbytes % sizeof(uint64_t) != 0)) {
JS_ReportErrorASCII(cx, "Invalid length for clonebuffer data");
return false;
}

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

@ -0,0 +1,16 @@
// |jit-test| error:dead object
var P = newGlobal().eval(`
(class extends Promise {
static resolve(o) {
return o;
}
});
`);
Promise.all.call(P, [{
then(r) {
nukeAllCCWs();
r();
}
}]);

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

@ -86,7 +86,6 @@ JSObject* JSAPITest::createGlobal(JSPrincipals* principals)
#ifdef ENABLE_STREAMS
options.creationOptions().setStreamsEnabled(true);
#endif
printf("enabled\n");
options.behaviors().setVersion(JSVERSION_DEFAULT);
newGlobal = JS_NewGlobalObject(cx, getGlobalClass(), principals, JS::FireOnNewGlobalHook,
options);

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

@ -178,7 +178,7 @@ HTTP(..) == reflow-sanity-1.html reflow-sanity-1-data.html
HTTP(..) == reflow-sanity-delay-1a.html reflow-sanity-1-ref.html
HTTP(..) == reflow-sanity-delay-1b.html reflow-sanity-1-ref.html
HTTP(..) == reflow-sanity-delay-1c.html reflow-sanity-1-ref.html
skip-if(winWidget&&!isDebugBuild) HTTP(..) == reflow-sanity-delay-1-metrics.html reflow-sanity-1-ref.html
HTTP(..) == reflow-sanity-delay-1-metrics.html reflow-sanity-1-ref.html
# font-display
skip-if(/^Linux\x20i686/.test(http.oscpu)) HTTP(..) == font-display-1.html font-display-1-ref.html # normal font load (~500ms)

Двоичные данные
layout/reftests/fonts/NotoSansMongolian-Regular.ttf Normal file

Двоичный файл не отображается.

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

@ -0,0 +1,16 @@
<!DOCTYPE html>
<meta charset=utf-8>
<style>
@font-face {
font-family: test;
src: url(../fonts/NotoSansMongolian-Regular.ttf);
}
div {
writing-mode: vertical-lr;
text-orientation: mixed;
font-family: test;
font-size: 32px;
}
</style>
<div>
ᠮᠣᠨᠭᠭᠣᠯ ᠬᠡᠯᠡ

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

@ -0,0 +1,16 @@
<!DOCTYPE html>
<meta charset=utf-8>
<style>
@font-face {
font-family: test;
src: url(../fonts/NotoSansMongolian-Regular.ttf);
}
div {
writing-mode: vertical-lr;
text-orientation: upright; /* should have no effect on Mongolian */
font-family: test;
font-size: 32px;
}
</style>
<div>
ᠮᠣᠨᠭᠭᠣᠯ ᠬᠡᠯᠡ

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

@ -178,6 +178,8 @@ fuzzy-if(gtkWidget,1,25) fuzzy-if(cocoaWidget,1,2) == 1302389-scrolled-rect-2b.h
== 1302389-scrolled-rect-2c.html 1302389-scrolled-rect-2-ref.html
fuzzy-if(Android,54,852) == 1302389-scrolled-rect-2d.html 1302389-scrolled-rect-2-ref.html
== 1361631-mongolian-upright-1.html 1361631-mongolian-upright-1-ref.html
# Suite of tests from Gérard Talbot in bug 1079151
# Frequent Windows 7 load failed: timed out waiting for test to complete (waiting for onload scripts to complete), bug 1167155 and friends
skip-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) include abspos/reftest.list

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

@ -2288,6 +2288,7 @@ pref("network.cookie.cookieBehavior", 0); // 0-Accept, 1-dontAcceptForeign
pref("network.cookie.cookieBehavior", 0); // Keep the old default of accepting all cookies
#endif
pref("network.cookie.thirdparty.sessionOnly", false);
pref("network.cookie.thirdparty.nonsecureSessionOnly", false);
pref("network.cookie.leave-secure-alone", true);
pref("network.cookie.ipc.sync", false);
pref("network.cookie.lifetimePolicy", 0); // 0-accept, 1-dontUse 2-acceptForSession, 3-acceptForNDays

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

@ -34,6 +34,8 @@ namespace net {
static const char kPrefCookieBehavior[] = "network.cookie.cookieBehavior";
static const char kPrefThirdPartySession[] =
"network.cookie.thirdparty.sessionOnly";
static const char kPrefThirdPartyNonsecureSession[] =
"network.cookie.thirdparty.nonsecureSessionOnly";
static const char kPrefCookieIPCSync[] = "network.cookie.ipc.sync";
static const char kCookieLeaveSecurityAlone[] = "network.cookie.leave-secure-alone";
@ -58,6 +60,7 @@ NS_IMPL_ISUPPORTS(CookieServiceChild,
CookieServiceChild::CookieServiceChild()
: mCookieBehavior(nsICookieService::BEHAVIOR_ACCEPT)
, mThirdPartySession(false)
, mThirdPartyNonsecureSession(false)
, mLeaveSecureAlone(true)
, mIPCSync(false)
, mIPCOpen(false)
@ -90,6 +93,7 @@ CookieServiceChild::CookieServiceChild()
if (prefBranch) {
prefBranch->AddObserver(kPrefCookieBehavior, this, true);
prefBranch->AddObserver(kPrefThirdPartySession, this, true);
prefBranch->AddObserver(kPrefThirdPartyNonsecureSession, this, true);
prefBranch->AddObserver(kPrefCookieIPCSync, this, true);
prefBranch->AddObserver(kCookieLeaveSecurityAlone, this, true);
PrefChanged(prefBranch);
@ -233,6 +237,10 @@ CookieServiceChild::PrefChanged(nsIPrefBranch *aPrefBranch)
if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kPrefThirdPartySession, &boolval)))
mThirdPartySession = !!boolval;
if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kPrefThirdPartyNonsecureSession,
&boolval)))
mThirdPartyNonsecureSession = boolval;
if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kPrefCookieIPCSync, &boolval)))
mIPCSync = !!boolval;
@ -277,7 +285,8 @@ CookieServiceChild::GetCookieStringFromCookieHashTable(nsIURI *a
nsCOMPtr<nsICookiePermission> permissionService = do_GetService(NS_COOKIEPERMISSION_CONTRACTID);
CookieStatus cookieStatus =
nsCookieService::CheckPrefs(permissionService, mCookieBehavior,
mThirdPartySession, aHostURI,
mThirdPartySession,
mThirdPartyNonsecureSession, aHostURI,
aIsForeign, nullptr,
CountCookiesFromHashTable(baseDomain, aOriginAttrs),
aOriginAttrs);
@ -379,7 +388,8 @@ CookieServiceChild::RequireThirdPartyCheck()
{
return mCookieBehavior == nsICookieService::BEHAVIOR_REJECT_FOREIGN ||
mCookieBehavior == nsICookieService::BEHAVIOR_LIMIT_FOREIGN ||
mThirdPartySession;
mThirdPartySession ||
mThirdPartyNonsecureSession;
}
void
@ -525,8 +535,9 @@ CookieServiceChild::SetCookieStringInternal(nsIURI *aHostURI,
CookieStatus cookieStatus =
nsCookieService::CheckPrefs(permissionService, mCookieBehavior,
mThirdPartySession, aHostURI,
!!isForeign, aCookieString,
mThirdPartySession,
mThirdPartyNonsecureSession, aHostURI,
isForeign, aCookieString,
CountCookiesFromHashTable(baseDomain, attrs),
attrs);
@ -544,7 +555,8 @@ CookieServiceChild::SetCookieStringInternal(nsIURI *aHostURI,
moreCookies = nsCookieService::CanSetCookie(aHostURI, key, cookieAttributes,
requireHostMatch, cookieStatus,
cookieString, serverTime, aFromHttp,
aChannel, mLeaveSecureAlone, canSetCookie);
aChannel, mLeaveSecureAlone,
canSetCookie, mThirdPartyUtil);
if (canSetCookie) {
SetCookieInternal(cookieAttributes, attrs, aChannel,

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

@ -121,6 +121,7 @@ protected:
nsCOMPtr<nsIEffectiveTLDService> mTLDService;
uint8_t mCookieBehavior;
bool mThirdPartySession;
bool mThirdPartyNonsecureSession;
bool mLeaveSecureAlone;
bool mIPCSync;
bool mIPCOpen;

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

@ -123,6 +123,7 @@ static const char kPrefMaxNumberOfCookies[] = "network.cookie.maxNumber";
static const char kPrefMaxCookiesPerHost[] = "network.cookie.maxPerHost";
static const char kPrefCookiePurgeAge[] = "network.cookie.purgeAge";
static const char kPrefThirdPartySession[] = "network.cookie.thirdparty.sessionOnly";
static const char kPrefThirdPartyNonsecureSession[] = "network.cookie.thirdparty.nonsecureSessionOnly";
static const char kCookieLeaveSecurityAlone[] = "network.cookie.leave-secure-alone";
// For telemetry COOKIE_LEAVE_SECURE_ALONE
@ -702,6 +703,7 @@ nsCookieService::nsCookieService()
: mDBState(nullptr)
, mCookieBehavior(nsICookieService::BEHAVIOR_ACCEPT)
, mThirdPartySession(false)
, mThirdPartyNonsecureSession(false)
, mLeaveSecureAlone(true)
, mMaxNumberOfCookies(kMaxNumberOfCookies)
, mMaxCookiesPerHost(kMaxCookiesPerHost)
@ -730,6 +732,7 @@ nsCookieService::Init()
prefBranch->AddObserver(kPrefMaxCookiesPerHost, this, true);
prefBranch->AddObserver(kPrefCookiePurgeAge, this, true);
prefBranch->AddObserver(kPrefThirdPartySession, this, true);
prefBranch->AddObserver(kPrefThirdPartyNonsecureSession, this, true);
prefBranch->AddObserver(kCookieLeaveSecurityAlone, this, true);
PrefChanged(prefBranch);
}
@ -2149,8 +2152,10 @@ nsCookieService::SetCookieStringInternal(nsIURI *aHostURI,
aHostURI->GetHost(hostFromURI);
CountCookiesFromHost(hostFromURI, &priorCookieCount);
CookieStatus cookieStatus = CheckPrefs(mPermissionService, mCookieBehavior,
mThirdPartySession, aHostURI, aIsForeign,
aCookieHeader.get(), priorCookieCount, aOriginAttrs);
mThirdPartySession,
mThirdPartyNonsecureSession, aHostURI,
aIsForeign, aCookieHeader.get(),
priorCookieCount, aOriginAttrs);
// fire a notification if third party or if cookie was rejected
// (but not if there was an error)
@ -2347,6 +2352,9 @@ nsCookieService::PrefChanged(nsIPrefBranch *aPrefBranch)
if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kPrefThirdPartySession, &boolval)))
mThirdPartySession = boolval;
if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kPrefThirdPartyNonsecureSession, &boolval)))
mThirdPartyNonsecureSession = boolval;
if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kCookieLeaveSecurityAlone, &boolval)))
mLeaveSecureAlone = boolval;
}
@ -3307,8 +3315,10 @@ nsCookieService::GetCookiesForURI(nsIURI *aHostURI,
uint32_t priorCookieCount = 0;
CountCookiesFromHost(hostFromURI, &priorCookieCount);
CookieStatus cookieStatus = CheckPrefs(mPermissionService, mCookieBehavior,
mThirdPartySession, aHostURI, aIsForeign,
nullptr, priorCookieCount, aOriginAttrs);
mThirdPartySession,
mThirdPartyNonsecureSession, aHostURI,
aIsForeign, nullptr,
priorCookieCount, aOriginAttrs);
// for GetCookie(), we don't fire rejection notifications.
switch (cookieStatus) {
@ -3471,7 +3481,8 @@ nsCookieService::CanSetCookie(nsIURI* aHostURI,
bool aFromHttp,
nsIChannel* aChannel,
bool aLeaveSecureAlone,
bool& aSetCookie)
bool& aSetCookie,
mozIThirdPartyUtil* aThirdPartyUtil)
{
NS_ASSERTION(aHostURI, "null host!");
@ -3501,6 +3512,26 @@ nsCookieService::CanSetCookie(nsIURI* aHostURI,
Telemetry::Accumulate(Telemetry::COOKIE_SCHEME_SECURITY,
((aCookieAttributes.isSecure)? 0x02 : 0x00) |
((isHTTPS)? 0x01 : 0x00));
// Collect telemetry on how often are first- and third-party cookies set
// from HTTPS origins:
//
// 0 (000) = first-party and "http:"
// 1 (001) = first-party and "http:" with bogus Secure cookie flag?!
// 2 (010) = first-party and "https:"
// 3 (011) = first-party and "https:" with Secure cookie flag
// 4 (100) = third-party and "http:"
// 5 (101) = third-party and "http:" with bogus Secure cookie flag?!
// 6 (110) = third-party and "https:"
// 7 (111) = third-party and "https:" with Secure cookie flag
if (aThirdPartyUtil) {
bool isThirdParty = true;
aThirdPartyUtil->IsThirdPartyChannel(aChannel, aHostURI, &isThirdParty);
Telemetry::Accumulate(Telemetry::COOKIE_SCHEME_HTTPS,
(isThirdParty ? 0x04 : 0x00) |
(isHTTPS ? 0x02 : 0x00) |
(aCookieAttributes.isSecure ? 0x01 : 0x00));
}
}
int64_t currentTimeInUsec = PR_Now();
@ -3608,7 +3639,8 @@ nsCookieService::SetCookieInternal(nsIURI *aHostURI,
nsCookieAttributes cookieAttributes;
bool newCookie = CanSetCookie(aHostURI, aKey, cookieAttributes, aRequireHostMatch,
aStatus, aCookieHeader, aServerTime, aFromHttp,
aChannel, mLeaveSecureAlone, canSetCookie);
aChannel, mLeaveSecureAlone, canSetCookie,
mThirdPartyUtil);
if (!canSetCookie) {
return newCookie;
@ -4210,6 +4242,7 @@ CookieStatus
nsCookieService::CheckPrefs(nsICookiePermission *aPermissionService,
uint8_t aCookieBehavior,
bool aThirdPartySession,
bool aThirdPartyNonsecureSession,
nsIURI *aHostURI,
bool aIsForeign,
const char *aCookieHeader,
@ -4284,9 +4317,6 @@ nsCookieService::CheckPrefs(nsICookiePermission *aPermissionService,
// check if cookie is foreign
if (aIsForeign) {
if (aCookieBehavior == nsICookieService::BEHAVIOR_ACCEPT && aThirdPartySession)
return STATUS_ACCEPT_SESSION;
if (aCookieBehavior == nsICookieService::BEHAVIOR_REJECT_FOREIGN) {
COOKIE_LOGFAILURE(aCookieHeader ? SET_COOKIE : GET_COOKIE, aHostURI, aCookieHeader, "context is third party");
return STATUS_REJECTED;
@ -4297,7 +4327,18 @@ nsCookieService::CheckPrefs(nsICookiePermission *aPermissionService,
COOKIE_LOGFAILURE(aCookieHeader ? SET_COOKIE : GET_COOKIE, aHostURI, aCookieHeader, "context is third party");
return STATUS_REJECTED;
}
if (aThirdPartySession)
}
MOZ_ASSERT(aCookieBehavior == nsICookieService::BEHAVIOR_ACCEPT ||
aCookieBehavior == nsICookieService::BEHAVIOR_LIMIT_FOREIGN);
if (aThirdPartySession)
return STATUS_ACCEPT_SESSION;
if (aThirdPartyNonsecureSession) {
bool isHTTPS = false;
aHostURI->SchemeIs("https", &isHTTPS);
if (!isHTTPS)
return STATUS_ACCEPT_SESSION;
}
}

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

@ -231,8 +231,8 @@ class nsCookieService final : public nsICookieService
static nsresult GetBaseDomainFromHost(nsIEffectiveTLDService *aTLDService, const nsACString &aHost, nsCString &aBaseDomain);
static bool DomainMatches(nsCookie* aCookie, const nsACString& aHost);
static bool PathMatches(nsCookie* aCookie, const nsACString& aPath);
static bool CanSetCookie(nsIURI *aHostURI, const nsCookieKey& aKey, nsCookieAttributes &aCookieAttributes, bool aRequireHostMatch, CookieStatus aStatus, nsDependentCString &aCookieHeader, int64_t aServerTime, bool aFromHttp, nsIChannel* aChannel, bool aLeaveSercureAlone, bool &aSetCookie);
static CookieStatus CheckPrefs(nsICookiePermission *aPermissionServices, uint8_t aCookieBehavior, bool aThirdPartyUtil, nsIURI *aHostURI, bool aIsForeign, const char *aCookieHeader, const int aNumOfCookies, const OriginAttributes& aOriginAttrs);
static bool CanSetCookie(nsIURI *aHostURI, const nsCookieKey& aKey, nsCookieAttributes &aCookieAttributes, bool aRequireHostMatch, CookieStatus aStatus, nsDependentCString &aCookieHeader, int64_t aServerTime, bool aFromHttp, nsIChannel* aChannel, bool aLeaveSercureAlone, bool &aSetCookie, mozIThirdPartyUtil* aThirdPartyUtil);
static CookieStatus CheckPrefs(nsICookiePermission *aPermissionServices, uint8_t aCookieBehavior, bool aThirdPartySession, bool aThirdPartyNonsecureSession, nsIURI *aHostURI, bool aIsForeign, const char *aCookieHeader, const int aNumOfCookies, const OriginAttributes& aOriginAttrs);
static int64_t ParseServerTime(const nsCString &aServerTime);
void GetCookiesForURI(nsIURI *aHostURI, bool aIsForeign, bool aHttpBound, const OriginAttributes& aOriginAttrs, nsTArray<nsCookie*>& aCookieList);
@ -321,6 +321,7 @@ class nsCookieService final : public nsICookieService
// cached prefs
uint8_t mCookieBehavior; // BEHAVIOR_{ACCEPT, REJECTFOREIGN, REJECT, LIMITFOREIGN}
bool mThirdPartySession;
bool mThirdPartyNonsecureSession;
bool mLeaveSecureAlone;
uint16_t mMaxNumberOfCookies;
uint16_t mMaxCookiesPerHost;

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

@ -238,8 +238,7 @@ mochitest-devtools-chrome:
chunked: true
instance-size:
by-test-platform:
# Bug 1281241: migrating to m3.large instances
linux64-asan/opt: legacy
linux64-asan/opt: xlarge # runs out of memory on default/m3.large
default: default
# Bug 1296086: high number of intermittents observed with software GL and large instances
allow-software-gl-layers: false

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

@ -99,6 +99,7 @@ talos-g2:
run-on-projects:
by-test-platform:
linux64-qr/.*: ['mozilla-central', 'try']
linux64-ccov/.*: ['try'] # Bug 1407593
default: ['mozilla-beta', 'mozilla-central', 'mozilla-inbound', 'autoland', 'try']
mozharness:
extra-options:

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

@ -104,7 +104,7 @@ reftest-stylo:
- reftest-stylo
qr-talos:
# - talos-chrome # regressed, see bug 1408418
- talos-chrome
- talos-dromaeojs
- talos-g1
# - talos-g2 # doesn't work with QR yet

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

@ -1,3 +1,5 @@
prefs: [layout.css.getBoxQuads.enabled:true, layout.css.convertFromNode.enabled:true]
[interfaces.html]
type: testharness
[Screen interface: existence and properties of interface object]

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

@ -10357,6 +10357,15 @@
"releaseChannelCollection": "opt-out",
"description": "Strict Secure Cookies: 0=blocked secure cookie from http; 1=blocked shadowing secure cookie from http; 2=shadowing secure cookie from https; 3=evicted newer insecure cookie; 4=evicted oldest insecure cookie; 5=evicted secure cookie; 6=evicting secure cookie blocked; 7=blocked downgrading secure cookie from http; 8=downgraded secure cookie from https"
},
"COOKIE_SCHEME_HTTPS": {
"record_in_processes": ["main", "content"],
"alert_emails": ["cpeterson@mozilla.com", "seceng-telemetry@mozilla.com"],
"bug_numbers": [1160368],
"expires_in_version": "60",
"kind": "enumerated",
"n_values": 10,
"description": "How often are first- and third-party cookies set from HTTPS origins? 0=first/http, 1=first/http+secure?!, 2=first/https, 3=first/https+secure, 4=third/http, 5=third/http+secure?!, 6=third/https, 7=third/https+secure"
},
"NTLM_MODULE_USED_2": {
"record_in_processes": ["main", "content"],
"expires_in_version": "never",

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

@ -103,8 +103,6 @@ doneFileScheme=local file
# LOCALIZATION NOTE (yesterday): Displayed time for files finished yesterday
yesterday=Yesterday
# LOCALIZATION NOTE (monthDate): #1 month name; #2 date number; e.g., January 22
monthDate2=%1$S %2$S
fileExecutableSecurityWarning=“%S” is an executable file. Executable files may contain viruses or other malicious code that could harm your computer. Use caution when opening this file. Are you sure you want to launch “%S”?
fileExecutableSecurityWarningTitle=Open Executable File?

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

@ -79,7 +79,6 @@ var gStr = {
timeLeftDouble: "timeLeftDouble3",
timeFewSeconds: "timeFewSeconds2",
timeUnknown: "timeUnknown2",
monthDate: "monthDate2",
yesterday: "yesterday",
doneScheme: "doneScheme2",
doneFileScheme: "doneFileScheme",
@ -364,9 +363,10 @@ this.DownloadUtils = {
dateTimeCompact = aDate.toLocaleDateString(undefined, { weekday: "long" });
} else {
// Show month/day
let month = aDate.toLocaleDateString(undefined, { month: "long" });
let date = aDate.getDate();
dateTimeCompact = gBundle.formatStringFromName(gStr.monthDate, [month, date], 2);
dateTimeCompact = aDate.toLocaleString(undefined, {
month: "long",
day: "numeric"
});
}
const dtOptions = { dateStyle: "long", timeStyle: "short" };

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

@ -8,7 +8,9 @@
#include "mozilla/ThreadEventQueue.h"
#include "LeakRefPtr.h"
#include "mozilla/TimeStamp.h"
#include "nsComponentManagerUtils.h"
#include "nsITimer.h"
#include "nsThreadManager.h"
#include "nsThreadSyncDispatch.h"
#include "nsThreadUtils.h"

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

@ -10,6 +10,7 @@
#include "mozilla/TimeStamp.h"
#include "LeakRefPtr.h"
#include "nsComponentManagerUtils.h"
#include "nsITimer.h"
#include "nsComponentManagerUtils.h"