зеркало из https://github.com/mozilla/gecko-dev.git
Merge m-c to inbound, a=merge
MozReview-Commit-ID: 7UN77Uvxgus
This commit is contained in:
Коммит
d2b28917c0
|
@ -6,6 +6,7 @@
|
|||
/* import-globals-from ../../../toolkit/content/treeUtils.js */
|
||||
|
||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||
Components.utils.import("resource://gre/modules/AppConstants.jsm");
|
||||
|
||||
const nsIPermissionManager = Components.interfaces.nsIPermissionManager;
|
||||
const nsICookiePermission = Components.interfaces.nsICookiePermission;
|
||||
|
@ -334,6 +335,7 @@ var gPermissionManager = {
|
|||
} else if (AppConstants.platform == "macosx" &&
|
||||
aEvent.keyCode == KeyEvent.DOM_VK_BACK_SPACE) {
|
||||
this.onPermissionDeleted();
|
||||
aEvent.preventDefault();
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
@ -469,17 +469,18 @@ html, body, #app, #memory-tool {
|
|||
}
|
||||
|
||||
.heap-tree-item-name {
|
||||
/**
|
||||
* Flex: contains an .arrow and some text, which need to be laid out
|
||||
* horizontally, vertically aligned in the middle of the container.
|
||||
*/
|
||||
display: flex;
|
||||
align-items: center;
|
||||
/**
|
||||
* Flexing to fill out remaining vertical space.
|
||||
* @see .header and .heap-tree-item */
|
||||
flex: 1;
|
||||
padding-inline-start: 5px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.heap-tree-item-name .arrow {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -520,19 +521,16 @@ html, body, #app, #memory-tool {
|
|||
}
|
||||
|
||||
.heap-tree-item-individuals {
|
||||
width: 38px;
|
||||
min-width: 20px;
|
||||
min-width: 38px;
|
||||
overflow: hidden;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.heap-tree-item-individuals > button {
|
||||
height: 10px;
|
||||
width: 32px;
|
||||
|
||||
/* Override default styles for toolbar buttons to fix entire row height. */
|
||||
margin: 0 auto !important;
|
||||
padding: 0;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -47,6 +47,7 @@
|
|||
#include "mozilla/Mutex.h"
|
||||
#include "nsICancelable.h"
|
||||
#include "nsUnicharUtils.h"
|
||||
#include "mozilla/net/HttpAuthUtils.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
@ -164,13 +165,13 @@ nsHttpNegotiateAuth::ChallengeReceived(nsIHttpAuthenticableChannel *authChannel,
|
|||
else {
|
||||
bool allowed = TestNotInPBMode(authChannel, isProxyAuth) &&
|
||||
(TestNonFqdn(uri) ||
|
||||
TestPref(uri, kNegotiateAuthTrustedURIs));
|
||||
mozilla::net::auth::URIMatchesPrefPattern(uri, kNegotiateAuthTrustedURIs));
|
||||
if (!allowed) {
|
||||
LOG(("nsHttpNegotiateAuth::ChallengeReceived URI blocked\n"));
|
||||
return NS_ERROR_ABORT;
|
||||
}
|
||||
|
||||
bool delegation = TestPref(uri, kNegotiateAuthDelegationURIs);
|
||||
bool delegation = mozilla::net::auth::URIMatchesPrefPattern(uri, kNegotiateAuthDelegationURIs);
|
||||
if (delegation) {
|
||||
LOG((" using REQ_DELEGATE\n"));
|
||||
req_flags |= nsIAuthModule::REQ_DELEGATE;
|
||||
|
@ -622,151 +623,3 @@ nsHttpNegotiateAuth::TestNonFqdn(nsIURI *uri)
|
|||
return !host.IsEmpty() && !host.Contains('.') &&
|
||||
PR_StringToNetAddr(host.BeginReading(), &addr) != PR_SUCCESS;
|
||||
}
|
||||
|
||||
bool
|
||||
nsHttpNegotiateAuth::TestPref(nsIURI *uri, const char *pref)
|
||||
{
|
||||
nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
|
||||
if (!prefs)
|
||||
return false;
|
||||
|
||||
nsAutoCString scheme, host;
|
||||
int32_t port;
|
||||
|
||||
if (NS_FAILED(uri->GetScheme(scheme)))
|
||||
return false;
|
||||
if (NS_FAILED(uri->GetAsciiHost(host)))
|
||||
return false;
|
||||
|
||||
port = NS_GetRealPort(uri);
|
||||
if (port == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
char *hostList;
|
||||
if (NS_FAILED(prefs->GetCharPref(pref, &hostList)) || !hostList)
|
||||
return false;
|
||||
|
||||
struct FreePolicy { void operator()(void* p) { free(p); } };
|
||||
mozilla::UniquePtr<char[], FreePolicy> hostListScope;
|
||||
hostListScope.reset(hostList);
|
||||
|
||||
// pseudo-BNF
|
||||
// ----------
|
||||
//
|
||||
// url-list base-url ( base-url "," LWS )*
|
||||
// base-url ( scheme-part | host-part | scheme-part host-part )
|
||||
// scheme-part scheme "://"
|
||||
// host-part host [":" port]
|
||||
//
|
||||
// for example:
|
||||
// "https://, http://office.foo.com"
|
||||
//
|
||||
|
||||
mozilla::Tokenizer t(hostList);
|
||||
while (!t.CheckEOF()) {
|
||||
t.SkipWhites();
|
||||
nsDependentCSubstring url;
|
||||
mozilla::Unused << t.ReadUntil(mozilla::Tokenizer::Token::Char(','), url);
|
||||
if (url.IsEmpty()) {
|
||||
continue;
|
||||
}
|
||||
if (MatchesBaseURI(scheme, host, port, url)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
nsHttpNegotiateAuth::MatchesBaseURI(const nsCSubstring &matchScheme,
|
||||
const nsCSubstring &matchHost,
|
||||
int32_t matchPort,
|
||||
nsDependentCSubstring const& url)
|
||||
{
|
||||
// check if scheme://host:port matches baseURI
|
||||
|
||||
// parse the base URI
|
||||
mozilla::Tokenizer t(url);
|
||||
mozilla::Tokenizer::Token token;
|
||||
|
||||
t.SkipWhites();
|
||||
|
||||
// We don't know if the url to check against starts with scheme
|
||||
// or a host name. Start recording here.
|
||||
t.Record();
|
||||
|
||||
mozilla::Unused << t.Next(token);
|
||||
|
||||
// The ipv6 literals MUST be enclosed with [] in the preference.
|
||||
bool ipv6 = false;
|
||||
if (token.Equals(mozilla::Tokenizer::Token::Char('['))) {
|
||||
nsDependentCSubstring ipv6BareLiteral;
|
||||
if (!t.ReadUntil(mozilla::Tokenizer::Token::Char(']'), ipv6BareLiteral)) {
|
||||
// Broken ipv6 literal
|
||||
return false;
|
||||
}
|
||||
|
||||
nsDependentCSubstring ipv6Literal;
|
||||
t.Claim(ipv6Literal, mozilla::Tokenizer::INCLUDE_LAST);
|
||||
if (!matchHost.Equals(ipv6Literal, nsCaseInsensitiveUTF8StringComparator()) &&
|
||||
!matchHost.Equals(ipv6BareLiteral, nsCaseInsensitiveUTF8StringComparator())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ipv6 = true;
|
||||
} else if (t.CheckChar(':') && t.CheckChar('/') && t.CheckChar('/')) {
|
||||
if (!matchScheme.Equals(token.Fragment())) {
|
||||
return false;
|
||||
}
|
||||
// Re-start recording the hostname from the point after scheme://.
|
||||
t.Record();
|
||||
}
|
||||
|
||||
while (t.Next(token)) {
|
||||
bool eof = token.Equals(mozilla::Tokenizer::Token::EndOfFile());
|
||||
bool port = token.Equals(mozilla::Tokenizer::Token::Char(':'));
|
||||
|
||||
if (eof || port) {
|
||||
if (!ipv6) { // Match already performed above.
|
||||
nsDependentCSubstring hostName;
|
||||
t.Claim(hostName);
|
||||
|
||||
// An empty hostname means to accept everything for the schema
|
||||
if (!hostName.IsEmpty()) {
|
||||
if (hostName.First() == '.') {
|
||||
if (!StringEndsWith(matchHost, hostName, nsCaseInsensitiveUTF8StringComparator())) {
|
||||
return false;
|
||||
}
|
||||
} else { // host to match doesn't begin with '.', do a full compare
|
||||
if (!matchHost.Equals(hostName, nsCaseInsensitiveUTF8StringComparator())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (port) {
|
||||
uint16_t portNumber;
|
||||
if (!t.ReadInteger(&portNumber)) {
|
||||
// Missing port number
|
||||
return false;
|
||||
}
|
||||
if (matchPort != portNumber) {
|
||||
return false;
|
||||
}
|
||||
if (!t.CheckEOF()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else if (ipv6) {
|
||||
// After an ipv6 literal there can only be EOF or :port. Everything else
|
||||
// must be treated as non-match/broken input.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// All negative checks has passed positively.
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -30,13 +30,6 @@ private:
|
|||
// tests if the host part of an uri is fully qualified
|
||||
bool TestNonFqdn(nsIURI *uri);
|
||||
|
||||
// returns true if URI is accepted by the list of hosts in the pref
|
||||
bool TestPref(nsIURI *, const char *pref);
|
||||
|
||||
bool MatchesBaseURI(const nsCSubstring &scheme,
|
||||
const nsCSubstring &host,
|
||||
int32_t port,
|
||||
nsDependentCSubstring const& url);
|
||||
// Thread for GenerateCredentialsAsync
|
||||
RefPtr<mozilla::LazyIdleThread> mNegotiateThread;
|
||||
};
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include "mozilla/TimeStamp.h"
|
||||
#include "mozilla/Maybe.h"
|
||||
|
||||
#if !defined(OS_WIN) && !defined(OS_NETBSD) && !defined(OS_OPENBSD) && !defined(OS_MACOSX)
|
||||
#if !defined(OS_WIN) && !defined(OS_MACOSX)
|
||||
#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
#include "SharedMemoryBasic.h"
|
||||
|
@ -30,7 +30,7 @@ struct ParamTraits;
|
|||
namespace mozilla {
|
||||
#if defined(OS_WIN)
|
||||
typedef HANDLE CrossProcessSemaphoreHandle;
|
||||
#elif !defined(OS_NETBSD) && !defined(OS_OPENBSD) && !defined(OS_MACOSX)
|
||||
#elif !defined(OS_MACOSX)
|
||||
typedef mozilla::ipc::SharedMemoryBasic::Handle CrossProcessSemaphoreHandle;
|
||||
#else
|
||||
// Stub for other platforms. We can't use uintptr_t here since different
|
||||
|
@ -86,7 +86,7 @@ private:
|
|||
|
||||
#if defined(OS_WIN)
|
||||
HANDLE mSemaphore;
|
||||
#elif !defined(OS_NETBSD) && !defined(OS_OPENBSD) && !defined(OS_MACOSX)
|
||||
#elif !defined(OS_MACOSX)
|
||||
RefPtr<mozilla::ipc::SharedMemoryBasic> mSharedBuffer;
|
||||
sem_t* mSemaphore;
|
||||
mozilla::Atomic<int32_t>* mRefCount;
|
||||
|
|
|
@ -86,7 +86,7 @@ if CONFIG['OS_ARCH'] == 'WINNT':
|
|||
SOURCES += [
|
||||
'CrossProcessSemaphore_windows.cpp',
|
||||
]
|
||||
elif not CONFIG['OS_ARCH'] in ('NetBSD', 'OpenBSD', 'Darwin'):
|
||||
elif CONFIG['OS_ARCH'] != 'Darwin':
|
||||
UNIFIED_SOURCES += [
|
||||
'CrossProcessSemaphore_posix.cpp',
|
||||
]
|
||||
|
|
|
@ -360,6 +360,35 @@ GeneratePrototypeGuards(CacheIRWriter& writer, JSObject* obj, JSObject* holder,
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
GeneratePrototypeHoleGuards(CacheIRWriter& writer, JSObject* obj, ObjOperandId objId)
|
||||
{
|
||||
if (obj->hasUncacheableProto()) {
|
||||
// If the shape does not imply the proto, emit an explicit proto guard.
|
||||
writer.guardProto(objId, obj->staticPrototype());
|
||||
}
|
||||
|
||||
JSObject* pobj = obj->staticPrototype();
|
||||
while (pobj) {
|
||||
ObjOperandId protoId = writer.loadObject(pobj);
|
||||
|
||||
// Non-singletons with uncacheable protos can change their proto
|
||||
// without a shape change, so also guard on the group (which determines
|
||||
// the proto) in this case.
|
||||
if (pobj->hasUncacheableProto() && !pobj->isSingleton())
|
||||
writer.guardGroup(protoId, pobj->group());
|
||||
|
||||
// Make sure the shape matches, to avoid non-dense elements or anything
|
||||
// else that is being checked by CanAttachDenseElementHole.
|
||||
writer.guardShape(protoId, pobj->as<NativeObject>().lastProperty());
|
||||
|
||||
// Also make sure there are no dense elements.
|
||||
writer.guardNoDenseElements(protoId);
|
||||
|
||||
pobj = pobj->staticPrototype();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
TestMatchingReceiver(CacheIRWriter& writer, JSObject* obj, Shape* shape, ObjOperandId objId,
|
||||
Maybe<ObjOperandId>* expandoId)
|
||||
|
@ -1338,31 +1367,7 @@ GetPropIRGenerator::tryAttachDenseElementHole(HandleObject obj, ObjOperandId obj
|
|||
// Guard on the shape, to prevent non-dense elements from appearing.
|
||||
writer.guardShape(objId, obj->as<NativeObject>().lastProperty());
|
||||
|
||||
if (obj->hasUncacheableProto()) {
|
||||
// If the shape does not imply the proto, emit an explicit proto guard.
|
||||
writer.guardProto(objId, obj->staticPrototype());
|
||||
}
|
||||
|
||||
JSObject* pobj = obj->staticPrototype();
|
||||
while (pobj) {
|
||||
ObjOperandId protoId = writer.loadObject(pobj);
|
||||
|
||||
// Non-singletons with uncacheable protos can change their proto
|
||||
// without a shape change, so also guard on the group (which determines
|
||||
// the proto) in this case.
|
||||
if (pobj->hasUncacheableProto() && !pobj->isSingleton())
|
||||
writer.guardGroup(protoId, pobj->group());
|
||||
|
||||
// Make sure the shape matches, to avoid non-dense elements or anything
|
||||
// else that is being checked by CanAttachDenseElementHole.
|
||||
writer.guardShape(protoId, pobj->as<NativeObject>().lastProperty());
|
||||
|
||||
// Also make sure there are no dense elements.
|
||||
writer.guardNoDenseElements(protoId);
|
||||
|
||||
pobj = pobj->staticPrototype();
|
||||
}
|
||||
|
||||
GeneratePrototypeHoleGuards(writer, obj, objId);
|
||||
writer.loadDenseElementHoleResult(objId, indexId);
|
||||
writer.typeMonitorResult();
|
||||
|
||||
|
@ -1768,6 +1773,30 @@ InIRGenerator::tryAttachDenseIn(uint32_t index, Int32OperandId indexId,
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
InIRGenerator::tryAttachDenseInHole(uint32_t index, Int32OperandId indexId,
|
||||
HandleObject obj, ObjOperandId objId)
|
||||
{
|
||||
if (!obj->isNative())
|
||||
return false;
|
||||
|
||||
if (obj->as<NativeObject>().containsDenseElement(index))
|
||||
return false;
|
||||
|
||||
if (!CanAttachDenseElementHole(obj))
|
||||
return false;
|
||||
|
||||
// Guard on the shape, to prevent non-dense elements from appearing.
|
||||
writer.guardShape(objId, obj->as<NativeObject>().lastProperty());
|
||||
|
||||
GeneratePrototypeHoleGuards(writer, obj, objId);
|
||||
writer.loadDenseElementHoleExistsResult(objId, indexId);
|
||||
writer.returnFromIC();
|
||||
|
||||
trackAttached("DenseInHole");
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
InIRGenerator::tryAttachNativeIn(HandleId key, ValOperandId keyId,
|
||||
HandleObject obj, ObjOperandId objId)
|
||||
|
@ -1843,6 +1872,8 @@ InIRGenerator::tryAttachStub()
|
|||
if (maybeGuardInt32Index(key_, keyId, &index, &indexId)) {
|
||||
if (tryAttachDenseIn(index, indexId, obj_, objId))
|
||||
return true;
|
||||
if (tryAttachDenseInHole(index, indexId, obj_, objId))
|
||||
return true;
|
||||
|
||||
trackNotAttached();
|
||||
return false;
|
||||
|
|
|
@ -212,6 +212,7 @@ extern const char* CacheKindNames[];
|
|||
_(LoadDenseElementResult) \
|
||||
_(LoadDenseElementHoleResult) \
|
||||
_(LoadDenseElementExistsResult) \
|
||||
_(LoadDenseElementHoleExistsResult) \
|
||||
_(LoadUnboxedArrayElementResult) \
|
||||
_(LoadTypedElementResult) \
|
||||
_(LoadInt32ArrayLengthResult) \
|
||||
|
@ -804,6 +805,10 @@ class MOZ_RAII CacheIRWriter : public JS::CustomAutoRooter
|
|||
writeOpWithOperandId(CacheOp::LoadDenseElementExistsResult, obj);
|
||||
writeOperandId(index);
|
||||
}
|
||||
void loadDenseElementHoleExistsResult(ObjOperandId obj, Int32OperandId index) {
|
||||
writeOpWithOperandId(CacheOp::LoadDenseElementHoleExistsResult, obj);
|
||||
writeOperandId(index);
|
||||
}
|
||||
void loadUnboxedArrayElementResult(ObjOperandId obj, Int32OperandId index, JSValueType elementType) {
|
||||
writeOpWithOperandId(CacheOp::LoadUnboxedArrayElementResult, obj);
|
||||
writeOperandId(index);
|
||||
|
@ -1186,6 +1191,8 @@ class MOZ_RAII InIRGenerator : public IRGenerator
|
|||
|
||||
bool tryAttachDenseIn(uint32_t index, Int32OperandId indexId,
|
||||
HandleObject obj, ObjOperandId objId);
|
||||
bool tryAttachDenseInHole(uint32_t index, Int32OperandId indexId,
|
||||
HandleObject obj, ObjOperandId objId);
|
||||
bool tryAttachNativeIn(HandleId key, ValOperandId keyId,
|
||||
HandleObject obj, ObjOperandId objId);
|
||||
bool tryAttachNativeInDoesNotExist(HandleId key, ValOperandId keyId,
|
||||
|
|
|
@ -1911,6 +1911,44 @@ CacheIRCompiler::emitLoadDenseElementExistsResult()
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
CacheIRCompiler::emitLoadDenseElementHoleExistsResult()
|
||||
{
|
||||
AutoOutputRegister output(*this);
|
||||
Register obj = allocator.useRegister(masm, reader.objOperandId());
|
||||
Register index = allocator.useRegister(masm, reader.int32OperandId());
|
||||
AutoScratchRegisterMaybeOutput scratch(allocator, masm, output);
|
||||
|
||||
FailurePath* failure;
|
||||
if (!addFailurePath(&failure))
|
||||
return false;
|
||||
|
||||
// Make sure the index is nonnegative.
|
||||
masm.branch32(Assembler::LessThan, index, Imm32(0), failure->label());
|
||||
|
||||
// Load obj->elements.
|
||||
masm.loadPtr(Address(obj, NativeObject::offsetOfElements()), scratch);
|
||||
|
||||
// Guard on the initialized length.
|
||||
Label hole;
|
||||
Address initLength(scratch, ObjectElements::offsetOfInitializedLength());
|
||||
masm.branch32(Assembler::BelowOrEqual, initLength, index, &hole);
|
||||
|
||||
// Load value and replace with true.
|
||||
Label done;
|
||||
masm.loadValue(BaseObjectElementIndex(scratch, index), output.valueReg());
|
||||
masm.branchTestMagic(Assembler::Equal, output.valueReg(), &hole);
|
||||
masm.moveValue(BooleanValue(true), output.valueReg());
|
||||
masm.jump(&done);
|
||||
|
||||
// Load false for the hole.
|
||||
masm.bind(&hole);
|
||||
masm.moveValue(BooleanValue(false), output.valueReg());
|
||||
|
||||
masm.bind(&done);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
CacheIRCompiler::emitLoadUnboxedArrayElementResult()
|
||||
{
|
||||
|
|
|
@ -48,6 +48,7 @@ namespace jit {
|
|||
_(LoadDenseElementResult) \
|
||||
_(LoadDenseElementHoleResult) \
|
||||
_(LoadDenseElementExistsResult) \
|
||||
_(LoadDenseElementHoleExistsResult) \
|
||||
_(LoadUnboxedArrayElementResult) \
|
||||
_(LoadTypedElementResult) \
|
||||
_(WrapResult)
|
||||
|
|
|
@ -1289,7 +1289,7 @@ nsFlexContainerFrame::CSSAlignmentForAbsPosChild(
|
|||
} else {
|
||||
// Single-line, or multi-line but the (one) line stretches to fill
|
||||
// container. Respect align-self.
|
||||
alignment = aChildRI.mStylePosition->UsedAlignSelf(nullptr);
|
||||
alignment = aChildRI.mStylePosition->UsedAlignSelf(StyleContext());
|
||||
// XXX strip off <overflow-position> bits until we implement it
|
||||
// (bug 1311892)
|
||||
alignment &= ~NS_STYLE_ALIGN_FLAG_BITS;
|
||||
|
@ -1310,8 +1310,6 @@ nsFlexContainerFrame::CSSAlignmentForAbsPosChild(
|
|||
alignment = isAxisReversed ? NS_STYLE_ALIGN_END : NS_STYLE_ALIGN_START;
|
||||
} else if (alignment == NS_STYLE_ALIGN_FLEX_END) {
|
||||
alignment = isAxisReversed ? NS_STYLE_ALIGN_START : NS_STYLE_ALIGN_END;
|
||||
} else if (alignment == NS_STYLE_ALIGN_AUTO) {
|
||||
alignment = NS_STYLE_ALIGN_START;
|
||||
} else if (alignment == NS_STYLE_ALIGN_LEFT ||
|
||||
alignment == NS_STYLE_ALIGN_RIGHT) {
|
||||
if (aLogicalAxis == eLogicalAxisInline) {
|
||||
|
|
|
@ -6657,20 +6657,14 @@ nsGridContainerFrame::CSSAlignmentForAbsPosChild(const ReflowInput& aChildRI,
|
|||
"This method should only be called for abspos children");
|
||||
|
||||
uint16_t alignment = (aLogicalAxis == eLogicalAxisInline) ?
|
||||
aChildRI.mStylePosition->UsedJustifySelf(nullptr) :
|
||||
aChildRI.mStylePosition->UsedAlignSelf(nullptr);
|
||||
aChildRI.mStylePosition->UsedJustifySelf(StyleContext()) :
|
||||
aChildRI.mStylePosition->UsedAlignSelf(StyleContext());
|
||||
|
||||
// XXX strip off <overflow-position> bits until we implement it
|
||||
// (bug 1311892)
|
||||
alignment &= ~NS_STYLE_ALIGN_FLAG_BITS;
|
||||
|
||||
// We group 'auto' with 'normal', because the spec says:
|
||||
// "The 'auto' keyword is interpreted as 'normal'
|
||||
// if the box is absolutely positioned [...]"
|
||||
// https://drafts.csswg.org/css-align-3/#valdef-align-self-auto
|
||||
// https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto
|
||||
if (alignment == NS_STYLE_ALIGN_AUTO ||
|
||||
alignment == NS_STYLE_ALIGN_NORMAL) {
|
||||
if (alignment == NS_STYLE_ALIGN_NORMAL) {
|
||||
// "the 'normal' keyword behaves as 'start' on replaced
|
||||
// absolutely-positioned boxes, and behaves as 'stretch' on all other
|
||||
// absolutely-positioned boxes."
|
||||
|
|
|
@ -925,8 +925,8 @@ fails == 407243-1.html 407243-1.html
|
|||
== 407937-1.html 407937-1.html
|
||||
== 408493-1.html 408493-1.html
|
||||
== 408493-2.html 408493-2.html
|
||||
fails == 408656-1a.html 408656-1a.html
|
||||
fails == 408656-1b.html 408656-1b.html
|
||||
== 408656-1a.html 408656-1a.html
|
||||
== 408656-1b.html 408656-1b.html
|
||||
== 408656-1c.html 408656-1c.html
|
||||
fails == 408782-1a.html 408782-1a.html
|
||||
fails == 408782-1b.html 408782-1b.html
|
||||
|
|
|
@ -34,5 +34,5 @@ fails == column-balancing-nested-000.html column-balancing-nested-000.html
|
|||
fails == column-balancing-nested-001.html column-balancing-nested-001.html
|
||||
== columnrule-overflow.html columnrule-overflow.html
|
||||
== columns-table-caption-000.html columns-table-caption-000.html
|
||||
fails == positioning-transforms-bug1112501.html positioning-transforms-bug1112501.html
|
||||
== positioning-transforms-bug1112501.html positioning-transforms-bug1112501.html
|
||||
== fieldset-columns-001.html fieldset-columns-001.html
|
||||
|
|
|
@ -14,7 +14,7 @@ random-if(/^Windows\x20NT\x205\.1/.test(http.oscpu)) == sync-image-switch-1d.htm
|
|||
|
||||
# Tests for "object-fit" & "object-position"
|
||||
pref(layout.css.object-fit-and-position.enabled,true) == image-object-fit-dyn-1.html image-object-fit-dyn-1.html
|
||||
skip-if(stylo) fails pref(layout.css.object-fit-and-position.enabled,true) == image-object-fit-with-background-1.html image-object-fit-with-background-1.html # Bug 1342188
|
||||
fails skip-if(stylo) pref(layout.css.object-fit-and-position.enabled,true) == image-object-fit-with-background-1.html image-object-fit-with-background-1.html # Bug 1342188
|
||||
fails pref(layout.css.object-fit-and-position.enabled,true) == image-object-fit-with-background-2.html image-object-fit-with-background-2.html
|
||||
pref(layout.css.object-fit-and-position.enabled,true) == image-object-position-dyn-1.html image-object-position-dyn-1.html
|
||||
fails pref(layout.css.object-fit-and-position.enabled,true) == image-object-position-with-background-1.html image-object-position-with-background-1.html
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
@ -73,7 +73,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
margin-bottom: 5px;
|
||||
margin-right: 5px;
|
||||
float: left; /* For testing in "rows" of containers */
|
||||
align-items: center; /* To exercise 'align-self: auto' on children */
|
||||
}
|
||||
br { clear: both }
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
@ -73,7 +73,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
margin-bottom: 5px;
|
||||
margin-right: 5px;
|
||||
float: left; /* For testing in "rows" of containers */
|
||||
align-items: center; /* To exercise 'align-self: auto' on children */
|
||||
}
|
||||
br { clear: both }
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
@ -76,7 +76,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
margin-bottom: 5px;
|
||||
margin-right: 5px;
|
||||
float: left; /* For testing in "rows" of containers */
|
||||
align-items: center; /* To exercise 'align-self: auto' on children */
|
||||
}
|
||||
br { clear: both }
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
@ -76,7 +76,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
margin-bottom: 5px;
|
||||
margin-right: 5px;
|
||||
float: left; /* For testing in "rows" of containers */
|
||||
align-items: center; /* To exercise 'align-self: auto' on children */
|
||||
}
|
||||
br { clear: both }
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
@ -73,7 +73,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
margin-bottom: 5px;
|
||||
margin-right: 5px;
|
||||
float: left; /* For testing in "rows" of containers */
|
||||
align-items: center; /* To exercise 'align-self: auto' on children */
|
||||
}
|
||||
br { clear: both }
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
@ -73,7 +73,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
margin-bottom: 5px;
|
||||
margin-right: 5px;
|
||||
float: left; /* For testing in "rows" of containers */
|
||||
align-items: center; /* To exercise 'align-self: auto' on children */
|
||||
}
|
||||
br { clear: both }
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
@ -76,7 +76,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
margin-bottom: 5px;
|
||||
margin-right: 5px;
|
||||
float: left; /* For testing in "rows" of containers */
|
||||
align-items: center; /* To exercise 'align-self: auto' on children */
|
||||
}
|
||||
br { clear: both }
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
@ -76,7 +76,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
margin-bottom: 5px;
|
||||
margin-right: 5px;
|
||||
float: left; /* For testing in "rows" of containers */
|
||||
align-items: center; /* To exercise 'align-self: auto' on children */
|
||||
}
|
||||
br { clear: both }
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
@ -74,7 +74,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
margin-bottom: 5px;
|
||||
margin-right: 5px;
|
||||
float: left; /* For testing in "rows" of containers */
|
||||
align-items: center; /* To exercise 'align-self: auto' on children */
|
||||
position: relative;
|
||||
}
|
||||
br { clear: both }
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
@ -72,7 +72,7 @@
|
|||
<!-- The various align-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-align-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
margin-bottom: 5px;
|
||||
margin-right: 5px;
|
||||
float: left; /* For testing in "rows" of containers */
|
||||
align-items: center; /* To exercise 'align-self: auto' on children */
|
||||
}
|
||||
br { clear: both }
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
<!-- The various justify-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
@ -75,7 +75,7 @@
|
|||
<!-- The various justify-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
margin-bottom: 5px;
|
||||
margin-right: 5px;
|
||||
float: left; /* For testing in "rows" of containers */
|
||||
justify-items: center; /* To exercise 'justify-self: auto' on children */
|
||||
position: relative;
|
||||
}
|
||||
br { clear: both }
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
<!-- The various justify-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
@ -73,7 +73,7 @@
|
|||
<!-- The various justify-self values, from
|
||||
https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
|
||||
<!-- auto | normal | stretch -->
|
||||
<div class="container"><div class="alignStart"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignCenter"><!--auto--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--normal--></div></div>
|
||||
<div class="container"><div class="alignStart"><!--stretch--></div></div>
|
||||
<br>
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
margin-bottom: 5px;
|
||||
margin-right: 5px;
|
||||
float: left; /* For testing in "rows" of containers */
|
||||
justify-items: center; /* To exercise 'justify-self: auto' on children */
|
||||
}
|
||||
br { clear: both }
|
||||
|
||||
|
|
|
@ -0,0 +1,171 @@
|
|||
#include "mozilla/net/HttpAuthUtils.h"
|
||||
#include "mozilla/Tokenizer.h"
|
||||
#include "nsIPrefService.h"
|
||||
#include "nsIURI.h"
|
||||
#include "nsNetUtil.h"
|
||||
#include "nsUnicharUtils.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace net {
|
||||
namespace auth {
|
||||
|
||||
namespace detail {
|
||||
|
||||
bool
|
||||
MatchesBaseURI(const nsCSubstring &matchScheme,
|
||||
const nsCSubstring &matchHost,
|
||||
int32_t matchPort,
|
||||
nsDependentCSubstring const& url)
|
||||
{
|
||||
// check if scheme://host:port matches baseURI
|
||||
|
||||
// parse the base URI
|
||||
mozilla::Tokenizer t(url);
|
||||
mozilla::Tokenizer::Token token;
|
||||
|
||||
t.SkipWhites();
|
||||
|
||||
// We don't know if the url to check against starts with scheme
|
||||
// or a host name. Start recording here.
|
||||
t.Record();
|
||||
|
||||
mozilla::Unused << t.Next(token);
|
||||
|
||||
// The ipv6 literals MUST be enclosed with [] in the preference.
|
||||
bool ipv6 = false;
|
||||
if (token.Equals(mozilla::Tokenizer::Token::Char('['))) {
|
||||
nsDependentCSubstring ipv6BareLiteral;
|
||||
if (!t.ReadUntil(mozilla::Tokenizer::Token::Char(']'), ipv6BareLiteral)) {
|
||||
// Broken ipv6 literal
|
||||
return false;
|
||||
}
|
||||
|
||||
nsDependentCSubstring ipv6Literal;
|
||||
t.Claim(ipv6Literal, mozilla::Tokenizer::INCLUDE_LAST);
|
||||
if (!matchHost.Equals(ipv6Literal, nsCaseInsensitiveUTF8StringComparator()) &&
|
||||
!matchHost.Equals(ipv6BareLiteral, nsCaseInsensitiveUTF8StringComparator())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ipv6 = true;
|
||||
} else if (t.CheckChar(':') && t.CheckChar('/') && t.CheckChar('/')) {
|
||||
if (!matchScheme.Equals(token.Fragment())) {
|
||||
return false;
|
||||
}
|
||||
// Re-start recording the hostname from the point after scheme://.
|
||||
t.Record();
|
||||
}
|
||||
|
||||
while (t.Next(token)) {
|
||||
bool eof = token.Equals(mozilla::Tokenizer::Token::EndOfFile());
|
||||
bool port = token.Equals(mozilla::Tokenizer::Token::Char(':'));
|
||||
|
||||
if (eof || port) {
|
||||
if (!ipv6) { // Match already performed above.
|
||||
nsDependentCSubstring hostName;
|
||||
t.Claim(hostName);
|
||||
|
||||
// An empty hostname means to accept everything for the schema
|
||||
if (!hostName.IsEmpty()) {
|
||||
if (hostName.First() == '.') {
|
||||
if (!StringEndsWith(matchHost, hostName, nsCaseInsensitiveUTF8StringComparator())) {
|
||||
return false;
|
||||
}
|
||||
} else { // host to match doesn't begin with '.', do a full compare
|
||||
if (!matchHost.Equals(hostName, nsCaseInsensitiveUTF8StringComparator())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (port) {
|
||||
uint16_t portNumber;
|
||||
if (!t.ReadInteger(&portNumber)) {
|
||||
// Missing port number
|
||||
return false;
|
||||
}
|
||||
if (matchPort != portNumber) {
|
||||
return false;
|
||||
}
|
||||
if (!t.CheckEOF()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else if (ipv6) {
|
||||
// After an ipv6 literal there can only be EOF or :port. Everything else
|
||||
// must be treated as non-match/broken input.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// All negative checks has passed positively.
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
|
||||
bool
|
||||
URIMatchesPrefPattern(nsIURI *uri, const char *pref)
|
||||
{
|
||||
nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
|
||||
if (!prefs) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nsAutoCString scheme, host;
|
||||
int32_t port;
|
||||
|
||||
if (NS_FAILED(uri->GetScheme(scheme))) {
|
||||
return false;
|
||||
}
|
||||
if (NS_FAILED(uri->GetAsciiHost(host))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
port = NS_GetRealPort(uri);
|
||||
if (port == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
char *hostList;
|
||||
if (NS_FAILED(prefs->GetCharPref(pref, &hostList)) || !hostList) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct FreePolicy { void operator()(void* p) { free(p); } };
|
||||
mozilla::UniquePtr<char[], FreePolicy> hostListScope;
|
||||
hostListScope.reset(hostList);
|
||||
|
||||
// pseudo-BNF
|
||||
// ----------
|
||||
//
|
||||
// url-list base-url ( base-url "," LWS )*
|
||||
// base-url ( scheme-part | host-part | scheme-part host-part )
|
||||
// scheme-part scheme "://"
|
||||
// host-part host [":" port]
|
||||
//
|
||||
// for example:
|
||||
// "https://, http://office.foo.com"
|
||||
//
|
||||
|
||||
mozilla::Tokenizer t(hostList);
|
||||
while (!t.CheckEOF()) {
|
||||
t.SkipWhites();
|
||||
nsDependentCSubstring url;
|
||||
mozilla::Unused << t.ReadUntil(mozilla::Tokenizer::Token::Char(','), url);
|
||||
if (url.IsEmpty()) {
|
||||
continue;
|
||||
}
|
||||
if (detail::MatchesBaseURI(scheme, host, port, url)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace auth
|
||||
} // namespace net
|
||||
} // namespace mozilla
|
|
@ -0,0 +1,32 @@
|
|||
/* 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 HttpAuthUtils_h__
|
||||
#define HttpAuthUtils_h__
|
||||
|
||||
|
||||
class nsIURI;
|
||||
|
||||
namespace mozilla { namespace net { namespace auth {
|
||||
|
||||
/* Tries to match the given URI against the value of a given pref
|
||||
*
|
||||
* The pref should be in pseudo-BNF format.
|
||||
* url-list base-url ( base-url "," LWS )*
|
||||
* base-url ( scheme-part | host-part | scheme-part host-part )
|
||||
* scheme-part scheme "://"
|
||||
* host-part host [":" port]
|
||||
*
|
||||
* for example:
|
||||
* "https://, http://office.foo.com"
|
||||
*
|
||||
* Will return true if the URI matches any of the patterns, or false otherwise.
|
||||
*/
|
||||
bool URIMatchesPrefPattern(nsIURI *uri, const char *pref);
|
||||
|
||||
} // namespace auth
|
||||
} // namespace net
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // HttpAuthUtils_h__
|
|
@ -38,6 +38,7 @@ EXPORTS += [
|
|||
EXPORTS.mozilla.net += [
|
||||
'AltDataOutputStreamChild.h',
|
||||
'AltDataOutputStreamParent.h',
|
||||
'HttpAuthUtils.h',
|
||||
'HttpBaseChannel.h',
|
||||
'HttpChannelChild.h',
|
||||
'HttpChannelParent.h',
|
||||
|
@ -67,6 +68,7 @@ UNIFIED_SOURCES += [
|
|||
'Http2Push.cpp',
|
||||
'Http2Session.cpp',
|
||||
'Http2Stream.cpp',
|
||||
'HttpAuthUtils.cpp',
|
||||
'HttpBaseChannel.cpp',
|
||||
'HttpChannelChild.cpp',
|
||||
'HttpChannelParent.cpp',
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include "nsNetUtil.h"
|
||||
#include "nsIChannel.h"
|
||||
#include "nsUnicharUtils.h"
|
||||
#include "mozilla/net/HttpAuthUtils.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace net {
|
||||
|
@ -43,102 +44,6 @@ static const char kTrustedURIs[] = "network.automatic-ntlm-auth.trusted-uris";
|
|||
static const char kForceGeneric[] = "network.auth.force-generic-ntlm";
|
||||
static const char kSSOinPBmode[] = "network.auth.private-browsing-sso";
|
||||
|
||||
// XXX MatchesBaseURI and TestPref are duplicated in nsHttpNegotiateAuth.cpp,
|
||||
// but since that file lives in a separate library we cannot directly share it.
|
||||
// bug 236865 addresses this problem.
|
||||
|
||||
static bool
|
||||
MatchesBaseURI(const nsCSubstring &matchScheme,
|
||||
const nsCSubstring &matchHost,
|
||||
int32_t matchPort,
|
||||
nsDependentCSubstring const& url)
|
||||
{
|
||||
// check if scheme://host:port matches baseURI
|
||||
|
||||
// parse the base URI
|
||||
mozilla::Tokenizer t(url);
|
||||
mozilla::Tokenizer::Token token;
|
||||
|
||||
t.SkipWhites();
|
||||
|
||||
// We don't know if the url to check against starts with scheme
|
||||
// or a host name. Start recording here.
|
||||
t.Record();
|
||||
|
||||
mozilla::Unused << t.Next(token);
|
||||
|
||||
// The ipv6 literals MUST be enclosed with [] in the preference.
|
||||
bool ipv6 = false;
|
||||
if (token.Equals(mozilla::Tokenizer::Token::Char('['))) {
|
||||
nsDependentCSubstring ipv6BareLiteral;
|
||||
if (!t.ReadUntil(mozilla::Tokenizer::Token::Char(']'), ipv6BareLiteral)) {
|
||||
// Broken ipv6 literal
|
||||
return false;
|
||||
}
|
||||
|
||||
nsDependentCSubstring ipv6Literal;
|
||||
t.Claim(ipv6Literal, mozilla::Tokenizer::INCLUDE_LAST);
|
||||
if (!matchHost.Equals(ipv6Literal, nsCaseInsensitiveUTF8StringComparator()) &&
|
||||
!matchHost.Equals(ipv6BareLiteral, nsCaseInsensitiveUTF8StringComparator())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ipv6 = true;
|
||||
} else if (t.CheckChar(':') && t.CheckChar('/') && t.CheckChar('/')) {
|
||||
if (!matchScheme.Equals(token.Fragment())) {
|
||||
return false;
|
||||
}
|
||||
// Re-start recording the hostname from the point after scheme://.
|
||||
t.Record();
|
||||
}
|
||||
|
||||
while (t.Next(token)) {
|
||||
bool eof = token.Equals(mozilla::Tokenizer::Token::EndOfFile());
|
||||
bool port = token.Equals(mozilla::Tokenizer::Token::Char(':'));
|
||||
|
||||
if (eof || port) {
|
||||
if (!ipv6) { // Match already performed above.
|
||||
nsDependentCSubstring hostName;
|
||||
t.Claim(hostName);
|
||||
|
||||
// An empty hostname means to accept everything for the schema
|
||||
if (!hostName.IsEmpty()) {
|
||||
if (hostName.First() == '.') {
|
||||
if (!StringEndsWith(matchHost, hostName, nsCaseInsensitiveUTF8StringComparator())) {
|
||||
return false;
|
||||
}
|
||||
} else { // host to match doesn't begin with '.', do a full compare
|
||||
if (!matchHost.Equals(hostName, nsCaseInsensitiveUTF8StringComparator())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (port) {
|
||||
uint16_t portNumber;
|
||||
if (!t.ReadInteger(&portNumber)) {
|
||||
// Missing port number
|
||||
return false;
|
||||
}
|
||||
if (matchPort != portNumber) {
|
||||
return false;
|
||||
}
|
||||
if (!t.CheckEOF()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else if (ipv6) {
|
||||
// After an ipv6 literal there can only be EOF or :port. Everything else
|
||||
// must be treated as non-match/broken input.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// All negative checks has passed positively.
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
IsNonFqdn(nsIURI *uri)
|
||||
{
|
||||
|
@ -153,59 +58,6 @@ IsNonFqdn(nsIURI *uri)
|
|||
PR_StringToNetAddr(host.BeginReading(), &addr) != PR_SUCCESS;
|
||||
}
|
||||
|
||||
static bool
|
||||
TestPref(nsIURI *uri, const char *pref)
|
||||
{
|
||||
nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
|
||||
if (!prefs)
|
||||
return false;
|
||||
|
||||
nsAutoCString scheme, host;
|
||||
int32_t port;
|
||||
|
||||
if (NS_FAILED(uri->GetScheme(scheme)))
|
||||
return false;
|
||||
if (NS_FAILED(uri->GetAsciiHost(host)))
|
||||
return false;
|
||||
if (NS_FAILED(uri->GetPort(&port)))
|
||||
return false;
|
||||
|
||||
char *hostList;
|
||||
if (NS_FAILED(prefs->GetCharPref(pref, &hostList)) || !hostList)
|
||||
return false;
|
||||
|
||||
struct FreePolicy { void operator()(void* p) { free(p); } };
|
||||
mozilla::UniquePtr<char[], FreePolicy> hostListScope;
|
||||
hostListScope.reset(hostList);
|
||||
|
||||
// pseudo-BNF
|
||||
// ----------
|
||||
//
|
||||
// url-list base-url ( base-url "," LWS )*
|
||||
// base-url ( scheme-part | host-part | scheme-part host-part )
|
||||
// scheme-part scheme "://"
|
||||
// host-part host [":" port]
|
||||
//
|
||||
// for example:
|
||||
// "https://, http://office.foo.com"
|
||||
//
|
||||
|
||||
mozilla::Tokenizer t(hostList);
|
||||
while (!t.CheckEOF()) {
|
||||
t.SkipWhites();
|
||||
nsDependentCSubstring url;
|
||||
mozilla::Unused << t.ReadUntil(mozilla::Tokenizer::Token::Char(','), url);
|
||||
if (url.IsEmpty()) {
|
||||
continue;
|
||||
}
|
||||
if (MatchesBaseURI(scheme, host, port, url)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check to see if we should use our generic (internal) NTLM auth module.
|
||||
static bool
|
||||
ForceGenericNTLM()
|
||||
|
@ -274,7 +126,7 @@ CanUseDefaultCredentials(nsIHttpAuthenticableChannel *channel,
|
|||
return true;
|
||||
}
|
||||
|
||||
bool isTrustedHost = (uri && TestPref(uri, kTrustedURIs));
|
||||
bool isTrustedHost = (uri && auth::URIMatchesPrefPattern(uri, kTrustedURIs));
|
||||
LOG(("Default credentials allowed for host: %d\n", isTrustedHost));
|
||||
return isTrustedHost;
|
||||
}
|
||||
|
|
|
@ -1157,4 +1157,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
|
|||
|
||||
static const int32_t kUnknownId = -1;
|
||||
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1496589383610000);
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1496676311804000);
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
00f.net: did not receive HSTS header
|
||||
020wifi.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
0p.no: did not receive HSTS header
|
||||
0x.sk: could not connect to host
|
||||
0x0a.net: could not connect to host
|
||||
0x1337.eu: could not connect to host
|
||||
0x44.net: did not receive HSTS header
|
||||
|
@ -35,6 +34,7 @@
|
|||
2smart4food.com: did not receive HSTS header
|
||||
2ss.jp: did not receive HSTS header
|
||||
300651.ru: did not receive HSTS header
|
||||
300m.com: did not receive HSTS header
|
||||
301.website: could not connect to host
|
||||
302.nyc: could not connect to host
|
||||
33drugstore.com: did not receive HSTS header
|
||||
|
@ -63,7 +63,6 @@
|
|||
56ct.com: could not connect to host
|
||||
60ych.net: did not receive HSTS header
|
||||
6120.eu: did not receive HSTS header
|
||||
646.io: could not connect to host
|
||||
7kovrikov.ru: did not receive HSTS header
|
||||
808.lv: did not receive HSTS header
|
||||
83i.net: could not connect to host
|
||||
|
@ -129,6 +128,7 @@ adquisitio.it: could not connect to host
|
|||
adrianseo.ro: did not receive HSTS header
|
||||
adrl.ca: could not connect to host
|
||||
adsfund.org: could not connect to host
|
||||
aduedu.de: did not receive HSTS header
|
||||
advancedstudio.ro: did not receive HSTS header
|
||||
adver.top: could not connect to host
|
||||
adviespuntklokkenluiders.nl: did not receive HSTS header
|
||||
|
@ -141,7 +141,7 @@ aficotroceni.ro: did not receive HSTS header
|
|||
afp548.tk: could not connect to host
|
||||
agalaxyfarfaraway.co.uk: could not connect to host
|
||||
agbremen.de: did not receive HSTS header
|
||||
agentseeker.ca: could not connect to host
|
||||
agentseeker.ca: did not receive HSTS header
|
||||
agonswim.com: could not connect to host
|
||||
agrimap.com: did not receive HSTS header
|
||||
agrios.de: did not receive HSTS header
|
||||
|
@ -159,9 +159,10 @@ aiticon.de: did not receive HSTS header
|
|||
aiw-thkoeln.online: could not connect to host
|
||||
ajmahal.com: could not connect to host
|
||||
akclinics.org: did not receive HSTS header
|
||||
akerek.hu: did not receive HSTS header
|
||||
akombakom.net: did not receive HSTS header
|
||||
akselimedia.fi: did not receive HSTS header
|
||||
akutun.cl: did not receive HSTS header
|
||||
akutun.cl: could not connect to host
|
||||
al-shami.net: could not connect to host
|
||||
aladdin.ie: did not receive HSTS header
|
||||
alainwolf.net: could not connect to host
|
||||
|
@ -180,6 +181,7 @@ alexandre.sh: did not receive HSTS header
|
|||
alexisabarca.com: did not receive HSTS header
|
||||
alexsergeyev.com: could not connect to host
|
||||
alfa24.pro: could not connect to host
|
||||
alinode.com: could not connect to host
|
||||
alittlebitcheeky.com: did not receive HSTS header
|
||||
aljaspod.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
alkami.com: did not receive HSTS header
|
||||
|
@ -205,7 +207,6 @@ amazingfloridagulfhomes.com: could not connect to host
|
|||
ameho.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
american-truck-simulator.de: could not connect to host
|
||||
american-truck-simulator.net: could not connect to host
|
||||
americanbio.com: could not connect to host
|
||||
americanworkwear.nl: did not receive HSTS header
|
||||
amigogeek.net: could not connect to host
|
||||
amihub.com: could not connect to host
|
||||
|
@ -316,9 +317,6 @@ askfit.cz: did not receive HSTS header
|
|||
asm-x.com: could not connect to host
|
||||
asmui.ga: could not connect to host
|
||||
asmui.ml: could not connect to host
|
||||
asr.li: could not connect to host
|
||||
asr.rocks: could not connect to host
|
||||
asr.solar: could not connect to host
|
||||
asrob.eu: did not receive HSTS header
|
||||
ass.org.au: did not receive HSTS header
|
||||
assdecoeur.org: could not connect to host
|
||||
|
@ -477,6 +475,7 @@ bi.search.yahoo.com: did not receive HSTS header
|
|||
bidon.ca: did not receive HSTS header
|
||||
bieberium.de: could not connect to host
|
||||
bienenblog.cc: could not connect to host
|
||||
bierbaumer.net: did not receive HSTS header
|
||||
big-black.de: did not receive HSTS header
|
||||
bigbrownpromotions.com.au: did not receive HSTS header
|
||||
bigdinosaur.org: could not connect to host
|
||||
|
@ -608,6 +607,7 @@ bulmafox.com: could not connect to host
|
|||
bumarkamoda.com: could not connect to host
|
||||
bunaken.asia: could not connect to host
|
||||
burian-server.cz: could not connect to host
|
||||
burpsuite.site: could not connect to host
|
||||
burrow.ovh: could not connect to host
|
||||
burtrum.me: could not connect to host
|
||||
burtrum.top: could not connect to host
|
||||
|
@ -648,6 +648,7 @@ cake.care: could not connect to host
|
|||
calendarr.com: did not receive HSTS header
|
||||
calgaryconstructionjobs.com: did not receive HSTS header
|
||||
calix.com: max-age too low: 0
|
||||
call.me: did not receive HSTS header
|
||||
calltrackingreports.com: could not connect to host
|
||||
calvin.me: max-age too low: 2592000
|
||||
calvinallen.net: did not receive HSTS header
|
||||
|
@ -727,7 +728,6 @@ charityclear.com: did not receive HSTS header
|
|||
charnleyhouse.co.uk: max-age too low: 604800
|
||||
chartpen.com: did not receive HSTS header
|
||||
chartstoffarm.de: max-age too low: 10
|
||||
chaska.co.za: could not connect to host
|
||||
chatbot.me: did not receive HSTS header
|
||||
chateauconstellation.ch: did not receive HSTS header
|
||||
chatme.im: did not receive HSTS header
|
||||
|
@ -742,13 +742,12 @@ cheesetart.my: could not connect to host
|
|||
cheetah85.de: could not connect to host
|
||||
chejianer.cn: did not receive HSTS header
|
||||
chensir.net: could not connect to host
|
||||
cherryonit.com: could not connect to host
|
||||
cherysunzhang.com: max-age too low: 7776000
|
||||
chihiro.xyz: could not connect to host
|
||||
chijiokeindustries.co.uk: could not connect to host
|
||||
childcaresolutionscny.org: did not receive HSTS header
|
||||
chinacdn.org: could not connect to host
|
||||
chinawhale.com: did not receive HSTS header
|
||||
chinawhale.com: could not connect to host
|
||||
chirgui.eu: could not connect to host
|
||||
chm.vn: did not receive HSTS header
|
||||
chontalpa.pw: could not connect to host
|
||||
|
@ -831,6 +830,8 @@ cmsbattle.com: could not connect to host
|
|||
cmscafe.ru: did not receive HSTS header
|
||||
cn.search.yahoo.com: did not receive HSTS header
|
||||
cni-certing.it: max-age too low: 0
|
||||
cnwage.com: could not connect to host
|
||||
cnwarn.com: could not connect to host
|
||||
co50.com: did not receive HSTS header
|
||||
cocaine-import.agency: could not connect to host
|
||||
cocktailfuture.fr: could not connect to host
|
||||
|
@ -841,10 +842,10 @@ code.google.com: did not receive HSTS header (error ignored - included regardles
|
|||
codeco.pw: could not connect to host
|
||||
codecontrollers.de: could not connect to host
|
||||
codeforce.io: could not connect to host
|
||||
codeforhakodate.org: could not connect to host
|
||||
codelayer.ca: could not connect to host
|
||||
codemonkeyrawks.net: did not receive HSTS header
|
||||
codepoet.de: could not connect to host
|
||||
codepult.com: could not connect to host
|
||||
codepx.com: did not receive HSTS header
|
||||
codewiththepros.org: could not connect to host
|
||||
codiva.io: max-age too low: 2592000
|
||||
|
@ -883,7 +884,7 @@ consciousandglamorous.com: could not connect to host
|
|||
console.python.org: did not receive HSTS header
|
||||
constructionjobs.com: did not receive HSTS header
|
||||
contactbig.com: did not receive HSTS header
|
||||
containerstatistics.com: could not connect to host
|
||||
containerstatistics.com: did not receive HSTS header
|
||||
contarkos.xyz: could not connect to host
|
||||
content-api-dev.azurewebsites.net: could not connect to host
|
||||
continuumgaming.com: could not connect to host
|
||||
|
@ -915,6 +916,7 @@ craftedge.xyz: could not connect to host
|
|||
craftmine.cz: did not receive HSTS header
|
||||
crate.io: did not receive HSTS header
|
||||
cravelyrics.com: could not connect to host
|
||||
crazifyngers.com: could not connect to host
|
||||
crazy-crawler.de: did not receive HSTS header
|
||||
crazycen.com: did not receive HSTS header
|
||||
crazyhotseeds.com: did not receive HSTS header
|
||||
|
@ -951,9 +953,11 @@ csfs.org.uk: could not connect to host
|
|||
csgodicegame.com: did not receive HSTS header
|
||||
csgoelemental.com: could not connect to host
|
||||
csgokings.eu: could not connect to host
|
||||
cshopify.com: could not connect to host
|
||||
csohack.tk: could not connect to host
|
||||
cspbuilder.info: could not connect to host
|
||||
cspvalidator.org: did not receive HSTS header
|
||||
csru.net: could not connect to host
|
||||
csvape.com: did not receive HSTS header
|
||||
ct-status.org: could not connect to host
|
||||
ct.search.yahoo.com: did not receive HSTS header
|
||||
|
@ -971,6 +975,7 @@ curroapp.com: could not connect to host
|
|||
curveweb.co.uk: did not receive HSTS header
|
||||
custe.rs: could not connect to host
|
||||
cuvva.insure: did not receive HSTS header
|
||||
cwage.com: could not connect to host
|
||||
cyanogenmod.xxx: could not connect to host
|
||||
cyberpunk.ca: could not connect to host
|
||||
cybershambles.com: could not connect to host
|
||||
|
@ -1008,9 +1013,6 @@ darrenellis.xyz: could not connect to host
|
|||
dashburst.com: did not receive HSTS header
|
||||
dashnimorad.com: did not receive HSTS header
|
||||
data-abundance.com: could not connect to host
|
||||
databionix.com: could not connect to host
|
||||
databutlr.com: could not connect to host
|
||||
databutlr.net: could not connect to host
|
||||
datahove.no: did not receive HSTS header
|
||||
datajapan.co.jp: could not connect to host
|
||||
datarank.com: max-age too low: 0
|
||||
|
@ -1078,12 +1080,11 @@ derevtsov.com: did not receive HSTS header
|
|||
derhil.de: did not receive HSTS header
|
||||
derwolfe.net: did not receive HSTS header
|
||||
desiccantpackets.com: did not receive HSTS header
|
||||
designgears.com: could not connect to host
|
||||
designgears.com: did not receive HSTS header
|
||||
designthinking.or.jp: did not receive HSTS header
|
||||
despora.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
destinationbijoux.fr: could not connect to host
|
||||
detector.exposed: could not connect to host
|
||||
detest.org: could not connect to host
|
||||
devcu.net: did not receive HSTS header
|
||||
deviltracks.net: could not connect to host
|
||||
devincrow.me: could not connect to host
|
||||
|
@ -1117,7 +1118,6 @@ diva-ey.com: could not connect to host
|
|||
dizihocasi.com: could not connect to host
|
||||
dizorg.net: could not connect to host
|
||||
dj4et.de: could not connect to host
|
||||
djlnetworks.co.uk: did not receive HSTS header
|
||||
djz4music.com: did not receive HSTS header
|
||||
dl.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
dlc.viasinc.com: could not connect to host
|
||||
|
@ -1192,13 +1192,13 @@ dustri.org: did not receive HSTS header
|
|||
dutchessuganda.com: did not receive HSTS header
|
||||
dutchrank.com: could not connect to host
|
||||
dwhd.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
dworzak.ch: could not connect to host
|
||||
dycontrol.de: could not connect to host
|
||||
dylanscott.com.au: did not receive HSTS header
|
||||
dymersion.com: did not receive HSTS header
|
||||
dynamic-innovations.net: could not connect to host
|
||||
dzimejl.sk: did not receive HSTS header
|
||||
dzlibs.io: could not connect to host
|
||||
dzndk.net: could not connect to host
|
||||
dzndk.org: could not connect to host
|
||||
e-aut.net: did not receive HSTS header
|
||||
e-deca2.org: did not receive HSTS header
|
||||
|
@ -1272,7 +1272,6 @@ elsitar.com: did not receive HSTS header
|
|||
email.lookout.com: could not connect to host
|
||||
emanatepixels.com: could not connect to host
|
||||
emeldi-commerce.com: max-age too low: 0
|
||||
emilyhorsman.com: could not connect to host
|
||||
eminovic.me: could not connect to host
|
||||
emjainteractive.com: did not receive HSTS header
|
||||
emjimadhu.com: could not connect to host
|
||||
|
@ -1314,6 +1313,8 @@ envygeeks.io: did not receive HSTS header
|
|||
eol34.com: did not receive HSTS header
|
||||
epanurse.com: could not connect to host
|
||||
ephry.com: could not connect to host
|
||||
epicsecure.de: could not connect to host
|
||||
epicsoft.de: could not connect to host
|
||||
epoxate.com: could not connect to host
|
||||
eq8.net.au: could not connect to host
|
||||
equate.net.au: max-age too low: 3600
|
||||
|
@ -1357,10 +1358,9 @@ eulerpi.io: could not connect to host
|
|||
eupho.me: could not connect to host
|
||||
euroshop24.net: could not connect to host
|
||||
evafojtova.cz: did not receive HSTS header
|
||||
evalesc.com: could not connect to host
|
||||
evantage.org: could not connect to host
|
||||
evdenevenakliyatankara.pw: did not receive HSTS header
|
||||
everybooks.com: max-age too low: 60
|
||||
everybooks.com: could not connect to host
|
||||
everylab.org: could not connect to host
|
||||
everything.place: could not connect to host
|
||||
evin.ml: could not connect to host
|
||||
|
@ -1375,7 +1375,7 @@ exgravitus.com: could not connect to host
|
|||
exitus.jp: max-age too low: 0
|
||||
exno.co: could not connect to host
|
||||
exousiakaidunamis.xyz: could not connect to host
|
||||
expatads.com: could not connect to host
|
||||
expatads.com: did not receive HSTS header
|
||||
expertmile.com: did not receive HSTS header
|
||||
expoundite.net: did not receive HSTS header
|
||||
expressfinance.co.za: did not receive HSTS header
|
||||
|
@ -1521,6 +1521,7 @@ foxley-seeds.co.uk: did not receive HSTS header
|
|||
foxleyseeds.co.uk: could not connect to host
|
||||
foxtrot.pw: could not connect to host
|
||||
fr33d0m.link: could not connect to host
|
||||
fragmentspuren.de: could not connect to host
|
||||
francevpn.xyz: could not connect to host
|
||||
frangor.info: did not receive HSTS header
|
||||
frankwei.xyz: did not receive HSTS header
|
||||
|
@ -1550,6 +1551,7 @@ frontisme.nl: could not connect to host
|
|||
frontmin.com: did not receive HSTS header
|
||||
frost-ci.xyz: could not connect to host
|
||||
frosty-gaming.xyz: did not receive HSTS header
|
||||
frowin-stemmer.de: could not connect to host
|
||||
fruitusers.com: could not connect to host
|
||||
frusky.de: did not receive HSTS header
|
||||
frusky.net: could not connect to host
|
||||
|
@ -1560,6 +1562,7 @@ fuckgfw233.org: could not connect to host
|
|||
fukushima-web.com: did not receive HSTS header
|
||||
fundacionhijosdelsol.org: could not connect to host
|
||||
funkyweddingideas.com.au: could not connect to host
|
||||
funnyang.com: could not connect to host
|
||||
funrun.com: did not receive HSTS header
|
||||
furiffic.com: did not receive HSTS header
|
||||
furnation.com: could not connect to host
|
||||
|
@ -1570,6 +1573,7 @@ futurenda.com: could not connect to host
|
|||
futuretechnologi.es: could not connect to host
|
||||
futureyouhealth.com: did not receive HSTS header
|
||||
fx-rk.com: did not receive HSTS header
|
||||
fyrkat.no: could not connect to host
|
||||
fysiohaenraets.nl: did not receive HSTS header
|
||||
fzn.io: could not connect to host
|
||||
fzslm.me: did not receive HSTS header
|
||||
|
@ -1582,7 +1586,6 @@ gabber.scot: could not connect to host
|
|||
gaelleetarnaud.com: did not receive HSTS header
|
||||
gafachi.com: could not connect to host
|
||||
gaiserik.com: could not connect to host
|
||||
gaite.me: could not connect to host
|
||||
gakkainavi.jp: did not receive HSTS header
|
||||
gakkainavi4.com: could not connect to host
|
||||
gakkainavi4.net: did not receive HSTS header
|
||||
|
@ -1613,7 +1616,7 @@ garciamartin.me: could not connect to host
|
|||
garden-life.org: could not connect to host
|
||||
gatapro.net: could not connect to host
|
||||
gatilagata.com.br: could not connect to host
|
||||
gatorsa.es: did not receive HSTS header
|
||||
gatorsa.es: could not connect to host
|
||||
gdpventure.com: max-age too low: 0
|
||||
gedankenbude.info: could not connect to host
|
||||
geekcast.co.uk: did not receive HSTS header
|
||||
|
@ -1665,6 +1668,7 @@ gietvloergarant.nl: did not receive HSTS header
|
|||
gigacloud.org: max-age too low: 0
|
||||
gilgaz.com: did not receive HSTS header
|
||||
gilly.berlin: did not receive HSTS header
|
||||
gincher.net: could not connect to host
|
||||
gingali.de: did not receive HSTS header
|
||||
gintenreiter-photography.com: did not receive HSTS header
|
||||
giogadesign.com: did not receive HSTS header
|
||||
|
@ -1749,6 +1753,7 @@ gremots.com: could not connect to host
|
|||
greplin.com: could not connect to host
|
||||
gresb.com: did not receive HSTS header
|
||||
gribani.com: could not connect to host
|
||||
griesser2.de: could not connect to host
|
||||
grigalanzsoftware.com: could not connect to host
|
||||
gripopgriep.net: could not connect to host
|
||||
grossmann.gr: could not connect to host
|
||||
|
@ -1769,6 +1774,7 @@ gugga.dk: did not receive HSTS header
|
|||
guilde-vindicta.fr: did not receive HSTS header
|
||||
gulenet.com: could not connect to host
|
||||
gunnarhafdal.com: did not receive HSTS header
|
||||
guoqiang.info: could not connect to host
|
||||
gurom.lv: could not connect to host
|
||||
gurusupe.com: could not connect to host
|
||||
guso.gq: could not connect to host
|
||||
|
@ -1812,11 +1818,16 @@ hanfu.la: could not connect to host
|
|||
hang333.pw: did not receive HSTS header
|
||||
hanimalis.fr: could not connect to host
|
||||
hansen.hn: could not connect to host
|
||||
hao-zhang.com: could not connect to host
|
||||
hao2taiwan.com: max-age too low: 0
|
||||
haoyugao.com: could not connect to host
|
||||
haozhang.org: could not connect to host
|
||||
hapijs.cn: could not connect to host
|
||||
hapissl.com: could not connect to host
|
||||
hapivm.com: could not connect to host
|
||||
happyfabric.me: did not receive HSTS header
|
||||
happygastro.com: could not connect to host
|
||||
hapvm.com: could not connect to host
|
||||
harabuhouse.com: did not receive HSTS header
|
||||
harbor-light.net: could not connect to host
|
||||
hardline.xyz: could not connect to host
|
||||
|
@ -1829,6 +1840,7 @@ harz.cloud: could not connect to host
|
|||
has.vision: could not connect to host
|
||||
hash-list.com: could not connect to host
|
||||
hasilocke.de: did not receive HSTS header
|
||||
hasinase.de: could not connect to host
|
||||
haste.ch: could not connect to host
|
||||
hastherebeenamassshooting.today: could not connect to host
|
||||
hatoko.net: could not connect to host
|
||||
|
@ -1896,7 +1908,6 @@ honeytracks.com: [Exception... "Component returned failure code: 0x80004005 (NS_
|
|||
hongzhaxiaofendui.com: could not connect to host
|
||||
honoo.com: could not connect to host
|
||||
hookandloom.com: did not receive HSTS header
|
||||
hooray.beer: could not connect to host
|
||||
hoovism.com: did not receive HSTS header
|
||||
horosho.in: could not connect to host
|
||||
horseboners.xxx: did not receive HSTS header
|
||||
|
@ -1907,7 +1918,6 @@ hosted-service.com: did not receive HSTS header
|
|||
hostedtalkgadget.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
hostgarou.com: did not receive HSTS header
|
||||
hostinaus.com.au: could not connect to host
|
||||
hostinghelp.guru: could not connect to host
|
||||
hostisan.com: did not receive HSTS header
|
||||
hotchillibox.com: max-age too low: 0
|
||||
hotchoc.io: did not receive HSTS header
|
||||
|
@ -1934,17 +1944,19 @@ humpteedumptee.in: did not receive HSTS header
|
|||
huntshomeinspections.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
hurricanelabs.com: did not receive HSTS header
|
||||
huskybutt.dog: could not connect to host
|
||||
hvh.no: could not connect to host
|
||||
hydra.ws: could not connect to host
|
||||
hydronium.cf: could not connect to host
|
||||
hydronium.ga: could not connect to host
|
||||
hydronium.me: could not connect to host
|
||||
hydronium.ml: could not connect to host
|
||||
hydronium.tk: could not connect to host
|
||||
hyper69.com: did not receive HSTS header
|
||||
i-jp.net: could not connect to host
|
||||
i-partners.sk: did not receive HSTS header
|
||||
iamokay.nl: did not receive HSTS header
|
||||
iamveto.com: could not connect to host
|
||||
iapws.com: did not receive HSTS header
|
||||
iapws.com: could not connect to host
|
||||
iban.is: could not connect to host
|
||||
ibarf.nl: did not receive HSTS header
|
||||
icebat.dyndns.org: could not connect to host
|
||||
|
@ -1953,6 +1965,7 @@ icfl.com.br: could not connect to host
|
|||
ichnichtskaufmann.de: could not connect to host
|
||||
ichoosebtec.com: could not connect to host
|
||||
icloud.net: could not connect to host
|
||||
icodesign.me: could not connect to host
|
||||
icpc2016.in.th: could not connect to host
|
||||
icreative.nl: did not receive HSTS header
|
||||
ictual.com: max-age too low: 0
|
||||
|
@ -1976,7 +1989,6 @@ ies.id.lv: could not connect to host
|
|||
ifad.org: did not receive HSTS header
|
||||
ifleurs.com: could not connect to host
|
||||
ifx.ee: could not connect to host
|
||||
igk.de: did not receive HSTS header
|
||||
ignatisd.gr: did not receive HSTS header
|
||||
igule.net: could not connect to host
|
||||
ihrlotto.de: could not connect to host
|
||||
|
@ -1993,6 +2005,7 @@ ilmconpm.de: did not receive HSTS header
|
|||
ilona.graphics: max-age too low: 3600
|
||||
iluvscotland.co.uk: did not receive HSTS header
|
||||
imakepoems.net: could not connect to host
|
||||
imanolbarba.net: could not connect to host
|
||||
ime.moe: could not connect to host
|
||||
imim.pw: did not receive HSTS header
|
||||
immersionwealth.com: could not connect to host
|
||||
|
@ -2045,7 +2058,6 @@ instacart.com: did not receive HSTS header
|
|||
instantdev.io: could not connect to host
|
||||
institutoflordelavida.com: could not connect to host
|
||||
intel.li: could not connect to host
|
||||
intelldynamics.com: could not connect to host
|
||||
interference.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
interlun.com: could not connect to host
|
||||
internetcasinos.de: could not connect to host
|
||||
|
@ -2089,6 +2101,7 @@ isogram.nl: could not connect to host
|
|||
israkurort.com: did not receive HSTS header
|
||||
isslshop.com: could not connect to host
|
||||
istaspirtslietas.lv: did not receive HSTS header
|
||||
isteinbaby.de: could not connect to host
|
||||
it-go.net: did not receive HSTS header
|
||||
itechgeek.com: max-age too low: 0
|
||||
ithakama.com: did not receive HSTS header
|
||||
|
@ -2099,7 +2112,6 @@ itriskltd.com: could not connect to host
|
|||
itsadog.co.uk: did not receive HSTS header
|
||||
itsagadget.com: did not receive HSTS header
|
||||
itsamurai.ru: max-age too low: 2592000
|
||||
itsatrap.nl: could not connect to host
|
||||
itsecurityassurance.pw: could not connect to host
|
||||
itsg-faq.de: could not connect to host
|
||||
itshost.ru: could not connect to host
|
||||
|
@ -2162,7 +2174,6 @@ jcor.me: did not receive HSTS header
|
|||
jcoscia.com: could not connect to host
|
||||
jctf.io: could not connect to host
|
||||
jeff393.com: could not connect to host
|
||||
jeffersonregan.com: could not connect to host
|
||||
jenjoit.de: could not connect to host
|
||||
jensenbanden.no: could not connect to host
|
||||
jeremye77.com: could not connect to host
|
||||
|
@ -2220,7 +2231,6 @@ jrvar.com: did not receive HSTS header
|
|||
jsanders.us: did not receive HSTS header
|
||||
jsg-technologies.de: did not receive HSTS header
|
||||
jslay.net: could not connect to host
|
||||
jsteward.moe: could not connect to host
|
||||
jualautoclave.com: did not receive HSTS header
|
||||
jualssh.com: could not connect to host
|
||||
juliamweber.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
|
@ -2230,7 +2240,6 @@ junaos.xyz: did not receive HSTS header
|
|||
junge-selbsthilfe.info: could not connect to host
|
||||
junqtion.com: could not connect to host
|
||||
jupp0r.de: did not receive HSTS header
|
||||
justinharrison.ca: could not connect to host
|
||||
justlikethat.hosting: did not receive HSTS header
|
||||
justnaw.co.uk: could not connect to host
|
||||
justudin.com: did not receive HSTS header
|
||||
|
@ -2287,7 +2296,6 @@ kg-rating.com: could not connect to host
|
|||
kgxtech.com: max-age too low: 2592000
|
||||
ki-on.net: did not receive HSTS header
|
||||
kickass.al: could not connect to host
|
||||
kickstart.com.pk: could not connect to host
|
||||
kid-dachau.de: did not receive HSTS header
|
||||
kiel-media.de: did not receive HSTS header
|
||||
kienlen.org: could not connect to host
|
||||
|
@ -2362,6 +2370,7 @@ kryptomech.com: could not connect to host
|
|||
ksfh-mail.de: could not connect to host
|
||||
kstan.me: could not connect to host
|
||||
kswriter.com: could not connect to host
|
||||
kuchentraum.eu: could not connect to host
|
||||
kucom.it: did not receive HSTS header
|
||||
kueulangtahunanak.net: could not connect to host
|
||||
kummerlaender.eu: did not receive HSTS header
|
||||
|
@ -2410,7 +2419,7 @@ lask.in: did not receive HSTS header
|
|||
latinred.com: could not connect to host
|
||||
latour-managedcare.ch: did not receive HSTS header
|
||||
latus.xyz: could not connect to host
|
||||
lausitzer-widerstand.de: could not connect to host
|
||||
lausitzer-widerstand.de: did not receive HSTS header
|
||||
lavine.ch: did not receive HSTS header
|
||||
lavval.com: could not connect to host
|
||||
lawformt.com: could not connect to host
|
||||
|
@ -2439,7 +2448,6 @@ lentri.com: did not receive HSTS header
|
|||
leob.in: did not receive HSTS header
|
||||
leolana.com: could not connect to host
|
||||
leon-jaekel.com: could not connect to host
|
||||
leonardcamacho.me: could not connect to host
|
||||
leopold.email: could not connect to host
|
||||
leopotamgroup.com: could not connect to host
|
||||
leovanna.co.uk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
|
@ -2513,7 +2521,7 @@ litzenberger.ca: could not connect to host
|
|||
livedemo.io: could not connect to host
|
||||
livej.am: could not connect to host
|
||||
livi.co: did not receive HSTS header
|
||||
lnoldan.com: could not connect to host
|
||||
livolett.de: could not connect to host
|
||||
loadingdeck.com: did not receive HSTS header
|
||||
loadso.me: could not connect to host
|
||||
loafbox.com: could not connect to host
|
||||
|
@ -2564,7 +2572,7 @@ lumd.me: could not connect to host
|
|||
lumi.do: did not receive HSTS header
|
||||
lungdoc.us: could not connect to host
|
||||
luno.io: could not connect to host
|
||||
luody.info: could not connect to host
|
||||
luody.info: did not receive HSTS header
|
||||
luoe.ml: could not connect to host
|
||||
luoxiao.im: could not connect to host
|
||||
luripump.se: could not connect to host
|
||||
|
@ -2595,7 +2603,6 @@ madars.org: did not receive HSTS header
|
|||
maddin.ga: could not connect to host
|
||||
madebymagnitude.com: did not receive HSTS header
|
||||
maderwin.com: could not connect to host
|
||||
madusecurity.com: could not connect to host
|
||||
mae-berlinistanbul.com: could not connect to host
|
||||
mafamane.com: could not connect to host
|
||||
mafiareturns.com: max-age too low: 2592000
|
||||
|
@ -2625,9 +2632,11 @@ mannsolutions.co.uk: did not receive HSTS header
|
|||
mansion-note.com: did not receive HSTS header
|
||||
manufacturing.gov: could not connect to host
|
||||
maomaofuli.vip: could not connect to host
|
||||
marchagen.nl: could not connect to host
|
||||
marchagen.nl: did not receive HSTS header
|
||||
marcofinke.de: could not connect to host
|
||||
marcontrol.com: did not receive HSTS header
|
||||
marcuskoh.com: did not receive HSTS header
|
||||
margaretrosefashions.co.uk: could not connect to host
|
||||
mariannematthew.com: could not connect to host
|
||||
marie-curie.fr: could not connect to host
|
||||
marie-elisabeth.dk: did not receive HSTS header
|
||||
|
@ -2661,7 +2670,6 @@ matsuz.com: could not connect to host
|
|||
mattberryman.com: did not receive HSTS header
|
||||
mattcoles.io: did not receive HSTS header
|
||||
mattfin.ch: could not connect to host
|
||||
matthewkenny.co.uk: could not connect to host
|
||||
matthewprenger.com: could not connect to host
|
||||
matthiassteen.be: max-age too low: 0
|
||||
mattressinsider.com: max-age too low: 3153600
|
||||
|
@ -2679,7 +2687,6 @@ mccarty.io: could not connect to host
|
|||
mccrackon.com: could not connect to host
|
||||
mcdonalds.ru: did not receive HSTS header
|
||||
mcga.media: did not receive HSTS header
|
||||
mcl.gg: did not receive HSTS header
|
||||
mclab.su: could not connect to host
|
||||
mdewendt.de: could not connect to host
|
||||
mdfnet.se: did not receive HSTS header
|
||||
|
@ -2723,10 +2730,7 @@ meshok.ru: did not receive HSTS header
|
|||
mesmoque.com: did not receive HSTS header
|
||||
metagrader.com: could not connect to host
|
||||
metebalci.com: did not receive HSTS header
|
||||
meteobox.es: could not connect to host
|
||||
meteobox.mx: could not connect to host
|
||||
meteobox.pl: could not connect to host
|
||||
meteobox.sk: could not connect to host
|
||||
meteobox.mx: did not receive HSTS header
|
||||
meteorapp.space: could not connect to host
|
||||
meteosky.net: could not connect to host
|
||||
metin2blog.de: did not receive HSTS header
|
||||
|
@ -2774,6 +2778,7 @@ minecraftserverz.com: could not connect to host
|
|||
minecraftvoter.com: could not connect to host
|
||||
mineover.es: could not connect to host
|
||||
minikneet.nl: did not receive HSTS header
|
||||
minimvc.com: could not connect to host
|
||||
minnesotadata.com: could not connect to host
|
||||
minoris.se: could not connect to host
|
||||
miragrow.com: could not connect to host
|
||||
|
@ -2805,7 +2810,6 @@ mobilemedics.com: did not receive HSTS header
|
|||
mobilethreat.net: could not connect to host
|
||||
mobilethreatnetwork.net: could not connect to host
|
||||
mobilpass.no: could not connect to host
|
||||
mobix5.com: could not connect to host
|
||||
mocloud.eu: could not connect to host
|
||||
model9.io: did not receive HSTS header
|
||||
modemagazines.co.uk: could not connect to host
|
||||
|
@ -2814,6 +2818,7 @@ moebel-nagel.de: did not receive HSTS header
|
|||
moelord.org: could not connect to host
|
||||
moen.io: did not receive HSTS header
|
||||
mogry.net: did not receive HSTS header
|
||||
mona.lu: did not receive HSTS header
|
||||
monarca.systems: could not connect to host
|
||||
monasterialis.eu: could not connect to host
|
||||
mondar.io: did not receive HSTS header
|
||||
|
@ -2845,6 +2850,7 @@ movepin.com: did not receive HSTS header
|
|||
moviesabout.net: could not connect to host
|
||||
moy-gorod.od.ua: did not receive HSTS header
|
||||
moy.cat: did not receive HSTS header
|
||||
mozoa.net: did not receive HSTS header
|
||||
mp3juices.is: could not connect to host
|
||||
mqas.net: could not connect to host
|
||||
mrdani.net: could not connect to host
|
||||
|
@ -2891,13 +2897,13 @@ mycoted.com: did not receive HSTS header
|
|||
mydeos.com: could not connect to host
|
||||
mydigipass.com: did not receive HSTS header
|
||||
myepass.de: could not connect to host
|
||||
myg21.com: could not connect to host
|
||||
mygate.at: could not connect to host
|
||||
mygdut.com: did not receive HSTS header
|
||||
mygov.scot: did not receive HSTS header
|
||||
myiocc.org: could not connect to host
|
||||
mykolab.com: did not receive HSTS header
|
||||
mykreuzfahrt.de: could not connect to host
|
||||
myms.eu: could not connect to host
|
||||
myni.io: could not connect to host
|
||||
mypagella.com: could not connect to host
|
||||
mypagella.eu: could not connect to host
|
||||
|
@ -2920,7 +2926,7 @@ naiharngym.com: did not receive HSTS header
|
|||
najedlo.sk: did not receive HSTS header
|
||||
nakliyatsirketi.biz: did not receive HSTS header
|
||||
nakuro.de: could not connect to host
|
||||
nalifornia.com: could not connect to host
|
||||
nalifornia.com: did not receive HSTS header
|
||||
nallon.com.br: could not connect to host
|
||||
namacindia.com: did not receive HSTS header
|
||||
namaho.com: could not connect to host
|
||||
|
@ -3039,6 +3045,7 @@ nordiccasinocommunity.com: did not receive HSTS header
|
|||
nordor.homeip.net: could not connect to host
|
||||
nosecretshop.com: could not connect to host
|
||||
notadd.com: did not receive HSTS header
|
||||
notcompletelycorrect.com: could not connect to host
|
||||
notenoughtime.de: could not connect to host
|
||||
nottheonion.net: did not receive HSTS header
|
||||
nouvelle-vague-saint-cast.fr: did not receive HSTS header
|
||||
|
@ -3114,7 +3121,6 @@ oldoakflorist.com: could not connect to host
|
|||
oliverdunk.com: did not receive HSTS header
|
||||
ollehbizev.co.kr: could not connect to host
|
||||
ollie.io: did not receive HSTS header
|
||||
olmari.fi: did not receive HSTS header
|
||||
omgaanmetidealen.com: could not connect to host
|
||||
ominto.com: max-age too low: 0
|
||||
omniti.com: max-age too low: 1
|
||||
|
@ -3139,6 +3145,7 @@ onlinewetten.de: could not connect to host
|
|||
onlyshopstation.com: did not receive HSTS header
|
||||
ononpay.com: did not receive HSTS header
|
||||
onpatient.com: did not receive HSTS header
|
||||
onsitemassageco.com: did not receive HSTS header
|
||||
ontras.com: could not connect to host
|
||||
onyxwall.com: could not connect to host
|
||||
onyxwall.link: could not connect to host
|
||||
|
@ -3258,7 +3265,6 @@ paster.li: did not receive HSTS header
|
|||
pataua.kiwi: did not receive HSTS header
|
||||
paternitydnatest.com: could not connect to host
|
||||
patientinsight.net: could not connect to host
|
||||
patrz.eu: could not connect to host
|
||||
patt.us: did not receive HSTS header
|
||||
patterson.mp: could not connect to host
|
||||
paulyang.cn: did not receive HSTS header
|
||||
|
@ -3281,6 +3287,7 @@ peakapp.nl: could not connect to host
|
|||
peissen.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
pekkapikkarainen.fi: did not receive HSTS header
|
||||
pekkarik.ru: could not connect to host
|
||||
pengi.me: could not connect to host
|
||||
penguinclientsystem.com: could not connect to host
|
||||
pensacolawinterfest.org: could not connect to host
|
||||
pentano.net: could not connect to host
|
||||
|
@ -3302,6 +3309,7 @@ petplum.com: did not receive HSTS header
|
|||
petrachuk.ru: could not connect to host
|
||||
petravdbos.nl: did not receive HSTS header
|
||||
petrolplus.ru: did not receive HSTS header
|
||||
petrovsky.pro: could not connect to host
|
||||
petsittersservices.com: could not connect to host
|
||||
pettsy.com: could not connect to host
|
||||
pewboards.com: could not connect to host
|
||||
|
@ -3367,6 +3375,7 @@ plombirator.kz: did not receive HSTS header
|
|||
plothost.com: did not receive HSTS header
|
||||
ploup.net: could not connect to host
|
||||
pluff.nl: could not connect to host
|
||||
plur.com.au: did not receive HSTS header
|
||||
pmnts.io: could not connect to host
|
||||
po.gl: did not receive HSTS header
|
||||
pocketsix.com: did not receive HSTS header
|
||||
|
@ -3381,7 +3390,6 @@ polimat.org: could not connect to host
|
|||
politically-incorrect.xyz: could not connect to host
|
||||
politologos.org: did not receive HSTS header
|
||||
polycoise.com: could not connect to host
|
||||
polymathematician.com: could not connect to host
|
||||
polypho.nyc: could not connect to host
|
||||
pompompoes.com: could not connect to host
|
||||
pontualcomp.com: max-age too low: 2592000
|
||||
|
@ -3420,12 +3428,12 @@ pro-zone.com: could not connect to host
|
|||
prodpad.com: did not receive HSTS header
|
||||
professionalboundaries.com: did not receive HSTS header
|
||||
profi-durchgangsmelder.de: did not receive HSTS header
|
||||
profpay.com: could not connect to host
|
||||
profundr.com: could not connect to host
|
||||
progblog.net: could not connect to host
|
||||
progg.no: could not connect to host
|
||||
progress-technologies.com: could not connect to host
|
||||
prohostonline.fi: could not connect to host
|
||||
proj.org.cn: could not connect to host
|
||||
projectdp.net: could not connect to host
|
||||
projectmercury.space: could not connect to host
|
||||
promecon-gmbh.de: did not receive HSTS header
|
||||
|
@ -3478,7 +3486,7 @@ qorm.co.uk: did not receive HSTS header
|
|||
qrara.net: did not receive HSTS header
|
||||
qrlending.com: did not receive HSTS header
|
||||
quail.solutions: could not connect to host
|
||||
quality1.com.br: did not receive HSTS header
|
||||
quality1.com.br: could not connect to host
|
||||
quantacloud.ch: could not connect to host
|
||||
quantenteranik.eu: could not connect to host
|
||||
quantum-cloud.xyz: could not connect to host
|
||||
|
@ -3507,10 +3515,11 @@ randomcloud.net: could not connect to host
|
|||
randomhero.cloud: could not connect to host
|
||||
rankthespot.com: could not connect to host
|
||||
rannseier.org: did not receive HSTS header
|
||||
rapido.nu: could not connect to host
|
||||
rapido.nu: did not receive HSTS header
|
||||
rapidresearch.me: could not connect to host
|
||||
rapidthunder.io: could not connect to host
|
||||
rasing.me: did not receive HSTS header
|
||||
raspass.me: could not connect to host
|
||||
rastreador.com.es: did not receive HSTS header
|
||||
ratajczak.fr: could not connect to host
|
||||
rate-esport.de: could not connect to host
|
||||
|
@ -3567,7 +3576,7 @@ rentacarcluj.xyz: could not connect to host
|
|||
rentcarassist.com: could not connect to host
|
||||
renteater.com: could not connect to host
|
||||
replacemychina.com: could not connect to host
|
||||
reprolife.co.uk: max-age too low: 0
|
||||
reprolife.co.uk: could not connect to host
|
||||
res-rheingau.de: did not receive HSTS header
|
||||
res42.com: could not connect to host
|
||||
research.facebook.com: did not receive HSTS header
|
||||
|
@ -3609,6 +3618,7 @@ rk6.cz: could not connect to host
|
|||
rkkhok.hu: did not receive HSTS header
|
||||
rkmantpur.org: did not receive HSTS header
|
||||
rme.li: did not receive HSTS header
|
||||
rms.sexy: could not connect to host
|
||||
rngmeme.com: could not connect to host
|
||||
roadfeast.com: could not connect to host
|
||||
roan24.pl: did not receive HSTS header
|
||||
|
@ -3645,7 +3655,6 @@ rouvray.org: could not connect to host
|
|||
royalpub.net: did not receive HSTS header
|
||||
rr.in.th: could not connect to host
|
||||
rrke.cc: did not receive HSTS header
|
||||
rrom.me: could not connect to host
|
||||
rsajeey.info: could not connect to host
|
||||
rsauget.fr: could not connect to host
|
||||
rsf.io: could not connect to host
|
||||
|
@ -3677,6 +3686,7 @@ rxv.cc: could not connect to host
|
|||
ryansmithphotography.com: did not receive HSTS header
|
||||
ryanteck.uk: did not receive HSTS header
|
||||
s.how: did not receive HSTS header
|
||||
safelist.eu: did not receive HSTS header
|
||||
safematix.com: could not connect to host
|
||||
safewings-nh.nl: did not receive HSTS header
|
||||
safic.net: could not connect to host
|
||||
|
@ -3728,6 +3738,7 @@ sby.de: did not receive HSTS header
|
|||
sc4le.com: could not connect to host
|
||||
scepticism.com: could not connect to host
|
||||
schadegarant.net: could not connect to host
|
||||
schamlosharmlos.de: could not connect to host
|
||||
schnell-gold.com: could not connect to host
|
||||
schoop.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
schrauger.com: did not receive HSTS header
|
||||
|
@ -3744,6 +3755,7 @@ schweizerbolzonello.net: could not connect to host
|
|||
scienceathome.org: did not receive HSTS header
|
||||
scooshonline.co.uk: did not receive HSTS header
|
||||
scotbirchfield.com: did not receive HSTS header
|
||||
scottferguson.com.au: could not connect to host
|
||||
scottgthomas.com: could not connect to host
|
||||
scrambl.is: could not connect to host
|
||||
scrambler.in: could not connect to host
|
||||
|
@ -3794,6 +3806,8 @@ semen3325.xyz: could not connect to host
|
|||
semenkovich.com: did not receive HSTS header
|
||||
semps-servers.de: could not connect to host
|
||||
semps.de: did not receive HSTS header
|
||||
sendc.at: could not connect to host
|
||||
sendcat.com: could not connect to host
|
||||
senedirect.com: did not receive HSTS header
|
||||
sensiblemn.org: could not connect to host
|
||||
sensibus.com: did not receive HSTS header
|
||||
|
@ -3802,7 +3816,6 @@ seomobo.com: could not connect to host
|
|||
seowarp.net: did not receive HSTS header
|
||||
sep23.ru: did not receive HSTS header
|
||||
seq.tf: did not receive HSTS header
|
||||
serathius.ovh: could not connect to host
|
||||
serenitycreams.com: did not receive HSTS header
|
||||
serfdom.io: did not receive HSTS header
|
||||
serized.pw: could not connect to host
|
||||
|
@ -3847,6 +3860,7 @@ shoprose.ru: could not connect to host
|
|||
shops.neonisi.com: could not connect to host
|
||||
shortr.li: could not connect to host
|
||||
showkeeper.tv: did not receive HSTS header
|
||||
shu-kin.net: could not connect to host
|
||||
shukatsu-note.com: could not connect to host
|
||||
shv25.se: could not connect to host
|
||||
shwongacc.com: could not connect to host
|
||||
|
@ -3963,7 +3977,6 @@ somethingnew.xyz: could not connect to host
|
|||
sonicrainboom.rocks: could not connect to host
|
||||
soobi.org: did not receive HSTS header
|
||||
soondy.com: did not receive HSTS header
|
||||
sortaweird.net: could not connect to host
|
||||
sotiran.com: did not receive HSTS header
|
||||
sotor.de: did not receive HSTS header
|
||||
soulema.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
|
@ -4002,12 +4015,13 @@ spikeykc.me: did not receive HSTS header
|
|||
spillmaker.no: did not receive HSTS header
|
||||
spilsbury.io: could not connect to host
|
||||
spititout.it: could not connect to host
|
||||
spittersberger.recipes: did not receive HSTS header
|
||||
spittersberger.recipes: could not connect to host
|
||||
sponsortobias.com: did not receive HSTS header
|
||||
sportwette.eu: did not receive HSTS header
|
||||
spot-events.com: could not connect to host
|
||||
spotifyripper.tk: could not connect to host
|
||||
spotlightsrule.ddns.net: could not connect to host
|
||||
spr.id.au: did not receive HSTS header
|
||||
spreadsheets.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
sproutconnections.com: did not receive HSTS header
|
||||
sprybear.com: did not receive HSTS header
|
||||
|
@ -4110,6 +4124,7 @@ suksit.com: could not connect to host
|
|||
sumoatm.com: did not receive HSTS header
|
||||
sumoscout.de: did not receive HSTS header
|
||||
suncountrymarine.com: did not receive HSTS header
|
||||
sunflyer.cn: did not receive HSTS header
|
||||
sunnyfruit.ru: did not receive HSTS header
|
||||
sunshinepress.org: could not connect to host
|
||||
supcro.com: could not connect to host
|
||||
|
@ -4190,6 +4205,7 @@ tcdw.net: did not receive HSTS header
|
|||
tcl.ath.cx: did not receive HSTS header
|
||||
tcomms.org: max-age too low: 0
|
||||
tcp.expert: did not receive HSTS header
|
||||
tcptun.com: could not connect to host
|
||||
teachforcanada.ca: did not receive HSTS header
|
||||
team-teasers.com: could not connect to host
|
||||
teamsocial.co: did not receive HSTS header
|
||||
|
@ -4334,10 +4350,10 @@ titouan.co: did not receive HSTS header
|
|||
tittelbach.at: did not receive HSTS header
|
||||
titties.ml: could not connect to host
|
||||
tjc.wiki: could not connect to host
|
||||
tkappertjedemetamorfose.nl: could not connect to host
|
||||
tkarstens.de: did not receive HSTS header
|
||||
tkat.ch: could not connect to host
|
||||
tkn.tokyo: could not connect to host
|
||||
tlach.cz: did not receive HSTS header
|
||||
tlo.hosting: could not connect to host
|
||||
tlo.link: did not receive HSTS header
|
||||
tlo.network: could not connect to host
|
||||
|
@ -4349,6 +4365,7 @@ tmitchell.io: could not connect to host
|
|||
tmprod.com: did not receive HSTS header
|
||||
tncnanet.com.br: could not connect to host
|
||||
tnrsca.jp: did not receive HSTS header
|
||||
tobi-mayer.de: could not connect to host
|
||||
tobias-bielefeld.de: did not receive HSTS header
|
||||
tobiasmathes.com: could not connect to host
|
||||
tobiasmathes.name: could not connect to host
|
||||
|
@ -4394,11 +4411,11 @@ transportal.sk: did not receive HSTS header
|
|||
travelinsurance.co.nz: did not receive HSTS header
|
||||
treeby.net: could not connect to host
|
||||
trendberry.ru: could not connect to host
|
||||
trik.es: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
trinityaffirmations.com: max-age too low: 0
|
||||
trinitycore.org: max-age too low: 2592000
|
||||
tripdelta.com: did not receive HSTS header
|
||||
trixies-wish.nz: could not connect to host
|
||||
trkpuls.tk: could not connect to host
|
||||
trollme.me: could not connect to host
|
||||
trunkjunk.co: did not receive HSTS header
|
||||
trusitio.com: did not receive HSTS header
|
||||
|
@ -4483,7 +4500,7 @@ undernet.uy: could not connect to host
|
|||
unfiltered.nyc: did not receive HSTS header
|
||||
unfuddle.cn: could not connect to host
|
||||
uni-games.com: could not connect to host
|
||||
unicooo.com: could not connect to host
|
||||
unicooo.com: did not receive HSTS header
|
||||
unison.com: did not receive HSTS header
|
||||
unisyssecurity.com: did not receive HSTS header
|
||||
unitedcyberdevelopment.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
|
@ -4573,7 +4590,6 @@ viewsea.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERRO
|
|||
vigilo.cf: could not connect to host
|
||||
vijos.org: did not receive HSTS header
|
||||
viktorsvantesson.net: did not receive HSTS header
|
||||
villasenor.online: could not connect to host
|
||||
vincentkooijman.at: did not receive HSTS header
|
||||
vincentkooijman.nl: did not receive HSTS header
|
||||
vincentpancol.com: could not connect to host
|
||||
|
@ -4593,12 +4609,12 @@ vitalorange.com: did not receive HSTS header
|
|||
vitapingu.de: could not connect to host
|
||||
viva-french.com: did not receive HSTS header
|
||||
vivocloud.com: did not receive HSTS header
|
||||
vjirovsky.cz: could not connect to host
|
||||
vlastimilburian.cz: did not receive HSTS header
|
||||
vlora.city: could not connect to host
|
||||
vm0.eu: did not receive HSTS header
|
||||
vmrdev.com: could not connect to host
|
||||
voceinveste.com: did not receive HSTS header
|
||||
vodpay.com: could not connect to host
|
||||
vodpay.net: could not connect to host
|
||||
vodpay.org: could not connect to host
|
||||
voicesuk.co.uk: did not receive HSTS header
|
||||
|
@ -4679,6 +4695,7 @@ weiyuz.com: could not connect to host
|
|||
weizenke.im: could not connect to host
|
||||
wellastore.ru: did not receive HSTS header
|
||||
wellsolveit.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
welpy.com: could not connect to host
|
||||
weltmeisterschaft.net: could not connect to host
|
||||
weltverschwoerung.de: did not receive HSTS header
|
||||
weme.eu: could not connect to host
|
||||
|
@ -4799,6 +4816,8 @@ wyzphoto.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERRO
|
|||
x-case.de: max-age too low: 0
|
||||
x2w.io: could not connect to host
|
||||
x3led.com: could not connect to host
|
||||
x509.pub: could not connect to host
|
||||
x509.pw: could not connect to host
|
||||
xa.search.yahoo.com: did not receive HSTS header
|
||||
xandocs.com: could not connect to host
|
||||
xatr0z.org: could not connect to host
|
||||
|
@ -4811,7 +4830,7 @@ xenesisziarovky.sk: could not connect to host
|
|||
xett.com: did not receive HSTS header
|
||||
xf-liam.com: did not receive HSTS header
|
||||
xfive.de: did not receive HSTS header
|
||||
xia100.xyz: did not receive HSTS header
|
||||
xia100.xyz: could not connect to host
|
||||
xiaody.me: could not connect to host
|
||||
xiaolvmu.me: could not connect to host
|
||||
xiaoxiao.im: could not connect to host
|
||||
|
@ -4838,6 +4857,7 @@ xn--lgb3a8bcpn.ml: could not connect to host
|
|||
xn--ls8hi7a.tk: could not connect to host
|
||||
xn--mgbbh2a9fub.xn--ngbc5azd: did not receive HSTS header
|
||||
xn--neb-tma3u8u.xyz: could not connect to host
|
||||
xn--pq1a637b.xn--6qq986b3xl: could not connect to host
|
||||
xn--werner-schffer-fib.de: could not connect to host
|
||||
xn--yoamomisuasbcn-ynb.com: could not connect to host
|
||||
xnode.org: did not receive HSTS header
|
||||
|
@ -4893,6 +4913,7 @@ yourbapp.ch: could not connect to host
|
|||
yourcomputer.expert: did not receive HSTS header
|
||||
yoursecondphone.co: could not connect to host
|
||||
yourstrongbox.com: could not connect to host
|
||||
ypcs.fi: could not connect to host
|
||||
ypiresia.fr: could not connect to host
|
||||
ytcuber.xyz: could not connect to host
|
||||
yu.gg: did not receive HSTS header
|
||||
|
@ -4909,7 +4930,7 @@ z33.ch: did not receive HSTS header
|
|||
z3liff.com: could not connect to host
|
||||
z3liff.net: could not connect to host
|
||||
za.search.yahoo.com: did not receive HSTS header
|
||||
zachgibbens.org: could not connect to host
|
||||
zachgibbens.org: did not receive HSTS header
|
||||
zadieheimlich.com: did not receive HSTS header
|
||||
zamorano.edu: could not connect to host
|
||||
zap.yt: could not connect to host
|
||||
|
@ -4933,6 +4954,8 @@ zerudi.com: did not receive HSTS header
|
|||
zett4.me: could not connect to host
|
||||
zeytin.pro: could not connect to host
|
||||
zh.search.yahoo.com: did not receive HSTS header
|
||||
zhang-hao.com: could not connect to host
|
||||
zhanghao.me: could not connect to host
|
||||
zhaojin97.cn: did not receive HSTS header
|
||||
zhendingresources.com: could not connect to host
|
||||
zinenapse.info: could not connect to host
|
||||
|
@ -4959,4 +4982,3 @@ zvncloud.com: did not receive HSTS header
|
|||
zwollemagazine.nl: did not receive HSTS header
|
||||
zwy.me: did not receive HSTS header
|
||||
zyf.pw: could not connect to host
|
||||
zymbit.com: could not connect to host
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -293,7 +293,7 @@ dependencies = [
|
|||
"cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ipc-channel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -585,8 +585,8 @@ dependencies = [
|
|||
name = "deny_public_fields"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"syn 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"synstructure 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.11.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"synstructure 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -630,7 +630,7 @@ version = "0.0.1"
|
|||
dependencies = [
|
||||
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper 0.9.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper_serde 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ipc-channel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -653,7 +653,7 @@ name = "domobject_derive"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"quote 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.11.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -955,7 +955,7 @@ dependencies = [
|
|||
"gfx_traits 0.0.1",
|
||||
"harfbuzz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ipc-channel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -996,7 +996,7 @@ name = "gfx_traits"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"range 0.0.1",
|
||||
"serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1092,12 +1092,12 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "heapsize_derive"
|
||||
version = "0.1.3"
|
||||
version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"quote 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"synstructure 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.11.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"synstructure 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1129,11 +1129,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "html5ever"
|
||||
version = "0.13.0"
|
||||
version = "0.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"html5ever-atoms 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1141,7 +1141,7 @@ dependencies = [
|
|||
"phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.11.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tendril 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -1151,7 +1151,7 @@ version = "0.2.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"string_cache 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"string_cache_codegen 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
@ -1297,8 +1297,8 @@ name = "jstraceable_derive"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"quote 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"synstructure 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.11.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"synstructure 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1643,7 +1643,7 @@ dependencies = [
|
|||
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"webrender_traits 0.20.0 (git+https://github.com/servo/webrender)",
|
||||
|
@ -1728,7 +1728,7 @@ version = "0.0.1"
|
|||
dependencies = [
|
||||
"cookie 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper 0.9.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper_serde 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"image 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -2112,7 +2112,7 @@ name = "range"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -2231,8 +2231,8 @@ dependencies = [
|
|||
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gfx_traits 0.0.1",
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"html5ever 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"html5ever 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"html5ever-atoms 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper 0.9.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper_serde 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -2295,7 +2295,7 @@ dependencies = [
|
|||
"euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gfx_traits 0.0.1",
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"html5ever-atoms 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ipc-channel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -2336,7 +2336,7 @@ dependencies = [
|
|||
"euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gfx_traits 0.0.1",
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper 0.9.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper_serde 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ipc-channel 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -2617,7 +2617,7 @@ name = "servo_url"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"servo_rand 0.0.1",
|
||||
|
@ -2736,7 +2736,7 @@ dependencies = [
|
|||
"euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"html5ever-atoms 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -2795,7 +2795,7 @@ dependencies = [
|
|||
"cssparser-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
@ -2851,11 +2851,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "synstructure"
|
||||
version = "0.4.0"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"quote 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.11.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -3436,11 +3436,11 @@ dependencies = [
|
|||
"checksum glx 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b280007fa9c7442cfd1e0b1addb8d1a59240267110e8705f8f7e2c7bfb7e2f72"
|
||||
"checksum harfbuzz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6b76113246f5c089dcf272cf89c3f61168a4d77b50ec5b2c1fab8c628c9ea762"
|
||||
"checksum heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "5a376f7402b85be6e0ba504243ecbc0709c48019ecc6286d0540c2e359050c88"
|
||||
"checksum heapsize_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b6876925b6c3de6f9073f016f425de0076ab68cf30522107fa586ae6524abfe"
|
||||
"checksum heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "46f96d52fb1564059fc97b85ef6165728cc30198ab60073bf114c66c4c89bb5d"
|
||||
"checksum heartbeats-simple 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9ad003ce233955e9d95f2c69cde84e68302ba9ba4a673d351c9bff93c738aadc"
|
||||
"checksum heartbeats-simple-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e1a408c0011427cc0e0049f7861c70377819aedfc006e8c901b1c70fd98fb1a4"
|
||||
"checksum hpack 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d2da7d3a34cf6406d9d700111b8eafafe9a251de41ae71d8052748259343b58"
|
||||
"checksum html5ever 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "43c1b50a0c2b4f697c025699ae33b2b4072fff5b6cbd7c184e25eea2beccb3ef"
|
||||
"checksum html5ever 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d60508177ec4e5774a112efcf4d4d5f123cb00a43476fa5940b7da568371a165"
|
||||
"checksum html5ever-atoms 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f9bd86e3b6a5a7933a272cc0a854f24e371f31576e585c0b41e8f857270c5134"
|
||||
"checksum httparse 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a6e7a63e511f9edffbab707141fbb8707d1a3098615fb2adbd5769cdfcc9b17d"
|
||||
"checksum hyper 0.9.18 (registry+https://github.com/rust-lang/crates.io-index)" = "1b9bf64f730d6ee4b0528a5f0a316363da9d8104318731509d4ccc86248f82b3"
|
||||
|
@ -3559,7 +3559,7 @@ dependencies = [
|
|||
"checksum syn 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)" = "58fd09df59565db3399efbba34ba8a2fec1307511ebd245d0061ff9d42691673"
|
||||
"checksum syn 0.11.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0e28da8d02d75d1e58b89258e0741128f0b0d8a8309fb5c627be0fbd37a76c67"
|
||||
"checksum synom 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8fece1853fb872b0acdc3ff88f37c474018e125ef81cd4cb8c0ca515746b62ed"
|
||||
"checksum synstructure 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e13808dc5a739d5ff1cff4a2361afdf4ec52d42221c7ddc1d8c438f5a53746a7"
|
||||
"checksum synstructure 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ccc9780bf1aa601943988c2876ab22413c01ad1739689aa6af18d0aa0b3f38b"
|
||||
"checksum syntex 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb3f52553a966675982404dc34028291b347e0c9a9c0b0b34f2da6be8a0443f8"
|
||||
"checksum syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dee2f6e49c075f71332bb775219d5982bee6732d26227fa1ae1b53cdb12f5cc5"
|
||||
"checksum syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8df3921c7945dfb9ffc53aa35adb2cf4313b5ab5f079c3619b3d4eb82a0efc2b"
|
||||
|
|
|
@ -10,5 +10,5 @@ path = "lib.rs"
|
|||
proc-macro = true
|
||||
|
||||
[dependencies]
|
||||
syn = "0.10"
|
||||
synstructure = "0.4"
|
||||
syn = "0.11"
|
||||
synstructure = "0.5"
|
||||
|
|
|
@ -10,5 +10,5 @@ path = "lib.rs"
|
|||
proc-macro = true
|
||||
|
||||
[dependencies]
|
||||
syn = "0.10"
|
||||
syn = "0.11"
|
||||
quote = "0.3"
|
||||
|
|
|
@ -10,6 +10,6 @@ path = "lib.rs"
|
|||
proc-macro = true
|
||||
|
||||
[dependencies]
|
||||
syn = "0.10"
|
||||
quote = "0.3"
|
||||
synstructure = "0.4"
|
||||
syn = "0.11"
|
||||
synstructure = "0.5"
|
||||
|
|
|
@ -4,38 +4,7 @@
|
|||
|
||||
use rustc::hir::def_id::DefId;
|
||||
use rustc::lint::{LateContext, LintContext};
|
||||
use syntax::ast;
|
||||
use syntax::codemap::{ExpnFormat, Span};
|
||||
use syntax::ptr::P;
|
||||
|
||||
/// Matches a type with a provided string, and returns its type parameters if successful
|
||||
pub fn match_ty_unwrap<'a>(ty: &'a ast::Ty, segments: &[&str]) -> Option<&'a [P<ast::Ty>]> {
|
||||
match ty.node {
|
||||
ast::TyKind::Path(_, ast::Path { segments: ref seg, .. }) => {
|
||||
// So hir::Path isn't the full path, just the tokens that were provided.
|
||||
// I could muck around with the maps and find the full path
|
||||
// however the more efficient way is to simply reverse the iterators and zip them
|
||||
// which will compare them in reverse until one of them runs out of segments
|
||||
if seg.iter().rev().zip(segments.iter().rev()).all(|(a, b)| &*a.identifier.name.as_str() == *b) {
|
||||
match seg.last() {
|
||||
Some(&ast::PathSegment { parameters: Some(ref params), .. }) => {
|
||||
match **params {
|
||||
ast::PathParameters::AngleBracketed(ref a) => Some(&a.types),
|
||||
|
||||
// `Foo(A,B) -> C`
|
||||
ast::PathParameters::Parenthesized(_) => None,
|
||||
}
|
||||
}
|
||||
Some(&ast::PathSegment { parameters: None, .. }) => Some(&[]),
|
||||
None => None,
|
||||
}
|
||||
} else {
|
||||
None
|
||||
}
|
||||
},
|
||||
_ => None
|
||||
}
|
||||
}
|
||||
|
||||
/// check if a DefId's path matches the given absolute type path
|
||||
/// usage e.g. with
|
||||
|
|
|
@ -1413,10 +1413,26 @@ fn static_assert() {
|
|||
self.gecko.mDisplay = result;
|
||||
self.gecko.mOriginalDisplay = result;
|
||||
}
|
||||
|
||||
/// Set the display value from the style adjustment code. This is pretty
|
||||
/// much like set_display, but without touching the mOriginalDisplay field,
|
||||
/// which we want to keep.
|
||||
pub fn set_adjusted_display(&mut self, v: longhands::display::computed_value::T) {
|
||||
use properties::longhands::display::computed_value::T as Keyword;
|
||||
let result = match v {
|
||||
% for value in display_keyword.values_for('gecko'):
|
||||
Keyword::${to_rust_ident(value)} =>
|
||||
structs::${display_keyword.gecko_constant(value)},
|
||||
% endfor
|
||||
};
|
||||
self.gecko.mDisplay = result;
|
||||
}
|
||||
|
||||
pub fn copy_display_from(&mut self, other: &Self) {
|
||||
self.gecko.mDisplay = other.gecko.mDisplay;
|
||||
self.gecko.mOriginalDisplay = other.gecko.mOriginalDisplay;
|
||||
self.gecko.mOriginalDisplay = other.gecko.mDisplay;
|
||||
}
|
||||
|
||||
<%call expr="impl_keyword_clone('display', 'mDisplay', display_keyword)"></%call>
|
||||
|
||||
// overflow-y is implemented as a newtype of overflow-x, so we need special handling.
|
||||
|
|
|
@ -1949,13 +1949,15 @@ pub fn apply_declarations<'a, F, I>(viewport_size: Size2D<Au>,
|
|||
};
|
||||
if let Some(computed_display) = computed_display {
|
||||
let box_ = style.mutate_box();
|
||||
box_.set_display(computed_display);
|
||||
% if product == "servo":
|
||||
box_.set_display(computed_display);
|
||||
box_.set__servo_display_for_hypothetical_box(if blockify_root || blockify_item {
|
||||
computed_display
|
||||
} else {
|
||||
specified_display
|
||||
});
|
||||
% else:
|
||||
box_.set_adjusted_display(computed_display);
|
||||
% endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1504,9 +1504,11 @@ pub extern "C" fn Servo_StyleSet_FillKeyframesForName(raw_data: RawServoStyleSet
|
|||
// Append missing property values in the initial or the finial keyframes.
|
||||
if step.start_percentage.0 == 0. ||
|
||||
step.start_percentage.0 == 1. {
|
||||
for (index, property) in animation.properties_changed.iter().enumerate() {
|
||||
let mut index = unsafe { (*keyframe).mPropertyValues.len() };
|
||||
for property in animation.properties_changed.iter() {
|
||||
if !seen.has_transition_property_bit(&property) {
|
||||
add_computed_property_value(keyframe, index, style, property);
|
||||
index += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
[package]
|
||||
name = "test"
|
||||
version = "*"
|
||||
version = "0.0.1"
|
||||
authors = ["The Servo Project Developers"]
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
test-package = { version = "*" }
|
||||
|
|
|
@ -144,11 +144,12 @@ macosx64/debug:
|
|||
build-platform: macosx64/debug
|
||||
test-sets:
|
||||
- macosx64-tests-debug
|
||||
# Disable bbb talos tests for mac until we disable bb scheduling
|
||||
|
||||
# macosx64/opt:
|
||||
# build-platform: macosx64/opt
|
||||
# test-sets:
|
||||
# - macosx64-tests-talos
|
||||
# - macosx64-tests-debug
|
||||
|
||||
##
|
||||
# Android platforms (matching /android.*/)
|
||||
|
|
|
@ -134,23 +134,26 @@ windows-vm-tests:
|
|||
macosx64-tests-debug:
|
||||
- cppunit
|
||||
- crashtest
|
||||
# - gtest
|
||||
- external-media-tests-base
|
||||
- external-media-tests-youtube
|
||||
- gtest
|
||||
- jittest
|
||||
- jsreftest
|
||||
# - marionette
|
||||
# - mochitest
|
||||
# - mochitest-a11y
|
||||
# - mochitest-browser-chrome
|
||||
# - mochitest-chrome
|
||||
# - mochitest-clipboard
|
||||
# - mochitest-devtools-chrome
|
||||
# - mochitest-gpu
|
||||
# - mochitest-jetpack
|
||||
# - mochitest-media
|
||||
- marionette
|
||||
- mochitest
|
||||
- mochitest-a11y
|
||||
- mochitest-browser-chrome
|
||||
- mochitest-chrome
|
||||
- mochitest-clipboard
|
||||
- mochitest-devtools-chrome
|
||||
- mochitest-gpu
|
||||
- mochitest-jetpack
|
||||
- mochitest-media
|
||||
- mochitest-webgl
|
||||
# - reftest
|
||||
# - web-platform-tests
|
||||
# - web-platform-tests-reftests
|
||||
# - xpcshell
|
||||
- reftest
|
||||
- web-platform-tests
|
||||
- web-platform-tests-reftests
|
||||
- xpcshell
|
||||
|
||||
macosx64-tests-talos:
|
||||
- talos-chrome
|
||||
|
|
|
@ -63,6 +63,7 @@ crashtest:
|
|||
by-test-platform:
|
||||
windows.*: false # Bug 1304435
|
||||
linux64-ccov/opt: false
|
||||
macosx64/debug: true
|
||||
default: both
|
||||
mozharness:
|
||||
by-test-platform:
|
||||
|
@ -75,7 +76,7 @@ crashtest:
|
|||
- --test-suite=crashtest
|
||||
default:
|
||||
script: desktop_unittest.py
|
||||
chunked: true
|
||||
chunked: false
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
|
@ -93,6 +94,7 @@ crashtest:
|
|||
external-media-tests-base:
|
||||
description: "External Media Test run"
|
||||
suite: external-media-tests
|
||||
unittest-try-name: 'media-tests'
|
||||
treeherder-symbol: tc-VP(b-m)
|
||||
e10s: false
|
||||
tier: 2
|
||||
|
@ -116,6 +118,7 @@ external-media-tests-twitch:
|
|||
description: "External Media Test Twitch run"
|
||||
suite: external-media-tests/twitch
|
||||
treeherder-symbol: tc-VP(b-t)
|
||||
unittest-try-name: media-twitch-tests
|
||||
e10s: false
|
||||
tier: 2
|
||||
max-run-time: 5400
|
||||
|
@ -139,6 +142,7 @@ external-media-tests-twitch:
|
|||
external-media-tests-youtube:
|
||||
description: "External Media Test Youtube run"
|
||||
suite: external-media-tests/youtube
|
||||
unittest-try-name: media-youtube-tests
|
||||
treeherder-symbol: tc-VP(b-y)
|
||||
e10s: false
|
||||
tier: 2
|
||||
|
@ -232,8 +236,14 @@ jittest:
|
|||
chunks:
|
||||
by-test-platform:
|
||||
windows.*: 1
|
||||
macosx.*: 1
|
||||
default: 6
|
||||
mozharness:
|
||||
chunked:
|
||||
by-test-platform:
|
||||
windows.*: false
|
||||
macosx.*: false
|
||||
default: true
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
|
@ -264,6 +274,7 @@ jsreftest:
|
|||
android.*: 10
|
||||
windows.*: 2
|
||||
linux64-qr/.*: 4
|
||||
macosx.*: 2
|
||||
default: 3
|
||||
e10s:
|
||||
by-test-platform:
|
||||
|
@ -293,6 +304,7 @@ jsreftest:
|
|||
default:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
chunked: true
|
||||
config:
|
||||
by-test-platform:
|
||||
windows.*:
|
||||
|
@ -331,6 +343,7 @@ marionette:
|
|||
e10s:
|
||||
by-test-platform:
|
||||
linux64-ccov/opt: false
|
||||
macosx.*: true
|
||||
default: both
|
||||
mozharness:
|
||||
by-test-platform:
|
||||
|
@ -379,6 +392,7 @@ mochitest:
|
|||
linux64-ccov/opt: false
|
||||
linux64-jsdcov/opt: false
|
||||
android.*: false
|
||||
macosx64/debug: true
|
||||
default: both
|
||||
max-run-time:
|
||||
by-test-platform:
|
||||
|
@ -430,7 +444,7 @@ mochitest-a11y:
|
|||
mozharness:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
chunked: true
|
||||
chunked: false
|
||||
config:
|
||||
by-test-platform:
|
||||
windows.*:
|
||||
|
@ -463,6 +477,7 @@ mochitest-browser-chrome:
|
|||
by-test-platform:
|
||||
linux64-jsdcov/opt: false
|
||||
linux64-ccov/opt: false
|
||||
macosx64/debug: true
|
||||
default: both
|
||||
max-run-time:
|
||||
by-test-platform:
|
||||
|
@ -474,6 +489,7 @@ mochitest-browser-chrome:
|
|||
mozharness:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
chunked: true
|
||||
config:
|
||||
by-test-platform:
|
||||
windows.*:
|
||||
|
@ -540,7 +556,6 @@ mochitest-chrome:
|
|||
by-test-platform:
|
||||
android-4.3-arm7-api-15/debug: 4
|
||||
android.*: 2
|
||||
macosx.*: 1
|
||||
default: 3
|
||||
max-run-time: 3600
|
||||
e10s: false
|
||||
|
@ -560,6 +575,7 @@ mochitest-chrome:
|
|||
default:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
chunked: true
|
||||
config:
|
||||
by-test-platform:
|
||||
windows.*:
|
||||
|
@ -579,6 +595,10 @@ mochitest-clipboard:
|
|||
treeherder-symbol: tc-M(cl)
|
||||
loopback-video: true
|
||||
instance-size: xlarge
|
||||
e10s:
|
||||
by-test-platform:
|
||||
macosx64/debug: true
|
||||
default: both
|
||||
mozharness:
|
||||
by-test-platform:
|
||||
android.*:
|
||||
|
@ -592,7 +612,7 @@ mochitest-clipboard:
|
|||
default:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
chunked: true
|
||||
chunked: false
|
||||
config:
|
||||
by-test-platform:
|
||||
windows.*:
|
||||
|
@ -618,6 +638,7 @@ mochitest-devtools-chrome:
|
|||
chunks:
|
||||
by-test-platform:
|
||||
windows.*: 8
|
||||
macosx.*: 8
|
||||
default: 10
|
||||
run-on-projects:
|
||||
by-test-platform:
|
||||
|
@ -629,10 +650,12 @@ mochitest-devtools-chrome:
|
|||
linux64-jsdcov/opt: false
|
||||
# Bug 1304433: mochitest-devtools-chrome (e10s) not greened on windows
|
||||
windows.*: false
|
||||
macosx64/debug: true
|
||||
default: both
|
||||
mozharness:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
chunked: true
|
||||
config:
|
||||
by-test-platform:
|
||||
windows.*:
|
||||
|
@ -671,6 +694,7 @@ mochitest-gpu:
|
|||
by-test-platform:
|
||||
windows.*: both
|
||||
android.*: false
|
||||
macosx64/opt: both
|
||||
default: true
|
||||
mozharness:
|
||||
by-test-platform:
|
||||
|
@ -685,7 +709,7 @@ mochitest-gpu:
|
|||
default:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
chunked: true
|
||||
chunked: false
|
||||
config:
|
||||
by-test-platform:
|
||||
windows.*:
|
||||
|
@ -714,7 +738,7 @@ mochitest-jetpack:
|
|||
mozharness:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
chunked: true
|
||||
chunked: false
|
||||
config:
|
||||
by-test-platform:
|
||||
windows.*:
|
||||
|
@ -735,6 +759,10 @@ mochitest-media:
|
|||
treeherder-symbol: tc-M(mda)
|
||||
max-run-time: 5400
|
||||
loopback-video: true
|
||||
e10s:
|
||||
by-test-platform:
|
||||
macosx64/debug: true
|
||||
default: both
|
||||
instance-size:
|
||||
by-test-platform:
|
||||
android.*: xlarge
|
||||
|
@ -742,6 +770,7 @@ mochitest-media:
|
|||
chunks:
|
||||
by-test-platform:
|
||||
android.*: 3
|
||||
macosx64.*: 1
|
||||
default: 3
|
||||
docker-image: {"in-tree": "desktop1604-test"}
|
||||
mozharness:
|
||||
|
@ -756,7 +785,10 @@ mochitest-media:
|
|||
default:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
chunked: true
|
||||
chunked:
|
||||
by-test-platform:
|
||||
macosx64.*: false
|
||||
default: true
|
||||
config:
|
||||
by-test-platform:
|
||||
windows.*:
|
||||
|
@ -805,6 +837,10 @@ mochitest-webgl:
|
|||
by-test-platform:
|
||||
android.*: 10
|
||||
default: 3
|
||||
e10s:
|
||||
by-test-platform:
|
||||
macosx64/opt: false
|
||||
default: both
|
||||
loopback-video: true
|
||||
max-run-time:
|
||||
by-test-platform:
|
||||
|
@ -876,7 +912,8 @@ reftest:
|
|||
by-test-platform:
|
||||
android-4.3-arm7-api-15/debug: 48
|
||||
android.*: 16
|
||||
macosx.*: 1
|
||||
macosx64/opt: 1
|
||||
macosx64/debug: 2
|
||||
default: 8
|
||||
max-run-time:
|
||||
by-test-platform:
|
||||
|
@ -898,6 +935,10 @@ reftest:
|
|||
default:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
chunked:
|
||||
by-test-platform:
|
||||
macosx64/opt: false
|
||||
default: true
|
||||
config:
|
||||
by-test-platform:
|
||||
windows.*:
|
||||
|
@ -1154,14 +1195,16 @@ talos-tp5o:
|
|||
web-platform-tests:
|
||||
description: "Web platform test run"
|
||||
suite: web-platform-tests
|
||||
treeherder-symbol: tc-W()
|
||||
treeherder-symbol: tc-W(wpt)
|
||||
chunks:
|
||||
by-test-platform:
|
||||
macosx.*: 5
|
||||
macosx64/opt: 5
|
||||
macosx64/debug: 10
|
||||
default: 12
|
||||
e10s:
|
||||
by-test-platform:
|
||||
linux64-ccov/opt: false
|
||||
macosx.*: true
|
||||
default: both
|
||||
max-run-time: 7200
|
||||
instance-size: xlarge
|
||||
|
@ -1174,6 +1217,7 @@ web-platform-tests:
|
|||
mozharness:
|
||||
script: web_platform_tests.py
|
||||
no-read-buildbot-config: true
|
||||
chunked: true
|
||||
config:
|
||||
by-test-platform:
|
||||
windows.*:
|
||||
|
@ -1241,7 +1285,7 @@ xpcshell:
|
|||
by-test-platform:
|
||||
linux64-jsdcov/opt: xpcshell-coverage
|
||||
default: xpcshell
|
||||
treeherder-symbol: tc-X()
|
||||
treeherder-symbol: tc-X(X)
|
||||
run-on-projects:
|
||||
by-test-platform:
|
||||
linux64-qr/.*: ['graphics']
|
||||
|
|
|
@ -32,7 +32,7 @@ def talos_task(n, tp):
|
|||
|
||||
tasks = {k: v for k, v in [
|
||||
unittest_task('mochitest-browser-chrome', 'linux'),
|
||||
unittest_task('mochitest-e10s-browser-chrome', 'linux64'),
|
||||
unittest_task('mochitest-browser-chrome-e10s', 'linux64'),
|
||||
unittest_task('mochitest-chrome', 'linux'),
|
||||
unittest_task('mochitest-webgl', 'linux'),
|
||||
unittest_task('crashtest-e10s', 'linux'),
|
||||
|
|
|
@ -20,15 +20,14 @@ JOB_NAME_WHITELIST = set([
|
|||
'android-api-15-gradle-dependencies-opt',
|
||||
'android-api-15-gradle-opt',
|
||||
'android-api-15-opt',
|
||||
'android-api-15-nightly-opt',
|
||||
'android-api-15-partner-sample1-opt',
|
||||
'android-l10n-opt',
|
||||
'android-nightly-l10n-opt',
|
||||
'android-x86-opt',
|
||||
'android-x86-nightly-opt',
|
||||
'aries-debug',
|
||||
'aries-eng-opt',
|
||||
'browser-haz-debug',
|
||||
'linux-debug',
|
||||
'linux-opt',
|
||||
'linux-pgo',
|
||||
'linux-qr-debug',
|
||||
'linux-qr-opt',
|
||||
'linux64-add-on-devel',
|
||||
'linux64-artifact-opt',
|
||||
'linux64-asan-debug',
|
||||
'linux64-asan-opt',
|
||||
|
@ -36,9 +35,6 @@ JOB_NAME_WHITELIST = set([
|
|||
'linux64-clang-tidy',
|
||||
'linux64-debug',
|
||||
'linux64-jsdcov-opt',
|
||||
'linux64-l10n-opt',
|
||||
'linux64-nightly-opt',
|
||||
'linux64-nightly-l10n-opt',
|
||||
'linux64-opt',
|
||||
'linux64-pgo',
|
||||
'linux64-qr-debug',
|
||||
|
@ -47,54 +43,42 @@ JOB_NAME_WHITELIST = set([
|
|||
'linux64-stylo-debug',
|
||||
'linux64-stylo-opt',
|
||||
'linux64-valgrind-opt',
|
||||
'linux-debug',
|
||||
'linux-opt',
|
||||
'linux-pgo',
|
||||
'linux-qr-debug',
|
||||
'linux-qr-opt',
|
||||
'linux32-nightly-opt',
|
||||
'linux32-l10n-opt',
|
||||
'linux32-nightly-l10n-opt',
|
||||
'linux64-add-on-devel',
|
||||
'macosx64-add-on-devel',
|
||||
'macosx64-clang-tidy',
|
||||
'macosx64-debug',
|
||||
'macosx64-opt',
|
||||
'macosx64-qr-debug',
|
||||
'macosx64-qr-opt',
|
||||
'macosx64-st-an-opt',
|
||||
'macosx64-add-on-devel',
|
||||
'nexus-5-l-eng-debug',
|
||||
'nexus-5-l-eng-opt',
|
||||
'osx-10-10',
|
||||
'shell-haz-debug',
|
||||
'sm-arm64-sim-debug',
|
||||
'sm-arm-sim-debug',
|
||||
'sm-arm64-sim-debug',
|
||||
'sm-asan-opt',
|
||||
'sm-compacting-debug',
|
||||
'sm-mozjs-sys-debug',
|
||||
'sm-msan-opt',
|
||||
'sm-nonunified-debug',
|
||||
'sm-package-opt',
|
||||
'sm-plaindebug-debug',
|
||||
'sm-plain-opt',
|
||||
'sm-plaindebug-debug',
|
||||
'sm-rootanalysis-debug',
|
||||
'sm-tsan-opt',
|
||||
'win64-add-on-devel',
|
||||
'win32-add-on-devel',
|
||||
'win32-st-an-debug',
|
||||
'win32-st-an-opt',
|
||||
'win32-clang-tidy',
|
||||
'win32-debug',
|
||||
'win32-opt',
|
||||
'win32-pgo',
|
||||
'win32-qr-debug',
|
||||
'win32-qr-opt',
|
||||
'win64-st-an-debug',
|
||||
'win64-st-an-opt',
|
||||
'win32-st-an-debug',
|
||||
'win32-st-an-opt',
|
||||
'win64-add-on-devel',
|
||||
'win64-clang-tidy',
|
||||
'win64-debug',
|
||||
'win64-opt',
|
||||
'win64-pgo',
|
||||
'win64-st-an-debug',
|
||||
'win64-st-an-opt',
|
||||
'win64-qr-debug',
|
||||
'win64-qr-opt',
|
||||
])
|
||||
|
|
|
@ -342,9 +342,41 @@ def mozharness_test_buildbot_bridge(config, job, taskdesc):
|
|||
test_name = test.get('talos-try-name', test['test-name'])
|
||||
mozharness = test['mozharness']
|
||||
|
||||
if test['e10s'] and not test_name.endswith('-e10s'):
|
||||
# mochitest e10s follows the pattern mochitest-e10s-<suffix>
|
||||
# in buildbot, except for these special cases
|
||||
buildbot_specials = [
|
||||
'mochitest-webgl',
|
||||
'mochitest-clipboard',
|
||||
'mochitest-media',
|
||||
'mochitest-gpu',
|
||||
'mochitest-e10s',
|
||||
]
|
||||
test_name = test.get(
|
||||
'talos-try-name',
|
||||
test.get(
|
||||
'unittest-try-name',
|
||||
test['test-name']
|
||||
)
|
||||
)
|
||||
if test['e10s'] and 'e10s' not in test_name:
|
||||
test_name += '-e10s'
|
||||
|
||||
if test_name.startswith('mochitest') \
|
||||
and test_name.endswith('e10s') \
|
||||
and not any(map(
|
||||
lambda name: test_name.startswith(name),
|
||||
buildbot_specials
|
||||
)):
|
||||
split_mochitest = test_name.split('-')
|
||||
test_name = '-'.join([
|
||||
split_mochitest[0],
|
||||
split_mochitest[-1],
|
||||
'-'.join(split_mochitest[1:-1])
|
||||
])
|
||||
|
||||
# in buildbot, mochitest-webgl is called mochitest-gl
|
||||
test_name = test_name.replace('webgl', 'gl')
|
||||
|
||||
if mozharness.get('chunked', False):
|
||||
this_chunk = test.get('this-chunk')
|
||||
test_name = '{}-{}'.format(test_name, this_chunk)
|
||||
|
|
|
@ -179,7 +179,7 @@ test_description_schema = Schema({
|
|||
Required('checkout', default=False): bool,
|
||||
|
||||
# Wheter to perform a machine reboot after test is done
|
||||
Optional('reboot', default=False): bool,
|
||||
Optional('reboot', default=True): bool,
|
||||
|
||||
# What to run
|
||||
Required('mozharness'): optionally_keyed_by(
|
||||
|
@ -227,7 +227,9 @@ test_description_schema = Schema({
|
|||
|
||||
# If true, include chunking information in the command even if the number
|
||||
# of chunks is 1
|
||||
Required('chunked', default=False): bool,
|
||||
Required('chunked', default=False): optionally_keyed_by(
|
||||
'test-platform',
|
||||
bool),
|
||||
|
||||
# The chunking argument format to use
|
||||
Required('chunking-args', default='this-chunk'): Any(
|
||||
|
@ -317,7 +319,7 @@ def set_defaults(config, tests):
|
|||
test.setdefault('run-on-projects', ['all'])
|
||||
test.setdefault('instance-size', 'default')
|
||||
test.setdefault('max-run-time', 3600)
|
||||
test.setdefault('reboot', False)
|
||||
test.setdefault('reboot', True)
|
||||
test['mozharness'].setdefault('extra-options', [])
|
||||
yield test
|
||||
|
||||
|
@ -374,13 +376,15 @@ def set_asan_docker_image(config, tests):
|
|||
@transforms.add
|
||||
def set_worker_implementation(config, tests):
|
||||
"""Set the worker implementation based on the test platform."""
|
||||
use_tc_worker = config.config['args'].taskcluster_worker
|
||||
for test in tests:
|
||||
if test.get('suite', '') == 'talos':
|
||||
if test['test-platform'].startswith('macosx'):
|
||||
test['worker-implementation'] = \
|
||||
'native-engine' if use_tc_worker else 'buildbot-bridge'
|
||||
elif test.get('suite', '') == 'talos':
|
||||
test['worker-implementation'] = 'buildbot-bridge'
|
||||
elif test['test-platform'].startswith('win'):
|
||||
test['worker-implementation'] = 'generic-worker'
|
||||
elif test['test-platform'].startswith('macosx'):
|
||||
test['worker-implementation'] = 'native-engine'
|
||||
else:
|
||||
test['worker-implementation'] = 'docker-worker'
|
||||
yield test
|
||||
|
@ -406,7 +410,8 @@ def set_tier(config, tests):
|
|||
'android-4.3-arm7-api-15/debug',
|
||||
'android-4.2-x86/opt']:
|
||||
test['tier'] = 1
|
||||
elif test['test-platform'].startswith('windows'):
|
||||
elif test['test-platform'].startswith('windows') \
|
||||
or test['worker-implementation'] == 'native-engine':
|
||||
test['tier'] = 3
|
||||
else:
|
||||
test['tier'] = 2
|
||||
|
@ -454,6 +459,7 @@ def handle_keyed_by(config, tests):
|
|||
'suite',
|
||||
'run-on-projects',
|
||||
'os-groups',
|
||||
'mozharness.chunked',
|
||||
'mozharness.config',
|
||||
'mozharness.extra-options',
|
||||
]
|
||||
|
@ -583,15 +589,6 @@ def remove_linux_pgo_try_talos(config, tests):
|
|||
yield test
|
||||
|
||||
|
||||
@transforms.add
|
||||
def remove_native(config, tests):
|
||||
"""Remove native-engine jobs if -w is not given."""
|
||||
for test in tests:
|
||||
if test['worker-implementation'] != 'native-engine' \
|
||||
or config.config['args'].taskcluster_worker:
|
||||
yield test
|
||||
|
||||
|
||||
@transforms.add
|
||||
def make_job_description(config, tests):
|
||||
"""Convert *test* descriptions to *job* descriptions (input to
|
||||
|
|
|
@ -88,12 +88,12 @@ UNITTEST_ALIASES = {
|
|||
'mochitest-debug': alias_prefix('mochitest-debug-'),
|
||||
'mochitest-a11y': alias_contains('mochitest-a11y'),
|
||||
'mochitest-bc': alias_prefix('mochitest-browser-chrome'),
|
||||
'mochitest-e10s-bc': alias_prefix('mochitest-e10s-browser-chrome'),
|
||||
'mochitest-e10s-bc': alias_prefix('mochitest-browser-chrome-e10s'),
|
||||
'mochitest-browser-chrome': alias_prefix('mochitest-browser-chrome'),
|
||||
'mochitest-e10s-browser-chrome': alias_prefix('mochitest-e10s-browser-chrome'),
|
||||
'mochitest-e10s-browser-chrome': alias_prefix('mochitest-browser-chrome-e10s'),
|
||||
'mochitest-chrome': alias_contains('mochitest-chrome'),
|
||||
'mochitest-dt': alias_prefix('mochitest-devtools-chrome'),
|
||||
'mochitest-e10s-dt': alias_prefix('mochitest-e10s-devtools-chrome'),
|
||||
'mochitest-e10s-dt': alias_prefix('mochitest-devtools-chrome-e10s'),
|
||||
'mochitest-gl': alias_prefix('mochitest-webgl'),
|
||||
'mochitest-gl-e10s': alias_prefix('mochitest-webgl-e10s'),
|
||||
'mochitest-gpu': alias_prefix('mochitest-gpu'),
|
||||
|
|
|
@ -327,11 +327,46 @@ const KEY_CODE_LOOKUP = {
|
|||
"\uE004": "Tab",
|
||||
};
|
||||
|
||||
/** Represents possible values for a pointer-move origin. */
|
||||
action.PointerOrigin = {
|
||||
Viewport: "viewport",
|
||||
Pointer: "pointer",
|
||||
};
|
||||
|
||||
/**
|
||||
* Look up a PointerOrigin.
|
||||
*
|
||||
* @param {?} obj
|
||||
* Origin for a pointerMove action.
|
||||
*
|
||||
* @return {?}
|
||||
* A pointer origin that is either "viewport" (default), "pointer", or a
|
||||
* web-element reference.
|
||||
*
|
||||
* @throws {InvalidArgumentError}
|
||||
* If |obj| is not a valid origin.
|
||||
*/
|
||||
action.PointerOrigin.get = function(obj) {
|
||||
let origin = obj;
|
||||
if (typeof obj == "undefined") {
|
||||
origin = this.Viewport;
|
||||
} else if (typeof obj == "string") {
|
||||
let name = capitalize(obj);
|
||||
assert.in(name, this, error.pprint`Unknown pointer-move origin: ${obj}`);
|
||||
origin = this[name];
|
||||
} else if (!element.isWebElementReference(obj)) {
|
||||
throw new InvalidArgumentError("Expected 'origin' to be a string or a " +
|
||||
`web element reference, got: ${obj}`);
|
||||
}
|
||||
return origin;
|
||||
};
|
||||
|
||||
/** Represents possible subtypes for a pointer input source. */
|
||||
action.PointerType = {
|
||||
Mouse: "mouse",
|
||||
Pen: "pen",
|
||||
Touch: "touch",
|
||||
// TODO For now, only mouse is supported
|
||||
//Pen: "pen",
|
||||
//Touch: "touch",
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -348,9 +383,7 @@ action.PointerType = {
|
|||
*/
|
||||
action.PointerType.get = function (str) {
|
||||
let name = capitalize(str);
|
||||
if (!(name in this)) {
|
||||
throw new InvalidArgumentError(`Unknown pointerType: ${str}`);
|
||||
}
|
||||
assert.in(name, this, error.pprint`Unknown pointerType: ${str}`);
|
||||
return this[name];
|
||||
};
|
||||
|
||||
|
@ -400,8 +433,8 @@ class InputState {
|
|||
|
||||
/**
|
||||
* @param {?} obj
|
||||
* Object with property |type|, representing an action sequence or an
|
||||
* action item.
|
||||
* Object with property |type| and optionally |parameters| or |pointerType|,
|
||||
* representing an action sequence or an action item.
|
||||
*
|
||||
* @return {action.InputState}
|
||||
* An |action.InputState| object for the type of the |actionSequence|.
|
||||
|
@ -411,11 +444,18 @@ class InputState {
|
|||
*/
|
||||
static fromJson(obj) {
|
||||
let type = obj.type;
|
||||
if (!(type in ACTIONS)) {
|
||||
throw new InvalidArgumentError(`Unknown action type: ${type}`);
|
||||
}
|
||||
assert.in(type, ACTIONS, error.pprint`Unknown action type: ${type}`);
|
||||
let name = type == "none" ? "Null" : capitalize(type);
|
||||
return new action.InputState[name]();
|
||||
if (name == "Pointer") {
|
||||
if (!obj.pointerType && (!obj.parameters || !obj.parameters.pointerType)) {
|
||||
throw new InvalidArgumentError(
|
||||
error.pprint`Expected obj to have pointerType, got: ${obj}`);
|
||||
}
|
||||
let pointerType = obj.pointerType || obj.parameters.pointerType;
|
||||
return new action.InputState[name](pointerType);
|
||||
} else {
|
||||
return new action.InputState[name]();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -488,7 +528,7 @@ action.InputState.Key = class Key extends InputState {
|
|||
* Normalized key value.
|
||||
*
|
||||
* @return {boolean}
|
||||
* True if |key| is removed successfully, false otherwise.
|
||||
* True if |key| was present before removal, false otherwise.
|
||||
*/
|
||||
release(key) {
|
||||
return this.pressed.delete(key);
|
||||
|
@ -510,18 +550,61 @@ action.InputState.Null = class Null extends InputState {
|
|||
*
|
||||
* @param {string} subtype
|
||||
* Kind of pointing device: mouse, pen, touch.
|
||||
* @param {boolean} primary
|
||||
* Whether the pointing device is primary.
|
||||
*
|
||||
* @throws {InvalidArgumentError}
|
||||
* If subtype is undefined or an invalid pointer type.
|
||||
*/
|
||||
action.InputState.Pointer = class Pointer extends InputState {
|
||||
constructor(subtype, primary) {
|
||||
constructor(subtype) {
|
||||
super();
|
||||
this.pressed = new Set();
|
||||
this.subtype = subtype;
|
||||
this.primary = primary;
|
||||
assert.defined(subtype, error.pprint`Expected subtype to be defined, got: ${subtype}`);
|
||||
this.subtype = action.PointerType.get(subtype);
|
||||
this.x = 0;
|
||||
this.y = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether |button| is pressed.
|
||||
*
|
||||
* @param {number} button
|
||||
* Positive integer that refers to a mouse button.
|
||||
*
|
||||
* @return {boolean}
|
||||
* True if |button| is in set of pressed buttons.
|
||||
*/
|
||||
isPressed(button) {
|
||||
assert.positiveInteger(button);
|
||||
return this.pressed.has(button);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add |button| to the set of pressed keys.
|
||||
*
|
||||
* @param {number} button
|
||||
* Positive integer that refers to a mouse button.
|
||||
*
|
||||
* @return {Set}
|
||||
* Set of pressed buttons.
|
||||
*/
|
||||
press(button) {
|
||||
assert.positiveInteger(button);
|
||||
return this.pressed.add(button);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove |button| from the set of pressed buttons.
|
||||
*
|
||||
* @param {number} button
|
||||
* A positive integer that refers to a mouse button.
|
||||
*
|
||||
* @return {boolean}
|
||||
* True if |button| was present before removals, false otherwise.
|
||||
*/
|
||||
release(button) {
|
||||
assert.positiveInteger(button);
|
||||
return this.pressed.delete(button);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -543,9 +626,7 @@ action.Action = class {
|
|||
throw new InvalidArgumentError("Missing id, type or subtype");
|
||||
}
|
||||
for (let attr of [id, type, subtype]) {
|
||||
if (typeof attr != "string") {
|
||||
throw new InvalidArgumentError(`Expected string, got: ${attr}`);
|
||||
}
|
||||
assert.string(attr, error.pprint`Expected string, got: ${attr}`);
|
||||
}
|
||||
this.id = id;
|
||||
this.type = type;
|
||||
|
@ -595,11 +676,9 @@ action.Action = class {
|
|||
// TODO countGraphemes
|
||||
// TODO key.value could be a single code point like "\uE012" (see rawKey)
|
||||
// or "grapheme cluster"
|
||||
if (typeof key != "string") {
|
||||
throw new InvalidArgumentError(
|
||||
"Expected 'value' to be a string that represents single code point " +
|
||||
"or grapheme cluster, got: " + key);
|
||||
}
|
||||
assert.string(key,
|
||||
error.pprint("Expected 'value' to be a string that represents single code point " +
|
||||
`or grapheme cluster, got: ${key}`));
|
||||
item.value = key;
|
||||
break;
|
||||
|
||||
|
@ -616,14 +695,7 @@ action.Action = class {
|
|||
assert.positiveInteger(item.duration,
|
||||
error.pprint`Expected 'duration' (${item.duration}) to be >= 0`);
|
||||
}
|
||||
if (typeof actionItem.element != "undefined" &&
|
||||
!element.isWebElementReference(actionItem.element)) {
|
||||
throw new InvalidArgumentError(
|
||||
"Expected 'actionItem.element' to be a web element reference, " +
|
||||
`got: ${actionItem.element}`);
|
||||
}
|
||||
item.element = actionItem.element;
|
||||
|
||||
item.origin = action.PointerOrigin.get(actionItem.origin);
|
||||
item.x = actionItem.x;
|
||||
if (typeof item.x != "undefined") {
|
||||
assert.positiveInteger(item.x, error.pprint`Expected 'x' (${item.x}) to be >= 0`);
|
||||
|
@ -710,18 +782,18 @@ action.Sequence = class extends Array {
|
|||
* If |actionSequence.actions| is not an Array.
|
||||
*/
|
||||
static fromJson(actionSequence) {
|
||||
// used here only to validate 'type' and InputState type
|
||||
// used here to validate 'type' in addition to InputState type below
|
||||
let inputSourceState = InputState.fromJson(actionSequence);
|
||||
let id = actionSequence.id;
|
||||
assert.defined(id, "Expected 'id' to be defined");
|
||||
assert.string(id, error.pprint`Expected 'id' to be a string, got: ${id}`);
|
||||
let actionItems = actionSequence.actions;
|
||||
if (!Array.isArray(actionItems)) {
|
||||
throw new InvalidArgumentError(
|
||||
`Expected 'actionSequence.actions' to be an Array, got: ${actionSequence.actions}`);
|
||||
}
|
||||
|
||||
if (action.inputStateMap.has(id) && !action.inputStateMap.get(id).is(inputSourceState)) {
|
||||
assert.array(actionItems,
|
||||
error.pprint("Expected 'actionSequence.actions' to be an Array, " +
|
||||
`got: ${actionSequence.actions}`));
|
||||
if (!action.inputStateMap.has(id)) {
|
||||
action.inputStateMap.set(id, inputSourceState);
|
||||
} else if (!action.inputStateMap.get(id).is(inputSourceState)) {
|
||||
throw new InvalidArgumentError(
|
||||
`Expected ${id} to be mapped to ${inputSourceState}, ` +
|
||||
`got: ${action.inputStateMap.get(id)}`);
|
||||
|
@ -739,19 +811,14 @@ action.Sequence = class extends Array {
|
|||
*
|
||||
* @param {string=} pointerType
|
||||
* Type of pointing device. If the parameter is undefined, "mouse" is used.
|
||||
* @param {boolean=} primary
|
||||
* Whether the input source is the primary pointing device.
|
||||
* If the parameter is undefined, true is used.
|
||||
*/
|
||||
action.PointerParameters = class {
|
||||
constructor(pointerType = "mouse", primary = true) {
|
||||
constructor(pointerType = "mouse") {
|
||||
this.pointerType = action.PointerType.get(pointerType);
|
||||
assert.boolean(primary);
|
||||
this.primary = primary;
|
||||
}
|
||||
|
||||
toString() {
|
||||
return `[pointerParameters ${this.pointerType}, primary=${this.primary}]`;
|
||||
return `[pointerParameters ${this.pointerType}]`;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -765,13 +832,13 @@ action.PointerParameters = class {
|
|||
if (typeof parametersData == "undefined") {
|
||||
return new action.PointerParameters();
|
||||
} else {
|
||||
return new action.PointerParameters(parametersData.pointerType, parametersData.primary);
|
||||
return new action.PointerParameters(parametersData.pointerType);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Adds |pointerType| and |primary| attributes to Action |act|. Helper function
|
||||
* Adds |pointerType| attribute to Action |act|. Helper function
|
||||
* for |action.Action.fromJson|.
|
||||
*
|
||||
* @param {string} id
|
||||
|
@ -783,17 +850,21 @@ action.PointerParameters = class {
|
|||
*
|
||||
* @throws {InvalidArgumentError}
|
||||
* If |id| is already mapped to an |action.InputState| that is
|
||||
* not compatible with |act.subtype|.
|
||||
* not compatible with |act.type| or |pointerParams.pointerType|.
|
||||
*/
|
||||
action.processPointerAction = function processPointerAction(id, pointerParams, act) {
|
||||
let subtype = act.subtype;
|
||||
if (action.inputStateMap.has(id) && action.inputStateMap.get(id).subtype !== subtype) {
|
||||
if (action.inputStateMap.has(id) && action.inputStateMap.get(id).type !== act.type) {
|
||||
throw new InvalidArgumentError(
|
||||
`Expected 'id' ${id} to be mapped to InputState whose type is ` +
|
||||
`${action.inputStateMap.get(id).type}, got: ${act.type}`);
|
||||
}
|
||||
let pointerType = pointerParams.pointerType;
|
||||
if (action.inputStateMap.has(id) && action.inputStateMap.get(id).subtype !== pointerType) {
|
||||
throw new InvalidArgumentError(
|
||||
`Expected 'id' ${id} to be mapped to InputState whose subtype is ` +
|
||||
`${action.inputStateMap.get(id).subtype}, got: ${subtype}`);
|
||||
`${action.inputStateMap.get(id).subtype}, got: ${pointerType}`);
|
||||
}
|
||||
act.pointerType = pointerParams.pointerType;
|
||||
act.primary = pointerParams.primary;
|
||||
};
|
||||
|
||||
/** Collect properties associated with KeyboardEvent */
|
||||
|
@ -820,6 +891,21 @@ action.Key = class {
|
|||
}
|
||||
};
|
||||
|
||||
/** Collect properties associated with MouseEvent */
|
||||
action.Mouse = class {
|
||||
constructor(type, button = 0) {
|
||||
this.type = type;
|
||||
assert.positiveInteger(button);
|
||||
this.button = button;
|
||||
this.buttons = 0;
|
||||
}
|
||||
|
||||
update(inputState) {
|
||||
let allButtons = Array.from(inputState.pressed);
|
||||
this.buttons = allButtons.reduce((a, i) => a + Math.pow(2, i), 0);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Dispatch a chain of actions over |chain.length| ticks.
|
||||
*
|
||||
|
@ -896,6 +982,40 @@ action.computeTickDuration = function(tickActions) {
|
|||
return max;
|
||||
};
|
||||
|
||||
/**
|
||||
* Compute viewport coordinates of pointer target based on given origin.
|
||||
*
|
||||
* @param {action.Action} a
|
||||
* Action that specifies pointer origin and x and y coordinates of target.
|
||||
* @param {action.InputState} inputState
|
||||
* Input state that specifies current x and y coordinates of pointer.
|
||||
* @param {Map.<string, number>=} center
|
||||
* Object representing x and y coordinates of an element center-point.
|
||||
* This is only used if |a.origin| is a web element reference.
|
||||
*
|
||||
* @return {Map.<string, number>}
|
||||
* x and y coordinates of pointer destination.
|
||||
*/
|
||||
action.computePointerDestination = function(a, inputState, center = undefined) {
|
||||
let {x, y} = a;
|
||||
switch (a.origin) {
|
||||
case action.PointerOrigin.Viewport:
|
||||
break;
|
||||
case action.PointerOrigin.Pointer:
|
||||
x += inputState.x;
|
||||
y += inputState.y;
|
||||
break;
|
||||
default:
|
||||
// origin represents web element
|
||||
assert.defined(center);
|
||||
assert.in("x", center);
|
||||
assert.in("y", center);
|
||||
x += center.x;
|
||||
y += center.y;
|
||||
}
|
||||
return {"x": x, "y": y};
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a closure to use as a map from action definitions to Promise events.
|
||||
*
|
||||
|
@ -912,9 +1032,6 @@ action.computeTickDuration = function(tickActions) {
|
|||
*/
|
||||
function toEvents(tickDuration, seenEls, container) {
|
||||
return function (a) {
|
||||
if (!action.inputStateMap.has(a.id)) {
|
||||
action.inputStateMap.set(a.id, InputState.fromJson(a));
|
||||
}
|
||||
let inputState = action.inputStateMap.get(a.id);
|
||||
switch (a.subtype) {
|
||||
case action.KeyUp:
|
||||
|
@ -924,8 +1041,14 @@ function toEvents(tickDuration, seenEls, container) {
|
|||
return dispatchKeyDown(a, inputState, container.frame);
|
||||
|
||||
case action.PointerDown:
|
||||
return dispatchPointerDown(a, inputState, container.frame);
|
||||
|
||||
case action.PointerUp:
|
||||
return dispatchPointerUp(a, inputState, container.frame);
|
||||
|
||||
case action.PointerMove:
|
||||
return dispatchPointerMove(a, inputState, tickDuration, seenEls, container);
|
||||
|
||||
case action.PointerCancel:
|
||||
throw new UnsupportedOperationError();
|
||||
|
||||
|
@ -996,6 +1119,180 @@ function dispatchKeyUp(a, inputState, win) {
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispatch a pointerDown action equivalent to pressing a pointer-device
|
||||
* button.
|
||||
*
|
||||
* @param {action.Action} a
|
||||
* Action to dispatch.
|
||||
* @param {action.InputState} inputState
|
||||
* Input state for this action's input source.
|
||||
* @param {nsIDOMWindow} win
|
||||
* Current window.
|
||||
*
|
||||
* @return {Promise}
|
||||
* Promise to dispatch at least a pointerdown event.
|
||||
*/
|
||||
function dispatchPointerDown(a, inputState, win) {
|
||||
return new Promise(resolve => {
|
||||
if (inputState.isPressed(a.button)) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
inputState.press(a.button);
|
||||
// Append a copy of |a| with pointerUp subtype
|
||||
action.inputsToCancel.push(Object.assign({}, a, {subtype: action.PointerUp}));
|
||||
switch (inputState.subtype) {
|
||||
case action.PointerType.Mouse:
|
||||
let mouseEvent = new action.Mouse("mousedown", a.button);
|
||||
mouseEvent.update(inputState);
|
||||
event.synthesizeMouseAtPoint(inputState.x, inputState.y, mouseEvent, win);
|
||||
break;
|
||||
case action.PointerType.Pen:
|
||||
case action.PointerType.Touch:
|
||||
throw new UnsupportedOperationError("Only 'mouse' pointer type is supported");
|
||||
break;
|
||||
default:
|
||||
throw new TypeError(`Unknown pointer type: ${inputState.subtype}`);
|
||||
}
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispatch a pointerUp action equivalent to releasing a pointer-device
|
||||
* button.
|
||||
*
|
||||
* @param {action.Action} a
|
||||
* Action to dispatch.
|
||||
* @param {action.InputState} inputState
|
||||
* Input state for this action's input source.
|
||||
* @param {nsIDOMWindow} win
|
||||
* Current window.
|
||||
*
|
||||
* @return {Promise}
|
||||
* Promise to dispatch at least a pointerup event.
|
||||
*/
|
||||
function dispatchPointerUp(a, inputState, win) {
|
||||
return new Promise(resolve => {
|
||||
if (!inputState.isPressed(a.button)) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
inputState.release(a.button);
|
||||
switch (inputState.subtype) {
|
||||
case action.PointerType.Mouse:
|
||||
let mouseEvent = new action.Mouse("mouseup", a.button);
|
||||
mouseEvent.update(inputState);
|
||||
event.synthesizeMouseAtPoint(inputState.x, inputState.y,
|
||||
mouseEvent, win);
|
||||
break;
|
||||
case action.PointerType.Pen:
|
||||
case action.PointerType.Touch:
|
||||
throw new UnsupportedOperationError("Only 'mouse' pointer type is supported");
|
||||
default:
|
||||
throw new TypeError(`Unknown pointer type: ${inputState.subtype}`);
|
||||
}
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispatch a pointerMove action equivalent to moving pointer device in a line.
|
||||
*
|
||||
* If the action duration is 0, the pointer jumps immediately to the target coordinates.
|
||||
* Otherwise, events are synthesized to mimic a pointer travelling in a discontinuous,
|
||||
* approximately straight line, with the pointer coordinates being updated around 60
|
||||
* times per second.
|
||||
*
|
||||
* @param {action.Action} a
|
||||
* Action to dispatch.
|
||||
* @param {action.InputState} inputState
|
||||
* Input state for this action's input source.
|
||||
* @param {element.Store} seenEls
|
||||
* Element store.
|
||||
* @param {?} container
|
||||
* Object with |frame| attribute of type |nsIDOMWindow|.
|
||||
*
|
||||
* @return {Promise}
|
||||
* Promise to dispatch at least one pointermove event, as well as mousemove events
|
||||
* as appropriate.
|
||||
*/
|
||||
function dispatchPointerMove(a, inputState, tickDuration, seenEls, container) {
|
||||
const timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
||||
// interval between pointermove increments in ms, based on common vsync
|
||||
const fps60 = 17;
|
||||
return new Promise(resolve => {
|
||||
const start = Date.now();
|
||||
const [startX, startY] = [inputState.x, inputState.y];
|
||||
let target = action.computePointerDestination(a, inputState,
|
||||
getElementCenter(a.origin, seenEls, container));
|
||||
const [targetX, targetY] = [target.x, target.y];
|
||||
if (!inViewPort(targetX, targetY, container.frame)) {
|
||||
throw new MoveTargetOutOfBoundsError(
|
||||
`(${targetX}, ${targetY}) is out of bounds of viewport ` +
|
||||
`width (${container.frame.innerWidth}) and height (${container.frame.innerHeight})`);
|
||||
}
|
||||
|
||||
const duration = typeof a.duration == "undefined" ? tickDuration : a.duration;
|
||||
if (duration === 0) {
|
||||
// move pointer to destination in one step
|
||||
performOnePointerMove(inputState, targetX, targetY, container.frame);
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
const distanceX = targetX - startX;
|
||||
const distanceY = targetY - startY;
|
||||
const ONE_SHOT = Ci.nsITimer.TYPE_ONE_SHOT;
|
||||
let intermediatePointerEvents = Task.spawn(function* () {
|
||||
// wait |fps60| ms before performing first incremental pointer move
|
||||
yield new Promise(resolveTimer =>
|
||||
timer.initWithCallback(resolveTimer, fps60, ONE_SHOT)
|
||||
);
|
||||
let durationRatio = Math.floor(Date.now() - start) / duration;
|
||||
const epsilon = fps60 / duration / 10;
|
||||
while ((1 - durationRatio) > epsilon) {
|
||||
let x = Math.floor(durationRatio * distanceX + startX);
|
||||
let y = Math.floor(durationRatio * distanceY + startY);
|
||||
performOnePointerMove(inputState, x, y, container.frame);
|
||||
// wait |fps60| ms before performing next pointer move
|
||||
yield new Promise(resolveTimer =>
|
||||
timer.initWithCallback(resolveTimer, fps60, ONE_SHOT));
|
||||
durationRatio = Math.floor(Date.now() - start) / duration;
|
||||
}
|
||||
});
|
||||
// perform last pointer move after all incremental moves are resolved and
|
||||
// durationRatio is close enough to 1
|
||||
intermediatePointerEvents.then(() => {
|
||||
performOnePointerMove(inputState, targetX, targetY, container.frame);
|
||||
resolve();
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
function performOnePointerMove(inputState, targetX, targetY, win) {
|
||||
if (targetX == inputState.x && targetY == inputState.y) {
|
||||
return;
|
||||
}
|
||||
switch (inputState.subtype) {
|
||||
case action.PointerType.Mouse:
|
||||
let mouseEvent = new action.Mouse("mousemove");
|
||||
mouseEvent.update(inputState);
|
||||
//TODO both pointermove (if available) and mousemove
|
||||
event.synthesizeMouseAtPoint(targetX, targetY, mouseEvent, win);
|
||||
break;
|
||||
case action.PointerType.Pen:
|
||||
case action.PointerType.Touch:
|
||||
throw new UnsupportedOperationError("Only 'mouse' pointer type is supported");
|
||||
default:
|
||||
throw new TypeError(`Unknown pointer type: ${inputState.subtype}`);
|
||||
}
|
||||
inputState.x = targetX;
|
||||
inputState.y = targetY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispatch a pause action equivalent waiting for |a.duration| milliseconds, or a
|
||||
* default time interval of |tickDuration|.
|
||||
|
@ -1031,8 +1328,21 @@ function flushEvents(container) {
|
|||
}
|
||||
|
||||
function capitalize(str) {
|
||||
if (typeof str != "string") {
|
||||
throw new InvalidArgumentError(`Expected string, got: ${str}`);
|
||||
}
|
||||
assert.string(str);
|
||||
return str.charAt(0).toUpperCase() + str.slice(1);
|
||||
}
|
||||
|
||||
function inViewPort(x, y, win) {
|
||||
assert.number(x);
|
||||
assert.number(y);
|
||||
// Viewport includes scrollbars if rendered.
|
||||
return !(x < 0 || y < 0 || x > win.innerWidth || y > win.innerHeight);
|
||||
}
|
||||
|
||||
function getElementCenter(elementReference, seenEls, container) {
|
||||
if (element.isWebElementReference(elementReference)) {
|
||||
let uuid = elementReference[element.Key] || elementReference[element.LegacyKey];
|
||||
let el = seenEls.get(uuid, container);
|
||||
return element.coordinates(el);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -100,7 +100,7 @@ assert.b2g = function (msg = "") {
|
|||
assert.content = function (context, msg = "") {
|
||||
msg = msg || "Only supported in content context";
|
||||
assert.that(c => c.toString() == "content", msg, UnsupportedOperationError)(context);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Asserts that the current browser is a mobile browser, that is either
|
||||
|
@ -136,6 +136,25 @@ assert.defined = function (obj, msg = "") {
|
|||
return assert.that(o => typeof o != "undefined", msg)(obj);
|
||||
};
|
||||
|
||||
/**
|
||||
* Asserts that |obj| is a finite number.
|
||||
*
|
||||
* @param {?} obj
|
||||
* Value to test.
|
||||
* @param {string=} msg
|
||||
* Custom error message.
|
||||
*
|
||||
* @return {number}
|
||||
* |obj| is returned unaltered.
|
||||
*
|
||||
* @throws {InvalidArgumentError}
|
||||
* If |obj| is not a number.
|
||||
*/
|
||||
assert.number = function (obj, msg = "") {
|
||||
msg = msg || error.pprint`Expected ${obj} to be finite number`;
|
||||
return assert.that(Number.isFinite, msg)(obj);
|
||||
};
|
||||
|
||||
/**
|
||||
* Asserts that |obj| is an integer.
|
||||
*
|
||||
|
|
|
@ -15,6 +15,7 @@ const ERRORS = new Set([
|
|||
"InvalidSelectorError",
|
||||
"InvalidSessionIDError",
|
||||
"JavaScriptError",
|
||||
"MoveTargetOutOfBoundsError",
|
||||
"NoAlertOpenError",
|
||||
"NoSuchElementError",
|
||||
"NoSuchFrameError",
|
||||
|
@ -301,6 +302,13 @@ class JavaScriptError extends WebDriverError {
|
|||
}
|
||||
}
|
||||
|
||||
class MoveTargetOutOfBoundsError extends WebDriverError {
|
||||
constructor (message) {
|
||||
super(message);
|
||||
this.status = "move target out of bounds";
|
||||
}
|
||||
}
|
||||
|
||||
class NoAlertOpenError extends WebDriverError {
|
||||
constructor (message) {
|
||||
super(message);
|
||||
|
@ -394,6 +402,7 @@ const STATUSES = new Map([
|
|||
["invalid selector", InvalidSelectorError],
|
||||
["invalid session id", InvalidSessionIDError],
|
||||
["javascript error", JavaScriptError],
|
||||
["move target out of bounds", MoveTargetOutOfBoundsError],
|
||||
["no alert open", NoAlertOpenError],
|
||||
["no such element", NoSuchElementError],
|
||||
["no such frame", NoSuchFrameError],
|
||||
|
|
|
@ -232,7 +232,7 @@ event.synthesizeMouse = function (
|
|||
* CSS pixels from the left document margin.
|
||||
* @param {number} top
|
||||
* CSS pixels from the top document margin.
|
||||
* @param {Object.<string, ?>} event
|
||||
* @param {Object.<string, ?>} opts
|
||||
* Object which may contain the properties "shiftKey", "ctrlKey",
|
||||
* "altKey", "metaKey", "accessKey", "clickCount", "button", and
|
||||
* "type".
|
||||
|
@ -247,15 +247,26 @@ event.synthesizeMouseAtPoint = function (
|
|||
let button = opts.button || 0;
|
||||
let clickCount = opts.clickCount || 1;
|
||||
let modifiers = event.parseModifiers_(opts);
|
||||
let pressure = ("pressure" in opts) ? opts.pressure : 0;
|
||||
let inputSource = ("inputSource" in opts) ? opts.inputSource :
|
||||
Ci.nsIDOMMouseEvent.MOZ_SOURCE_MOUSE;
|
||||
let isDOMEventSynthesized =
|
||||
("isSynthesized" in opts) ? opts.isSynthesized : true;
|
||||
let isWidgetEventSynthesized =
|
||||
("isWidgetEventSynthesized" in opts) ? opts.isWidgetEventSynthesized : false;
|
||||
let buttons = ("buttons" in opts) ? opts.buttons : domutils.MOUSE_BUTTONS_NOT_SPECIFIED;
|
||||
|
||||
if (("type" in event) && opts.type) {
|
||||
if (("type" in opts) && opts.type) {
|
||||
domutils.sendMouseEvent(
|
||||
opts.type, left, top, button, clickCount, modifiers);
|
||||
opts.type, left, top, button, clickCount, modifiers, false, pressure, inputSource,
|
||||
isDOMEventSynthesized, isWidgetEventSynthesized, buttons);
|
||||
} else {
|
||||
domutils.sendMouseEvent(
|
||||
"mousedown", left, top, button, clickCount, modifiers);
|
||||
"mousedown", left, top, button, clickCount, modifiers, false, pressure, inputSource,
|
||||
isDOMEventSynthesized, isWidgetEventSynthesized, buttons);
|
||||
domutils.sendMouseEvent(
|
||||
"mouseup", left, top, button, clickCount, modifiers);
|
||||
"mouseup", left, top, button, clickCount, modifiers, false, pressure, inputSource,
|
||||
isDOMEventSynthesized, isWidgetEventSynthesized, buttons);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ add_test(function test_createAction() {
|
|||
});
|
||||
|
||||
add_test(function test_defaultPointerParameters() {
|
||||
let defaultParameters = {pointerType: action.PointerType.Mouse, primary: true};
|
||||
let defaultParameters = {pointerType: action.PointerType.Mouse};
|
||||
deepEqual(action.PointerParameters.fromJson(), defaultParameters);
|
||||
|
||||
run_next_test();
|
||||
|
@ -34,16 +34,15 @@ add_test(function test_defaultPointerParameters() {
|
|||
add_test(function test_processPointerParameters() {
|
||||
let check = (regex, message, arg) => checkErrors(
|
||||
regex, action.PointerParameters.fromJson, [arg], message);
|
||||
let parametersData = {pointerType: "foo", primary: undefined};
|
||||
let message = `parametersData: [pointerType: ${parametersData.pointerType}, ` +
|
||||
`primary: ${parametersData.primary}]`;
|
||||
check(/Unknown pointerType/, message, parametersData);
|
||||
parametersData.pointerType = "pen";
|
||||
parametersData.primary = "a";
|
||||
check(/Expected \[object String\] "a" to be boolean/, message, parametersData);
|
||||
parametersData.primary = false;
|
||||
let parametersData;
|
||||
for (let d of ["foo", "", "get", "Get"]) {
|
||||
parametersData = {pointerType: d};
|
||||
let message = `parametersData: [pointerType: ${parametersData.pointerType}]`;
|
||||
check(/Unknown pointerType/, message, parametersData);
|
||||
}
|
||||
parametersData.pointerType = "mouse"; //TODO "pen";
|
||||
deepEqual(action.PointerParameters.fromJson(parametersData),
|
||||
{pointerType: action.PointerType.Pen, primary: false});
|
||||
{pointerType: "mouse"}); //TODO action.PointerType.Pen});
|
||||
|
||||
run_next_test();
|
||||
});
|
||||
|
@ -89,37 +88,66 @@ add_test(function test_validateActionDurationAndCoordinates() {
|
|||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_processPointerMoveActionElementValidation() {
|
||||
add_test(function test_processPointerMoveActionOriginValidation() {
|
||||
let actionSequence = {type: "pointer", id: "some_id"};
|
||||
let actionItem = {duration: 5000, type: "pointerMove"};
|
||||
for (let d of [-1, "a", {a: "blah"}]) {
|
||||
actionItem.element = d;
|
||||
checkErrors(/Expected 'actionItem.element' to be a web element reference/,
|
||||
for (let d of [-1, {a: "blah"}, []]) {
|
||||
actionItem.origin = d;
|
||||
checkErrors(/Expected \'origin\' to be a string or a web element reference/,
|
||||
action.Action.fromJson,
|
||||
[actionSequence, actionItem],
|
||||
`actionItem.element: (${getTypeString(d)})`);
|
||||
`actionItem.origin: (${getTypeString(d)})`);
|
||||
}
|
||||
actionItem.element = {[element.Key]: "something"};
|
||||
let a = action.Action.fromJson(actionSequence, actionItem);
|
||||
deepEqual(a.element, actionItem.element);
|
||||
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_processPointerMoveActionOriginStringValidation() {
|
||||
let actionSequence = {type: "pointer", id: "some_id"};
|
||||
let actionItem = {duration: 5000, type: "pointerMove"};
|
||||
for (let d of ["a", "", "get", "Get"]) {
|
||||
actionItem.origin = d;
|
||||
checkErrors(/Unknown pointer-move origin/,
|
||||
action.Action.fromJson,
|
||||
[actionSequence, actionItem],
|
||||
`actionItem.origin: ${d}`);
|
||||
}
|
||||
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_processPointerMoveActionElementOrigin() {
|
||||
let actionSequence = {type: "pointer", id: "some_id"};
|
||||
let actionItem = {duration: 5000, type: "pointerMove"};
|
||||
actionItem.origin = {[element.Key]: "something"};
|
||||
let a = action.Action.fromJson(actionSequence, actionItem);
|
||||
deepEqual(a.origin, actionItem.origin);
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_processPointerMoveActionDefaultOrigin() {
|
||||
let actionSequence = {type: "pointer", id: "some_id"};
|
||||
// origin left undefined
|
||||
let actionItem = {duration: 5000, type: "pointerMove"};
|
||||
let a = action.Action.fromJson(actionSequence, actionItem);
|
||||
deepEqual(a.origin, action.PointerOrigin.Viewport);
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_processPointerMoveAction() {
|
||||
let actionSequence = {id: "some_id", type: "pointer"};
|
||||
let actionItems = [
|
||||
{
|
||||
duration: 5000,
|
||||
type: "pointerMove",
|
||||
element: undefined,
|
||||
origin: undefined,
|
||||
x: undefined,
|
||||
y: undefined,
|
||||
},
|
||||
{
|
||||
duration: undefined,
|
||||
type: "pointerMove",
|
||||
element: {[element.Key]: "id", [element.LegacyKey]: "id"},
|
||||
origin: {[element.Key]: "id", [element.LegacyKey]: "id"},
|
||||
x: undefined,
|
||||
y: undefined,
|
||||
},
|
||||
|
@ -128,34 +156,88 @@ add_test(function test_processPointerMoveAction() {
|
|||
type: "pointerMove",
|
||||
x: 0,
|
||||
y: undefined,
|
||||
element: undefined,
|
||||
origin: undefined,
|
||||
},
|
||||
{
|
||||
duration: 5000,
|
||||
type: "pointerMove",
|
||||
x: 1,
|
||||
y: 2,
|
||||
element: undefined,
|
||||
origin: undefined,
|
||||
},
|
||||
];
|
||||
for (let expected of actionItems) {
|
||||
let actual = action.Action.fromJson(actionSequence, expected);
|
||||
ok(actual instanceof action.Action);
|
||||
equal(actual.duration, expected.duration);
|
||||
equal(actual.element, expected.element);
|
||||
equal(actual.x, expected.x);
|
||||
equal(actual.y, expected.y);
|
||||
|
||||
let origin = expected.origin;
|
||||
if (typeof origin == "undefined") {
|
||||
origin = action.PointerOrigin.Viewport;
|
||||
}
|
||||
deepEqual(actual.origin, origin);
|
||||
|
||||
}
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_computePointerDestinationViewport() {
|
||||
let act = { type: "pointerMove", x: 100, y: 200, origin: "viewport"};
|
||||
let inputState = new action.InputState.Pointer(action.PointerType.Mouse);
|
||||
// these values should not affect the outcome
|
||||
inputState.x = "99";
|
||||
inputState.y = "10";
|
||||
let target = action.computePointerDestination(act, inputState);
|
||||
equal(act.x, target.x);
|
||||
equal(act.y, target.y);
|
||||
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_computePointerDestinationPointer() {
|
||||
let act = { type: "pointerMove", x: 100, y: 200, origin: "pointer"};
|
||||
let inputState = new action.InputState.Pointer(action.PointerType.Mouse);
|
||||
inputState.x = 10;
|
||||
inputState.y = 99;
|
||||
let target = action.computePointerDestination(act, inputState);
|
||||
equal(act.x + inputState.x, target.x);
|
||||
equal(act.y + inputState.y, target.y);
|
||||
|
||||
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_computePointerDestinationElement() {
|
||||
// origin represents a web element
|
||||
// using an object literal instead to test default case in computePointerDestination
|
||||
let act = {type: "pointerMove", x: 100, y: 200, origin: {}};
|
||||
let inputState = new action.InputState.Pointer(action.PointerType.Mouse);
|
||||
let elementCenter = {x: 10, y: 99};
|
||||
let target = action.computePointerDestination(act, inputState, elementCenter);
|
||||
equal(act.x + elementCenter.x, target.x);
|
||||
equal(act.y + elementCenter.y, target.y);
|
||||
|
||||
Assert.throws(
|
||||
() => action.computePointerDestination(act, inputState, {a: 1}),
|
||||
InvalidArgumentError,
|
||||
"Invalid element center coordinates.");
|
||||
|
||||
Assert.throws(
|
||||
() => action.computePointerDestination(act, inputState, undefined),
|
||||
InvalidArgumentError,
|
||||
"Undefined element center coordinates.");
|
||||
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_processPointerAction() {
|
||||
let actionSequence = {
|
||||
type: "pointer",
|
||||
id: "some_id",
|
||||
parameters: {
|
||||
pointerType: "touch",
|
||||
primary: false,
|
||||
pointerType: "mouse" //TODO "touch"
|
||||
},
|
||||
};
|
||||
let actionItems = [
|
||||
|
@ -183,7 +265,6 @@ add_test(function test_processPointerAction() {
|
|||
equal(actual.duration, expected.duration);
|
||||
}
|
||||
if (expected.type !== "pause") {
|
||||
equal(actual.primary, actionSequence.parameters.primary);
|
||||
equal(actual.pointerType, actionSequence.parameters.pointerType);
|
||||
}
|
||||
}
|
||||
|
@ -253,20 +334,24 @@ add_test(function test_processInputSourceActionSequenceValidation() {
|
|||
let check = (message, regex) => checkErrors(
|
||||
regex, action.Sequence.fromJson, [actionSequence], message);
|
||||
check(`actionSequence.type: ${actionSequence.type}`, /Unknown action type/);
|
||||
action.inputStateMap.clear();
|
||||
|
||||
actionSequence.type = "none";
|
||||
actionSequence.id = -1;
|
||||
check(`actionSequence.id: ${getTypeString(actionSequence.id)}`,
|
||||
/Expected 'id' to be a string/);
|
||||
action.inputStateMap.clear();
|
||||
|
||||
actionSequence.id = undefined;
|
||||
check(`actionSequence.id: ${getTypeString(actionSequence.id)}`,
|
||||
/Expected 'id' to be defined/);
|
||||
action.inputStateMap.clear();
|
||||
|
||||
actionSequence.id = "some_id";
|
||||
actionSequence.actions = -1;
|
||||
check(`actionSequence.actions: ${getTypeString(actionSequence.actions)}`,
|
||||
/Expected 'actionSequence.actions' to be an Array/);
|
||||
action.inputStateMap.clear();
|
||||
|
||||
run_next_test();
|
||||
});
|
||||
|
@ -283,6 +368,7 @@ add_test(function test_processInputSourceActionSequence() {
|
|||
let actions = action.Sequence.fromJson(actionSequence);
|
||||
equal(actions.length, 1);
|
||||
deepEqual(actions[0], expectedAction);
|
||||
action.inputStateMap.clear();
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
|
@ -293,18 +379,17 @@ add_test(function test_processInputSourceActionSequencePointer() {
|
|||
id: "9",
|
||||
actions: [actionItem],
|
||||
parameters: {
|
||||
pointerType: "pen",
|
||||
primary: false,
|
||||
pointerType: "mouse" // TODO "pen"
|
||||
},
|
||||
};
|
||||
let expectedAction = new action.Action(
|
||||
actionSequence.id, actionSequence.type, actionItem.type);
|
||||
expectedAction.pointerType = actionSequence.parameters.pointerType;
|
||||
expectedAction.primary = actionSequence.parameters.primary;
|
||||
expectedAction.button = actionItem.button;
|
||||
let actions = action.Sequence.fromJson(actionSequence);
|
||||
equal(actions.length, 1);
|
||||
deepEqual(actions[0], expectedAction);
|
||||
action.inputStateMap.clear();
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
|
@ -321,6 +406,7 @@ add_test(function test_processInputSourceActionSequenceKey() {
|
|||
let actions = action.Sequence.fromJson(actionSequence);
|
||||
equal(actions.length, 1);
|
||||
deepEqual(actions[0], expectedAction);
|
||||
action.inputStateMap.clear();
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
|
@ -349,26 +435,40 @@ add_test(function test_processInputSourceActionSequenceInputStateMap() {
|
|||
add_test(function test_processPointerActionInputStateMap() {
|
||||
let actionItem = {type: "pointerDown"};
|
||||
let id = "1";
|
||||
let parameters = {pointerType: "mouse", primary: false};
|
||||
let parameters = {pointerType: "mouse"};
|
||||
let a = new action.Action(id, "pointer", actionItem.type);
|
||||
let wrongInputState = new action.InputState.Pointer("pause", true);
|
||||
let wrongInputState = new action.InputState.Key();
|
||||
action.inputStateMap.set(id, wrongInputState);
|
||||
checkErrors(
|
||||
/to be mapped to InputState whose subtype is/, action.processPointerAction,
|
||||
/to be mapped to InputState whose type is/, action.processPointerAction,
|
||||
[id, parameters, a],
|
||||
`$subtype ${actionItem.type} with ${wrongInputState.subtype} in inputState`);
|
||||
`type "pointer" with ${wrongInputState.type} in inputState`);
|
||||
action.inputStateMap.clear();
|
||||
let rightInputState = new action.InputState.Pointer("pointerDown", false);
|
||||
|
||||
// TODO - uncomment once pen is supported
|
||||
//wrongInputState = new action.InputState.Pointer("pen");
|
||||
//action.inputStateMap.set(id, wrongInputState);
|
||||
//checkErrors(
|
||||
// /to be mapped to InputState whose subtype is/, action.processPointerAction,
|
||||
// [id, parameters, a],
|
||||
// `subtype ${parameters.pointerType} with ${wrongInputState.subtype} in inputState`);
|
||||
//action.inputStateMap.clear();
|
||||
|
||||
let rightInputState = new action.InputState.Pointer("mouse");
|
||||
action.inputStateMap.set(id, rightInputState);
|
||||
action.processPointerAction(id, parameters, a);
|
||||
equal(a.primary, parameters.primary);
|
||||
action.inputStateMap.clear();
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_createInputState() {
|
||||
for (let kind in action.InputState) {
|
||||
let state = new action.InputState[kind]();
|
||||
let state;
|
||||
if (kind == "Pointer") {
|
||||
state = new action.InputState[kind]("mouse");
|
||||
} else {
|
||||
state = new action.InputState[kind]();
|
||||
}
|
||||
ok(state);
|
||||
if (kind === "Null") {
|
||||
equal(state.type, "none");
|
||||
|
@ -376,6 +476,10 @@ add_test(function test_createInputState() {
|
|||
equal(state.type, kind.toLowerCase());
|
||||
}
|
||||
}
|
||||
Assert.throws(() => new action.InputState.Pointer(), InvalidArgumentError,
|
||||
"Missing InputState.Pointer constructor arg");
|
||||
Assert.throws(() => new action.InputState.Pointer("foo"), InvalidArgumentError,
|
||||
"Invalid InputState.Pointer constructor arg");
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
|
@ -408,6 +512,7 @@ add_test(function test_extractActionChain_oneTickOneInput() {
|
|||
equal(1, actionsByTick.length);
|
||||
equal(1, actionsByTick[0].length);
|
||||
deepEqual(actionsByTick, [[expectedAction]]);
|
||||
action.inputStateMap.clear();
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
|
@ -427,8 +532,7 @@ add_test(function test_extractActionChain_twoAndThreeTicks() {
|
|||
id: "7",
|
||||
actions: mouseActionItems,
|
||||
parameters: {
|
||||
pointerType: "touch",
|
||||
primary: false,
|
||||
pointerType: "mouse" //TODO "touch"
|
||||
},
|
||||
};
|
||||
let keyActionItems = [
|
||||
|
@ -459,12 +563,14 @@ add_test(function test_extractActionChain_twoAndThreeTicks() {
|
|||
let expectedAction = new action.Action(keyActionSequence.id, "key", keyActionItems[2].type);
|
||||
expectedAction.value = keyActionItems[2].value;
|
||||
deepEqual(actionsByTick[2][0], expectedAction);
|
||||
action.inputStateMap.clear();
|
||||
|
||||
// one empty action sequence
|
||||
actionsByTick = action.Chain.fromJson(
|
||||
[keyActionSequence, {type: "none", id: "some", actions: []}]);
|
||||
equal(keyActionItems.length, actionsByTick.length);
|
||||
equal(1, actionsByTick[0].length);
|
||||
action.inputStateMap.clear();
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
|
|
|
@ -40,11 +40,23 @@ add_test(function test_defined() {
|
|||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_number() {
|
||||
assert.number(1);
|
||||
assert.number(0);
|
||||
assert.number(-1);
|
||||
assert.number(1.2);
|
||||
for (let i of ["foo", "1", {}, [], NaN, Infinity, undefined]) {
|
||||
Assert.throws(() => assert.number(i), InvalidArgumentError);
|
||||
}
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_integer() {
|
||||
assert.integer(1);
|
||||
assert.integer(0);
|
||||
assert.integer(-1);
|
||||
Assert.throws(() => assert.integer("foo"), InvalidArgumentError);
|
||||
Assert.throws(() => assert.integer(1.2), InvalidArgumentError);
|
||||
|
||||
run_next_test();
|
||||
});
|
||||
|
|
|
@ -31,8 +31,8 @@ config = {
|
|||
'tooltool_script': ["/builds/tooltool.py"],
|
||||
'tooltool_bootstrap': "setup.sh",
|
||||
'enable_count_ctors': False,
|
||||
'enable_talos_sendchange': True,
|
||||
'enable_unittest_sendchange': True,
|
||||
'enable_talos_sendchange': False,
|
||||
'enable_unittest_sendchange': False,
|
||||
#########################################################################
|
||||
|
||||
|
||||
|
|
|
@ -37,8 +37,8 @@ config = {
|
|||
'tooltool_script': ["/builds/tooltool.py"],
|
||||
'tooltool_bootstrap': "setup.sh",
|
||||
'enable_count_ctors': False,
|
||||
'enable_talos_sendchange': True,
|
||||
'enable_unittest_sendchange': True,
|
||||
'enable_talos_sendchange': False,
|
||||
'enable_unittest_sendchange': False,
|
||||
#########################################################################
|
||||
|
||||
|
||||
|
|
|
@ -12854,11 +12854,6 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"./test_keys_wdspec.html": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"./update-built-tests.sh": [
|
||||
[
|
||||
{}
|
||||
|
@ -62234,12 +62229,27 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"webdriver/support/__init__.py": [
|
||||
"webdriver/actions/__init__.py": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"webdriver/support/keys.py": [
|
||||
"webdriver/actions/support/__init__.py": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"webdriver/actions/support/keys.py": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"webdriver/actions/support/refine.py": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"webdriver/actions/support/test_actions_wdspec.html": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
|
@ -129329,9 +129339,27 @@
|
|||
]
|
||||
},
|
||||
"wdspec": {
|
||||
"webdriver/actions.py": [
|
||||
"webdriver/actions/conftest.py": [
|
||||
[
|
||||
"/webdriver/actions.py",
|
||||
"/webdriver/actions/conftest.py",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"webdriver/actions/key.py": [
|
||||
[
|
||||
"/webdriver/actions/key.py",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"webdriver/actions/mouse.py": [
|
||||
[
|
||||
"/webdriver/actions/mouse.py",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"webdriver/actions/sequence.py": [
|
||||
[
|
||||
"/webdriver/actions/sequence.py",
|
||||
{}
|
||||
]
|
||||
],
|
||||
|
@ -129444,10 +129472,6 @@
|
|||
"c51b17fbac2a2e3121dc74f7badbd2873ce92f61",
|
||||
"support"
|
||||
],
|
||||
"./test_keys_wdspec.html": [
|
||||
"13e6f15dcfe080bff5f3b3cbaf9b9f679915aca3",
|
||||
"support"
|
||||
],
|
||||
"./update-built-tests.sh": [
|
||||
"75ea35a5ce9d8e3e32e8d0c336dc12e04691d16a",
|
||||
"support"
|
||||
|
@ -176941,7 +176965,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"html/semantics/forms/the-select-element/common-HTMLOptionsCollection.html": [
|
||||
"de186d5f39bf85cc073ad6262fa933f89a4500d5",
|
||||
"b5a01e973e4d4c97c6fa06bd9fd1e535e8c622e8",
|
||||
"testharness"
|
||||
],
|
||||
"html/semantics/forms/the-select-element/select-ask-for-reset.html": [
|
||||
|
@ -178129,11 +178153,11 @@
|
|||
"testharness"
|
||||
],
|
||||
"html/semantics/tabular-data/the-table-element/tFoot.html": [
|
||||
"8017cabc08b5c10566ce97dee0cecd73d7ee3bce",
|
||||
"ec9513f8c78bed931ac9ea51910d314b46639317",
|
||||
"testharness"
|
||||
],
|
||||
"html/semantics/tabular-data/the-table-element/tHead.html": [
|
||||
"45cd1c63c80dce76c5a51644fa17f8535846cb54",
|
||||
"96c3470e247189297a84310173392007bad4977d",
|
||||
"testharness"
|
||||
],
|
||||
"html/semantics/tabular-data/the-table-element/table-insertRow.html": [
|
||||
|
@ -178197,7 +178221,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"html/semantics/tabular-data/the-tr-element/insertCell.html": [
|
||||
"d3e48e89cfc8a9f3478af5c922fea6a59e88135e",
|
||||
"8161e1f20e42a9fe5270cc779dca71ada097cd75",
|
||||
"testharness"
|
||||
],
|
||||
"html/semantics/tabular-data/the-tr-element/rowIndex.html": [
|
||||
|
@ -205836,10 +205860,42 @@
|
|||
"a4611303723fa7225d7667a1e4fe2495451b824f",
|
||||
"support"
|
||||
],
|
||||
"webdriver/actions.py": [
|
||||
"3a857859e17b7965cec7fb1ba2368177f316a395",
|
||||
"webdriver/actions/__init__.py": [
|
||||
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
|
||||
"support"
|
||||
],
|
||||
"webdriver/actions/conftest.py": [
|
||||
"ba57459c1eb7d792e14e756078eb725f4c07aa6e",
|
||||
"wdspec"
|
||||
],
|
||||
"webdriver/actions/key.py": [
|
||||
"808f1311409fb70a40bbb995ff7da768d58e43cb",
|
||||
"wdspec"
|
||||
],
|
||||
"webdriver/actions/mouse.py": [
|
||||
"640ae3074200938ad63f77627d6645efa8c5716e",
|
||||
"wdspec"
|
||||
],
|
||||
"webdriver/actions/sequence.py": [
|
||||
"d80f382863e52ff223db735a2a551197e570774f",
|
||||
"wdspec"
|
||||
],
|
||||
"webdriver/actions/support/__init__.py": [
|
||||
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
|
||||
"support"
|
||||
],
|
||||
"webdriver/actions/support/keys.py": [
|
||||
"85bfdbd3203166c2b84616cc1936f6dd98f8de3b",
|
||||
"support"
|
||||
],
|
||||
"webdriver/actions/support/refine.py": [
|
||||
"0d244bffe67ef57be68aad99f1cbc7440ff80e27",
|
||||
"support"
|
||||
],
|
||||
"webdriver/actions/support/test_actions_wdspec.html": [
|
||||
"63b5de5ab6c7a00717663a18c3b4d79857ee2136",
|
||||
"support"
|
||||
],
|
||||
"webdriver/conftest.py": [
|
||||
"9a5d2c122d912af2d53478a3f83ac9da676ba531",
|
||||
"wdspec"
|
||||
|
@ -205856,14 +205912,6 @@
|
|||
"2216ea3b518ec6b1beef54ce2580b5e62c2841a0",
|
||||
"wdspec"
|
||||
],
|
||||
"webdriver/support/__init__.py": [
|
||||
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
|
||||
"support"
|
||||
],
|
||||
"webdriver/support/keys.py": [
|
||||
"85bfdbd3203166c2b84616cc1936f6dd98f8de3b",
|
||||
"support"
|
||||
],
|
||||
"webdriver/util/__init__.py": [
|
||||
"8910ee7d68dfff68460731ea37eb0d406d07862d",
|
||||
"support"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
[actions.py]
|
||||
[key.py]
|
||||
type: wdspec
|
||||
disabled:
|
||||
if (os == "linux") and (bits == 64) and debug: https://bugzilla.mozilla.org/show_bug.cgi?id=1318724
|
|
@ -0,0 +1,5 @@
|
|||
[mouse.py]
|
||||
type: wdspec
|
||||
disabled:
|
||||
if (os == "linux") and (bits == 64) and debug: https://bugzilla.mozilla.org/show_bug.cgi?id=1318724
|
||||
expected: CRASH
|
|
@ -0,0 +1,5 @@
|
|||
[sequence.py]
|
||||
type: wdspec
|
||||
disabled:
|
||||
if (os == "linux") and (bits == 64) and debug: https://bugzilla.mozilla.org/show_bug.cgi?id=1318724
|
||||
expected: CRASH
|
|
@ -13,3 +13,4 @@ testharness_runner.html
|
|||
webdriver/.idea
|
||||
.vscode/
|
||||
.DS_Store
|
||||
*.rej
|
||||
|
|
|
@ -1,69 +0,0 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<head>
|
||||
<title>Test Keys</title>
|
||||
<script>
|
||||
var allEvents = {events: []};
|
||||
function displayMessage(message) {
|
||||
document.getElementById("events").innerHTML = "<p>" + message + "</p>";
|
||||
}
|
||||
|
||||
function appendMessage(message) {
|
||||
document.getElementById("events").innerHTML += "<p>" + message + "</p>";
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape |key| if it's in a surrogate-half character range.
|
||||
*
|
||||
* Example: given "\ud83d" return "U+d83d".
|
||||
*
|
||||
* Otherwise JSON.stringify will convert it to U+FFFD (REPLACEMENT CHARACTER)
|
||||
* when returning a value from executeScript, for example.
|
||||
*/
|
||||
function escapeSurrogateHalf(key) {
|
||||
if (typeof key !== "undefined" && key.length === 1) {
|
||||
var charCode = key.charCodeAt(0);
|
||||
var highSurrogate = charCode >= 0xD800 && charCode <= 0xDBFF;
|
||||
var surrogate = highSurrogate || (charCode >= 0xDC00 && charCode <= 0xDFFF);
|
||||
if (surrogate) {
|
||||
key = "U+" + charCode.toString(16);
|
||||
}
|
||||
}
|
||||
return key;
|
||||
}
|
||||
|
||||
function recordEvent(event) {
|
||||
var key = escapeSurrogateHalf(event.key);
|
||||
allEvents.events.push({
|
||||
"code": event.code,
|
||||
"key": key,
|
||||
"which": event.which,
|
||||
"location": event.location,
|
||||
"ctrl": event.ctrlKey,
|
||||
"meta": event.metaKey,
|
||||
"shift": event.shiftKey,
|
||||
"repeat": event.repeat,
|
||||
"type": event.type
|
||||
});
|
||||
appendMessage(`${event.type}(code:${event.code}, key:${key}, which:${event.which})`);
|
||||
}
|
||||
|
||||
function resetEvents() {
|
||||
allEvents.events.length = 0;
|
||||
displayMessage("");
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<h2>KeyReporter</h2>
|
||||
<input type="text" id="keys" size="80"
|
||||
onkeyup="recordEvent(event)"
|
||||
onkeypress="recordEvent(event)"
|
||||
onkeydown="recordEvent(event)">
|
||||
</div>
|
||||
<div id="resultContainer" style="width:300;height:60">
|
||||
<h2>Events</h2>
|
||||
<div id="events"></div>
|
||||
</div>
|
||||
</body>
|
|
@ -83,26 +83,30 @@ class ActionSequence(object):
|
|||
.key_up("a") \
|
||||
.perform()
|
||||
"""
|
||||
def __init__(self, session, action_type, input_id):
|
||||
def __init__(self, session, action_type, input_id, pointer_params=None):
|
||||
"""Represents a sequence of actions of one type for one input source.
|
||||
|
||||
:param session: WebDriver session.
|
||||
:param action_type: Action type; may be "none", "key", or "pointer".
|
||||
:param input_id: ID of input source.
|
||||
:param pointer_params: Optional dictionary of pointer parameters.
|
||||
"""
|
||||
self.session = session
|
||||
# TODO take advantage of remote end generating uuid
|
||||
self._id = input_id
|
||||
self._type = action_type
|
||||
self._actions = []
|
||||
self._pointer_params = pointer_params
|
||||
|
||||
@property
|
||||
def dict(self):
|
||||
return {
|
||||
"type": self._type,
|
||||
"id": self._id,
|
||||
"actions": self._actions,
|
||||
d = {
|
||||
"type": self._type,
|
||||
"id": self._id,
|
||||
"actions": self._actions,
|
||||
}
|
||||
if self._pointer_params is not None:
|
||||
d["parameters"] = self._pointer_params
|
||||
return d
|
||||
|
||||
@command
|
||||
def perform(self):
|
||||
|
@ -112,6 +116,48 @@ class ActionSequence(object):
|
|||
def _key_action(self, subtype, value):
|
||||
self._actions.append({"type": subtype, "value": value})
|
||||
|
||||
def _pointer_action(self, subtype, button):
|
||||
self._actions.append({"type": subtype, "button": button})
|
||||
|
||||
def pointer_move(self, x, y, duration=None, origin=None):
|
||||
"""Queue a pointerMove action.
|
||||
|
||||
:param x: Destination x-axis coordinate of pointer in CSS pixels.
|
||||
:param y: Destination y-axis coordinate of pointer in CSS pixels.
|
||||
:param duration: Number of milliseconds over which to distribute the
|
||||
move. If None, remote end defaults to 0.
|
||||
:param origin: Origin of coordinates, either "viewport", "pointer" or
|
||||
an Element. If None, remote end defaults to "viewport".
|
||||
"""
|
||||
# TODO change to pointerMove once geckodriver > 0.14 is available on mozilla-central
|
||||
action = {
|
||||
"type": "move",
|
||||
"x": x,
|
||||
"y": y
|
||||
}
|
||||
if duration is not None:
|
||||
action["duration"] = duration
|
||||
if origin is not None:
|
||||
action["origin"] = origin if isinstance(origin, basestring) else origin.json()
|
||||
self._actions.append(action)
|
||||
return self
|
||||
|
||||
def pointer_up(self, button):
|
||||
"""Queue a pointerUp action for `button`.
|
||||
|
||||
:param button: Pointer button to perform action with.
|
||||
"""
|
||||
self._pointer_action("pointerUp", button)
|
||||
return self
|
||||
|
||||
def pointer_down(self, button):
|
||||
"""Queue a pointerDown action for `button`.
|
||||
|
||||
:param button: Pointer button to perform action with.
|
||||
"""
|
||||
self._pointer_action("pointerDown", button)
|
||||
return self
|
||||
|
||||
def key_up(self, value):
|
||||
"""Queue a keyUp action for `value`.
|
||||
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
import pytest
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def key_chain(session):
|
||||
return session.actions.sequence("key", "keyboard_id")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mouse_chain(session):
|
||||
return session.actions.sequence(
|
||||
"pointer",
|
||||
"pointer_id",
|
||||
{"pointerType": "mouse"})
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def release_actions(session, request):
|
||||
# release all actions after each test
|
||||
# equivalent to a teardown_function, but with access to session fixture
|
||||
request.addfinalizer(session.actions.release)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def key_reporter(session, test_actions_page, request):
|
||||
"""Represents focused input element from `test_keys_page` fixture."""
|
||||
input_el = session.find.css("#keys", all=False)
|
||||
input_el.click()
|
||||
return input_el
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def test_actions_page(session, server):
|
||||
session.url = server.where_is("webdriver/actions/support/test_actions_wdspec.html")
|
|
@ -1,72 +1,7 @@
|
|||
import pytest
|
||||
|
||||
from support.keys import Keys
|
||||
|
||||
|
||||
def get_events(session):
|
||||
"""Return list of key events recorded in the test_keys_page fixture."""
|
||||
events = session.execute_script("return allEvents.events;") or []
|
||||
# `key` values in `allEvents` may be escaped (see `escapeSurrogateHalf` in
|
||||
# test_keys_wdspec.html), so this converts them back into unicode literals.
|
||||
for e in events:
|
||||
# example: turn "U+d83d" (6 chars) into u"\ud83d" (1 char)
|
||||
if e["key"].startswith(u"U+"):
|
||||
key = e["key"]
|
||||
hex_suffix = key[key.index("+") + 1:]
|
||||
e["key"] = unichr(int(hex_suffix, 16))
|
||||
return events
|
||||
|
||||
|
||||
def get_keys(input_el):
|
||||
"""Get printable characters entered into `input_el`.
|
||||
|
||||
:param input_el: HTML input element.
|
||||
"""
|
||||
rv = input_el.property("value")
|
||||
if rv is None:
|
||||
return ""
|
||||
else:
|
||||
return rv
|
||||
|
||||
|
||||
def filter_dict(source, d):
|
||||
"""Filter `source` dict to only contain same keys as `d` dict.
|
||||
|
||||
:param source: dictionary to filter.
|
||||
:param d: dictionary whose keys determine the filtering.
|
||||
"""
|
||||
return {k: source[k] for k in d.keys()}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def key_reporter(session, test_keys_page, request):
|
||||
"""Represents focused input element from `test_keys_page` fixture."""
|
||||
input_el = session.find.css("#keys", all=False)
|
||||
input_el.click()
|
||||
return input_el
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def test_keys_page(session, server):
|
||||
session.url = server.where_is("test_keys_wdspec.html")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def key_chain(session):
|
||||
return session.actions.sequence("key", "keyboard_id")
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def release_actions(session, request):
|
||||
# release all actions after each test
|
||||
# equivalent to a teardown_function, but with access to session fixture
|
||||
request.addfinalizer(session.actions.release)
|
||||
|
||||
|
||||
def test_no_actions_send_no_events(session, key_reporter, key_chain):
|
||||
key_chain.perform()
|
||||
assert len(get_keys(key_reporter)) == 0
|
||||
assert len(get_events(session)) == 0
|
||||
from support.refine import get_keys, filter_dict, get_events
|
||||
|
||||
|
||||
def test_lone_keyup_sends_no_events(session, key_reporter, key_chain):
|
||||
|
@ -220,24 +155,6 @@ def test_sequence_of_keydown_printable_keys_sends_events(session,
|
|||
assert get_keys(key_reporter) == "ab"
|
||||
|
||||
|
||||
def test_release_char_sequence_sends_keyup_events_in_reverse(session,
|
||||
key_reporter,
|
||||
key_chain):
|
||||
key_chain \
|
||||
.key_down("a") \
|
||||
.key_down("b") \
|
||||
.perform()
|
||||
# reset so we only see the release events
|
||||
session.execute_script("resetEvents();")
|
||||
session.actions.release()
|
||||
expected = [
|
||||
{"code": "KeyB", "key": "b", "type": "keyup"},
|
||||
{"code": "KeyA", "key": "a", "type": "keyup"},
|
||||
]
|
||||
events = [filter_dict(e, expected[0]) for e in get_events(session)]
|
||||
assert events == expected
|
||||
|
||||
|
||||
def test_sequence_of_keydown_character_keys(session, key_reporter, key_chain):
|
||||
key_chain.send_keys("ef").perform()
|
||||
expected = [
|
||||
|
@ -251,9 +168,3 @@ def test_sequence_of_keydown_character_keys(session, key_reporter, key_chain):
|
|||
events = [filter_dict(e, expected[0]) for e in get_events(session)]
|
||||
assert events == expected
|
||||
assert get_keys(key_reporter) == "ef"
|
||||
|
||||
|
||||
def test_release_no_actions_sends_no_events(session, key_reporter, key_chain):
|
||||
session.actions.release()
|
||||
assert len(get_keys(key_reporter)) == 0
|
||||
assert len(get_events(session)) == 0
|
|
@ -0,0 +1,31 @@
|
|||
from support.refine import get_events, filter_dict
|
||||
|
||||
|
||||
def test_click_at_coordinates(session, test_actions_page, mouse_chain):
|
||||
div_point = {
|
||||
"x": 82,
|
||||
"y": 187,
|
||||
}
|
||||
button = 0
|
||||
mouse_chain \
|
||||
.pointer_move(div_point["x"], div_point["y"], duration=1000) \
|
||||
.pointer_down(button) \
|
||||
.pointer_up(button) \
|
||||
.perform()
|
||||
events = get_events(session)
|
||||
assert len(events) == 4
|
||||
for e in events:
|
||||
if e["type"] != "mousemove":
|
||||
assert e["pageX"] == div_point["x"]
|
||||
assert e["pageY"] == div_point["y"]
|
||||
assert e["target"] == "outer"
|
||||
if e["type"] != "mousedown":
|
||||
assert e["buttons"] == 0
|
||||
assert e["button"] == button
|
||||
expected = [
|
||||
{"type": "mousedown", "buttons": 1},
|
||||
{"type": "mouseup", "buttons": 0},
|
||||
{"type": "click", "buttons": 0},
|
||||
]
|
||||
filtered_events = [filter_dict(e, expected[0]) for e in events]
|
||||
assert expected == filtered_events[1:]
|
|
@ -0,0 +1,31 @@
|
|||
from support.refine import get_keys, filter_dict, get_events
|
||||
|
||||
|
||||
def test_no_actions_send_no_events(session, key_reporter, key_chain):
|
||||
key_chain.perform()
|
||||
assert len(get_keys(key_reporter)) == 0
|
||||
assert len(get_events(session)) == 0
|
||||
|
||||
|
||||
def test_release_char_sequence_sends_keyup_events_in_reverse(session,
|
||||
key_reporter,
|
||||
key_chain):
|
||||
key_chain \
|
||||
.key_down("a") \
|
||||
.key_down("b") \
|
||||
.perform()
|
||||
# reset so we only see the release events
|
||||
session.execute_script("resetEvents();")
|
||||
session.actions.release()
|
||||
expected = [
|
||||
{"code": "KeyB", "key": "b", "type": "keyup"},
|
||||
{"code": "KeyA", "key": "a", "type": "keyup"},
|
||||
]
|
||||
events = [filter_dict(e, expected[0]) for e in get_events(session)]
|
||||
assert events == expected
|
||||
|
||||
|
||||
def test_release_no_actions_sends_no_events(session, key_reporter):
|
||||
session.actions.release()
|
||||
assert len(get_keys(key_reporter)) == 0
|
||||
assert len(get_events(session)) == 0
|
|
@ -0,0 +1,33 @@
|
|||
def get_events(session):
|
||||
"""Return list of key events recorded in the test_keys_page fixture."""
|
||||
events = session.execute_script("return allEvents.events;") or []
|
||||
# `key` values in `allEvents` may be escaped (see `escapeSurrogateHalf` in
|
||||
# test_keys_wdspec.html), so this converts them back into unicode literals.
|
||||
for e in events:
|
||||
# example: turn "U+d83d" (6 chars) into u"\ud83d" (1 char)
|
||||
if "key" in e and e["key"].startswith(u"U+"):
|
||||
key = e["key"]
|
||||
hex_suffix = key[key.index("+") + 1:]
|
||||
e["key"] = unichr(int(hex_suffix, 16))
|
||||
return events
|
||||
|
||||
|
||||
def get_keys(input_el):
|
||||
"""Get printable characters entered into `input_el`.
|
||||
|
||||
:param input_el: HTML input element.
|
||||
"""
|
||||
rv = input_el.property("value")
|
||||
if rv is None:
|
||||
return ""
|
||||
else:
|
||||
return rv
|
||||
|
||||
|
||||
def filter_dict(source, d):
|
||||
"""Filter `source` dict to only contain same keys as `d` dict.
|
||||
|
||||
:param source: dictionary to filter.
|
||||
:param d: dictionary whose keys determine the filtering.
|
||||
"""
|
||||
return {k: source[k] for k in d.keys()}
|
|
@ -0,0 +1,131 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<head>
|
||||
<title>Test Actions</title>
|
||||
<style>
|
||||
div { padding:0px; margin: 0px; }
|
||||
#resultContainer { width: 600px; height: 60px; }
|
||||
#outer { width: 100px; height: 50px; background-color: #ccc; }
|
||||
#trackPointer {
|
||||
width: 5px;
|
||||
height: 5px;
|
||||
border: solid 1px red;
|
||||
position: fixed; }
|
||||
</style>
|
||||
<script>
|
||||
var allEvents = {events: []};
|
||||
function displayMessage(message) {
|
||||
document.getElementById("events").innerHTML = "<p>" + message + "</p>";
|
||||
}
|
||||
|
||||
function appendMessage(message) {
|
||||
document.getElementById("events").innerHTML += "<p>" + message + "</p>";
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape |key| if it's in a surrogate-half character range.
|
||||
*
|
||||
* Example: given "\ud83d" return "U+d83d".
|
||||
*
|
||||
* Otherwise JSON.stringify will convert it to U+FFFD (REPLACEMENT CHARACTER)
|
||||
* when returning a value from executeScript, for example.
|
||||
*/
|
||||
function escapeSurrogateHalf(key) {
|
||||
if (typeof key !== "undefined" && key.length === 1) {
|
||||
var charCode = key.charCodeAt(0);
|
||||
var highSurrogate = charCode >= 0xD800 && charCode <= 0xDBFF;
|
||||
var surrogate = highSurrogate || (charCode >= 0xDC00 && charCode <= 0xDFFF);
|
||||
if (surrogate) {
|
||||
key = "U+" + charCode.toString(16);
|
||||
}
|
||||
}
|
||||
return key;
|
||||
}
|
||||
|
||||
function recordKeyboardEvent(event) {
|
||||
var key = escapeSurrogateHalf(event.key);
|
||||
allEvents.events.push({
|
||||
"code": event.code,
|
||||
"key": key,
|
||||
"which": event.which,
|
||||
"location": event.location,
|
||||
"ctrl": event.ctrlKey,
|
||||
"meta": event.metaKey,
|
||||
"shift": event.shiftKey,
|
||||
"repeat": event.repeat,
|
||||
"type": event.type
|
||||
});
|
||||
appendMessage(`${event.type}(` +
|
||||
`code: ${event.code}, ` +
|
||||
`key: ${key}, ` +
|
||||
`which: ${event.which})`);
|
||||
}
|
||||
|
||||
function recordPointerEvent(event) {
|
||||
allEvents.events.push({
|
||||
"type": event.type,
|
||||
"button": event.button,
|
||||
"buttons": event.buttons,
|
||||
"pageX": event.pageX,
|
||||
"pageY": event.pageY,
|
||||
"target": event.target.id
|
||||
});
|
||||
appendMessage(`${event.type}(` +
|
||||
`button: ${event.button}, ` +
|
||||
`pageX: ${event.pageX}, ` +
|
||||
`pageY: ${event.pageY}, ` +
|
||||
`button: ${event.button}, ` +
|
||||
`buttons: ${event.buttons}, ` +
|
||||
`target id: ${event.target.id})`);
|
||||
}
|
||||
|
||||
function recordFirstPointerMove(event) {
|
||||
recordPointerEvent(event);
|
||||
window.removeEventListener("mousemove", recordFirstPointerMove);
|
||||
}
|
||||
|
||||
function resetEvents() {
|
||||
allEvents.events.length = 0;
|
||||
displayMessage("");
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
var keyReporter = document.getElementById("keys");
|
||||
["keyup", "keypress", "keydown"].forEach((e) => {
|
||||
keyReporter.addEventListener(e, recordKeyboardEvent);
|
||||
});
|
||||
var outer = document.getElementById("outer");
|
||||
["click", "dblclick", "mousedown",
|
||||
"mouseup", "contextmenu"].forEach((e) => {
|
||||
outer.addEventListener(e, recordPointerEvent);
|
||||
});
|
||||
window.addEventListener("mousemove", recordFirstPointerMove);
|
||||
//visual cue for mousemove
|
||||
var pointer = document.getElementById("trackPointer");
|
||||
window.addEventListener("mousemove", (e) => {
|
||||
setTimeout(() => {
|
||||
let offset = 15;
|
||||
pointer.style.top = e.pageY + offset + "px";
|
||||
pointer.style.left = e.pageX + offset + "px";
|
||||
}, 30);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="trackPointer"></div>
|
||||
<div>
|
||||
<h2>KeyReporter</h2>
|
||||
<input type="text" id="keys" size="80">
|
||||
</div>
|
||||
<div>
|
||||
<h2>ClickReporter</h2>
|
||||
<div id="outer">
|
||||
</div>
|
||||
</div>
|
||||
<div id="resultContainer">
|
||||
<h2>Events</h2>
|
||||
<div id="events"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -732,7 +732,11 @@ Classifier::ApplyUpdates(nsTArray<TableUpdate*>* aUpdates)
|
|||
LOG(("Failed to copy in-use directory for update."));
|
||||
return rv;
|
||||
}
|
||||
CopyInUseLookupCacheForUpdate(); // i.e. mNewLookupCaches will be setup.
|
||||
rv = CopyInUseLookupCacheForUpdate(); // i.e. mNewLookupCaches will be setup.
|
||||
if (NS_FAILED(rv)) {
|
||||
LOG(("Failed to create lookup caches from copied files."));
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
LOG(("Applying %" PRIuSIZE " table updates.", aUpdates->Length()));
|
||||
|
@ -1017,7 +1021,7 @@ Classifier::CopyInUseDirForUpdate()
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
nsresult
|
||||
Classifier::CopyInUseLookupCacheForUpdate()
|
||||
{
|
||||
MOZ_ASSERT(mNewLookupCaches.IsEmpty(), "Update intermediaries is forgotten to "
|
||||
|
@ -1028,8 +1032,12 @@ Classifier::CopyInUseLookupCacheForUpdate()
|
|||
// Another option is to NOT pre-open these LookupCaches and
|
||||
// do a "merge" instead of "swap" after update.
|
||||
for (auto c: mLookupCaches) {
|
||||
Unused << GetLookupCacheForUpdate(c->TableName());
|
||||
if (!GetLookupCacheForUpdate(c->TableName())) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
@ -1333,20 +1341,14 @@ Classifier::UpdateCache(TableUpdate* aUpdate)
|
|||
LookupCache *
|
||||
Classifier::GetLookupCache(const nsACString& aTable, bool aForUpdate)
|
||||
{
|
||||
if (aForUpdate) {
|
||||
return GetLookupCacheFrom(aTable, mNewLookupCaches, mUpdatingDirectory);
|
||||
}
|
||||
return GetLookupCacheFrom(aTable, mLookupCaches, mRootStoreDirectory);
|
||||
}
|
||||
nsTArray<LookupCache*>& lookupCaches = aForUpdate ? mNewLookupCaches
|
||||
: mLookupCaches;
|
||||
auto& rootStoreDirectory = aForUpdate ? mUpdatingDirectory
|
||||
: mRootStoreDirectory;
|
||||
|
||||
LookupCache *
|
||||
Classifier::GetLookupCacheFrom(const nsACString& aTable,
|
||||
nsTArray<LookupCache*>& aLookupCaches,
|
||||
nsIFile* aRootStoreDirectory)
|
||||
{
|
||||
for (uint32_t i = 0; i < aLookupCaches.Length(); i++) {
|
||||
if (aLookupCaches[i]->TableName().Equals(aTable)) {
|
||||
return aLookupCaches[i];
|
||||
for (auto c: lookupCaches) {
|
||||
if (c->TableName().Equals(aTable)) {
|
||||
return c;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1356,9 +1358,9 @@ Classifier::GetLookupCacheFrom(const nsACString& aTable,
|
|||
UniquePtr<LookupCache> cache;
|
||||
nsCString provider = GetProvider(aTable);
|
||||
if (StringEndsWith(aTable, NS_LITERAL_CSTRING("-proto"))) {
|
||||
cache = MakeUnique<LookupCacheV4>(aTable, provider, aRootStoreDirectory);
|
||||
cache = MakeUnique<LookupCacheV4>(aTable, provider, rootStoreDirectory);
|
||||
} else {
|
||||
cache = MakeUnique<LookupCacheV2>(aTable, provider, aRootStoreDirectory);
|
||||
cache = MakeUnique<LookupCacheV2>(aTable, provider, rootStoreDirectory);
|
||||
}
|
||||
|
||||
nsresult rv = cache->Init();
|
||||
|
@ -1366,14 +1368,28 @@ Classifier::GetLookupCacheFrom(const nsACString& aTable,
|
|||
return nullptr;
|
||||
}
|
||||
rv = cache->Open();
|
||||
if (NS_FAILED(rv)) {
|
||||
if (rv == NS_ERROR_FILE_CORRUPTED) {
|
||||
Reset();
|
||||
}
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
lookupCaches.AppendElement(cache.get());
|
||||
return cache.release();
|
||||
}
|
||||
|
||||
// At this point we failed to open LookupCache.
|
||||
//
|
||||
// GetLookupCache for update and for other usage will run on update thread
|
||||
// and worker thread respectively (Bug 1339760). Removing stuff only in
|
||||
// their own realms potentially increases the concurrency.
|
||||
|
||||
if (aForUpdate) {
|
||||
// Remove intermediaries no matter if it's due to file corruption or not.
|
||||
RemoveUpdateIntermediaries();
|
||||
return nullptr;
|
||||
}
|
||||
aLookupCaches.AppendElement(cache.get());
|
||||
return cache.release();
|
||||
|
||||
// Non-update case.
|
||||
if (rv == NS_ERROR_FILE_CORRUPTED) {
|
||||
Reset(); // Not including the update intermediaries.
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
|
|
@ -32,7 +32,7 @@ public:
|
|||
|
||||
nsresult Open(nsIFile& aCacheDirectory);
|
||||
void Close();
|
||||
void Reset();
|
||||
void Reset(); // Not including any intermediary for update.
|
||||
|
||||
/**
|
||||
* Clear data for specific tables.
|
||||
|
@ -126,7 +126,7 @@ private:
|
|||
nsresult RecoverBackups();
|
||||
nsresult CleanToDelete();
|
||||
nsresult CopyInUseDirForUpdate();
|
||||
void CopyInUseLookupCacheForUpdate();
|
||||
nsresult CopyInUseLookupCacheForUpdate();
|
||||
nsresult RegenActiveTables();
|
||||
|
||||
|
||||
|
|
|
@ -57,12 +57,13 @@ Finder.prototype = {
|
|||
destroy() {
|
||||
if (this._iterator)
|
||||
this._iterator.reset();
|
||||
if (this._highlighter) {
|
||||
let window = this._getWindow();
|
||||
if (this._highlighter && window) {
|
||||
// if we clear all the references before we hide the highlights (in both
|
||||
// highlighting modes), we simply can't use them to find the ranges we
|
||||
// need to clear from the selection.
|
||||
this._highlighter.hide();
|
||||
this._highlighter.clear();
|
||||
this._highlighter.hide(window);
|
||||
this._highlighter.clear(window);
|
||||
}
|
||||
this.listeners = [];
|
||||
this._docShell.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||
|
@ -296,7 +297,7 @@ Finder.prototype = {
|
|||
removeSelection() {
|
||||
this._fastFind.collapseSelection();
|
||||
this.enableSelection();
|
||||
this.highlighter.clear();
|
||||
this.highlighter.clear(this._getWindow());
|
||||
},
|
||||
|
||||
focusContent() {
|
||||
|
@ -475,6 +476,8 @@ Finder.prototype = {
|
|||
},
|
||||
|
||||
_getWindow() {
|
||||
if (!this._docShell)
|
||||
return null;
|
||||
return this._docShell.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow);
|
||||
},
|
||||
|
||||
|
|
|
@ -131,7 +131,7 @@ function mockAnonymousContentNode(domNode) {
|
|||
};
|
||||
}
|
||||
|
||||
let gWindows = new Map();
|
||||
let gWindows = new WeakMap();
|
||||
|
||||
/**
|
||||
* FinderHighlighter class that is used by Finder.jsm to take care of the
|
||||
|
@ -337,9 +337,9 @@ FinderHighlighter.prototype = {
|
|||
* @param {nsIDOMEvent} event When called from an event handler, this will
|
||||
* be the triggering event.
|
||||
*/
|
||||
hide(window = null, skipRange = null, event = null) {
|
||||
hide(window, skipRange = null, event = null) {
|
||||
try {
|
||||
window = (window || this.finder._getWindow()).top;
|
||||
window = window.top;
|
||||
} catch (ex) {
|
||||
Cu.reportError(ex);
|
||||
return;
|
||||
|
@ -412,7 +412,7 @@ FinderHighlighter.prototype = {
|
|||
let foundRange = this.finder._fastFind.getFoundRange();
|
||||
|
||||
if (data.result == Ci.nsITypeAheadFind.FIND_NOTFOUND || !data.searchString || !foundRange) {
|
||||
this.hide();
|
||||
this.hide(window);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -454,14 +454,8 @@ FinderHighlighter.prototype = {
|
|||
* keep to build the mask for.
|
||||
*/
|
||||
clear(window = null) {
|
||||
if (!window) {
|
||||
// Since we're clearing _all the things_, make sure we hide 'em all as well.
|
||||
for (let win of gWindows.keys())
|
||||
this.hide(win);
|
||||
// Reset the Map, because no range references a node anymore.
|
||||
gWindows.clear();
|
||||
if (!window || !window.top)
|
||||
return;
|
||||
}
|
||||
|
||||
let dict = this.getForWindow(window.top);
|
||||
this._finishOutlineAnimations(dict);
|
||||
|
@ -479,6 +473,8 @@ FinderHighlighter.prototype = {
|
|||
*/
|
||||
onLocationChange() {
|
||||
let window = this.finder._getWindow();
|
||||
if (!window || !window.top)
|
||||
return;
|
||||
this.hide(window);
|
||||
this.clear(window);
|
||||
this._removeRangeOutline(window);
|
||||
|
@ -494,9 +490,10 @@ FinderHighlighter.prototype = {
|
|||
* @param {Boolean} useModalHighlight
|
||||
*/
|
||||
onModalHighlightChange(useModalHighlight) {
|
||||
if (this._modal && !useModalHighlight) {
|
||||
this.hide();
|
||||
this.clear();
|
||||
let window = this.finder._getWindow();
|
||||
if (window && this._modal && !useModalHighlight) {
|
||||
this.hide(window);
|
||||
this.clear(window);
|
||||
}
|
||||
this._modal = useModalHighlight;
|
||||
},
|
||||
|
|
Загрузка…
Ссылка в новой задаче