зеркало из https://github.com/mozilla/gecko-dev.git
Merge autoland to mozilla-central. a=merge
This commit is contained in:
Коммит
2d3cb7b452
|
@ -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 @@ project’s canonical home was on GitHub. Today geckodriver is hosted
|
|||
in [mozilla-central], and whilst we do want to make future releases
|
||||
from [Mozilla’s 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/
|
||||
[Mozilla’s 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! You’ve 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"),
|
||||
|
|
Загрузка…
Ссылка в новой задаче