Merge autoland to mozilla-central. a=merge

This commit is contained in:
Brindusan Cristian 2020-07-27 23:31:20 +03:00
Родитель e0a22e8714 2168dfaac8
Коммит 2d3cb7b452
49 изменённых файлов: 705 добавлений и 250 удалений

12
Cargo.lock сгенерированный
Просмотреть файл

@ -1661,7 +1661,7 @@ dependencies = [
[[package]]
name = "geckodriver"
version = "0.26.0"
version = "0.27.0"
dependencies = [
"base64 0.12.0",
"chrono",
@ -2984,7 +2984,7 @@ dependencies = [
[[package]]
name = "mozdevice"
version = "0.1.0"
version = "0.2.0"
dependencies = [
"log",
"regex",
@ -3026,14 +3026,14 @@ dependencies = [
[[package]]
name = "mozprofile"
version = "0.6.0"
version = "0.7.0"
dependencies = [
"tempfile",
]
[[package]]
name = "mozrunner"
version = "0.10.0"
version = "0.11.0"
dependencies = [
"dirs",
"log",
@ -3055,7 +3055,7 @@ dependencies = [
[[package]]
name = "mozversion"
version = "0.2.1"
version = "0.3.0"
dependencies = [
"regex",
"rust-ini",
@ -5441,7 +5441,7 @@ dependencies = [
[[package]]
name = "webdriver"
version = "0.40.2"
version = "0.41.0"
dependencies = [
"base64 0.12.0",
"bytes 0.5.3",

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

@ -254,7 +254,7 @@
<hbox id="zoomBox" align="center" hidden="true">
<label control="defaultZoom" data-l10n-id="preferences-default-zoom"/>
<!-- Please don't remove the wrapping hbox/vbox/box for these elements. It's used to properly compute the search tooltip position. -->
<hbox flex="1">
<hbox>
<menulist id="defaultZoom">
<menupopup/>
</menulist>

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

@ -101,6 +101,10 @@ function getWatchedData(watcher, { createData = false } = {}) {
*/
function persistMapToSharedData() {
Services.ppmm.sharedData.set(SHARED_DATA_KEY_NAME, watchedDataByWatcherActor);
// Request to immediately flush the data to the content processes in order to prevent
// races (bug 1644649). Otherwise content process may have outdated sharedData
// and try to create targets for Watcher actor that already stopped watching for targets.
Services.ppmm.sharedData.flush();
}
const WatcherRegistry = {

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

@ -35,6 +35,7 @@
#include "nsFocusManager.h"
#include "nsColorControlFrame.h"
#include "nsNumberControlFrame.h"
#include "nsSearchControlFrame.h"
#include "nsPIDOMWindow.h"
#include "nsRepeatService.h"
#include "nsContentCID.h"
@ -4010,6 +4011,23 @@ nsresult HTMLInputElement::PostHandleEvent(EventChainPostVisitor& aVisitor) {
break;
}
#endif
case eMouseClick: {
if (!aVisitor.mEvent->DefaultPrevented() &&
aVisitor.mEvent->IsTrusted() && mType == NS_FORM_INPUT_SEARCH &&
aVisitor.mEvent->AsMouseEvent()->mButton ==
MouseButton::ePrimary) {
if (nsSearchControlFrame* searchControlFrame =
do_QueryFrame(GetPrimaryFrame())) {
Element* clearButton = searchControlFrame->GetAnonClearButton();
if (clearButton &&
aVisitor.mEvent->mOriginalTarget == clearButton) {
SetUserInput(EmptyString(),
*nsContentUtils::GetSystemPrincipal());
}
}
}
break;
}
default:
break;
}
@ -6635,6 +6653,14 @@ void HTMLInputElement::OnValueChanged(ValueChangeKind aKind) {
if (PlaceholderApplies() && HasAttr(nsGkAtoms::placeholder)) {
UpdateState(true);
}
// Update clear button state on search inputs
if (mType == NS_FORM_INPUT_SEARCH) {
if (nsSearchControlFrame* searchControlFrame =
do_QueryFrame(GetPrimaryFrame())) {
searchControlFrame->UpdateClearButtonState();
}
}
}
bool HTMLInputElement::HasCachedSelection() {

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

@ -848,6 +848,14 @@ class HTMLInputElement final : public TextControlElement,
bool HasBeenTypePassword() { return mHasBeenTypePassword; }
/**
* Returns whether the current value is the empty string. This only makes
* sense for some input types; does NOT make sense for file inputs.
*
* @return whether the current value is the empty string.
*/
bool IsValueEmpty() const;
protected:
MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual ~HTMLInputElement();
@ -925,14 +933,6 @@ class HTMLInputElement final : public TextControlElement,
// don't have to think about the caller type.
void GetNonFileValueInternal(nsAString& aValue) const;
/**
* Returns whether the current value is the empty string. This only makes
* sense for some input types; does NOT make sense for file inputs.
*
* @return whether the current value is the empty string.
*/
bool IsValueEmpty() const;
/**
* Returns whether the current placeholder value should be shown.
*/

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

@ -14,12 +14,8 @@
dictionary AudioParamDescriptor {
required DOMString name;
float defaultValue = 0;
// FIXME: we use 3.402823466e38 instead of 3.4028235e38 to workaround a bug
// in Visual Studio compiler (see bug 1501709 for more information).
// We should put back 3.4028235e38 once MSVC support is dropped (i.e. once
// bug 1512504 is fixed)
float minValue = -3.402823466e38;
float maxValue = 3.402823466e38;
float minValue = -3.4028235e38;
float maxValue = 3.4028235e38;
// AutomationRate for AudioWorklet is not needed until bug 1504984 is
// implemented
// AutomationRate automationRate = "a-rate";

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

@ -497,8 +497,7 @@ class MOZ_RAII CacheIRWriter : public JS::CustomAutoRooter {
void assertSameCompartment(JSObject*);
void writeOp(CacheOp op) {
MOZ_ASSERT(uint32_t(op) <= UINT8_MAX);
buffer_.writeByte(uint32_t(op));
buffer_.writeUnsigned15Bit(uint32_t(op));
nextInstructionId_++;
#ifdef DEBUG
MOZ_ASSERT(currentOp_.isNothing(), "Missing call to assertLengthMatches?");
@ -928,7 +927,7 @@ class MOZ_RAII CacheIRReader {
bool more() const { return buffer_.more(); }
CacheOp readOp() { return CacheOp(buffer_.readByte()); }
CacheOp readOp() { return CacheOp(buffer_.readUnsigned15Bit()); }
// Skip data not currently used.
void skip() { buffer_.readByte(); }

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

@ -74,6 +74,18 @@
# If there's an argument named 'result', the generated CacheIRWriter method will
# return a new OperandId of this type.
- name: TypeMonitorResult
shared: false
transpile: true
cost_estimate: 1
args:
- name: ReturnFromIC
shared: false
transpile: true
cost_estimate: 1
args:
- name: GuardToObject
shared: true
transpile: true
@ -2090,18 +2102,6 @@
cost_estimate: 1
args:
- name: TypeMonitorResult
shared: false
transpile: true
cost_estimate: 1
args:
- name: ReturnFromIC
shared: false
transpile: true
cost_estimate: 1
args:
- name: WrapResult
shared: true
transpile: false

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

@ -83,7 +83,15 @@ class CompactBufferReader {
}
return result;
}
// Reads a value written by writeUnsigned15Bit.
uint32_t readUnsigned15Bit() {
uint8_t byte = readByte();
uint32_t val = byte >> 1;
if (byte & 1) {
val |= uint32_t(readByte()) << 7;
}
return val;
}
void* readRawPointer() {
uintptr_t ptrWord = 0;
for (unsigned i = 0; i < sizeof(uintptr_t); i++) {
@ -119,7 +127,9 @@ class CompactBufferWriter {
// assert.
void writeByte(uint32_t byte) {
MOZ_ASSERT(byte <= 0xFF);
enoughMemory_ &= buffer_.append(byte);
if (!buffer_.append(byte)) {
enoughMemory_ = false;
}
}
void writeByteAt(uint32_t pos, uint32_t byte) {
MOZ_ASSERT(byte <= 0xFF);
@ -127,6 +137,18 @@ class CompactBufferWriter {
buffer_[pos] = byte;
}
}
// Writes a variable-length value similar to writeUnsigned, but optimized for
// small 15-bit values that fit in one or two variable-length-encoded bytes.
// Must be read using readUnsigned15Bit.
void writeUnsigned15Bit(uint32_t value) {
uint8_t byte1 = ((value & 0x7F) << 1) | (value > 0x7F);
writeByte(byte1);
value >>= 7;
if (value) {
MOZ_ASSERT(value <= 0xFF);
writeByte(value);
}
}
void writeUnsigned(uint32_t value) {
do {
uint8_t byte = ((value & 0x7F) << 1) | (value > 0x7F);

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

@ -91,6 +91,7 @@ Maybe<InlinableCallData> FindInlinableCallData(ICStub* stub) {
CacheOp op = reader.readOp();
uint32_t argLength = CacheIROpArgLengths[size_t(op)];
mozilla::DebugOnly<const uint8_t*> argStart = reader.currentPosition();
switch (op) {
case CacheOp::GuardSpecificFunction:
@ -140,7 +141,7 @@ Maybe<InlinableCallData> FindInlinableCallData(ICStub* stub) {
reader.skip(argLength);
break;
}
MOZ_ASSERT(opStart + 1 + argLength == reader.currentPosition());
MOZ_ASSERT(argStart + argLength == reader.currentPosition());
}
if (data.isSome()) {

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

@ -94,8 +94,13 @@ SharedCompileArgs CompileArgs::build(JSContext* cx,
bool forceTiering =
cx->options().testWasmAwaitTier2() || JitOptions.wasmDelayTier2;
// The <Compiler>Available() predicates should ensure this.
MOZ_RELEASE_ASSERT(!(debug && (ion || cranelift)));
// The <Compiler>Available() predicates should ensure no failure here, but
// when we're fuzzing we allow inconsistent switches and the check may thus
// fail. Let it go to a run-time error instead of crashing.
if (debug && (ion || cranelift)) {
JS_ReportErrorASCII(cx, "no WebAssembly compiler available");
return nullptr;
}
if (forceTiering && !(baseline && (cranelift || ion))) {
// This can happen only in testing, and in this case we don't have a

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

@ -73,8 +73,39 @@ using mozilla::RangedPtr;
extern mozilla::Atomic<bool> fuzzingSafe;
// About the fuzzer intercession points: If fuzzing has been selected and only a
// single compiler has been selected then we will disable features that are not
// supported by that single compiler. This is strictly a concession to the
// fuzzer infrastructure.
static inline bool IsFuzzing() {
#ifdef FUZZING
return true;
#else
return fuzzingSafe;
#endif
}
static inline bool IsFuzzingIon(JSContext* cx) {
return IsFuzzing() && !cx->options().wasmBaseline() &&
cx->options().wasmIon() && !cx->options().wasmCranelift();
}
static inline bool IsFuzzingCranelift(JSContext* cx) {
return IsFuzzing() && !cx->options().wasmBaseline() &&
!cx->options().wasmIon() && cx->options().wasmCranelift();
}
// These functions read flags and apply fuzzing intercession policies. Never go
// directly to the flags in code below, always go via these accessors.
static inline bool WasmMultiValueFlag(JSContext* cx) {
#ifdef ENABLE_WASM_MULTI_VALUE
if (IsFuzzingCranelift(cx)) {
# ifdef JS_CODEGEN_X64
return false;
# endif
}
return cx->options().wasmMultiValue();
#else
return false;
@ -83,12 +114,45 @@ static inline bool WasmMultiValueFlag(JSContext* cx) {
static inline bool WasmSimdFlag(JSContext* cx) {
#ifdef ENABLE_WASM_SIMD
if (IsFuzzingCranelift(cx)) {
return false;
}
return cx->options().wasmSimd() && js::jit::JitSupportsWasmSimd();
#else
return false;
#endif
}
static inline bool WasmReftypesFlag(JSContext* cx) {
#ifdef ENABLE_WASM_REFTYPES
return cx->options().wasmReftypes();
#else
return false;
#endif
}
static inline bool WasmGcFlag(JSContext* cx) {
if (IsFuzzingIon(cx) || IsFuzzingCranelift(cx)) {
return false;
}
return cx->options().wasmGc();
}
static inline bool WasmThreadsFlag(JSContext* cx) {
if (IsFuzzingCranelift(cx)) {
return false;
}
return cx->realm() &&
cx->realm()->creationOptions().getSharedMemoryAndAtomicsEnabled();
}
static inline bool WasmDebuggerActive(JSContext* cx) {
if (IsFuzzingIon(cx) || IsFuzzingCranelift(cx)) {
return false;
}
return cx->realm() && cx->realm()->debuggerObservesAsmJS();
}
/*
* [WASMDOC] Compiler and feature selection; compiler and feature availability.
*
@ -215,8 +279,8 @@ static inline bool Append(JSStringBuilder* reason, const char (&s)[ArrayLength],
bool wasm::IonDisabledByFeatures(JSContext* cx, bool* isDisabled,
JSStringBuilder* reason) {
// Ion has no debugging support, no gc support.
bool debug = cx->realm() && cx->realm()->debuggerObservesAsmJS();
bool gc = cx->options().wasmGc();
bool debug = WasmDebuggerActive(cx);
bool gc = WasmGcFlag(cx);
if (reason) {
char sep = 0;
if (debug && !Append(reason, "debug", &sep)) {
@ -241,17 +305,15 @@ bool wasm::CraneliftAvailable(JSContext* cx) {
bool wasm::CraneliftDisabledByFeatures(JSContext* cx, bool* isDisabled,
JSStringBuilder* reason) {
// Cranelift has no debugging support, no gc support, no threads, and no
// simd.
bool debug = cx->realm() && cx->realm()->debuggerObservesAsmJS();
bool gc = cx->options().wasmGc();
bool threads =
cx->realm() &&
cx->realm()->creationOptions().getSharedMemoryAndAtomicsEnabled();
#if defined(JS_CODEGEN_ARM64)
bool multiValue = false; // `false` --> not disabled.
#else
bool multiValue = WasmMultiValueFlag(cx);
// Cranelift has no debugging support, no gc support, no threads, no simd, and
// on x64, no multi-value support.
// on some platforms, no reference types or multi-value support.
bool debug = WasmDebuggerActive(cx);
bool gc = WasmGcFlag(cx);
bool threads = WasmThreadsFlag(cx);
bool multiValueOnX64 = false;
#if defined(JS_CODEGEN_X64)
multiValueOnX64 = WasmMultiValueFlag(cx);
#endif
bool simd = WasmSimdFlag(cx);
if (reason) {
@ -262,7 +324,7 @@ bool wasm::CraneliftDisabledByFeatures(JSContext* cx, bool* isDisabled,
if (gc && !Append(reason, "gc", &sep)) {
return false;
}
if (multiValue && !Append(reason, "multi-value", &sep)) {
if (multiValueOnX64 && !Append(reason, "multi-value", &sep)) {
return false;
}
if (threads && !Append(reason, "threads", &sep)) {
@ -272,7 +334,7 @@ bool wasm::CraneliftDisabledByFeatures(JSContext* cx, bool* isDisabled,
return false;
}
}
*isDisabled = debug || gc || multiValue || threads || simd;
*isDisabled = debug || gc || multiValueOnX64 || threads || simd;
return true;
}
@ -285,18 +347,14 @@ bool wasm::CraneliftDisabledByFeatures(JSContext* cx, bool* isDisabled,
// ensure that only compilers that actually support the feature are used.
bool wasm::ReftypesAvailable(JSContext* cx) {
// All compilers support reference types, except Cranelift on ARM64.
#ifdef ENABLE_WASM_REFTYPES
return cx->options().wasmReftypes() &&
// All compilers support reference types.
return WasmReftypesFlag(cx) &&
(BaselineAvailable(cx) || IonAvailable(cx) || CraneliftAvailable(cx));
#else
return false;
#endif
}
bool wasm::GcTypesAvailable(JSContext* cx) {
// Cranelift and Ion do not support GC.
return cx->options().wasmGc() && BaselineAvailable(cx);
return WasmGcFlag(cx) && BaselineAvailable(cx);
}
bool wasm::MultiValuesAvailable(JSContext* cx) {
@ -311,9 +369,7 @@ bool wasm::SimdAvailable(JSContext* cx) {
bool wasm::ThreadsAvailable(JSContext* cx) {
// Cranelift does not support atomics.
return cx->realm() &&
cx->realm()->creationOptions().getSharedMemoryAndAtomicsEnabled() &&
(BaselineAvailable(cx) || IonAvailable(cx));
return WasmThreadsFlag(cx) && (BaselineAvailable(cx) || IonAvailable(cx));
}
bool wasm::HasPlatformSupport(JSContext* cx) {

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

@ -3391,6 +3391,21 @@ nsCSSFrameConstructor::FindImgControlData(const Element& aElement,
return &sImgControlData;
}
/* static */
const nsCSSFrameConstructor::FrameConstructionData*
nsCSSFrameConstructor::FindSearchControlData(const Element& aElement,
ComputedStyle& aStyle) {
if (StaticPrefs::layout_forms_input_type_search_enabled()) {
static const FrameConstructionData sSearchControlData =
SIMPLE_FCDATA(NS_NewSearchControlFrame);
return &sSearchControlData;
}
static const FrameConstructionData sTextControlData =
SIMPLE_FCDATA(NS_NewTextControlFrame);
return &sTextControlData;
}
/* static */
const nsCSSFrameConstructor::FrameConstructionData*
nsCSSFrameConstructor::FindInputData(const Element& aElement,
@ -3402,7 +3417,6 @@ nsCSSFrameConstructor::FindInputData(const Element& aElement,
SIMPLE_INT_CHAIN(NS_FORM_INPUT_IMAGE,
nsCSSFrameConstructor::FindImgControlData),
SIMPLE_INT_CREATE(NS_FORM_INPUT_EMAIL, NS_NewTextControlFrame),
SIMPLE_INT_CREATE(NS_FORM_INPUT_SEARCH, NS_NewTextControlFrame),
SIMPLE_INT_CREATE(NS_FORM_INPUT_TEXT, NS_NewTextControlFrame),
SIMPLE_INT_CREATE(NS_FORM_INPUT_TEL, NS_NewTextControlFrame),
SIMPLE_INT_CREATE(NS_FORM_INPUT_URL, NS_NewTextControlFrame),
@ -3411,7 +3425,9 @@ nsCSSFrameConstructor::FindInputData(const Element& aElement,
{NS_FORM_INPUT_COLOR,
FCDATA_WITH_WRAPPING_BLOCK(0, NS_NewColorControlFrame,
PseudoStyleType::buttonContent)},
// TODO: this is temporary until a frame is written: bug 635240.
SIMPLE_INT_CHAIN(NS_FORM_INPUT_SEARCH,
nsCSSFrameConstructor::FindSearchControlData),
SIMPLE_INT_CREATE(NS_FORM_INPUT_NUMBER, NS_NewNumberControlFrame),
SIMPLE_INT_CREATE(NS_FORM_INPUT_TIME, NS_NewDateTimeControlFrame),
SIMPLE_INT_CREATE(NS_FORM_INPUT_DATE, NS_NewDateTimeControlFrame),

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

@ -1362,6 +1362,8 @@ class nsCSSFrameConstructor final : public nsFrameManager {
ComputedStyle&);
static const FrameConstructionData* FindImgControlData(const Element&,
ComputedStyle&);
static const FrameConstructionData* FindSearchControlData(const Element&,
ComputedStyle&);
static const FrameConstructionData* FindInputData(const Element&,
ComputedStyle&);
static const FrameConstructionData* FindObjectData(const Element&,

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

@ -33,6 +33,7 @@ UNIFIED_SOURCES += [
'nsNumberControlFrame.cpp',
'nsProgressFrame.cpp',
'nsRangeFrame.cpp',
'nsSearchControlFrame.cpp',
'nsSelectsAreaFrame.cpp',
'nsTextControlFrame.cpp',
]

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

@ -47,26 +47,6 @@ void nsNumberControlFrame::DestroyFrom(nsIFrame* aDestructRoot,
nsTextControlFrame::DestroyFrom(aDestructRoot, aPostDestroyData);
}
already_AddRefed<Element> nsNumberControlFrame::MakeAnonymousElement(
Element* aParent, nsAtom* aTagName, PseudoStyleType aPseudoType) {
// Get the NodeInfoManager and tag necessary to create the anonymous divs.
Document* doc = mContent->GetComposedDoc();
RefPtr<Element> resultElement = doc->CreateHTMLElement(aTagName);
resultElement->SetPseudoElementType(aPseudoType);
if (aPseudoType == PseudoStyleType::mozNumberSpinDown ||
aPseudoType == PseudoStyleType::mozNumberSpinUp) {
resultElement->SetAttr(kNameSpaceID_None, nsGkAtoms::aria_hidden,
u"true"_ns, false);
}
if (aParent) {
aParent->AppendChildTo(resultElement, false);
}
return resultElement.forget();
}
nsresult nsNumberControlFrame::CreateAnonymousContent(
nsTArray<ContentInfo>& aElements) {
// We create an anonymous tree for our input element that is structured as
@ -85,8 +65,7 @@ nsresult nsNumberControlFrame::CreateAnonymousContent(
// nsNumberControlFrame::DestroyFrom.
// Create the anonymous outer wrapper:
mOuterWrapper = MakeAnonymousElement(nullptr, nsGkAtoms::div,
PseudoStyleType::mozNumberWrapper);
mOuterWrapper = MakeAnonElement(PseudoStyleType::mozComplexControlWrapper);
// We want to do this now, rather than on the caller, so that the
// AppendChildTo calls below know that they are anonymous already. This is
@ -114,16 +93,13 @@ nsresult nsNumberControlFrame::CreateAnonymousContent(
}
// Create the ::-moz-number-spin-box pseudo-element:
mSpinBox = MakeAnonymousElement(mOuterWrapper, nsGkAtoms::div,
PseudoStyleType::mozNumberSpinBox);
mSpinBox = MakeAnonElement(PseudoStyleType::mozNumberSpinBox, mOuterWrapper);
// Create the ::-moz-number-spin-up pseudo-element:
mSpinUp = MakeAnonymousElement(mSpinBox, nsGkAtoms::div,
PseudoStyleType::mozNumberSpinUp);
mSpinUp = MakeAnonElement(PseudoStyleType::mozNumberSpinUp, mSpinBox);
// Create the ::-moz-number-spin-down pseudo-element:
mSpinDown = MakeAnonymousElement(mSpinBox, nsGkAtoms::div,
PseudoStyleType::mozNumberSpinDown);
mSpinDown = MakeAnonElement(PseudoStyleType::mozNumberSpinDown, mSpinBox);
return NS_OK;
}

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

@ -102,10 +102,6 @@ class nsNumberControlFrame final : public nsTextControlFrame {
bool ShouldUseNativeStyleForSpinner() const;
private:
already_AddRefed<Element> MakeAnonymousElement(Element* aParent,
nsAtom* aTagName,
PseudoStyleType aPseudoType);
// See nsNumberControlFrame::CreateAnonymousContent for a description of
// these.
nsCOMPtr<Element> mOuterWrapper;

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

@ -0,0 +1,118 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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 "nsSearchControlFrame.h"
#include "HTMLInputElement.h"
#include "nsGkAtoms.h"
#include "nsNameSpaceManager.h"
#include "nsStyleConsts.h"
#include "nsContentUtils.h"
#include "nsContentCreatorFunctions.h"
#include "nsCSSPseudoElements.h"
#include "nsICSSDeclaration.h"
#ifdef ACCESSIBILITY
# include "mozilla/a11y/AccTypes.h"
#endif
using namespace mozilla;
using namespace mozilla::dom;
nsIFrame* NS_NewSearchControlFrame(PresShell* aPresShell,
ComputedStyle* aStyle) {
return new (aPresShell)
nsSearchControlFrame(aStyle, aPresShell->GetPresContext());
}
NS_IMPL_FRAMEARENA_HELPERS(nsSearchControlFrame)
NS_QUERYFRAME_HEAD(nsSearchControlFrame)
NS_QUERYFRAME_ENTRY(nsSearchControlFrame)
NS_QUERYFRAME_TAIL_INHERITING(nsTextControlFrame)
nsSearchControlFrame::nsSearchControlFrame(ComputedStyle* aStyle,
nsPresContext* aPresContext)
: nsTextControlFrame(aStyle, aPresContext, kClassID) {}
void nsSearchControlFrame::DestroyFrom(nsIFrame* aDestructRoot,
PostDestroyData& aPostDestroyData) {
aPostDestroyData.AddAnonymousContent(mOuterWrapper.forget());
nsTextControlFrame::DestroyFrom(aDestructRoot, aPostDestroyData);
}
nsresult nsSearchControlFrame::CreateAnonymousContent(
nsTArray<ContentInfo>& aElements) {
// We create an anonymous tree for our input element that is structured as
// follows:
//
// input
// div - outer wrapper with "display:flex" by default
// div - editor root
// button - clear button
// div - placeholder
// div - preview div
//
// If you change this, be careful to change the destruction order in
// nsSearchControlFrame::DestroyFrom.
// Create the anonymous outer wrapper:
mOuterWrapper = MakeAnonElement(PseudoStyleType::mozComplexControlWrapper);
aElements.AppendElement(mOuterWrapper);
nsTArray<ContentInfo> nestedContent;
nsTextControlFrame::CreateAnonymousContent(nestedContent);
for (auto& content : nestedContent) {
// The root goes inside the container.
if (content.mContent == mRootNode) {
mOuterWrapper->AppendChildTo(content.mContent, false);
} else {
// The rest (placeholder and preview), directly under us.
aElements.AppendElement(std::move(content));
}
}
// Create the ::-moz-search-clear-button pseudo-element:
mClearButton = MakeAnonElement(PseudoStyleType::mozSearchClearButton,
mOuterWrapper, nsGkAtoms::button);
// Update clear button visibility based on value
UpdateClearButtonState();
return NS_OK;
}
void nsSearchControlFrame::AppendAnonymousContentTo(
nsTArray<nsIContent*>& aElements, uint32_t aFilter) {
if (mOuterWrapper) {
aElements.AppendElement(mOuterWrapper);
}
if (mPlaceholderDiv) {
aElements.AppendElement(mPlaceholderDiv);
}
if (mPreviewDiv) {
aElements.AppendElement(mPreviewDiv);
}
}
void nsSearchControlFrame::UpdateClearButtonState() {
if (!mClearButton) {
return;
}
auto* content = HTMLInputElement::FromNode(mContent);
nsGenericHTMLElement* element = nsGenericHTMLElement::FromNode(mClearButton);
nsCOMPtr<nsICSSDeclaration> declaration = element->Style();
if (content->IsValueEmpty()) {
declaration->SetProperty("visibility"_ns, "hidden"_ns, EmptyString(),
IgnoreErrors());
} else {
nsAutoString dummy;
declaration->RemoveProperty("visibility"_ns, dummy, IgnoreErrors());
}
}

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

@ -0,0 +1,70 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/. */
#ifndef nsSearchControlFrame_h__
#define nsSearchControlFrame_h__
#include "mozilla/Attributes.h"
#include "nsTextControlFrame.h"
#include "nsIAnonymousContentCreator.h"
#include "mozilla/RefPtr.h"
class nsITextControlFrame;
class nsPresContext;
namespace mozilla {
enum class PseudoStyleType : uint8_t;
class PresShell;
namespace dom {
class Element;
} // namespace dom
} // namespace mozilla
/**
* This frame type is used for <input type=search>.
*/
class nsSearchControlFrame final : public nsTextControlFrame {
friend nsIFrame* NS_NewSearchControlFrame(mozilla::PresShell* aPresShell,
ComputedStyle* aStyle);
using PseudoStyleType = mozilla::PseudoStyleType;
using Element = mozilla::dom::Element;
explicit nsSearchControlFrame(ComputedStyle* aStyle,
nsPresContext* aPresContext);
public:
NS_DECL_QUERYFRAME
NS_DECL_FRAMEARENA_HELPERS(nsSearchControlFrame)
void DestroyFrom(nsIFrame* aDestructRoot,
PostDestroyData& aPostDestroyData) override;
// nsIAnonymousContentCreator
nsresult CreateAnonymousContent(nsTArray<ContentInfo>& aElements) override;
void AppendAnonymousContentTo(nsTArray<nsIContent*>& aElements,
uint32_t aFilter) override;
#ifdef DEBUG_FRAME_DUMP
nsresult GetFrameName(nsAString& aResult) const override {
return MakeFrameName(u"SearchControl"_ns, aResult);
}
#endif
Element* GetAnonClearButton() const { return mClearButton; }
/**
* Update visbility of the clear button depending on the value
*/
void UpdateClearButtonState();
private:
// See nsSearchControlFrame::CreateAnonymousContent of a description of these
RefPtr<Element> mOuterWrapper;
RefPtr<Element> mClearButton;
};
#endif // nsSearchControlFrame_h__

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

@ -335,25 +335,33 @@ nsresult nsTextControlFrame::EnsureEditorInitialized() {
return NS_OK;
}
already_AddRefed<Element> nsTextControlFrame::CreateEmptyAnonymousDiv(
PseudoStyleType aPseudoType) const {
already_AddRefed<Element> nsTextControlFrame::MakeAnonElement(
PseudoStyleType aPseudoType, Element* aParent, nsAtom* aTag) const {
MOZ_ASSERT(aPseudoType != PseudoStyleType::NotPseudo);
Document* doc = PresContext()->Document();
RefPtr<NodeInfo> nodeInfo = doc->NodeInfoManager()->GetNodeInfo(
nsGkAtoms::div, nullptr, kNameSpaceID_XHTML, nsINode::ELEMENT_NODE);
RefPtr<Element> div = NS_NewHTMLDivElement(nodeInfo.forget());
div->SetPseudoElementType(aPseudoType);
RefPtr<Element> element = doc->CreateHTMLElement(aTag);
element->SetPseudoElementType(aPseudoType);
if (aPseudoType == PseudoStyleType::mozTextControlEditingRoot) {
// Make our root node editable
div->SetFlags(NODE_IS_EDITABLE);
element->SetFlags(NODE_IS_EDITABLE);
}
return div.forget();
if (aPseudoType == PseudoStyleType::mozNumberSpinDown ||
aPseudoType == PseudoStyleType::mozNumberSpinUp) {
element->SetAttr(kNameSpaceID_None, nsGkAtoms::aria_hidden, u"true"_ns,
false);
}
if (aParent) {
aParent->AppendChildTo(element, false);
}
return element.forget();
}
already_AddRefed<Element>
nsTextControlFrame::CreateEmptyAnonymousDivWithTextNode(
already_AddRefed<Element> nsTextControlFrame::MakeAnonDivWithTextNode(
PseudoStyleType aPseudoType) const {
RefPtr<Element> divElement = CreateEmptyAnonymousDiv(aPseudoType);
RefPtr<Element> divElement = MakeAnonElement(aPseudoType);
// Create the text node for the anonymous <div> element.
RefPtr<nsTextNode> textNode = new (divElement->OwnerDoc()->NodeInfoManager())
@ -383,8 +391,7 @@ nsresult nsTextControlFrame::CreateAnonymousContent(
RefPtr<TextControlElement> textControlElement =
TextControlElement::FromNode(GetContent());
MOZ_ASSERT(textControlElement);
mRootNode =
CreateEmptyAnonymousDiv(PseudoStyleType::mozTextControlEditingRoot);
mRootNode = MakeAnonElement(PseudoStyleType::mozTextControlEditingRoot);
if (NS_WARN_IF(!mRootNode)) {
return NS_ERROR_FAILURE;
}
@ -482,8 +489,7 @@ void nsTextControlFrame::CreatePlaceholderIfNeeded() {
return;
}
mPlaceholderDiv =
CreateEmptyAnonymousDivWithTextNode(PseudoStyleType::placeholder);
mPlaceholderDiv = MakeAnonDivWithTextNode(PseudoStyleType::placeholder);
mPlaceholderDiv->GetFirstChild()->AsText()->SetText(placeholderTxt, false);
}
@ -495,8 +501,7 @@ void nsTextControlFrame::CreatePreviewIfNeeded() {
return;
}
mPreviewDiv = CreateEmptyAnonymousDivWithTextNode(
PseudoStyleType::mozTextControlPreview);
mPreviewDiv = MakeAnonDivWithTextNode(PseudoStyleType::mozTextControlPreview);
}
void nsTextControlFrame::AppendAnonymousContentTo(

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

@ -32,6 +32,8 @@ class nsTextControlFrame : public nsContainerFrame,
public nsIAnonymousContentCreator,
public nsITextControlFrame,
public nsIStatefulFrame {
using Element = mozilla::dom::Element;
public:
NS_DECL_FRAMEARENA_HELPERS(nsTextControlFrame)
@ -207,11 +209,11 @@ class nsTextControlFrame : public nsContainerFrame,
public: // for methods who access nsTextControlFrame directly
void SetValueChanged(bool aValueChanged);
mozilla::dom::Element* GetRootNode() const { return mRootNode; }
Element* GetRootNode() const { return mRootNode; }
mozilla::dom::Element* GetPreviewNode() const { return mPreviewDiv; }
Element* GetPreviewNode() const { return mPreviewDiv; }
mozilla::dom::Element* GetPlaceholderNode() const { return mPlaceholderDiv; }
Element* GetPlaceholderNode() const { return mPlaceholderDiv; }
// called by the focus listener
nsresult MaybeBeginSecureKeyboardInput();
@ -328,17 +330,18 @@ class nsTextControlFrame : public nsContainerFrame,
nsresult CreateRootNode();
void CreatePlaceholderIfNeeded();
void CreatePreviewIfNeeded();
already_AddRefed<mozilla::dom::Element> CreateEmptyAnonymousDiv(
mozilla::PseudoStyleType) const;
already_AddRefed<mozilla::dom::Element> CreateEmptyAnonymousDivWithTextNode(
already_AddRefed<Element> MakeAnonElement(
mozilla::PseudoStyleType, Element* aParent = nullptr,
nsAtom* aTag = nsGkAtoms::div) const;
already_AddRefed<Element> MakeAnonDivWithTextNode(
mozilla::PseudoStyleType) const;
bool ShouldInitializeEagerly() const;
void InitializeEagerlyIfNeeded();
RefPtr<mozilla::dom::Element> mRootNode;
RefPtr<mozilla::dom::Element> mPlaceholderDiv;
RefPtr<mozilla::dom::Element> mPreviewDiv;
RefPtr<Element> mRootNode;
RefPtr<Element> mPlaceholderDiv;
RefPtr<Element> mPreviewDiv;
RefPtr<nsAnonDivObserver> mMutationObserver;
// Cache of the |.value| of <input> or <textarea> element without hard-wrap.
// If its IsVoid() returns true, it doesn't cache |.value|.

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

@ -93,6 +93,7 @@ FRAME_CLASSES = [
Frame("nsRubyTextFrame", "RubyText", NOT_LEAF),
Frame("nsScrollbarButtonFrame", "Box", NOT_LEAF),
Frame("nsScrollbarFrame", "Scrollbar", NOT_LEAF),
Frame("nsSearchControlFrame", "SearchControl", LEAF),
Frame("nsSelectsAreaFrame", "Block", NOT_LEAF),
Frame("nsPageSequenceFrame", "PageSequence", NOT_LEAF),
Frame("nsSliderFrame", "Slider", NOT_LEAF),

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

@ -154,6 +154,8 @@ nsIFrame* NS_NewNumberControlFrame(mozilla::PresShell* aPresShell,
mozilla::ComputedStyle* aStyle);
nsIFrame* NS_NewDateTimeControlFrame(mozilla::PresShell* aPresShell,
mozilla::ComputedStyle* aStyle);
nsIFrame* NS_NewSearchControlFrame(mozilla::PresShell* aPresShell,
mozilla::ComputedStyle* aStyle);
nsBlockFrame* NS_NewDetailsFrame(mozilla::PresShell* aPresShell,
mozilla::ComputedStyle* aStyle);
nsIFrame* NS_NewBulletFrame(mozilla::PresShell* aPresShell,

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

@ -4,7 +4,7 @@
<style>
/* None of these selectors should match from content */
input[type=number]::-moz-number-wrapper,
input[type=number]::-moz-complex-control-wrapper,
input[type=number]::-moz-number-spin-box,
input[type=number]::-moz-number-spin-up,
input[type=number]::-moz-number-spin-down {

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

@ -56,9 +56,8 @@ CSS_PSEUDO_ELEMENT(mozFocusInner, ":-moz-focus-inner", 0)
CSS_PSEUDO_ELEMENT(mozFocusOuter, ":-moz-focus-outer", 0)
// HTML5 Forms pseudo elements
CSS_PSEUDO_ELEMENT(mozNumberWrapper, ":-moz-number-wrapper",
CSS_PSEUDO_ELEMENT_SUPPORTS_USER_ACTION_STATE |
CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS_AND_CHROME)
CSS_PSEUDO_ELEMENT(mozComplexControlWrapper, ":-moz-complex-control-wrapper",
CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS)
CSS_PSEUDO_ELEMENT(mozNumberSpinBox, ":-moz-number-spin-box",
CSS_PSEUDO_ELEMENT_SUPPORTS_USER_ACTION_STATE |
CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS_AND_CHROME)
@ -68,6 +67,9 @@ CSS_PSEUDO_ELEMENT(mozNumberSpinUp, ":-moz-number-spin-up",
CSS_PSEUDO_ELEMENT(mozNumberSpinDown, ":-moz-number-spin-down",
CSS_PSEUDO_ELEMENT_SUPPORTS_USER_ACTION_STATE |
CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS_AND_CHROME)
CSS_PSEUDO_ELEMENT(mozSearchClearButton, ":-moz-search-clear-button",
CSS_PSEUDO_ELEMENT_SUPPORTS_USER_ACTION_STATE |
CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS_AND_CHROME)
CSS_PSEUDO_ELEMENT(mozProgressBar, ":-moz-progress-bar",
CSS_PSEUDO_ELEMENT_SUPPORTS_USER_ACTION_STATE)
CSS_PSEUDO_ELEMENT(mozRangeTrack, ":-moz-range-track",

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

@ -912,7 +912,7 @@ input[type="number"] {
-moz-default-appearance: number-input;
}
input[type=number]::-moz-number-wrapper {
input:is([type=number], [type=search])::-moz-complex-control-wrapper {
/* Prevent styling that would change the type of frame we construct. */
display: flex;
float: none !important;
@ -923,7 +923,7 @@ input[type=number]::-moz-number-wrapper {
overflow: -moz-hidden-unscrollable;
}
input[type=number]::-moz-text-control-editing-root {
input:is([type=number], [type=search])::-moz-text-control-editing-root {
display: block; /* Flex items must be block-level. Normally we do fixup in
the style system to ensure this, but that fixup is disabled
inside of form controls. So, we hardcode display here. */
@ -1002,6 +1002,20 @@ input[type="number"] > div > div > div:hover {
background-color: lightblue;
}
input[type=search]::-moz-search-clear-button {
display: block;
cursor: default;
width: 1em;
height: 1em;
max-height: 1em;
margin-inline-start: 1px;
align-self: center;
background-image: url(chrome://global/skin/icons/searchfield-cancel.svg);
background-repeat: no-repeat;
background-position: center;
background-size: contain;
}
input[type="date"],
input[type="time"] {
overflow: hidden !important;

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

@ -3,12 +3,16 @@
<script src="/resources/testharnessreport.js"></script>
<style id="sheet"></style>
<script>
// Even though some of these no longer exist, we still do want to test that
// they aren't exposed to the web.
const NON_CONTENT_ACCESIBLE_PSEUDOS = [
"::-moz-complex-control-wrapper",
"::-moz-number-wrapper",
"::-moz-number-text",
"::-moz-number-spin-up",
"::-moz-number-spin-down",
"::-moz-number-spin-box",
"::-moz-number-text",
"::-moz-search-clear-button",
":-moz-native-anonymous",
":-moz-use-shadow-tree-root",

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

@ -985,22 +985,27 @@ static int nr_ice_component_process_incoming_check(nr_ice_component *comp, nr_tr
static int nr_ice_component_stun_server_cb(void *cb_arg,nr_stun_server_ctx *stun_ctx,nr_socket *sock, nr_stun_server_request *req, int *dont_free, int *error)
{
nr_ice_component *comp=cb_arg;
nr_ice_component *pcomp=cb_arg;
nr_transport_addr local_addr;
int r,_status;
if(comp->state==NR_ICE_COMPONENT_FAILED) {
if(pcomp->state==NR_ICE_COMPONENT_FAILED) {
*error=400;
ABORT(R_REJECTED);
}
if (pcomp->local_component->stream->obsolete) {
/* Don't do any triggered check stuff in thiis case. */
return 0;
}
/* Find the candidate pair that this maps to */
if(r=nr_socket_getaddr(sock,&local_addr)) {
*error=500;
ABORT(r);
}
if (r=nr_ice_component_process_incoming_check(comp, &local_addr, req, error))
if (r=nr_ice_component_process_incoming_check(pcomp, &local_addr, req, error))
ABORT(r);
_status=0;

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

@ -6250,6 +6250,13 @@
value: @IS_EARLY_BETA_OR_EARLIER@
mirror: always
# Enables the <input type=search> custom layout frame with a clear icon.
# Still needs tests and a web-exposed way to remove that icon, see bug 1654288.
- name: layout.forms.input-type-search.enabled
type: bool
value: false
mirror: always
# Pref to control browser frame rate, in Hz. A value <= 0 means choose
# automatically based on knowledge of the platform (or 60Hz if no platform-
# specific information is available).

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

@ -105,7 +105,13 @@ raptor-youtube-playback-h264-fennec68:
description: "Raptor YouTube Playback H264 on Fennec68"
try-name: raptor-youtube-playback-h264-fennec68
treeherder-symbol: Rap(ytp-h264)
run-on-projects: []
run-on-projects:
by-test-platform:
android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
android-hw-g5.*/pgo: ['mozilla-central']
android-hw-g5.*-shippable/opt: ['mozilla-central']
default: []
mozharness:
extra-options:
- --test=raptor-youtube-playback-h264-std-fennec68

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

@ -237,7 +237,13 @@ raptor-youtube-playback-av1-sfr-geckoview:
description: "Raptor YouTube Playback AV1 SFR on GeckoView"
try-name: raptor-youtube-playback-av1-sfr-geckoview
treeherder-symbol: Rap(ytp-av1-sfr)
run-on-projects: []
run-on-projects:
by-test-platform:
android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
android-hw-g5.*/pgo: ['mozilla-central']
android-hw-g5.*-shippable/opt: ['mozilla-central']
default: []
max-run-time: 3600
mozharness:
extra-options:
@ -250,7 +256,13 @@ raptor-youtube-playback-h264-sfr-geckoview:
description: "Raptor YouTube Playback H264 SFR on GeckoView"
try-name: raptor-youtube-playback-h264-sfr-geckoview
treeherder-symbol: Rap(ytp-h264-sfr)
run-on-projects: []
run-on-projects:
by-test-platform:
android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
android-hw-g5.*/pgo: ['mozilla-central']
android-hw-g5.*-shippable/opt: ['mozilla-central']
default: []
max-run-time: 3600
mozharness:
extra-options:
@ -263,7 +275,13 @@ raptor-youtube-playback-h264-geckoview:
description: "Raptor YouTube Playback H264 on GeckoView"
try-name: raptor-youtube-playback-h264-geckoview
treeherder-symbol: Rap(ytp-h264)
run-on-projects: []
run-on-projects:
by-test-platform:
android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
android-hw-g5.*/pgo: ['mozilla-central']
android-hw-g5.*-shippable/opt: ['mozilla-central']
default: []
max-run-time: 3600
mozharness:
extra-options:
@ -276,7 +294,11 @@ raptor-youtube-playback-vp9-sfr-geckoview:
description: "Raptor YouTube Playback VP9 SFR on GeckoView"
try-name: raptor-youtube-playback-vp9-sfr-geckoview
treeherder-symbol: Rap(ytp-vp9-sfr)
run-on-projects: []
run-on-projects:
by-test-platform:
android-hw-p2.*aarch64.*/pgo: ['mozilla-central']
android-hw-p2.*aarch64-shippable/opt: ['mozilla-central']
default: []
max-run-time: 3600
mozharness:
extra-options:

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

@ -626,7 +626,11 @@ raptor-youtube-playback-av1-sfr-firefox:
variants: ["fission"]
try-name: raptor-youtube-playback-av1-sfr-firefox
treeherder-symbol: Rap(ytp-av1-sfr)
run-on-projects: []
run-on-projects:
by-test-platform:
windows10-64-ref-hw-2017/opt: ['mozilla-central']
(linux|windows|macos)(?!.*shippable).*: []
default: ['mozilla-central']
limit-platforms:
- windows10-64-ref-hw-2017/opt
- macosx1014-64-shippable/opt
@ -643,7 +647,11 @@ raptor-youtube-playback-h264-sfr-firefox:
variants: ["fission"]
try-name: raptor-youtube-playback-h264-sfr-firefox
treeherder-symbol: Rap(ytp-h264-sfr)
run-on-projects: []
run-on-projects:
by-test-platform:
windows10-64-ref-hw-2017/opt: ['mozilla-central']
(linux|windows|macos)(?!.*shippable).*: []
default: ['mozilla-central']
max-run-time:
by-test-platform:
windows10-aarch64/opt: 3600
@ -657,7 +665,11 @@ raptor-youtube-playback-h264-firefox:
variants: ["fission"]
try-name: raptor-youtube-playback-h264-firefox
treeherder-symbol: Rap(ytp-h264)
run-on-projects: []
run-on-projects:
by-test-platform:
windows10-64-ref-hw-2017/opt: ['mozilla-central']
(linux|windows|macos)(?!.*shippable).*: []
default: ['mozilla-central']
max-run-time: 3600
tier: 2
mozharness:
@ -669,7 +681,11 @@ raptor-youtube-playback-vp9-sfr-firefox:
variants: ["fission"]
try-name: raptor-youtube-playback-vp9-sfr-firefox
treeherder-symbol: Rap(ytp-vp9-sfr)
run-on-projects: []
run-on-projects:
by-test-platform:
windows10-64-ref-hw-2017/opt: ['mozilla-central']
(linux|windows|macos)(?!.*shippable).*: []
default: ['mozilla-central']
max-run-time:
by-test-platform:
windows10-aarch64/opt: 3600
@ -683,7 +699,11 @@ raptor-youtube-playback-widevine-hfr-firefox:
variants: ["fission"]
try-name: raptor-youtube-playback-widevine-hfr-firefox
treeherder-symbol: Rap(ytp-widevine-hfr)
run-on-projects: []
run-on-projects:
by-test-platform:
windows10-64-ref-hw-2017/opt: ['mozilla-central']
(linux|windows|macos)(?!.*shippable).*: []
default: ['mozilla-central']
max-run-time:
by-test-platform:
windows10-aarch64/opt: 3600
@ -697,7 +717,11 @@ raptor-youtube-playback-widevine-h264-sfr-firefox:
variants: ["fission"]
try-name: raptor-youtube-playback-widevine-h264-sfr-firefox
treeherder-symbol: Rap(ytp-widevine-h264-sfr)
run-on-projects: []
run-on-projects:
by-test-platform:
windows10-64-ref-hw-2017/opt: ['mozilla-central']
(linux|windows|macos)(?!.*shippable).*: []
default: ['mozilla-central']
max-run-time:
by-test-platform:
windows10-aarch64/opt: 3600
@ -711,7 +735,11 @@ raptor-youtube-playback-widevine-vp9-sfr-firefox:
variants: ["fission"]
try-name: raptor-youtube-playback-widevine-vp9-sfr-firefox
treeherder-symbol: Rap(ytp-widevine-vp9-sfr)
run-on-projects: []
run-on-projects:
by-test-platform:
windows10-64-ref-hw-2017/opt: ['mozilla-central']
(linux|windows|macos)(?!.*shippable).*: []
default: ['mozilla-central']
max-run-time:
by-test-platform:
windows10-aarch64/opt: 3600

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

@ -687,9 +687,6 @@ def target_tasks_general_perf_testing(full_task_graph, parameters, graph_config)
if 'tp6' in try_name and 'amazon' in try_name:
return True
else:
# Bug 1652451 - Perma-failing due to server issues
if 'youtube-playback' in try_name and 'youtube-playback-chrome' not in try_name:
return False
# Run tests on all chrome variants
if '-chrome' in try_name:
return True

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

@ -4,16 +4,57 @@ Change log
All notable changes to this program is documented in this file.
0.27.0
------
0.27.0 (2020-07-27)
--------------------
### Known problems
- _macOS 10.15 (Catalina):_
Due to the requirement from Apple that all programs must be
notarized, geckodriver will not work on Catalina if you manually
download it through another notarized program, such as Firefox.
Whilst we are working on a repackaging fix for this problem, you
can find more details on how to work around this issue in the
[macOS notarization] section of the documentation.
### Added
- To set environment variables for the launched Firefox, it is now
possible to add an `env` object on `moz:firefoxOptions`
- To set environment variables for the launched Firefox for Android,
it is now possible to add an `env` object on `moz:firefoxOptions`
(note: this is not supported for Firefox Desktop)
0.26.0
------
- Support for print-to-PDF
The newly standardised WebDriver [Print] endpoint provides a way to
render pages to a paginated PDF representation. This endpoint is
supported by geckodriver when using Firefox version ≥78.
- Support for same-site cookies
Cookies can now be set with a `same-site` parameter, and the value
of that parameter will be returned when cookies are
retrieved. Requires Firefox version ≥79. Thanks to [Peter Major] for
the patch.
### Fixed
- _Android:_
* Firefox running on Android devices can now be controlled from a
Windows host.
* Setups with multiple connected Android devices are now supported.
* Improved cleanup of configuration files. This prevents crashes if
the application is started manually after launching it through
geckodriver.
- Windows and Linux binaries are again statically linked.
0.26.0 (2019-10-12, `e9783a644016'`)
------------------------------------
Note that with this release the minimum recommended Firefox version
has changed to Firefox ≥60.
@ -1335,6 +1376,7 @@ and greater.
[Minimize Window]: https://w3c.github.io/webdriver/webdriver-spec.html#minimize-window
[New Session]: https://w3c.github.io/webdriver/webdriver-spec.html#new-session
[New Window]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Commands/New_Window
[Print]: https://w3c.github.io/webdriver/webdriver-spec.html#print
[Send Alert Text]: https://w3c.github.io/webdriver/webdriver-spec.html#send-alert-text
[Set Timeouts]: https://w3c.github.io/webdriver/webdriver-spec.html#set-timeouts
[Set Window Rect]: https://w3c.github.io/webdriver/webdriver-spec.html#set-window-rect
@ -1350,6 +1392,7 @@ and greater.
[Kriti Singh]: https://github.com/kritisingh1
[Mike Pennisi]: https://github.com/jugglinmike
[Nupur Baghel]: https://github.com/nupurbaghel
[Peter Major]: https://github.com/aldaris
[Shivam Singhal]: https://github.com/championshuttler
[Sven Jost]: https://github/mythsunwind
[Vlad Filippov]: https://github.com/vladikoff

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

@ -1,6 +1,6 @@
[package]
name = "geckodriver"
version = "0.26.0"
version = "0.27.0"
description = "Proxy for using WebDriver clients to interact with Gecko-based browsers."
keywords = ["webdriver", "w3c", "httpd", "mozilla", "firefox"]
repository = "https://hg.mozilla.org/mozilla-central/file/tip/testing/geckodriver"

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

@ -6,17 +6,12 @@ projects canonical home was on GitHub. Today geckodriver is hosted
in [mozilla-central], and whilst we do want to make future releases
from [Mozillas CI infrastructure], we are currently in between two
worlds: development happens in m-c, but releases continue to be made
from GitHub using Travis CI.
The reason for this is that we haven't setup the release pipeline
for TaskCluster builds yet, which would also include [signed releases]
on Windows.
from GitHub.
In any case, the steps to release geckodriver are as follows:
[mozilla-central]: https://hg.mozilla.org/mozilla-central/
[Mozillas CI infrastructure]: https://treeherder.mozilla.org/
[signed releases]: https://github.com/mozilla/geckodriver/issues/292
Update in-tree dependency crates
@ -27,6 +22,7 @@ central by using relative paths:
[dependencies]
mozdevice = { path = "../mozbase/rust/mozdevice" }
mozprofile = { path = "../mozbase/rust/mozprofile" }
mozrunner = { path = "../mozbase/rust/mozrunner" }
mozversion = { path = "../mozbase/rust/mozversion" }
@ -38,6 +34,7 @@ GitHub repository when we release, we first need to publish these
crates if they have had any changes in the interim since the last
release. If they have received no changes, you can skip them:
- `testing/mozbase/rust/mozdevice`
- `testing/mozbase/rust/mozprofile`
- `testing/mozbase/rust/mozrunner`
- `testing/mozbase/rust/mozversion`
@ -218,41 +215,40 @@ or if you cannot use signing use:
% git add .
% git commit -am "import of vX.Y.Z" (unsigned)
Then push the changes:
% git push
As indicated above, the changes you make to this branch will not
be upstreamed back into mozilla-central. It is merely used as a
staging ground for pushing builds to Travis CI.
place for external consumers to build their own version of geckodriver.
[GPG key]: https://help.github.com/articles/signing-commits/
Tag the release
---------------
Run the following command to tag the release:
% git tag 'vX.Y.Z'
Make the release
----------------
geckodriver is released and automatically uploaded from Travis CI by
pushing a new version tag to the _release_ branch:
geckodriver needs to be manually released on github.com. Therefore start to
[draft a new release], and make the following changes:
% git push
% git push --tags
1. Specify the "Tag version", and select "Release" as target.
2. Leave the release title empty
Update the release description
------------------------------
3. Paste the raw Markdown source from [CHANGES.md] into the description field.
This will highlight for end-users what changes were made in that particular
package when they visit the GitHub downloads section. Make sure to check that
all references can be resolved, and if not make sure to add those too.
4. Find the signed geckodriver archives in the [taskcluster index] by
replacing %changeset% with the full release changeset id. Rename the
individual files so the basename looks like 'geckodriver-v%version%-%platform%'.
Upload them all, including the checksum files for both the Linux platforms.
[draft a new release]: https://github.com/mozilla/geckodriver/releases/new
[taskcluster index]: https://firefox-ci-tc.services.mozilla.com/tasks/index/gecko.v2.mozilla-central.revision.%changeset%.geckodriver
Once the release binaries have been built and are available on the
[releases page] update the details of the new release by clicking
`Edit`. Therefore copy the raw Markdown source from [CHANGES.md]
into the description field. This will highlight for end-users what
changes were made in that particular package when they visit the
GitHub downloads section. Make sure to check that all references
can be resolved, and if not make sure to add those too.
Congratulations! Youve released geckodriver!

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

@ -1,7 +1,7 @@
[package]
name = "mozdevice"
version = "0.1.0"
authors = ["Nick Alexander <nalexander@mozilla.com>", "Henrik Skupin <mail@hskupin.info>"]
version = "0.2.0"
authors = ["Mozilla"]
description = "Client library for the Android Debug Bridge (adb)"
keywords = ["mozilla", "firefox", "geckoview", "android", "adb"]
repository = "https://hg.mozilla.org/mozilla-central/file/tip/testing/mozbase/rust/mozdevice"

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

@ -1,6 +1,6 @@
[package]
name = "mozprofile"
version = "0.6.0"
version = "0.7.0"
authors = ["Mozilla"]
description = "Library for working with Mozilla profiles."
repository = "https://hg.mozilla.org/mozilla-central/file/tip/testing/mozbase/rust/mozprofile"

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

@ -1,6 +1,6 @@
[package]
name = "mozrunner"
version = "0.10.0"
version = "0.11.0"
authors = ["Mozilla"]
description = "Reliable Firefox process management."
repository = "https://hg.mozilla.org/mozilla-central/file/tip/testing/mozbase/rust/mozrunner"
@ -9,7 +9,7 @@ edition = "2018"
[dependencies]
log = "0.4"
mozprofile = { path = "../mozprofile", version = "0.6" }
mozprofile = { path = "../mozprofile", version = "0.7" }
plist = "0.5"
[target.'cfg(target_os = "windows")'.dependencies]

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

@ -1,7 +1,7 @@
[package]
name = "mozversion"
version = "0.2.1"
authors = ["James Graham <james@hoppipolla.co.uk>"]
version = "0.3.0"
authors = ["Mozilla"]
description = "Utility for accessing Firefox version metadata"
keywords = ["mozilla", "firefox"]
repository = "https://hg.mozilla.org/mozilla-central/file/tip/testing/mozbase/rust/mozversion"

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

@ -1,9 +1,7 @@
[iframe-all-local-schemes-inherit-self.sub.html]
expected:
if (os == "android") and not debug: ["TIMEOUT", "OK"]
TIMEOUT
["TIMEOUT", "OK"]
[<iframe>'s about:blank inherits policy.]
expected:
if (os == "android") and not debug: ["TIMEOUT", "PASS"]
TIMEOUT
["TIMEOUT", "PASS"]

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

@ -100,7 +100,7 @@
[cross-origin > w => w.frames]
expected:
if not debug and (os == "linux") and not webrender: ["NOTRUN", "TIMEOUT"]
if not debug and (os == "linux") and not webrender: ["NOTRUN", "TIMEOUT", "FAIL"]
if debug and (os == "mac"): ["TIMEOUT", "FAIL", "NOTRUN"]
if debug and (os == "win"): FAIL
if debug and (os == "linux"): ["FAIL", "TIMEOUT"]
@ -136,6 +136,10 @@
[same-site > w => w[0\] = ""]
expected: NOTRUN
[cross-origin > w => w[0\]]
expected:
if asan and (os == "linux") and not webrender: TIMEOUT
[cross-origin > w => w.window]
expected: NOTRUN

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

@ -1,5 +1,6 @@
[reporting-popup-unsafe-none-report-to.https.html]
expected:
if asan and (os == "linux") and not webrender: OK
if debug: OK
TIMEOUT
[coop reporting test reporting same origin with report-to to CROSS_ORIGIN with same-origin; report-to="coop-popup-report-endpoint", , , ]
@ -7,6 +8,7 @@
if not debug and (os == "win") and not webrender and (processor == "x86_64"): NOTRUN
if not debug and (os == "win") and not webrender and (processor == "x86"): TIMEOUT
if not debug and (os == "win") and webrender: ["NOTRUN", "TIMEOUT"]
if asan and (os == "linux") and not webrender: FAIL
if not debug and (os == "linux"): NOTRUN
if not debug and (os == "mac"): NOTRUN
FAIL
@ -15,12 +17,14 @@
expected:
if not debug and (os == "win") and not webrender and (processor == "x86_64"): TIMEOUT
if not debug and (os == "win") and webrender: ["TIMEOUT", "FAIL"]
if asan and (os == "linux") and not webrender: FAIL
if not debug and (os == "linux"): TIMEOUT
if not debug and (os == "mac"): TIMEOUT
FAIL
[verify remaining reports]
expected:
if asan and (os == "linux") and not webrender: PASS
if debug: PASS
NOTRUN

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

@ -1,6 +1,6 @@
[package]
name = "webdriver"
version = "0.40.2"
version = "0.41.0"
authors = ["Mozilla"]
description = "Library implementing the wire protocol for the W3C WebDriver specification."
keywords = ["webdriver", "browser", "automation", "protocol", "w3c"]

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

@ -15,6 +15,7 @@
static get inheritedAttributes() {
return {
"#scrollbutton-up": "disabled=scrolledtostart",
".scrollbox-clip": "orient",
scrollbox: "orient,align,pack,dir,smoothscroll",
"#scrollbutton-down": "disabled=scrolledtoend",
};
@ -26,9 +27,11 @@
<html:link rel="stylesheet" href="chrome://global/skin/arrowscrollbox.css"/>
<toolbarbutton id="scrollbutton-up" part="scrollbutton-up"/>
<spacer part="overflow-start-indicator"/>
<scrollbox part="scrollbox" flex="1">
<html:slot/>
</scrollbox>
<box class="scrollbox-clip" part="scrollbox-clip" flex="1">
<scrollbox part="scrollbox" flex="1">
<html:slot/>
</scrollbox>
</box>
<spacer part="overflow-end-indicator"/>
<toolbarbutton id="scrollbutton-down" part="scrollbutton-down"/>
`;

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

@ -98,6 +98,10 @@
}
:host(.in-menulist) arrowscrollbox::part(scrollbox) {
overflow: auto;
margin: 0;
}
:host(.in-menulist) arrowscrollbox::part(scrollbox-clip) {
overflow: visible;
}
`;

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

@ -129,7 +129,6 @@ menuitem[_moz-menuactive="true"] {
menuitem[customoptionstyling="true"] {
appearance: none;
padding-block: 0;
}
/* menu/menuitems in menulist popups */
@ -172,31 +171,31 @@ menuseparator {
/* Scroll buttons */
.menupopup-arrowscrollbox:not(:-moz-lwtheme)::part(scrollbutton-up),
.menupopup-arrowscrollbox:not(:-moz-lwtheme)::part(scrollbutton-down) {
position: relative;
/* Here we're using a little magic.
* The arrow button is supposed to overlay the scrollbox, blocking
* everything under it from reaching the screen. However, the menu background
* is slightly transparent, so how can we block something completely without
* messing up the transparency? It's easy: The native theming of the
* "menuitem" appearance uses CGContextClearRect before drawing, which
* clears everything under it.
* Without help from native theming this effect wouldn't be achievable.
*/
appearance: auto;
-moz-default-appearance: menuitem;
/* Hide arrow buttons when there's nothing to scroll in that direction */
.menupopup-arrowscrollbox[scrolledtostart="true"]::part(scrollbutton-up),
.menupopup-arrowscrollbox[scrolledtoend="true"]::part(scrollbutton-down) {
visibility: collapse;
}
.menupopup-arrowscrollbox:not(:-moz-lwtheme)::part(scrollbutton-up) {
margin-bottom: -16px;
}
.menupopup-arrowscrollbox:not(:-moz-lwtheme)::part(scrollbutton-down) {
/* Prevent the scrolled contents of the menupopup from jumping vertically when
* the arrow buttons appear / disappear, by positioning ::part(scrollbox) in
* such a way that its edges are at the same position as the edges of
* arrowscrollbox regardless of scroll button visibility.
*/
.menupopup-arrowscrollbox:not([scrolledtostart="true"])::part(scrollbox) {
/* scrollbutton-up is visible; shift our top edge up by its height. */
margin-top: -16px;
}
.menupopup-arrowscrollbox:not(:-moz-lwtheme)[scrolledtostart="true"]::part(scrollbutton-up),
.menupopup-arrowscrollbox:not(:-moz-lwtheme)[scrolledtoend="true"]::part(scrollbutton-down) {
visibility: collapse;
.menupopup-arrowscrollbox:not([scrolledtoend="true"])::part(scrollbox) {
/* scrollbutton-down is visible; shift our bottom edge down by its height. */
margin-bottom: -16px;
}
.menupopup-arrowscrollbox::part(scrollbox-clip) {
/* In the space where the arrow buttons overlap the scrollbox, clip away the
* scrollbox so that nothing is shown behind the arrow button even if the
* button is transparent.
*/
overflow: hidden;
}

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

@ -53,10 +53,11 @@ void clipboard_get_cb(GtkClipboard* aGtkClipboard,
// Callback when someone asks us to clear a clipboard
void clipboard_clear_cb(GtkClipboard* aGtkClipboard, gpointer user_data);
static void ConvertHTMLtoUCS2(const char* data, int32_t dataLength,
char16_t** unicodeData, int32_t& outUnicodeLen);
static bool ConvertHTMLtoUCS2(const char* data, int32_t dataLength,
nsCString& charset, char16_t** unicodeData,
int32_t& outUnicodeLen);
static void GetHTMLCharset(const char* data, int32_t dataLength,
static bool GetHTMLCharset(const char* data, int32_t dataLength,
nsCString& str);
GdkAtom GetSelectionAtom(int32_t aWhichClipboard) {
@ -245,6 +246,13 @@ nsClipboard::GetData(nsITransferable* aTransferable, int32_t aWhichClipboard) {
return rv;
}
#ifdef MOZ_LOGGING
LOGCLIP(("Flavors which can be imported:\n"));
for (uint32_t i = 0; i < flavors.Length(); i++) {
LOGCLIP((" %s\n", flavors[i].get()));
}
#endif
for (uint32_t i = 0; i < flavors.Length(); i++) {
nsCString& flavorStr = flavors[i];
@ -257,6 +265,8 @@ nsClipboard::GetData(nsITransferable* aTransferable, int32_t aWhichClipboard) {
flavorStr.Assign(kJPEGImageMime);
}
LOGCLIP((" Getting image %s MIME clipboard data\n", flavorStr.get()));
uint32_t clipboardDataLength;
const char* clipboardData = mContext->GetClipboardData(
flavorStr.get(), aWhichClipboard, &clipboardDataLength);
@ -279,6 +289,9 @@ nsClipboard::GetData(nsITransferable* aTransferable, int32_t aWhichClipboard) {
// Special case text/unicode since we can convert any
// string into text/unicode
if (flavorStr.EqualsLiteral(kUnicodeMime)) {
LOGCLIP(
(" Getting unicode %s MIME clipboard data\n", flavorStr.get()));
const char* clipboardData = mContext->GetClipboardText(aWhichClipboard);
if (!clipboardData) {
LOGCLIP((" failed to get unicode data\n"));
@ -302,6 +315,8 @@ nsClipboard::GetData(nsITransferable* aTransferable, int32_t aWhichClipboard) {
return NS_OK;
}
LOGCLIP((" Getting %s MIME clipboard data\n", flavorStr.get()));
uint32_t clipboardDataLength;
const char* clipboardData = mContext->GetClipboardData(
flavorStr.get(), aWhichClipboard, &clipboardDataLength);
@ -320,11 +335,15 @@ nsClipboard::GetData(nsITransferable* aTransferable, int32_t aWhichClipboard) {
char16_t* htmlBody = nullptr;
int32_t htmlBodyLen = 0;
// Convert text/html into our unicode format
ConvertHTMLtoUCS2(clipboardData, clipboardDataLength, &htmlBody,
htmlBodyLen);
// Try next data format?
if (!htmlBodyLen) {
nsAutoCString charset;
if (!GetHTMLCharset(clipboardData, clipboardDataLength, charset)) {
// Fall back to utf-8 in case html/data is missing kHTMLMarkupPrefix.
LOGCLIP(("Failed to get html/text encoding, fall back to utf-8.\n"));
charset.AssignLiteral("utf-8");
}
if (!ConvertHTMLtoUCS2(clipboardData, clipboardDataLength, charset,
&htmlBody, htmlBodyLen)) {
LOGCLIP((" failed to convert text/html to UCS2.\n"));
mContext->ReleaseClipboardData(clipboardData);
continue;
}
@ -683,30 +702,27 @@ void clipboard_clear_cb(GtkClipboard* aGtkClipboard, gpointer user_data) {
* body : pass to Mozilla
* bodyLength: pass to Mozilla
*/
void ConvertHTMLtoUCS2(const char* data, int32_t dataLength,
bool ConvertHTMLtoUCS2(const char* data, int32_t dataLength, nsCString& charset,
char16_t** unicodeData, int32_t& outUnicodeLen) {
nsAutoCString charset;
GetHTMLCharset(data, dataLength, charset); // get charset of HTML
if (charset.EqualsLiteral("UTF-16")) { // current mozilla
if (charset.EqualsLiteral("UTF-16")) { // current mozilla
outUnicodeLen = (dataLength / 2) - 1;
*unicodeData = reinterpret_cast<char16_t*>(
moz_xmalloc((outUnicodeLen + sizeof('\0')) * sizeof(char16_t)));
memcpy(*unicodeData, data + sizeof(char16_t),
outUnicodeLen * sizeof(char16_t));
(*unicodeData)[outUnicodeLen] = '\0';
return true;
} else if (charset.EqualsLiteral("UNKNOWN")) {
outUnicodeLen = 0;
return;
return false;
} else {
// app which use "text/html" to copy&paste
// get the decoder
auto encoding = Encoding::ForLabelNoReplacement(charset);
if (!encoding) {
#ifdef DEBUG_CLIPBOARD
g_print(" get unicode decoder error\n");
#endif
LOGCLIP(("ConvertHTMLtoUCS2: get unicode decoder error\n"));
outUnicodeLen = 0;
return;
return false;
}
auto dataSpan = MakeSpan(data, dataLength);
@ -723,7 +739,7 @@ void ConvertHTMLtoUCS2(const char* data, int32_t dataLength,
decoder->MaxUTF16BufferLength(dataSpan.Length());
if (!needed.isValid() || needed.value() > INT32_MAX) {
outUnicodeLen = 0;
return;
return false;
}
outUnicodeLen = 0;
@ -743,8 +759,10 @@ void ConvertHTMLtoUCS2(const char* data, int32_t dataLength,
outUnicodeLen = written;
// null terminate.
(*unicodeData)[outUnicodeLen] = '\0';
return true;
} // if valid length
}
return false;
}
/*
@ -754,12 +772,13 @@ void ConvertHTMLtoUCS2(const char* data, int32_t dataLength,
* 2. "UNKNOWN": mozilla can't detect what encode it use
* 3. other: "text/html" with other charset than utf-16
*/
void GetHTMLCharset(const char* data, int32_t dataLength, nsCString& str) {
bool GetHTMLCharset(const char* data, int32_t dataLength, nsCString& str) {
// if detect "FFFE" or "FEFF", assume UTF-16
char16_t* beginChar = (char16_t*)data;
if ((beginChar[0] == 0xFFFE) || (beginChar[0] == 0xFEFF)) {
str.AssignLiteral("UTF-16");
return;
LOGCLIP(("GetHTMLCharset: Charset of HTML is UTF-16\n"));
return true;
}
// no "FFFE" and "FEFF", assume ASCII first to find "charset" info
const nsDependentCSubstring htmlStr(data, dataLength);
@ -784,10 +803,10 @@ void GetHTMLCharset(const char* data, int32_t dataLength, nsCString& str) {
if (valueStart != valueEnd) {
str = Substring(valueStart, valueEnd);
ToUpperCase(str);
#ifdef DEBUG_CLIPBOARD
printf("Charset of HTML = %s\n", charsetUpperStr.get());
#endif
return;
LOGCLIP(("GetHTMLCharset: Charset of HTML = %s\n", str.get()));
return true;
}
str.AssignLiteral("UNKNOWN");
LOGCLIP(("GetHTMLCharset: Failed to get HTML Charset!\n"));
return false;
}

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

@ -2463,10 +2463,11 @@ STATIC_ATOMS = [
PseudoElementAtom("PseudoElement_selection", ":selection"),
PseudoElementAtom("PseudoElement_mozFocusInner", ":-moz-focus-inner"),
PseudoElementAtom("PseudoElement_mozFocusOuter", ":-moz-focus-outer"),
PseudoElementAtom("PseudoElement_mozNumberWrapper", ":-moz-number-wrapper"),
PseudoElementAtom("PseudoElement_mozComplexControlWrapper", ":-moz-complex-control-wrapper"),
PseudoElementAtom("PseudoElement_mozNumberSpinBox", ":-moz-number-spin-box"),
PseudoElementAtom("PseudoElement_mozNumberSpinUp", ":-moz-number-spin-up"),
PseudoElementAtom("PseudoElement_mozNumberSpinDown", ":-moz-number-spin-down"),
PseudoElementAtom("PseudoElement_mozSearchClearButton", ":-moz-search-clear-button"),
PseudoElementAtom("PseudoElement_mozProgressBar", ":-moz-progress-bar"),
PseudoElementAtom("PseudoElement_mozRangeTrack", ":-moz-range-track"),
PseudoElementAtom("PseudoElement_mozRangeProgress", ":-moz-range-progress"),