зеркало из https://github.com/mozilla/gecko-dev.git
Merge m-c to inbound, a=merge
MozReview-Commit-ID: BEeGEkSCpNK
This commit is contained in:
Коммит
5defc5746a
|
@ -1722,7 +1722,7 @@
|
||||||
</emItem>
|
</emItem>
|
||||||
<emItem blockID="d33f6d48-a555-49dd-96ff-8d75473403a8" id="mozilla_cc2@internetdownloadmanager.com">
|
<emItem blockID="d33f6d48-a555-49dd-96ff-8d75473403a8" id="mozilla_cc2@internetdownloadmanager.com">
|
||||||
<prefs/>
|
<prefs/>
|
||||||
<versionRange minVersion="0" maxVersion="6.26.11" severity="1">
|
<versionRange minVersion="0" maxVersion="6.26.11" severity="3">
|
||||||
<targetApplication id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
|
<targetApplication id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
|
||||||
<versionRange maxVersion="*" minVersion="53.0a1"/>
|
<versionRange maxVersion="*" minVersion="53.0a1"/>
|
||||||
</targetApplication>
|
</targetApplication>
|
||||||
|
|
|
@ -1256,10 +1256,10 @@ pref("dom.debug.propagate_gesture_events_through_content", false);
|
||||||
// All the Geolocation preferences are here.
|
// All the Geolocation preferences are here.
|
||||||
//
|
//
|
||||||
|
|
||||||
// Geolocation preferences for the RELEASE channel.
|
// Geolocation preferences for the RELEASE and "later" Beta channels.
|
||||||
// Some of these prefs are specified even though they are redundant; they are
|
// Some of these prefs are specified even though they are redundant; they are
|
||||||
// here for clarity and end-user experiments.
|
// here for clarity and end-user experiments.
|
||||||
#ifdef RELEASE
|
#ifndef EARLY_BETA_OR_EARLIER
|
||||||
pref("geo.wifi.uri", "https://www.googleapis.com/geolocation/v1/geolocate?key=%GOOGLE_API_KEY%");
|
pref("geo.wifi.uri", "https://www.googleapis.com/geolocation/v1/geolocate?key=%GOOGLE_API_KEY%");
|
||||||
|
|
||||||
#ifdef XP_MACOSX
|
#ifdef XP_MACOSX
|
||||||
|
|
|
@ -19,7 +19,7 @@ add_task(function* checkReturnToAboutHome() {
|
||||||
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
|
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
|
||||||
gBrowser.selectedTab = gBrowser.addTab(BAD_CERT);
|
gBrowser.selectedTab = gBrowser.addTab(BAD_CERT);
|
||||||
browser = gBrowser.selectedBrowser;
|
browser = gBrowser.selectedBrowser;
|
||||||
certErrorLoaded = waitForCertErrorLoad(browser);
|
certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
info("Loading and waiting for the cert error");
|
info("Loading and waiting for the cert error");
|
||||||
|
@ -57,7 +57,7 @@ add_task(function* checkReturnToPreviousPage() {
|
||||||
let browser = gBrowser.selectedBrowser;
|
let browser = gBrowser.selectedBrowser;
|
||||||
|
|
||||||
info("Loading and waiting for the cert error");
|
info("Loading and waiting for the cert error");
|
||||||
let certErrorLoaded = waitForCertErrorLoad(browser);
|
let certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
|
||||||
BrowserTestUtils.loadURI(browser, BAD_CERT);
|
BrowserTestUtils.loadURI(browser, BAD_CERT);
|
||||||
yield certErrorLoaded;
|
yield certErrorLoaded;
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ add_task(function* checkBadStsCert() {
|
||||||
let browser = gBrowser.selectedBrowser;
|
let browser = gBrowser.selectedBrowser;
|
||||||
|
|
||||||
info("Loading and waiting for the cert error");
|
info("Loading and waiting for the cert error");
|
||||||
let certErrorLoaded = waitForCertErrorLoad(browser);
|
let certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
|
||||||
BrowserTestUtils.loadURI(browser, BAD_STS_CERT);
|
BrowserTestUtils.loadURI(browser, BAD_STS_CERT);
|
||||||
yield certErrorLoaded;
|
yield certErrorLoaded;
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ add_task(function* checkWrongSystemTimeWarning() {
|
||||||
yield BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
|
yield BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
|
||||||
gBrowser.selectedTab = gBrowser.addTab(BAD_CERT);
|
gBrowser.selectedTab = gBrowser.addTab(BAD_CERT);
|
||||||
browser = gBrowser.selectedBrowser;
|
browser = gBrowser.selectedBrowser;
|
||||||
certErrorLoaded = waitForCertErrorLoad(browser);
|
certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
info("Loading and waiting for the cert error");
|
info("Loading and waiting for the cert error");
|
||||||
|
@ -224,7 +224,7 @@ add_task(function* checkAdvancedDetails() {
|
||||||
yield BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
|
yield BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
|
||||||
gBrowser.selectedTab = gBrowser.addTab(BAD_CERT);
|
gBrowser.selectedTab = gBrowser.addTab(BAD_CERT);
|
||||||
browser = gBrowser.selectedBrowser;
|
browser = gBrowser.selectedBrowser;
|
||||||
certErrorLoaded = waitForCertErrorLoad(browser);
|
certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
info("Loading and waiting for the cert error");
|
info("Loading and waiting for the cert error");
|
||||||
|
@ -286,7 +286,7 @@ add_task(function* checkAdvancedDetailsForHSTS() {
|
||||||
yield BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
|
yield BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
|
||||||
gBrowser.selectedTab = gBrowser.addTab(BAD_STS_CERT);
|
gBrowser.selectedTab = gBrowser.addTab(BAD_STS_CERT);
|
||||||
browser = gBrowser.selectedBrowser;
|
browser = gBrowser.selectedBrowser;
|
||||||
certErrorLoaded = waitForCertErrorLoad(browser);
|
certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
info("Loading and waiting for the cert error");
|
info("Loading and waiting for the cert error");
|
||||||
|
@ -355,7 +355,7 @@ add_task(function* checkUnknownIssuerLearnMoreLink() {
|
||||||
yield BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
|
yield BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
|
||||||
gBrowser.selectedTab = gBrowser.addTab(UNKNOWN_ISSUER);
|
gBrowser.selectedTab = gBrowser.addTab(UNKNOWN_ISSUER);
|
||||||
browser = gBrowser.selectedBrowser;
|
browser = gBrowser.selectedBrowser;
|
||||||
certErrorLoaded = waitForCertErrorLoad(browser);
|
certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
info("Loading and waiting for the cert error");
|
info("Loading and waiting for the cert error");
|
||||||
|
@ -370,16 +370,6 @@ add_task(function* checkUnknownIssuerLearnMoreLink() {
|
||||||
yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
|
yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
|
||||||
});
|
});
|
||||||
|
|
||||||
function waitForCertErrorLoad(browser) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
info("Waiting for DOMContentLoaded event");
|
|
||||||
browser.addEventListener("DOMContentLoaded", function load() {
|
|
||||||
browser.removeEventListener("DOMContentLoaded", load, false, true);
|
|
||||||
resolve();
|
|
||||||
}, false, true);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getCertChain(securityInfoAsString) {
|
function getCertChain(securityInfoAsString) {
|
||||||
let certChain = "";
|
let certChain = "";
|
||||||
const serhelper = Cc["@mozilla.org/network/serialization-helper;1"]
|
const serhelper = Cc["@mozilla.org/network/serialization-helper;1"]
|
||||||
|
|
|
@ -81,16 +81,16 @@ function dateToChromeTime(aDate) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert bookmark items into specific folder.
|
* Converts an array of chrome bookmark objects into one our own places code
|
||||||
|
* understands.
|
||||||
*
|
*
|
||||||
* @param parentGuid
|
|
||||||
* GUID of the folder where items will be inserted
|
|
||||||
* @param items
|
* @param items
|
||||||
* bookmark items to be inserted
|
* bookmark items to be inserted on this parent
|
||||||
* @param errorAccumulator
|
* @param errorAccumulator
|
||||||
* function that gets called with any errors thrown so we don't drop them on the floor.
|
* function that gets called with any errors thrown so we don't drop them on the floor.
|
||||||
*/
|
*/
|
||||||
function* insertBookmarkItems(parentGuid, items, errorAccumulator) {
|
function convertBookmarks(items, errorAccumulator) {
|
||||||
|
let itemsToInsert = [];
|
||||||
for (let item of items) {
|
for (let item of items) {
|
||||||
try {
|
try {
|
||||||
if (item.type == "url") {
|
if (item.type == "url") {
|
||||||
|
@ -99,21 +99,18 @@ function* insertBookmarkItems(parentGuid, items, errorAccumulator) {
|
||||||
// messages to the console, so we avoid doing that.
|
// messages to the console, so we avoid doing that.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
yield MigrationUtils.insertBookmarkWrapper({
|
itemsToInsert.push({url: item.url, title: item.name});
|
||||||
parentGuid, url: item.url, title: item.name
|
|
||||||
});
|
|
||||||
} else if (item.type == "folder") {
|
} else if (item.type == "folder") {
|
||||||
let newFolderGuid = (yield MigrationUtils.insertBookmarkWrapper({
|
let folderItem = {type: PlacesUtils.bookmarks.TYPE_FOLDER, title: item.name};
|
||||||
parentGuid, type: PlacesUtils.bookmarks.TYPE_FOLDER, title: item.name
|
folderItem.children = convertBookmarks(item.children, errorAccumulator);
|
||||||
})).guid;
|
itemsToInsert.push(folderItem);
|
||||||
|
|
||||||
yield insertBookmarkItems(newFolderGuid, item.children, errorAccumulator);
|
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (ex) {
|
||||||
Cu.reportError(e);
|
Cu.reportError(ex);
|
||||||
errorAccumulator(e);
|
errorAccumulator(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return itemsToInsert;
|
||||||
}
|
}
|
||||||
|
|
||||||
function ChromeProfileMigrator() {
|
function ChromeProfileMigrator() {
|
||||||
|
@ -260,23 +257,8 @@ function GetBookmarksResource(aProfileFolder) {
|
||||||
return Task.spawn(function* () {
|
return Task.spawn(function* () {
|
||||||
let gotErrors = false;
|
let gotErrors = false;
|
||||||
let errorGatherer = function() { gotErrors = true };
|
let errorGatherer = function() { gotErrors = true };
|
||||||
let jsonStream = yield new Promise((resolve, reject) => {
|
|
||||||
let options = {
|
|
||||||
uri: NetUtil.newURI(bookmarksFile),
|
|
||||||
loadUsingSystemPrincipal: true
|
|
||||||
};
|
|
||||||
NetUtil.asyncFetch(options, (inputStream, resultCode) => {
|
|
||||||
if (Components.isSuccessCode(resultCode)) {
|
|
||||||
resolve(inputStream);
|
|
||||||
} else {
|
|
||||||
reject(new Error("Could not read Bookmarks file"));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Parse Chrome bookmark file that is JSON format
|
// Parse Chrome bookmark file that is JSON format
|
||||||
let bookmarkJSON = NetUtil.readInputStreamToString(
|
let bookmarkJSON = yield OS.File.read(bookmarksFile.path, {encoding: "UTF-8"});
|
||||||
jsonStream, jsonStream.available(), { charset : "UTF-8" });
|
|
||||||
let roots = JSON.parse(bookmarkJSON).roots;
|
let roots = JSON.parse(bookmarkJSON).roots;
|
||||||
|
|
||||||
// Importing bookmark bar items
|
// Importing bookmark bar items
|
||||||
|
@ -284,11 +266,12 @@ function GetBookmarksResource(aProfileFolder) {
|
||||||
roots.bookmark_bar.children.length > 0) {
|
roots.bookmark_bar.children.length > 0) {
|
||||||
// Toolbar
|
// Toolbar
|
||||||
let parentGuid = PlacesUtils.bookmarks.toolbarGuid;
|
let parentGuid = PlacesUtils.bookmarks.toolbarGuid;
|
||||||
|
let bookmarks = convertBookmarks(roots.bookmark_bar.children, errorGatherer);
|
||||||
if (!MigrationUtils.isStartupMigration) {
|
if (!MigrationUtils.isStartupMigration) {
|
||||||
parentGuid =
|
parentGuid =
|
||||||
yield MigrationUtils.createImportedBookmarksFolder("Chrome", parentGuid);
|
yield MigrationUtils.createImportedBookmarksFolder("Chrome", parentGuid);
|
||||||
}
|
}
|
||||||
yield insertBookmarkItems(parentGuid, roots.bookmark_bar.children, errorGatherer);
|
yield MigrationUtils.insertManyBookmarksWrapper(bookmarks, parentGuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Importing bookmark menu items
|
// Importing bookmark menu items
|
||||||
|
@ -296,11 +279,12 @@ function GetBookmarksResource(aProfileFolder) {
|
||||||
roots.other.children.length > 0) {
|
roots.other.children.length > 0) {
|
||||||
// Bookmark menu
|
// Bookmark menu
|
||||||
let parentGuid = PlacesUtils.bookmarks.menuGuid;
|
let parentGuid = PlacesUtils.bookmarks.menuGuid;
|
||||||
|
let bookmarks = convertBookmarks(roots.other.children, errorGatherer);
|
||||||
if (!MigrationUtils.isStartupMigration) {
|
if (!MigrationUtils.isStartupMigration) {
|
||||||
parentGuid =
|
parentGuid
|
||||||
yield MigrationUtils.createImportedBookmarksFolder("Chrome", parentGuid);
|
= yield MigrationUtils.createImportedBookmarksFolder("Chrome", parentGuid);
|
||||||
}
|
}
|
||||||
yield insertBookmarkItems(parentGuid, roots.other.children, errorGatherer);
|
yield MigrationUtils.insertManyBookmarksWrapper(bookmarks, parentGuid);
|
||||||
}
|
}
|
||||||
if (gotErrors) {
|
if (gotErrors) {
|
||||||
throw new Error("The migration included errors.");
|
throw new Error("The migration included errors.");
|
||||||
|
|
|
@ -18,6 +18,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "ESEDBReader",
|
XPCOMUtils.defineLazyModuleGetter(this, "ESEDBReader",
|
||||||
"resource:///modules/ESEDBReader.jsm");
|
"resource:///modules/ESEDBReader.jsm");
|
||||||
|
|
||||||
|
Cu.importGlobalProperties(["URL"]);
|
||||||
|
|
||||||
const kEdgeRegistryRoot = "SOFTWARE\\Classes\\Local Settings\\Software\\" +
|
const kEdgeRegistryRoot = "SOFTWARE\\Classes\\Local Settings\\Software\\" +
|
||||||
"Microsoft\\Windows\\CurrentVersion\\AppContainer\\Storage\\" +
|
"Microsoft\\Windows\\CurrentVersion\\AppContainer\\Storage\\" +
|
||||||
"microsoft.microsoftedge_8wekyb3d8bbwe\\MicrosoftEdge";
|
"microsoft.microsoftedge_8wekyb3d8bbwe\\MicrosoftEdge";
|
||||||
|
@ -194,21 +196,18 @@ EdgeReadingListMigrator.prototype = {
|
||||||
}
|
}
|
||||||
|
|
||||||
let destFolderGuid = yield this._ensureReadingListFolder(parentGuid);
|
let destFolderGuid = yield this._ensureReadingListFolder(parentGuid);
|
||||||
let exceptionThrown;
|
let bookmarks = [];
|
||||||
for (let item of readingListItems) {
|
for (let item of readingListItems) {
|
||||||
let dateAdded = item.AddedDate || new Date();
|
let dateAdded = item.AddedDate || new Date();
|
||||||
yield MigrationUtils.insertBookmarkWrapper({
|
// Avoid including broken URLs:
|
||||||
parentGuid: destFolderGuid, url: item.URL, title: item.Title, dateAdded
|
try {
|
||||||
}).catch(ex => {
|
new URL(item.URL);
|
||||||
if (!exceptionThrown) {
|
} catch (ex) {
|
||||||
exceptionThrown = ex;
|
continue;
|
||||||
}
|
}
|
||||||
Cu.reportError(ex);
|
bookmarks.push({ url: item.URL, title: item.Title, dateAdded });
|
||||||
});
|
|
||||||
}
|
|
||||||
if (exceptionThrown) {
|
|
||||||
throw exceptionThrown;
|
|
||||||
}
|
}
|
||||||
|
yield MigrationUtils.insertManyBookmarksWrapper(readingListItems, destFolderGuid);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
_ensureReadingListFolder: Task.async(function*(parentGuid) {
|
_ensureReadingListFolder: Task.async(function*(parentGuid) {
|
||||||
|
@ -240,7 +239,7 @@ EdgeBookmarksMigrator.prototype = {
|
||||||
},
|
},
|
||||||
|
|
||||||
migrate(callback) {
|
migrate(callback) {
|
||||||
this._migrateBookmarks(PlacesUtils.bookmarks.menuGuid).then(
|
this._migrateBookmarks().then(
|
||||||
() => callback(true),
|
() => callback(true),
|
||||||
ex => {
|
ex => {
|
||||||
Cu.reportError(ex);
|
Cu.reportError(ex);
|
||||||
|
@ -249,64 +248,21 @@ EdgeBookmarksMigrator.prototype = {
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
_migrateBookmarks: Task.async(function*(rootGuid) {
|
_migrateBookmarks: Task.async(function*() {
|
||||||
let {bookmarks, folderMap} = this._fetchBookmarksFromDB();
|
let {toplevelBMs, toolbarBMs} = this._fetchBookmarksFromDB();
|
||||||
if (!bookmarks.length) {
|
if (toplevelBMs.length) {
|
||||||
return;
|
let parentGuid = PlacesUtils.bookmarks.menuGuid;
|
||||||
}
|
if (!MigrationUtils.isStartupMigration) {
|
||||||
yield this._importBookmarks(bookmarks, folderMap, rootGuid);
|
parentGuid = yield MigrationUtils.createImportedBookmarksFolder("Edge", parentGuid);
|
||||||
}),
|
|
||||||
|
|
||||||
_importBookmarks: Task.async(function*(bookmarks, folderMap, rootGuid) {
|
|
||||||
if (!MigrationUtils.isStartupMigration) {
|
|
||||||
rootGuid =
|
|
||||||
yield MigrationUtils.createImportedBookmarksFolder("Edge", rootGuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
let exceptionThrown;
|
|
||||||
for (let bookmark of bookmarks) {
|
|
||||||
// If this is a folder, we might have created it already to put other bookmarks in.
|
|
||||||
if (bookmark.IsFolder && bookmark._guid) {
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
yield MigrationUtils.insertManyBookmarksWrapper(toplevelBMs, parentGuid);
|
||||||
// If this is a folder, just create folders up to and including that folder.
|
|
||||||
// Otherwise, create folders until we have a parent for this bookmark.
|
|
||||||
// This avoids duplicating logic for the bookmarks bar.
|
|
||||||
let folderId = bookmark.IsFolder ? bookmark.ItemId : bookmark.ParentId;
|
|
||||||
let parentGuid = yield this._getGuidForFolder(folderId, folderMap, rootGuid).catch(ex => {
|
|
||||||
if (!exceptionThrown) {
|
|
||||||
exceptionThrown = ex;
|
|
||||||
}
|
|
||||||
Cu.reportError(ex);
|
|
||||||
});
|
|
||||||
|
|
||||||
// If this was a folder, we're done with this item
|
|
||||||
if (bookmark.IsFolder) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!parentGuid) {
|
|
||||||
// If we couldn't sort out a parent, fall back to importing on the root:
|
|
||||||
parentGuid = rootGuid;
|
|
||||||
}
|
|
||||||
let placesInfo = {
|
|
||||||
parentGuid,
|
|
||||||
url: bookmark.URL,
|
|
||||||
dateAdded: bookmark.DateUpdated || new Date(),
|
|
||||||
title: bookmark.Title,
|
|
||||||
};
|
|
||||||
|
|
||||||
yield MigrationUtils.insertBookmarkWrapper(placesInfo).catch(ex => {
|
|
||||||
if (!exceptionThrown) {
|
|
||||||
exceptionThrown = ex;
|
|
||||||
}
|
|
||||||
Cu.reportError(ex);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
if (toolbarBMs.length) {
|
||||||
if (exceptionThrown) {
|
let parentGuid = PlacesUtils.bookmarks.toolbarGuid;
|
||||||
throw exceptionThrown;
|
if (!MigrationUtils.isStartupMigration) {
|
||||||
|
parentGuid = yield MigrationUtils.createImportedBookmarksFolder("Edge", parentGuid);
|
||||||
|
}
|
||||||
|
yield MigrationUtils.insertManyBookmarksWrapper(toolbarBMs, parentGuid);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
@ -331,44 +287,54 @@ EdgeBookmarksMigrator.prototype = {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
let bookmarks = readTableFromEdgeDB(this.TABLE_NAME, columns, filterFn, this.db);
|
let bookmarks = readTableFromEdgeDB(this.TABLE_NAME, columns, filterFn, this.db);
|
||||||
return {bookmarks, folderMap};
|
let toplevelBMs = [], toolbarBMs = [];
|
||||||
},
|
for (let bookmark of bookmarks) {
|
||||||
|
let bmToInsert;
|
||||||
_getGuidForFolder: Task.async(function*(folderId, folderMap, rootGuid) {
|
// Ignore invalid URLs:
|
||||||
// If the folderId is not known as a folder in the folder map, we assume
|
if (!bookmark.IsFolder) {
|
||||||
// we just need the root
|
try {
|
||||||
if (!folderMap.has(folderId)) {
|
new URL(bookmark.URL);
|
||||||
return rootGuid;
|
} catch (ex) {
|
||||||
}
|
Cu.reportError(`Ignoring ${bookmark.URL} when importing from Edge because of exception: ${ex}`);
|
||||||
let folder = folderMap.get(folderId);
|
continue;
|
||||||
// If the folder already has a places guid, just return that.
|
}
|
||||||
if (folder._guid) {
|
bmToInsert = {
|
||||||
return folder._guid;
|
dateAdded: bookmark.DateUpdated || new Date(),
|
||||||
}
|
title: bookmark.Title,
|
||||||
|
url: bookmark.URL,
|
||||||
// Hacks! The bookmarks bar is special:
|
};
|
||||||
if (folder.Title == "_Favorites_Bar_") {
|
} else /* bookmark.IsFolder */ {
|
||||||
let toolbarGuid = PlacesUtils.bookmarks.toolbarGuid;
|
// Ignore the favorites bar bookmark itself.
|
||||||
if (!MigrationUtils.isStartupMigration) {
|
if (bookmark.Title == "_Favorites_Bar_") {
|
||||||
toolbarGuid =
|
continue;
|
||||||
yield MigrationUtils.createImportedBookmarksFolder("Edge", toolbarGuid);
|
}
|
||||||
|
if (!bookmark._childrenRef) {
|
||||||
|
bookmark._childrenRef = [];
|
||||||
|
}
|
||||||
|
bmToInsert = {
|
||||||
|
title: bookmark.Title,
|
||||||
|
type: PlacesUtils.bookmarks.TYPE_FOLDER,
|
||||||
|
dateAdded: bookmark.DateUpdated || new Date(),
|
||||||
|
children: bookmark._childrenRef,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!folderMap.has(bookmark.ParentId)) {
|
||||||
|
toplevelBMs.push(bmToInsert);
|
||||||
|
} else {
|
||||||
|
let parent = folderMap.get(bookmark.ParentId);
|
||||||
|
if (parent.Title == "_Favorites_Bar_") {
|
||||||
|
toolbarBMs.push(bmToInsert);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!parent._childrenRef) {
|
||||||
|
parent._childrenRef = [];
|
||||||
|
}
|
||||||
|
parent._childrenRef.push(bmToInsert);
|
||||||
}
|
}
|
||||||
folder._guid = toolbarGuid;
|
|
||||||
return folder._guid;
|
|
||||||
}
|
}
|
||||||
// Otherwise, get the right parent guid recursively:
|
return {toplevelBMs, toolbarBMs};
|
||||||
let parentGuid = yield this._getGuidForFolder(folder.ParentId, folderMap, rootGuid);
|
},
|
||||||
let folderInfo = {
|
|
||||||
title: folder.Title,
|
|
||||||
type: PlacesUtils.bookmarks.TYPE_FOLDER,
|
|
||||||
dateAdded: folder.DateUpdated || new Date(),
|
|
||||||
parentGuid,
|
|
||||||
};
|
|
||||||
// and add ourselves as a kid, and return the guid we got.
|
|
||||||
let parentBM = yield MigrationUtils.insertBookmarkWrapper(folderInfo);
|
|
||||||
folder._guid = parentBM.guid;
|
|
||||||
return folder._guid;
|
|
||||||
}),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function EdgeProfileMigrator() {
|
function EdgeProfileMigrator() {
|
||||||
|
|
|
@ -377,12 +377,19 @@ Bookmarks.prototype = {
|
||||||
},
|
},
|
||||||
|
|
||||||
_migrateFolder: Task.async(function* (aSourceFolder, aDestFolderGuid) {
|
_migrateFolder: Task.async(function* (aSourceFolder, aDestFolderGuid) {
|
||||||
|
let bookmarks = yield this._getBookmarksInFolder(aSourceFolder);
|
||||||
|
if (bookmarks.length) {
|
||||||
|
yield MigrationUtils.insertManyBookmarksWrapper(bookmarks, aDestFolderGuid);
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
|
||||||
|
_getBookmarksInFolder: Task.async(function* (aSourceFolder) {
|
||||||
// TODO (bug 741993): the favorites order is stored in the Registry, at
|
// TODO (bug 741993): the favorites order is stored in the Registry, at
|
||||||
// HCU\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Favorites
|
// HCU\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Favorites
|
||||||
// for IE, and in a similar location for Edge.
|
// for IE, and in a similar location for Edge.
|
||||||
// Until we support it, bookmarks are imported in alphabetical order.
|
// Until we support it, bookmarks are imported in alphabetical order.
|
||||||
let entries = aSourceFolder.directoryEntries;
|
let entries = aSourceFolder.directoryEntries;
|
||||||
let succeeded = true;
|
let rv = [];
|
||||||
while (entries.hasMoreElements()) {
|
while (entries.hasMoreElements()) {
|
||||||
let entry = entries.getNext().QueryInterface(Ci.nsIFile);
|
let entry = entries.getNext().QueryInterface(Ci.nsIFile);
|
||||||
try {
|
try {
|
||||||
|
@ -391,27 +398,23 @@ Bookmarks.prototype = {
|
||||||
// Don't use isSymlink(), since it would throw for invalid
|
// Don't use isSymlink(), since it would throw for invalid
|
||||||
// lnk files pointing to URLs or to unresolvable paths.
|
// lnk files pointing to URLs or to unresolvable paths.
|
||||||
if (entry.path == entry.target && entry.isDirectory()) {
|
if (entry.path == entry.target && entry.isDirectory()) {
|
||||||
let folderGuid;
|
let isBookmarksFolder = entry.leafName == this._toolbarFolderName &&
|
||||||
if (entry.leafName == this._toolbarFolderName &&
|
entry.parent.equals(this._favoritesFolder);
|
||||||
entry.parent.equals(this._favoritesFolder)) {
|
if (isBookmarksFolder && entry.isReadable()) {
|
||||||
// Import to the bookmarks toolbar.
|
// Import to the bookmarks toolbar.
|
||||||
folderGuid = PlacesUtils.bookmarks.toolbarGuid;
|
let folderGuid = PlacesUtils.bookmarks.toolbarGuid;
|
||||||
if (!MigrationUtils.isStartupMigration) {
|
if (!MigrationUtils.isStartupMigration) {
|
||||||
folderGuid =
|
folderGuid =
|
||||||
yield MigrationUtils.createImportedBookmarksFolder(this.importedAppLabel, folderGuid);
|
yield MigrationUtils.createImportedBookmarksFolder(this.importedAppLabel, folderGuid);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// Import to a new folder.
|
|
||||||
folderGuid = (yield MigrationUtils.insertBookmarkWrapper({
|
|
||||||
type: PlacesUtils.bookmarks.TYPE_FOLDER,
|
|
||||||
parentGuid: aDestFolderGuid,
|
|
||||||
title: entry.leafName
|
|
||||||
})).guid;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (entry.isReadable()) {
|
|
||||||
// Recursively import the folder.
|
|
||||||
yield this._migrateFolder(entry, folderGuid);
|
yield this._migrateFolder(entry, folderGuid);
|
||||||
|
} else if (entry.isReadable()) {
|
||||||
|
let childBookmarks = yield this._getBookmarksInFolder(entry);
|
||||||
|
rv.push({
|
||||||
|
type: PlacesUtils.bookmarks.TYPE_FOLDER,
|
||||||
|
title: entry.leafName,
|
||||||
|
children: childBookmarks,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Strip the .url extension, to both check this is a valid link file,
|
// Strip the .url extension, to both check this is a valid link file,
|
||||||
|
@ -421,21 +424,14 @@ Bookmarks.prototype = {
|
||||||
let fileHandler = Cc["@mozilla.org/network/protocol;1?name=file"].
|
let fileHandler = Cc["@mozilla.org/network/protocol;1?name=file"].
|
||||||
getService(Ci.nsIFileProtocolHandler);
|
getService(Ci.nsIFileProtocolHandler);
|
||||||
let uri = fileHandler.readURLFile(entry);
|
let uri = fileHandler.readURLFile(entry);
|
||||||
let title = matches[1];
|
rv.push({url: uri, title: matches[1]});
|
||||||
|
|
||||||
yield MigrationUtils.insertBookmarkWrapper({
|
|
||||||
parentGuid: aDestFolderGuid, url: uri, title
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
Components.utils.reportError("Unable to import " + this.importedAppLabel + " favorite (" + entry.leafName + "): " + ex);
|
Components.utils.reportError("Unable to import " + this.importedAppLabel + " favorite (" + entry.leafName + "): " + ex);
|
||||||
succeeded = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!succeeded) {
|
return rv;
|
||||||
throw new Error("Failed to import all bookmarks correctly.");
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -991,6 +991,20 @@ this.MigrationUtils = Object.freeze({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
insertManyBookmarksWrapper(bookmarks, parent) {
|
||||||
|
let insertionPromise = PlacesUtils.bookmarks.insertTree({guid: parent, children: bookmarks});
|
||||||
|
return insertionPromise.then(insertedItems => {
|
||||||
|
this._importQuantities.bookmarks += insertedItems.length;
|
||||||
|
if (gKeepUndoData) {
|
||||||
|
let bmData = gUndoData.get("bookmarks");
|
||||||
|
for (let bm of insertedItems) {
|
||||||
|
let {parentGuid, guid, lastModified, type} = bm;
|
||||||
|
bmData.push({parentGuid, guid, lastModified, type});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, ex => Cu.reportError(ex));
|
||||||
|
},
|
||||||
|
|
||||||
insertVisitsWrapper(places, options) {
|
insertVisitsWrapper(places, options) {
|
||||||
this._importQuantities.history += places.length;
|
this._importQuantities.history += places.length;
|
||||||
if (gKeepUndoData) {
|
if (gKeepUndoData) {
|
||||||
|
|
|
@ -27,6 +27,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "FormHistory",
|
XPCOMUtils.defineLazyModuleGetter(this, "FormHistory",
|
||||||
"resource://gre/modules/FormHistory.jsm");
|
"resource://gre/modules/FormHistory.jsm");
|
||||||
|
|
||||||
|
Cu.importGlobalProperties(["URL"]);
|
||||||
|
|
||||||
function Bookmarks(aBookmarksFile) {
|
function Bookmarks(aBookmarksFile) {
|
||||||
this._file = aBookmarksFile;
|
this._file = aBookmarksFile;
|
||||||
}
|
}
|
||||||
|
@ -147,33 +149,38 @@ Bookmarks.prototype = {
|
||||||
|
|
||||||
// migrate the given array of safari bookmarks to the given places
|
// migrate the given array of safari bookmarks to the given places
|
||||||
// folder.
|
// folder.
|
||||||
_migrateEntries: Task.async(function* (entries, parentGuid) {
|
_migrateEntries(entries, parentGuid) {
|
||||||
for (let entry of entries) {
|
let convertedEntries = this._convertEntries(entries);
|
||||||
|
return MigrationUtils.insertManyBookmarksWrapper(convertedEntries, parentGuid);
|
||||||
|
},
|
||||||
|
|
||||||
|
_convertEntries(entries) {
|
||||||
|
return entries.map(function(entry) {
|
||||||
let type = entry.get("WebBookmarkType");
|
let type = entry.get("WebBookmarkType");
|
||||||
if (type == "WebBookmarkTypeList" && entry.has("Children")) {
|
if (type == "WebBookmarkTypeList" && entry.has("Children")) {
|
||||||
let title = entry.get("Title");
|
return {
|
||||||
let newFolderGuid = (yield MigrationUtils.insertBookmarkWrapper({
|
title: entry.get("Title"),
|
||||||
parentGuid, type: PlacesUtils.bookmarks.TYPE_FOLDER, title
|
type: PlacesUtils.bookmarks.TYPE_FOLDER,
|
||||||
})).guid;
|
children: this._convertEntries(entry.get("Children")),
|
||||||
|
};
|
||||||
// Empty folders may not have a children array.
|
}
|
||||||
if (entry.has("Children"))
|
if (type == "WebBookmarkTypeLeaf" && entry.has("URLString")) {
|
||||||
yield this._migrateEntries(entry.get("Children"), newFolderGuid, false);
|
// Check we understand this URL before adding it:
|
||||||
} else if (type == "WebBookmarkTypeLeaf" && entry.has("URLString")) {
|
let url = entry.get("URLString");
|
||||||
|
try {
|
||||||
|
new URL(url);
|
||||||
|
} catch (ex) {
|
||||||
|
Cu.reportError(`Ignoring ${url} when importing from Safari because of exception: ${ex}`);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
let title;
|
let title;
|
||||||
if (entry.has("URIDictionary"))
|
if (entry.has("URIDictionary"))
|
||||||
title = entry.get("URIDictionary").get("title");
|
title = entry.get("URIDictionary").get("title");
|
||||||
|
return { url, title };
|
||||||
try {
|
|
||||||
yield MigrationUtils.insertBookmarkWrapper({
|
|
||||||
parentGuid, url: entry.get("URLString"), title
|
|
||||||
});
|
|
||||||
} catch (ex) {
|
|
||||||
Cu.reportError("Invalid Safari bookmark: " + ex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
return null;
|
||||||
})
|
}).filter(e => !!e);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
function History(aHistoryFile) {
|
function History(aHistoryFile) {
|
||||||
|
|
|
@ -0,0 +1,105 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
Cu.import("resource://gre/modules/AppConstants.jsm");
|
||||||
|
|
||||||
|
add_task(function* () {
|
||||||
|
let rootDir = do_get_file("chromefiles/");
|
||||||
|
let pathId;
|
||||||
|
let subDirs = ["Google", "Chrome"];
|
||||||
|
if (AppConstants.platform == "macosx") {
|
||||||
|
subDirs.unshift("Application Support");
|
||||||
|
pathId = "ULibDir";
|
||||||
|
} else if (AppConstants.platform == "win") {
|
||||||
|
subDirs.push("User Data");
|
||||||
|
pathId = "LocalAppData";
|
||||||
|
} else {
|
||||||
|
subDirs = [".config", "google-chrome"];
|
||||||
|
pathId = "Home";
|
||||||
|
}
|
||||||
|
registerFakePath(pathId, rootDir);
|
||||||
|
|
||||||
|
let target = rootDir.clone();
|
||||||
|
// Pretend this is the default profile
|
||||||
|
subDirs.push("Default");
|
||||||
|
while (subDirs.length) {
|
||||||
|
target.append(subDirs.shift());
|
||||||
|
}
|
||||||
|
// We don't import osfile.jsm until after registering the fake path, because
|
||||||
|
// importing osfile will sometimes greedily fetch certain path identifiers
|
||||||
|
// from the dir service, which means they get cached, which means we can't
|
||||||
|
// register a fake path for them anymore.
|
||||||
|
Cu.import("resource://gre/modules/osfile.jsm"); /* globals OS */
|
||||||
|
yield OS.File.makeDir(target.path, {from: rootDir.parent.path, ignoreExisting: true});
|
||||||
|
|
||||||
|
target.append("Bookmarks");
|
||||||
|
yield OS.File.remove(target.path, {ignoreAbsent: true});
|
||||||
|
|
||||||
|
let bookmarksData = {roots: {bookmark_bar: {children: []}, other: {children: []}}};
|
||||||
|
const MAX_BMS = 100;
|
||||||
|
let barKids = bookmarksData.roots.bookmark_bar.children;
|
||||||
|
let menuKids = bookmarksData.roots.other.children;
|
||||||
|
let currentMenuKids = menuKids;
|
||||||
|
let currentBarKids = barKids;
|
||||||
|
for (let i = 0; i < MAX_BMS; i++) {
|
||||||
|
currentBarKids.push({
|
||||||
|
url: "https://www.chrome-bookmark-bar-bookmark" + i + ".com",
|
||||||
|
name: "bookmark " + i,
|
||||||
|
type: "url",
|
||||||
|
});
|
||||||
|
currentMenuKids.push({
|
||||||
|
url: "https://www.chrome-menu-bookmark" + i + ".com",
|
||||||
|
name: "bookmark for menu " + i,
|
||||||
|
type: "url",
|
||||||
|
});
|
||||||
|
if (i % 20 == 19) {
|
||||||
|
let nextFolder = {
|
||||||
|
name: "toolbar folder " + Math.ceil(i / 20),
|
||||||
|
type: "folder",
|
||||||
|
children: [],
|
||||||
|
};
|
||||||
|
currentBarKids.push(nextFolder);
|
||||||
|
currentBarKids = nextFolder.children;
|
||||||
|
|
||||||
|
nextFolder = {
|
||||||
|
name: "menu folder " + Math.ceil(i / 20),
|
||||||
|
type: "folder",
|
||||||
|
children: [],
|
||||||
|
};
|
||||||
|
currentMenuKids.push(nextFolder);
|
||||||
|
currentMenuKids = nextFolder.children;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
yield OS.File.writeAtomic(target.path, JSON.stringify(bookmarksData), {encoding: "utf-8"});
|
||||||
|
|
||||||
|
let migrator = MigrationUtils.getMigrator("chrome");
|
||||||
|
// Sanity check for the source.
|
||||||
|
Assert.ok(migrator.sourceExists);
|
||||||
|
|
||||||
|
let itemsSeen = {bookmarks: 0, folders: 0};
|
||||||
|
let bmObserver = {
|
||||||
|
onItemAdded(aItemId, aParentId, aIndex, aItemType, aURI, aTitle) {
|
||||||
|
if (!aTitle.includes("Chrome")) {
|
||||||
|
itemsSeen[aItemType == PlacesUtils.bookmarks.TYPE_FOLDER ? "folders" : "bookmarks"]++;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onBeginUpdateBatch() {},
|
||||||
|
onEndUpdateBatch() {},
|
||||||
|
onItemRemoved() {},
|
||||||
|
onItemChanged() {},
|
||||||
|
onItemVisited() {},
|
||||||
|
onItemMoved() {},
|
||||||
|
};
|
||||||
|
|
||||||
|
PlacesUtils.bookmarks.addObserver(bmObserver, false);
|
||||||
|
const PROFILE = {
|
||||||
|
id: "Default",
|
||||||
|
name: "Default",
|
||||||
|
};
|
||||||
|
yield promiseMigration(migrator, MigrationUtils.resourceTypes.BOOKMARKS, PROFILE);
|
||||||
|
PlacesUtils.bookmarks.removeObserver(bmObserver);
|
||||||
|
|
||||||
|
Assert.equal(itemsSeen.bookmarks, 200, "Should have seen 200 bookmarks.");
|
||||||
|
Assert.equal(itemsSeen.folders, 10, "Should have seen 10 folders.");
|
||||||
|
Assert.equal(MigrationUtils._importQuantities.bookmarks, itemsSeen.bookmarks + itemsSeen.folders, "Telemetry reporting correct.");
|
||||||
|
});
|
|
@ -7,6 +7,7 @@ support-files =
|
||||||
AppData/**
|
AppData/**
|
||||||
|
|
||||||
[test_automigration.js]
|
[test_automigration.js]
|
||||||
|
[test_Chrome_bookmarks.js]
|
||||||
[test_Chrome_cookies.js]
|
[test_Chrome_cookies.js]
|
||||||
skip-if = os != "mac" # Relies on ULibDir
|
skip-if = os != "mac" # Relies on ULibDir
|
||||||
[test_Chrome_passwords.js]
|
[test_Chrome_passwords.js]
|
||||||
|
|
|
@ -91,7 +91,19 @@ AutofillProfileAutoCompleteSearch.prototype = {
|
||||||
this.log.debug("startSearch: for", searchString, "with input", formFillController.focusedInput);
|
this.log.debug("startSearch: for", searchString, "with input", formFillController.focusedInput);
|
||||||
let focusedInput = formFillController.focusedInput;
|
let focusedInput = formFillController.focusedInput;
|
||||||
this.forceStop = false;
|
this.forceStop = false;
|
||||||
let info = this._serializeInfo(FormAutofillContent.getInputDetails(focusedInput));
|
let info = FormAutofillContent.getInputDetails(focusedInput);
|
||||||
|
|
||||||
|
if (!FormAutofillContent.savedFieldNames.has(info.fieldName)) {
|
||||||
|
let formHistory = Cc["@mozilla.org/autocomplete/search;1?name=form-history"]
|
||||||
|
.createInstance(Ci.nsIAutoCompleteSearch);
|
||||||
|
formHistory.startSearch(searchString, searchParam, previousResult, {
|
||||||
|
onSearchResult: (search, result) => {
|
||||||
|
listener.onSearchResult(this, result);
|
||||||
|
ProfileAutocomplete.setProfileAutoCompleteResult(result);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this._getProfiles({info, searchString}).then((profiles) => {
|
this._getProfiles({info, searchString}).then((profiles) => {
|
||||||
if (this.forceStop) {
|
if (this.forceStop) {
|
||||||
|
@ -142,12 +154,6 @@ AutofillProfileAutoCompleteSearch.prototype = {
|
||||||
Services.cpmm.sendAsyncMessage("FormAutofill:GetProfiles", data);
|
Services.cpmm.sendAsyncMessage("FormAutofill:GetProfiles", data);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_serializeInfo(detail) {
|
|
||||||
let info = Object.assign({}, detail);
|
|
||||||
delete info.element;
|
|
||||||
return info;
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([AutofillProfileAutoCompleteSearch]);
|
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([AutofillProfileAutoCompleteSearch]);
|
||||||
|
@ -250,20 +256,39 @@ var FormAutofillContent = {
|
||||||
*/
|
*/
|
||||||
_formsDetails: new WeakMap(),
|
_formsDetails: new WeakMap(),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Set} Set of the fields with usable values in any saved profile.
|
||||||
|
*/
|
||||||
|
savedFieldNames: null,
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
FormAutofillUtils.defineLazyLogGetter(this, "FormAutofillContent");
|
FormAutofillUtils.defineLazyLogGetter(this, "FormAutofillContent");
|
||||||
|
|
||||||
Services.cpmm.addMessageListener("FormAutofill:enabledStatus", (result) => {
|
Services.cpmm.addMessageListener("FormAutofill:enabledStatus", this);
|
||||||
if (result.data) {
|
Services.cpmm.addMessageListener("FormAutofill:savedFieldNames", this);
|
||||||
ProfileAutocomplete.ensureRegistered();
|
|
||||||
} else {
|
|
||||||
ProfileAutocomplete.ensureUnregistered();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (Services.cpmm.initialProcessData.autofillEnabled) {
|
if (Services.cpmm.initialProcessData.autofillEnabled) {
|
||||||
ProfileAutocomplete.ensureRegistered();
|
ProfileAutocomplete.ensureRegistered();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.savedFieldNames =
|
||||||
|
Services.cpmm.initialProcessData.autofillSavedFieldNames || new Set();
|
||||||
|
},
|
||||||
|
|
||||||
|
receiveMessage({name, data}) {
|
||||||
|
switch (name) {
|
||||||
|
case "FormAutofill:enabledStatus": {
|
||||||
|
if (data) {
|
||||||
|
ProfileAutocomplete.ensureRegistered();
|
||||||
|
} else {
|
||||||
|
ProfileAutocomplete.ensureUnregistered();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "FormAutofill:savedFieldNames": {
|
||||||
|
this.savedFieldNames = data;
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -53,15 +53,10 @@ FormAutofillHandler.prototype = {
|
||||||
fieldDetails: null,
|
fieldDetails: null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns information from the form about fields that can be autofilled, and
|
* Set fieldDetails from the form about fields that can be autofilled.
|
||||||
* populates the fieldDetails array on this object accordingly.
|
|
||||||
*
|
|
||||||
* @returns {Array<Object>} Serializable data structure that can be sent to the user
|
|
||||||
* interface, or null if the operation failed because the constraints
|
|
||||||
* on the allowed fields were not honored.
|
|
||||||
*/
|
*/
|
||||||
collectFormFields() {
|
collectFormFields() {
|
||||||
let autofillData = [];
|
this.fieldDetails = [];
|
||||||
|
|
||||||
for (let element of this.form.elements) {
|
for (let element of this.form.elements) {
|
||||||
// Exclude elements to which no autocomplete field has been assigned.
|
// Exclude elements to which no autocomplete field has been assigned.
|
||||||
|
@ -77,28 +72,21 @@ FormAutofillHandler.prototype = {
|
||||||
f.fieldName == info.fieldName)) {
|
f.fieldName == info.fieldName)) {
|
||||||
// A field with the same identifier already exists.
|
// A field with the same identifier already exists.
|
||||||
log.debug("Not collecting a field matching another with the same info:", info);
|
log.debug("Not collecting a field matching another with the same info:", info);
|
||||||
return null;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let inputFormat = {
|
let formatWithElement = {
|
||||||
section: info.section,
|
section: info.section,
|
||||||
addressType: info.addressType,
|
addressType: info.addressType,
|
||||||
contactType: info.contactType,
|
contactType: info.contactType,
|
||||||
fieldName: info.fieldName,
|
fieldName: info.fieldName,
|
||||||
|
element, // TODO: Apply Cu.getWeakReference and use get API for strong ref.
|
||||||
};
|
};
|
||||||
// Clone the inputFormat for caching the fields and elements together
|
|
||||||
let formatWithElement = Object.assign({}, inputFormat);
|
|
||||||
|
|
||||||
inputFormat.index = autofillData.length;
|
|
||||||
autofillData.push(inputFormat);
|
|
||||||
|
|
||||||
formatWithElement.element = element;
|
|
||||||
this.fieldDetails.push(formatWithElement);
|
this.fieldDetails.push(formatWithElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
log.debug("Collected details on", autofillData.length, "fields");
|
log.debug("Collected details on", this.fieldDetails.length, "fields");
|
||||||
|
|
||||||
return autofillData;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -85,6 +85,7 @@ FormAutofillParent.prototype = {
|
||||||
// Force to trigger the onStatusChanged function for setting listeners properly
|
// Force to trigger the onStatusChanged function for setting listeners properly
|
||||||
// while initizlization
|
// while initizlization
|
||||||
this._setStatus(this._getStatus());
|
this._setStatus(this._getStatus());
|
||||||
|
this._updateSavedFieldNames();
|
||||||
},
|
},
|
||||||
|
|
||||||
observe(subject, topic, data) {
|
observe(subject, topic, data) {
|
||||||
|
@ -115,6 +116,7 @@ FormAutofillParent.prototype = {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._updateSavedFieldNames();
|
||||||
let currentStatus = this._getStatus();
|
let currentStatus = this._getStatus();
|
||||||
if (currentStatus !== this._enabled) {
|
if (currentStatus !== this._enabled) {
|
||||||
this._setStatus(currentStatus);
|
this._setStatus(currentStatus);
|
||||||
|
@ -244,4 +246,29 @@ FormAutofillParent.prototype = {
|
||||||
|
|
||||||
target.sendAsyncMessage("FormAutofill:Profiles", profiles);
|
target.sendAsyncMessage("FormAutofill:Profiles", profiles);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_updateSavedFieldNames() {
|
||||||
|
if (!Services.ppmm.initialProcessData.autofillSavedFieldNames) {
|
||||||
|
Services.ppmm.initialProcessData.autofillSavedFieldNames = new Set();
|
||||||
|
} else {
|
||||||
|
Services.ppmm.initialProcessData.autofillSavedFieldNames.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
this._profileStore.getAll().forEach((profile) => {
|
||||||
|
Object.keys(profile).forEach((fieldName) => {
|
||||||
|
if (!profile[fieldName]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Services.ppmm.initialProcessData.autofillSavedFieldNames.add(fieldName);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Remove the internal guid and metadata fields.
|
||||||
|
this._profileStore.INTERNAL_FIELDS.forEach((fieldName) => {
|
||||||
|
Services.ppmm.initialProcessData.autofillSavedFieldNames.delete(fieldName);
|
||||||
|
});
|
||||||
|
|
||||||
|
Services.ppmm.broadcastAsyncMessage("FormAutofill:savedFieldNames",
|
||||||
|
Services.ppmm.initialProcessData.autofillSavedFieldNames);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -92,6 +92,9 @@ function ProfileStorage(path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ProfileStorage.prototype = {
|
ProfileStorage.prototype = {
|
||||||
|
// These fields are defined internally for each profile.
|
||||||
|
INTERNAL_FIELDS:
|
||||||
|
["guid", "timeCreated", "timeLastUsed", "timeLastModified", "timesUsed"],
|
||||||
/**
|
/**
|
||||||
* Loads the profile data from file to memory.
|
* Loads the profile data from file to memory.
|
||||||
*
|
*
|
||||||
|
|
|
@ -24,13 +24,6 @@ const TESTCASES = [
|
||||||
<input id="country" autocomplete="country">
|
<input id="country" autocomplete="country">
|
||||||
<input id="email" autocomplete="email">
|
<input id="email" autocomplete="email">
|
||||||
<input id="tel" autocomplete="tel"></form>`,
|
<input id="tel" autocomplete="tel"></form>`,
|
||||||
returnedFormat: [
|
|
||||||
{"section": "", "addressType": "", "contactType": "", "fieldName": "street-address", "index": 0},
|
|
||||||
{"section": "", "addressType": "", "contactType": "", "fieldName": "address-level2", "index": 1},
|
|
||||||
{"section": "", "addressType": "", "contactType": "", "fieldName": "country", "index": 2},
|
|
||||||
{"section": "", "addressType": "", "contactType": "", "fieldName": "email", "index": 3},
|
|
||||||
{"section": "", "addressType": "", "contactType": "", "fieldName": "tel", "index": 4},
|
|
||||||
],
|
|
||||||
fieldDetails: [
|
fieldDetails: [
|
||||||
{"section": "", "addressType": "", "contactType": "", "fieldName": "street-address", "element": {}},
|
{"section": "", "addressType": "", "contactType": "", "fieldName": "street-address", "element": {}},
|
||||||
{"section": "", "addressType": "", "contactType": "", "fieldName": "address-level2", "element": {}},
|
{"section": "", "addressType": "", "contactType": "", "fieldName": "address-level2", "element": {}},
|
||||||
|
@ -48,13 +41,6 @@ const TESTCASES = [
|
||||||
<input id="country" autocomplete="shipping country">
|
<input id="country" autocomplete="shipping country">
|
||||||
<input id='email' autocomplete="shipping email">
|
<input id='email' autocomplete="shipping email">
|
||||||
<input id="tel" autocomplete="shipping tel"></form>`,
|
<input id="tel" autocomplete="shipping tel"></form>`,
|
||||||
returnedFormat: [
|
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "street-address", "index": 0},
|
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "address-level2", "index": 1},
|
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "country", "index": 2},
|
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "email", "index": 3},
|
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "tel", "index": 4},
|
|
||||||
],
|
|
||||||
fieldDetails: [
|
fieldDetails: [
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "street-address", "element": {}},
|
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "street-address", "element": {}},
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "address-level2", "element": {}},
|
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "address-level2", "element": {}},
|
||||||
|
@ -72,13 +58,6 @@ const TESTCASES = [
|
||||||
<input id="country" autocomplete="shipping country">
|
<input id="country" autocomplete="shipping country">
|
||||||
<input id='email' autocomplete="shipping email">
|
<input id='email' autocomplete="shipping email">
|
||||||
<input id="tel" autocomplete="shipping tel"></form>`,
|
<input id="tel" autocomplete="shipping tel"></form>`,
|
||||||
returnedFormat: [
|
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "street-address", "index": 0},
|
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "address-level2", "index": 1},
|
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "country", "index": 2},
|
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "email", "index": 3},
|
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "tel", "index": 4},
|
|
||||||
],
|
|
||||||
fieldDetails: [
|
fieldDetails: [
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "street-address", "element": {}},
|
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "street-address", "element": {}},
|
||||||
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "address-level2", "element": {}},
|
{"section": "", "addressType": "shipping", "contactType": "", "fieldName": "address-level2", "element": {}},
|
||||||
|
@ -100,8 +79,7 @@ for (let tc of TESTCASES) {
|
||||||
let form = doc.querySelector("form");
|
let form = doc.querySelector("form");
|
||||||
let handler = new FormAutofillHandler(form);
|
let handler = new FormAutofillHandler(form);
|
||||||
|
|
||||||
Assert.deepEqual(handler.collectFormFields(), testcase.returnedFormat,
|
handler.collectFormFields();
|
||||||
"Check the format of form autofill were returned correctly");
|
|
||||||
|
|
||||||
Assert.deepEqual(handler.fieldDetails, testcase.fieldDetails,
|
Assert.deepEqual(handler.fieldDetails, testcase.fieldDetails,
|
||||||
"Check the fieldDetails were set correctly");
|
"Check the fieldDetails were set correctly");
|
||||||
|
|
|
@ -25,6 +25,7 @@ add_task(function* test_enabledStatus_observe() {
|
||||||
let formAutofillParent = new FormAutofillParent();
|
let formAutofillParent = new FormAutofillParent();
|
||||||
sinon.stub(formAutofillParent, "_getStatus");
|
sinon.stub(formAutofillParent, "_getStatus");
|
||||||
sinon.spy(formAutofillParent, "_setStatus");
|
sinon.spy(formAutofillParent, "_setStatus");
|
||||||
|
sinon.stub(formAutofillParent, "_updateSavedFieldNames");
|
||||||
|
|
||||||
// _enabled = _getStatus() => No need to trigger onStatusChanged
|
// _enabled = _getStatus() => No need to trigger onStatusChanged
|
||||||
formAutofillParent._enabled = true;
|
formAutofillParent._enabled = true;
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* Test for keeping the valid fields information in initialProcessData.
|
||||||
|
*/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
Cu.import("resource://formautofill/FormAutofillParent.jsm");
|
||||||
|
Cu.import("resource://formautofill/ProfileStorage.jsm");
|
||||||
|
|
||||||
|
add_task(function* test_profileSavedFieldNames_init() {
|
||||||
|
let formAutofillParent = new FormAutofillParent();
|
||||||
|
sinon.stub(formAutofillParent, "_updateSavedFieldNames");
|
||||||
|
|
||||||
|
formAutofillParent.init();
|
||||||
|
do_check_eq(formAutofillParent._updateSavedFieldNames.called, true);
|
||||||
|
|
||||||
|
formAutofillParent._uninit();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* test_profileSavedFieldNames_observe() {
|
||||||
|
let formAutofillParent = new FormAutofillParent();
|
||||||
|
sinon.stub(formAutofillParent, "_updateSavedFieldNames");
|
||||||
|
|
||||||
|
// profile added => Need to trigger updateValidFields
|
||||||
|
formAutofillParent.observe(null, "formautofill-storage-changed", "add");
|
||||||
|
do_check_eq(formAutofillParent._updateSavedFieldNames.called, true);
|
||||||
|
|
||||||
|
// profile removed => Need to trigger updateValidFields
|
||||||
|
formAutofillParent._updateSavedFieldNames.reset();
|
||||||
|
formAutofillParent.observe(null, "formautofill-storage-changed", "remove");
|
||||||
|
do_check_eq(formAutofillParent._updateSavedFieldNames.called, true);
|
||||||
|
|
||||||
|
// profile updated => no need to trigger updateValidFields
|
||||||
|
formAutofillParent._updateSavedFieldNames.reset();
|
||||||
|
formAutofillParent.observe(null, "formautofill-storage-changed", "update");
|
||||||
|
do_check_eq(formAutofillParent._updateSavedFieldNames.called, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* test_profileSavedFieldNames_update() {
|
||||||
|
let formAutofillParent = new FormAutofillParent();
|
||||||
|
formAutofillParent.init();
|
||||||
|
do_register_cleanup(function cleanup() {
|
||||||
|
Services.prefs.clearUserPref("browser.formautofill.enabled");
|
||||||
|
});
|
||||||
|
|
||||||
|
sinon.stub(formAutofillParent._profileStore, "getAll");
|
||||||
|
formAutofillParent._profileStore.getAll.returns([]);
|
||||||
|
|
||||||
|
// The set is empty if there's no profile in the store.
|
||||||
|
formAutofillParent._updateSavedFieldNames();
|
||||||
|
do_check_eq(Services.ppmm.initialProcessData.autofillSavedFieldNames.size, 0);
|
||||||
|
|
||||||
|
// 2 profiles with 4 valid fields.
|
||||||
|
let fakeStorage = [{
|
||||||
|
guid: "test-guid-1",
|
||||||
|
organization: "Sesame Street",
|
||||||
|
"street-address": "123 Sesame Street.",
|
||||||
|
tel: "1-345-345-3456",
|
||||||
|
email: "",
|
||||||
|
timeCreated: 0,
|
||||||
|
timeLastUsed: 0,
|
||||||
|
timeLastModified: 0,
|
||||||
|
timesUsed: 0,
|
||||||
|
}, {
|
||||||
|
guid: "test-guid-2",
|
||||||
|
organization: "Mozilla",
|
||||||
|
"street-address": "331 E. Evelyn Avenue",
|
||||||
|
tel: "1-650-903-0800",
|
||||||
|
country: "US",
|
||||||
|
timeCreated: 0,
|
||||||
|
timeLastUsed: 0,
|
||||||
|
timeLastModified: 0,
|
||||||
|
timesUsed: 0,
|
||||||
|
}];
|
||||||
|
formAutofillParent._profileStore.getAll.returns(fakeStorage);
|
||||||
|
formAutofillParent._updateSavedFieldNames();
|
||||||
|
|
||||||
|
let autofillSavedFieldNames = Services.ppmm.initialProcessData.autofillSavedFieldNames;
|
||||||
|
do_check_eq(autofillSavedFieldNames.size, 4);
|
||||||
|
do_check_eq(autofillSavedFieldNames.has("organization"), true);
|
||||||
|
do_check_eq(autofillSavedFieldNames.has("street-address"), true);
|
||||||
|
do_check_eq(autofillSavedFieldNames.has("tel"), true);
|
||||||
|
do_check_eq(autofillSavedFieldNames.has("email"), false);
|
||||||
|
do_check_eq(autofillSavedFieldNames.has("guid"), false);
|
||||||
|
do_check_eq(autofillSavedFieldNames.has("timeCreated"), false);
|
||||||
|
do_check_eq(autofillSavedFieldNames.has("timeLastUsed"), false);
|
||||||
|
do_check_eq(autofillSavedFieldNames.has("timeLastModified"), false);
|
||||||
|
do_check_eq(autofillSavedFieldNames.has("timesUsed"), false);
|
||||||
|
});
|
|
@ -10,3 +10,5 @@ support-files =
|
||||||
[test_markAsAutofillField.js]
|
[test_markAsAutofillField.js]
|
||||||
[test_profileAutocompleteResult.js]
|
[test_profileAutocompleteResult.js]
|
||||||
[test_profileStorage.js]
|
[test_profileStorage.js]
|
||||||
|
[test_savedFieldNames.js]
|
||||||
|
|
||||||
|
|
|
@ -1551,6 +1551,13 @@ class PPAPIInstance {
|
||||||
this.mm.addMessageListener("ppapipdf.js:hashchange", (evt) => {
|
this.mm.addMessageListener("ppapipdf.js:hashchange", (evt) => {
|
||||||
this.notifyHashChange(evt.data.url);
|
this.notifyHashChange(evt.data.url);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.mm.addMessageListener("ppapipdf.js:oncommand", (evt) => {
|
||||||
|
this.viewport.notify({
|
||||||
|
type: "command",
|
||||||
|
name: evt.data.name
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
notifyHashChange(url) {
|
notifyHashChange(url) {
|
||||||
|
|
|
@ -594,6 +594,21 @@ class Viewport {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_handleCommand(name) {
|
||||||
|
switch(name) {
|
||||||
|
case 'cmd_selectAll':
|
||||||
|
this._doAction({
|
||||||
|
type: 'selectAll'
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'cmd_copy':
|
||||||
|
this._doAction({
|
||||||
|
type: 'getSelectedText'
|
||||||
|
})
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
verifyPassword(password) {
|
verifyPassword(password) {
|
||||||
this._doAction({
|
this._doAction({
|
||||||
type: 'getPasswordComplete',
|
type: 'getPasswordComplete',
|
||||||
|
@ -614,12 +629,6 @@ class Viewport {
|
||||||
this._refresh();
|
this._refresh();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'copy':
|
|
||||||
this._doAction({
|
|
||||||
type: 'getSelectedText'
|
|
||||||
})
|
|
||||||
evt.preventDefault();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -756,6 +765,9 @@ class Viewport {
|
||||||
case 'hashChange':
|
case 'hashChange':
|
||||||
this._handleHashChange(message.hash);
|
this._handleHashChange(message.hash);
|
||||||
break;
|
break;
|
||||||
|
case 'command':
|
||||||
|
this._handleCommand(message.name);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -183,4 +183,35 @@ mm.addMessageListener("ppapipdf.js:save", () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// This class is created to transfer global XUL commands event we needed.
|
||||||
|
// The main reason we need to transfer it from sandbox side is that commands
|
||||||
|
// triggered from menu bar targets only the outmost iframe (which is sandbox
|
||||||
|
// itself) so we need to propagate it manually into the plugin's iframe.
|
||||||
|
class CommandController {
|
||||||
|
constructor() {
|
||||||
|
this.SUPPORTED_COMMANDS = ['cmd_copy', 'cmd_selectAll'];
|
||||||
|
containerWindow.controllers.insertControllerAt(0, this);
|
||||||
|
containerWindow.addEventListener('unload', this.terminate.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
terminate() {
|
||||||
|
containerWindow.controllers.removeController(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
supportsCommand(cmd) {
|
||||||
|
return this.SUPPORTED_COMMANDS.includes(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
isCommandEnabled(cmd) {
|
||||||
|
return this.SUPPORTED_COMMANDS.includes(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
doCommand(cmd) {
|
||||||
|
mm.sendAsyncMessage("ppapipdf.js:oncommand", {name: cmd});
|
||||||
|
}
|
||||||
|
|
||||||
|
onEvent(evt) {}
|
||||||
|
};
|
||||||
|
var commandController = new CommandController();
|
||||||
|
|
||||||
mm.loadFrameScript("resource://ppapi.js/ppapi-instance.js", true);
|
mm.loadFrameScript("resource://ppapi.js/ppapi-instance.js", true);
|
||||||
|
|
|
@ -163,3 +163,8 @@ span#hostname {
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
padding: 1em 0;
|
padding: 1em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#cert_domain_link:not([href]) {
|
||||||
|
color: var(--in-content-page-color);
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
|
@ -10,19 +10,22 @@ support-files =
|
||||||
!/devtools/client/framework/test/shared-redux-head.js
|
!/devtools/client/framework/test/shared-redux-head.js
|
||||||
|
|
||||||
[browser_memory_allocationStackDisplay_01.js]
|
[browser_memory_allocationStackDisplay_01.js]
|
||||||
skip-if = debug # bug 1219554
|
skip-if = debug # bug 1219554
|
||||||
[browser_memory_displays_01.js]
|
[browser_memory_displays_01.js]
|
||||||
[browser_memory_clear_snapshots.js]
|
[browser_memory_clear_snapshots.js]
|
||||||
[browser_memory_diff_01.js]
|
[browser_memory_diff_01.js]
|
||||||
[browser_memory_dominator_trees_01.js]
|
[browser_memory_dominator_trees_01.js]
|
||||||
|
skip-if = coverage # bug 1347244
|
||||||
[browser_memory_dominator_trees_02.js]
|
[browser_memory_dominator_trees_02.js]
|
||||||
|
skip-if = coverage # bug 1347244
|
||||||
[browser_memory_filter_01.js]
|
[browser_memory_filter_01.js]
|
||||||
|
skip-if = coverage # bug 1347244
|
||||||
[browser_memory_individuals_01.js]
|
[browser_memory_individuals_01.js]
|
||||||
[browser_memory_keyboard.js]
|
[browser_memory_keyboard.js]
|
||||||
[browser_memory_keyboard-snapshot-list.js]
|
[browser_memory_keyboard-snapshot-list.js]
|
||||||
[browser_memory_no_allocation_stacks.js]
|
[browser_memory_no_allocation_stacks.js]
|
||||||
[browser_memory_no_auto_expand.js]
|
[browser_memory_no_auto_expand.js]
|
||||||
skip-if = debug # bug 1219554
|
skip-if = debug # bug 1219554
|
||||||
[browser_memory_percents_01.js]
|
[browser_memory_percents_01.js]
|
||||||
[browser_memory_refresh_does_not_leak.js]
|
[browser_memory_refresh_does_not_leak.js]
|
||||||
[browser_memory_simple_01.js]
|
[browser_memory_simple_01.js]
|
||||||
|
|
|
@ -241,10 +241,6 @@ DOMInterfaces = {
|
||||||
'headerFile': 'nsCSSRules.h',
|
'headerFile': 'nsCSSRules.h',
|
||||||
},
|
},
|
||||||
|
|
||||||
'CSSNamespaceRule': {
|
|
||||||
'nativeType': 'mozilla::css::NameSpaceRule',
|
|
||||||
},
|
|
||||||
|
|
||||||
'CSSPageRule': {
|
'CSSPageRule': {
|
||||||
'nativeType': 'nsCSSPageRule',
|
'nativeType': 'nsCSSPageRule',
|
||||||
'headerFile': 'nsCSSRules.h',
|
'headerFile': 'nsCSSRules.h',
|
||||||
|
|
|
@ -33,4 +33,16 @@ interface nsIDateTimeInputArea : nsISupports
|
||||||
* Set the current state of the picker, true if it's opened, false otherwise.
|
* Set the current state of the picker, true if it's opened, false otherwise.
|
||||||
*/
|
*/
|
||||||
void setPickerState(in boolean isOpen);
|
void setPickerState(in boolean isOpen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the attribute of the inner text boxes. Only "tabindex", "readonly",
|
||||||
|
* and "disabled" are allowed.
|
||||||
|
*/
|
||||||
|
void setEditAttribute(in DOMString name, in DOMString value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the attribute of the inner text boxes. Only "tabindex", "readonly",
|
||||||
|
* and "disabled" are allowed.
|
||||||
|
*/
|
||||||
|
void removeEditAttribute(in DOMString name);
|
||||||
};
|
};
|
||||||
|
|
|
@ -234,6 +234,13 @@ def main(argv):
|
||||||
if read_all:
|
if read_all:
|
||||||
test_list = jittests.find_tests()
|
test_list = jittests.find_tests()
|
||||||
|
|
||||||
|
# If code coverage is enabled, exclude tests. (bug 1347245)
|
||||||
|
if os.getenv('GCOV_PREFIX') is not None:
|
||||||
|
if options.exclude:
|
||||||
|
options.exclude += ['asm.js/testSIMD.js']
|
||||||
|
else:
|
||||||
|
options.exclude = ['asm.js/testSIMD.js']
|
||||||
|
|
||||||
if options.exclude:
|
if options.exclude:
|
||||||
exclude_list = []
|
exclude_list = []
|
||||||
for exclude in options.exclude:
|
for exclude in options.exclude:
|
||||||
|
|
|
@ -316,21 +316,25 @@ nsDateTimeControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
|
||||||
NS_TrustedNewXULElement(getter_AddRefs(mInputAreaContent), nodeInfo.forget());
|
NS_TrustedNewXULElement(getter_AddRefs(mInputAreaContent), nodeInfo.forget());
|
||||||
aElements.AppendElement(mInputAreaContent);
|
aElements.AppendElement(mInputAreaContent);
|
||||||
|
|
||||||
// Propogate our tabindex.
|
nsCOMPtr<nsIDateTimeInputArea> inputAreaContent =
|
||||||
nsAutoString tabIndexStr;
|
do_QueryInterface(mInputAreaContent);
|
||||||
if (mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::tabindex, tabIndexStr)) {
|
if (inputAreaContent) {
|
||||||
mInputAreaContent->SetAttr(kNameSpaceID_None, nsGkAtoms::tabindex,
|
// Propogate our tabindex.
|
||||||
tabIndexStr, false);
|
nsAutoString tabIndexStr;
|
||||||
}
|
if (mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::tabindex, tabIndexStr)) {
|
||||||
|
inputAreaContent->SetEditAttribute(NS_LITERAL_STRING("tabindex"),
|
||||||
|
tabIndexStr);
|
||||||
|
}
|
||||||
|
|
||||||
// Propagate our readonly state.
|
// Propagate our readonly state.
|
||||||
nsAutoString readonly;
|
nsAutoString readonly;
|
||||||
if (mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::readonly, readonly)) {
|
if (mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::readonly, readonly)) {
|
||||||
mInputAreaContent->SetAttr(kNameSpaceID_None, nsGkAtoms::readonly, readonly,
|
inputAreaContent->SetEditAttribute(NS_LITERAL_STRING("readonly"),
|
||||||
false);
|
readonly);
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncDisabledState();
|
SyncDisabledState();
|
||||||
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
@ -347,12 +351,19 @@ nsDateTimeControlFrame::AppendAnonymousContentTo(nsTArray<nsIContent*>& aElement
|
||||||
void
|
void
|
||||||
nsDateTimeControlFrame::SyncDisabledState()
|
nsDateTimeControlFrame::SyncDisabledState()
|
||||||
{
|
{
|
||||||
|
NS_ASSERTION(mInputAreaContent, "The input area content must exist!");
|
||||||
|
nsCOMPtr<nsIDateTimeInputArea> inputAreaContent =
|
||||||
|
do_QueryInterface(mInputAreaContent);
|
||||||
|
if (!inputAreaContent) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
EventStates eventStates = mContent->AsElement()->State();
|
EventStates eventStates = mContent->AsElement()->State();
|
||||||
if (eventStates.HasState(NS_EVENT_STATE_DISABLED)) {
|
if (eventStates.HasState(NS_EVENT_STATE_DISABLED)) {
|
||||||
mInputAreaContent->SetAttr(kNameSpaceID_None, nsGkAtoms::disabled,
|
inputAreaContent->SetEditAttribute(NS_LITERAL_STRING("disabled"),
|
||||||
EmptyString(), true);
|
EmptyString());
|
||||||
} else {
|
} else {
|
||||||
mInputAreaContent->UnsetAttr(kNameSpaceID_None, nsGkAtoms::disabled, true);
|
inputAreaContent->RemoveEditAttribute(NS_LITERAL_STRING("disabled"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -374,22 +385,28 @@ nsDateTimeControlFrame::AttributeChanged(int32_t aNameSpaceID,
|
||||||
// then we don't need to do anything since we are going to be reframed.
|
// then we don't need to do anything since we are going to be reframed.
|
||||||
if (contentAsInputElem->GetType() == NS_FORM_INPUT_TIME ||
|
if (contentAsInputElem->GetType() == NS_FORM_INPUT_TIME ||
|
||||||
contentAsInputElem->GetType() == NS_FORM_INPUT_DATE) {
|
contentAsInputElem->GetType() == NS_FORM_INPUT_DATE) {
|
||||||
|
nsCOMPtr<nsIDateTimeInputArea> inputAreaContent =
|
||||||
|
do_QueryInterface(mInputAreaContent);
|
||||||
if (aAttribute == nsGkAtoms::value) {
|
if (aAttribute == nsGkAtoms::value) {
|
||||||
nsCOMPtr<nsIDateTimeInputArea> inputAreaContent =
|
|
||||||
do_QueryInterface(mInputAreaContent);
|
|
||||||
if (inputAreaContent) {
|
if (inputAreaContent) {
|
||||||
nsContentUtils::AddScriptRunner(NewRunnableMethod(inputAreaContent,
|
nsContentUtils::AddScriptRunner(NewRunnableMethod(inputAreaContent,
|
||||||
&nsIDateTimeInputArea::NotifyInputElementValueChanged));
|
&nsIDateTimeInputArea::NotifyInputElementValueChanged));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (aModType == nsIDOMMutationEvent::REMOVAL) {
|
if (aModType == nsIDOMMutationEvent::REMOVAL) {
|
||||||
mInputAreaContent->UnsetAttr(aNameSpaceID, aAttribute, true);
|
if (inputAreaContent) {
|
||||||
|
nsAtomString name(aAttribute);
|
||||||
|
inputAreaContent->RemoveEditAttribute(name);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
MOZ_ASSERT(aModType == nsIDOMMutationEvent::ADDITION ||
|
MOZ_ASSERT(aModType == nsIDOMMutationEvent::ADDITION ||
|
||||||
aModType == nsIDOMMutationEvent::MODIFICATION);
|
aModType == nsIDOMMutationEvent::MODIFICATION);
|
||||||
nsAutoString value;
|
if (inputAreaContent) {
|
||||||
mContent->GetAttr(aNameSpaceID, aAttribute, value);
|
nsAtomString name(aAttribute);
|
||||||
mInputAreaContent->SetAttr(aNameSpaceID, aAttribute, value, true);
|
nsAutoString value;
|
||||||
|
mContent->GetAttr(aNameSpaceID, aAttribute, value);
|
||||||
|
inputAreaContent->SetEditAttribute(name, value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<body style="background-color: lime;">
|
||||||
|
<svg width="0" height="0">
|
||||||
|
<filter id="myFilter" filterUnits="objectBoundingBox" x="0" y="0" width="50%" height="50%">
|
||||||
|
<feMerge>
|
||||||
|
<feMergeNode/>
|
||||||
|
</feMerge>
|
||||||
|
</filter>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<!-- This outer svg element should be totally covered by the next filtered outer svg element. -->
|
||||||
|
<svg style="position: fixed;" x="0" y ="0" width="120" height="120">
|
||||||
|
<rect x="10" y="10" width="100" height="100" fill="red"/>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<svg filter="url(#myFilter)" style="position: fixed;" x="0" y ="0" width="240" height="240">
|
||||||
|
<rect x="10" y="10" width="100" height="100" fill="lime"/>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
</body>
|
|
@ -0,0 +1,22 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<body style="background-color: lime;">
|
||||||
|
<svg width="0" height="0">
|
||||||
|
<filter id="myFilter" filterUnits="objectBoundingBox" x="0" y="0" width="50%" height="50%">
|
||||||
|
<feMerge>
|
||||||
|
<feMergeNode/>
|
||||||
|
</feMerge>
|
||||||
|
</filter>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<svg style="position: fixed;" x="0" y ="0" width="400" height="400">
|
||||||
|
<!-- This filtered inner element should be covered by the next outer svg element. -->
|
||||||
|
<svg filter="url(#myFilter)" style="position: fixed;" x="0" y ="0" width="200" height="200">
|
||||||
|
<rect x="10" y="10" width="120" height="120" fill="red"/>
|
||||||
|
</svg>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<svg style="position: fixed;" x="0" y ="0" width="120" height="120">
|
||||||
|
<rect x="10" y="10" width="100" height="100" fill="lime"/>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
</body>
|
|
@ -83,6 +83,8 @@ fails == filter-marked-line-01.svg pass.svg # bug 477704
|
||||||
== filter-nested-filtering-02.svg pass.svg
|
== filter-nested-filtering-02.svg pass.svg
|
||||||
== filter-patterned-rect-01.svg pass.svg
|
== filter-patterned-rect-01.svg pass.svg
|
||||||
== filter-patterned-rect-02.svg pass.svg
|
== filter-patterned-rect-02.svg pass.svg
|
||||||
|
== filter-region-01a.html pass.svg
|
||||||
|
== filter-region-01b.html pass.svg
|
||||||
|
|
||||||
== feColorMatrix-saturate-01.svg pass.svg
|
== feColorMatrix-saturate-01.svg pass.svg
|
||||||
|
|
||||||
|
|
|
@ -27,11 +27,40 @@ include moz-only/reftest-stylo.list
|
||||||
include svg-integration/reftest-stylo.list
|
include svg-integration/reftest-stylo.list
|
||||||
|
|
||||||
== baseline-middle-01.svg baseline-middle-01.svg
|
== baseline-middle-01.svg baseline-middle-01.svg
|
||||||
|
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-color-burn.svg blend-color-burn.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-color-dodge.svg blend-color-dodge.svg
|
||||||
|
skip-if(stylo) pref(layout.css.mix-blend-mode.enabled,true) == blend-color.svg blend-color.svg # Too intermittent
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-darken.svg blend-darken.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-difference.svg blend-difference.svg
|
||||||
|
skip-if(Android) fuzzy-if(skiaContent,1,1600) pref(layout.css.mix-blend-mode.enabled,true) == blend-exclusion.svg blend-exclusion.svg
|
||||||
|
skip-if(stylo) pref(layout.css.mix-blend-mode.enabled,true) == blend-hard-light.svg blend-hard-light.svg # Too intermittent
|
||||||
|
skip-if(stylo) pref(layout.css.mix-blend-mode.enabled,true) == blend-hue.svg blend-hue.svg # Too intermittent
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-blend.svg blend-layer-blend.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-filter.svg blend-layer-filter.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-mask.svg blend-layer-mask.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-opacity.svg blend-layer-opacity.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-lighten.svg blend-lighten.svg
|
||||||
|
skip-if(stylo) pref(layout.css.mix-blend-mode.enabled,true) == blend-luminosity.svg blend-luminosity.svg # Too intermittent
|
||||||
|
skip-if(stylo) skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-multiply-alpha.svg blend-multiply-alpha.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-multiply.svg blend-multiply.svg
|
||||||
|
pref(layout.css.mix-blend-mode.enabled,true) == blend-normal.svg blend-normal.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-overlay.svg blend-overlay.svg
|
||||||
|
skip-if(stylo) skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-saturation.svg blend-saturation.svg
|
||||||
|
skip-if(stylo) skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-screen.svg blend-screen.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-soft-light.svg blend-soft-light.svg
|
||||||
|
== blend-difference-stacking.html blend-difference-stacking.html
|
||||||
|
|
||||||
== border-radius-01.html border-radius-01.html
|
== border-radius-01.html border-radius-01.html
|
||||||
|
|
||||||
== clip-01.svg clip-01.svg
|
== clip-01.svg clip-01.svg
|
||||||
== clip-02a.svg clip-02a.svg
|
== clip-02a.svg clip-02a.svg
|
||||||
== clip-02b.svg clip-02b.svg
|
== clip-02b.svg clip-02b.svg
|
||||||
|
== clip-surface-clone-01.svg clip-surface-clone-01.svg
|
||||||
|
|
||||||
== clipPath-advanced-01.svg clipPath-advanced-01.svg
|
== clipPath-advanced-01.svg clipPath-advanced-01.svg
|
||||||
|
== clipPath-and-mask-on-outflowElement-01a.html clipPath-and-mask-on-outflowElement-01a.html
|
||||||
|
fails == clipPath-and-mask-on-outflowElement-01b.html clipPath-and-mask-on-outflowElement-01b.html
|
||||||
fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)||/^Windows\x20NT\x206\.[12]/.test(http.oscpu),1,5) fuzzy-if(OSX,1,6) fuzzy-if(skiaContent,1,630) == clipPath-and-shape-rendering-01.svg clipPath-and-shape-rendering-01.svg
|
fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)||/^Windows\x20NT\x206\.[12]/.test(http.oscpu),1,5) fuzzy-if(OSX,1,6) fuzzy-if(skiaContent,1,630) == clipPath-and-shape-rendering-01.svg clipPath-and-shape-rendering-01.svg
|
||||||
== clipPath-and-transform-01.svg clipPath-and-transform-01.svg
|
== clipPath-and-transform-01.svg clipPath-and-transform-01.svg
|
||||||
== clipPath-basic-01.svg clipPath-basic-01.svg
|
== clipPath-basic-01.svg clipPath-basic-01.svg
|
||||||
|
@ -41,9 +70,16 @@ fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)||/^Windows\x20NT\x206\.[12]/
|
||||||
== clipPath-basic-05.svg clipPath-basic-05.svg
|
== clipPath-basic-05.svg clipPath-basic-05.svg
|
||||||
== clipPath-basic-06.svg clipPath-basic-06.svg
|
== clipPath-basic-06.svg clipPath-basic-06.svg
|
||||||
== clipPath-basic-07.svg clipPath-basic-07.svg
|
== clipPath-basic-07.svg clipPath-basic-07.svg
|
||||||
|
== clipPath-on-outflowElement-01a.html clipPath-on-outflowElement-01a.html
|
||||||
|
== clipPath-on-outflowElement-01b.html clipPath-on-outflowElement-01b.html
|
||||||
|
default-preferences pref(layout.css.clip-path-shapes.enabled,true)
|
||||||
|
fuzzy(1,32400) == clipPath-on-outflowElement-02a.html clipPath-on-outflowElement-02a.html
|
||||||
|
fuzzy(1,32400) == clipPath-on-outflowElement-02b.html clipPath-on-outflowElement-02b.html
|
||||||
|
default-preferences
|
||||||
== clipPath-winding-01.svg clipPath-winding-01.svg
|
== clipPath-winding-01.svg clipPath-winding-01.svg
|
||||||
== clip-surface-clone-01.svg clip-surface-clone-01.svg
|
|
||||||
== comments-in-pres-attrs.svg pass.svg
|
== comments-in-pres-attrs.svg pass.svg
|
||||||
|
|
||||||
== conditions-01.svg conditions-01.svg
|
== conditions-01.svg conditions-01.svg
|
||||||
== conditions-02.svg conditions-02.svg
|
== conditions-02.svg conditions-02.svg
|
||||||
== conditions-03.svg conditions-03.svg
|
== conditions-03.svg conditions-03.svg
|
||||||
|
@ -52,12 +88,15 @@ fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)||/^Windows\x20NT\x206\.[12]/
|
||||||
== conditions-07.svg conditions-07.svg
|
== conditions-07.svg conditions-07.svg
|
||||||
fuzzy-if(skiaContent,1,320) == conditions-08.svg conditions-08.svg
|
fuzzy-if(skiaContent,1,320) == conditions-08.svg conditions-08.svg
|
||||||
== conditions-09.svg conditions-09.svg
|
== conditions-09.svg conditions-09.svg
|
||||||
|
|
||||||
== currentColor-01.svg currentColor-01.svg
|
== currentColor-01.svg currentColor-01.svg
|
||||||
== currentColor-02.svg currentColor-02.svg
|
== currentColor-02.svg currentColor-02.svg
|
||||||
== currentColor-03.svg currentColor-03.svg
|
== currentColor-03.svg currentColor-03.svg
|
||||||
|
|
||||||
== data-uri-with-filter-01.xhtml data-uri-with-filter-01.xhtml
|
== data-uri-with-filter-01.xhtml data-uri-with-filter-01.xhtml
|
||||||
== data-uri-with-gradient-01.xhtml data-uri-with-gradient-01.xhtml
|
== data-uri-with-gradient-01.xhtml data-uri-with-gradient-01.xhtml
|
||||||
== data-uri-with-pattern-01.xhtml data-uri-with-pattern-01.xhtml
|
== data-uri-with-pattern-01.xhtml data-uri-with-pattern-01.xhtml
|
||||||
|
|
||||||
== dynamic-attr-removal-1.svg dynamic-attr-removal-1.svg
|
== dynamic-attr-removal-1.svg dynamic-attr-removal-1.svg
|
||||||
== dynamic-attr-removal-2.svg dynamic-attr-removal-2.svg
|
== dynamic-attr-removal-2.svg dynamic-attr-removal-2.svg
|
||||||
== dynamic-attr-change-1.svg dynamic-attr-change-1.svg
|
== dynamic-attr-change-1.svg dynamic-attr-change-1.svg
|
||||||
|
@ -137,20 +176,14 @@ random == dynamic-use-nested-01b.svg dynamic-use-nested-01b.svg
|
||||||
== dynamic-viewBox-change-01.svg dynamic-viewBox-change-01.svg
|
== dynamic-viewBox-change-01.svg dynamic-viewBox-change-01.svg
|
||||||
== dynamic-viewBox-change-02.svg dynamic-viewBox-change-02.svg
|
== dynamic-viewBox-change-02.svg dynamic-viewBox-change-02.svg
|
||||||
== dynamic-viewBox-change-03.svg dynamic-viewBox-change-03.svg
|
== dynamic-viewBox-change-03.svg dynamic-viewBox-change-03.svg
|
||||||
== fragmentIdentifier-01.xhtml fragmentIdentifier-01.xhtml
|
|
||||||
== linked-filter-01.svg linked-filter-01.svg
|
|
||||||
== linked-pattern-01.svg linked-pattern-01.svg
|
|
||||||
== use-01.svg use-01.svg
|
|
||||||
== use-01-extref.svg use-01-extref.svg
|
|
||||||
== use-02-extref.svg use-02-extref.svg
|
|
||||||
== use-extref-dataURI-01.svg use-extref-dataURI-01.svg
|
|
||||||
== use-children.svg use-children.svg
|
|
||||||
== fallback-color-01a.svg fallback-color-01a.svg
|
== fallback-color-01a.svg fallback-color-01a.svg
|
||||||
== fallback-color-01b.svg fallback-color-01b.svg
|
== fallback-color-01b.svg fallback-color-01b.svg
|
||||||
== fallback-color-02a.svg fallback-color-02a.svg
|
== fallback-color-02a.svg fallback-color-02a.svg
|
||||||
== fallback-color-02b.svg fallback-color-02b.svg
|
== fallback-color-02b.svg fallback-color-02b.svg
|
||||||
== fallback-color-03.svg fallback-color-03.svg
|
== fallback-color-03.svg fallback-color-03.svg
|
||||||
fuzzy-if(skiaContent,1,2) == fallback-color-04.svg fallback-color-04.svg
|
fuzzy-if(skiaContent,1,2) == fallback-color-04.svg fallback-color-04.svg
|
||||||
|
|
||||||
== filter-basic-01.svg filter-basic-01.svg
|
== filter-basic-01.svg filter-basic-01.svg
|
||||||
== filter-basic-02.svg filter-basic-02.svg
|
== filter-basic-02.svg filter-basic-02.svg
|
||||||
== filter-basic-03.svg filter-basic-03.svg
|
== filter-basic-03.svg filter-basic-03.svg
|
||||||
|
@ -168,6 +201,7 @@ fails-if(Android) pref(security.fileuri.strict_origin_policy,true) == filter-ext
|
||||||
fails == filter-scaled-02.html filter-scaled-02.html
|
fails == filter-scaled-02.html filter-scaled-02.html
|
||||||
== filter-translated-01.svg filter-translated-01.svg
|
== filter-translated-01.svg filter-translated-01.svg
|
||||||
fuzzy-if(skiaContent,1,800000) == filters-and-group-opacity-01.svg filters-and-group-opacity-01.svg
|
fuzzy-if(skiaContent,1,800000) == filters-and-group-opacity-01.svg filters-and-group-opacity-01.svg
|
||||||
|
|
||||||
== foreignObject-01.svg foreignObject-01.svg
|
== foreignObject-01.svg foreignObject-01.svg
|
||||||
== foreignObject-02.svg foreignObject-02.svg
|
== foreignObject-02.svg foreignObject-02.svg
|
||||||
== foreignObject-ancestor-style-change-01.svg foreignObject-ancestor-style-change-01.svg
|
== foreignObject-ancestor-style-change-01.svg foreignObject-ancestor-style-change-01.svg
|
||||||
|
@ -185,6 +219,7 @@ fuzzy-if(skiaContent,1,800000) == filters-and-group-opacity-01.svg filters-and-g
|
||||||
== foreignObject-fixedpos-02.html foreignObject-fixedpos-02.html
|
== foreignObject-fixedpos-02.html foreignObject-fixedpos-02.html
|
||||||
== foreignObject-dynamic-fixedpos-01.html foreignObject-dynamic-fixedpos-01.html
|
== foreignObject-dynamic-fixedpos-01.html foreignObject-dynamic-fixedpos-01.html
|
||||||
== foreignObject-vertical-01.svg foreignObject-vertical-01.svg
|
== foreignObject-vertical-01.svg foreignObject-vertical-01.svg
|
||||||
|
== fragmentIdentifier-01.xhtml fragmentIdentifier-01.xhtml
|
||||||
== g-transform-01.svg g-transform-01.svg
|
== g-transform-01.svg g-transform-01.svg
|
||||||
== getElementById-a-element-01.svg getElementById-a-element-01.svg
|
== getElementById-a-element-01.svg getElementById-a-element-01.svg
|
||||||
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01a.svg gradient-live-01a.svg
|
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01a.svg gradient-live-01a.svg
|
||||||
|
@ -192,6 +227,7 @@ fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01b.svg g
|
||||||
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01c.svg gradient-live-01c.svg
|
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01c.svg gradient-live-01c.svg
|
||||||
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01d.svg gradient-live-01d.svg
|
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01d.svg gradient-live-01d.svg
|
||||||
== gradient-transform-01.svg gradient-transform-01.svg
|
== gradient-transform-01.svg gradient-transform-01.svg
|
||||||
|
== href-attr-change-restyles.svg href-attr-change-restyles.svg
|
||||||
== import-svg-01.html import-svg-01.html
|
== import-svg-01.html import-svg-01.html
|
||||||
== invalid-text-01.svg invalid-text-01.svg
|
== invalid-text-01.svg invalid-text-01.svg
|
||||||
== lang-attribute-01.svg lang-attribute-01.svg
|
== lang-attribute-01.svg lang-attribute-01.svg
|
||||||
|
@ -201,6 +237,10 @@ fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01d.svg g
|
||||||
== linearGradient-basic-02.svg linearGradient-basic-02.svg
|
== linearGradient-basic-02.svg linearGradient-basic-02.svg
|
||||||
# off-by-one fuzziness expected. OS X is broken with bad aliasing though (bug 1023640).
|
# off-by-one fuzziness expected. OS X is broken with bad aliasing though (bug 1023640).
|
||||||
fuzzy-if(cocoaWidget,15,19679) fuzzy-if(winWidget,1,8800) fuzzy-if(!cocoaWidget&&!winWidget,1,4000) fuzzy-if(skiaContent,1,5000) == linearGradient-basic-03.svg linearGradient-basic-03.svg
|
fuzzy-if(cocoaWidget,15,19679) fuzzy-if(winWidget,1,8800) fuzzy-if(!cocoaWidget&&!winWidget,1,4000) fuzzy-if(skiaContent,1,5000) == linearGradient-basic-03.svg linearGradient-basic-03.svg
|
||||||
|
|
||||||
|
== linked-filter-01.svg linked-filter-01.svg
|
||||||
|
== linked-pattern-01.svg linked-pattern-01.svg
|
||||||
|
|
||||||
fuzzy-if(skiaContent,1,800000) == markers-and-group-opacity-01.svg markers-and-group-opacity-01.svg
|
fuzzy-if(skiaContent,1,800000) == markers-and-group-opacity-01.svg markers-and-group-opacity-01.svg
|
||||||
== marker-attribute-01.svg marker-attribute-01.svg
|
== marker-attribute-01.svg marker-attribute-01.svg
|
||||||
== marker-effects-01.svg marker-effects-01.svg
|
== marker-effects-01.svg marker-effects-01.svg
|
||||||
|
@ -209,22 +249,30 @@ fuzzy-if(skiaContent,1,100) == marker-orientation-01.svg marker-orientation-01.s
|
||||||
fuzzy-if(skiaContent,1,5) pref(svg.marker-improvements.enabled,true) == marker-orientation-02.svg marker-orientation-02.svg
|
fuzzy-if(skiaContent,1,5) pref(svg.marker-improvements.enabled,true) == marker-orientation-02.svg marker-orientation-02.svg
|
||||||
== marker-orientation-03.svg marker-orientation-03.svg
|
== marker-orientation-03.svg marker-orientation-03.svg
|
||||||
== marker-orientation-04.svg marker-orientation-04.svg
|
== marker-orientation-04.svg marker-orientation-04.svg
|
||||||
|
|
||||||
|
# fuzzy because of the differences between clipPath and mask clipping
|
||||||
|
fails == mask-and-clipPath.html mask-and-clipPath.html
|
||||||
|
== mask-and-clipPath-2.svg mask-and-clipPath-2.svg
|
||||||
== mask-basic-01.svg mask-basic-01.svg
|
== mask-basic-01.svg mask-basic-01.svg
|
||||||
fuzzy-if(skiaContent,1,10000) == mask-basic-02.svg mask-basic-02.svg
|
fuzzy-if(skiaContent,1,10000) == mask-basic-02.svg mask-basic-02.svg
|
||||||
== mask-basic-03.svg mask-basic-03.svg
|
== mask-basic-03.svg mask-basic-03.svg
|
||||||
== mask-basic-04.svg mask-basic-04.svg
|
== mask-basic-04.svg mask-basic-04.svg
|
||||||
== mask-extref-dataURI-01.svg mask-extref-dataURI-01.svg
|
|
||||||
== mask-containing-masked-content-01.svg mask-containing-masked-content-01.svg
|
== mask-containing-masked-content-01.svg mask-containing-masked-content-01.svg
|
||||||
|
== mask-empty-size.svg mask-empty-size.svg
|
||||||
|
== mask-extref-dataURI-01.svg mask-extref-dataURI-01.svg
|
||||||
|
== mask-img.html mask-img.html
|
||||||
|
fails == mask-on-outflowElement-01a.html mask-on-outflowElement-01a.html
|
||||||
|
fails == mask-on-outflowElement-01b.html mask-on-outflowElement-01b.html
|
||||||
|
fuzzy(1,5000) == mask-opacity-01.svg mask-opacity-01.svg
|
||||||
== mask-transformed-01.svg mask-transformed-01.svg
|
== mask-transformed-01.svg mask-transformed-01.svg
|
||||||
== mask-transformed-02.svg mask-transformed-02.svg
|
== mask-transformed-02.svg mask-transformed-02.svg
|
||||||
== mask-transformed-child-01.svg mask-transformed-child-01.svg
|
== mask-transformed-child-01.svg mask-transformed-child-01.svg
|
||||||
# fuzzy because of the differences between clipPath and mask clipping
|
|
||||||
fails == mask-and-clipPath.html mask-and-clipPath.html
|
|
||||||
== mask-and-clipPath-2.svg mask-and-clipPath-2.svg
|
|
||||||
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-01.svg mask-type-01.svg
|
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-01.svg mask-type-01.svg
|
||||||
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-02.svg mask-type-02.svg
|
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-02.svg mask-type-02.svg
|
||||||
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-03.svg mask-type-03.svg
|
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-03.svg mask-type-03.svg
|
||||||
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-04.svg mask-type-04.svg
|
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-04.svg mask-type-04.svg
|
||||||
|
== nested-mask-mode.svg nested-mask-mode.svg
|
||||||
|
|
||||||
== nested-viewBox-01.svg nested-viewBox-01.svg
|
== nested-viewBox-01.svg nested-viewBox-01.svg
|
||||||
fuzzy-if(skiaContent,3,448000) == nesting-invalid-01.svg nesting-invalid-01.svg
|
fuzzy-if(skiaContent,3,448000) == nesting-invalid-01.svg nesting-invalid-01.svg
|
||||||
fuzzy-if(d2d&&/^Windows\x20NT\x20(6\.1|10\.0)/.test(http.oscpu),63,168) fuzzy-if(cocoaWidget,1,122) fuzzy-if(skiaContent,2,1000) == non-scaling-stroke-01.svg non-scaling-stroke-01.svg
|
fuzzy-if(d2d&&/^Windows\x20NT\x20(6\.1|10\.0)/.test(http.oscpu),63,168) fuzzy-if(cocoaWidget,1,122) fuzzy-if(skiaContent,2,1000) == non-scaling-stroke-01.svg non-scaling-stroke-01.svg
|
||||||
|
@ -265,8 +313,10 @@ fuzzy(23,60) fails-if(d2d) == path-01.svg path-01.svg
|
||||||
fuzzy-if(skiaContent,1,400) == path-06.svg path-06.svg
|
fuzzy-if(skiaContent,1,400) == path-06.svg path-06.svg
|
||||||
== path-07.svg path-07.svg
|
== path-07.svg path-07.svg
|
||||||
== path-08.svg path-08.svg
|
== path-08.svg path-08.svg
|
||||||
|
|
||||||
== pathLength-01.svg pathLength-01.svg
|
== pathLength-01.svg pathLength-01.svg
|
||||||
== pathLength-02.svg pathLength-02.svg
|
== pathLength-02.svg pathLength-02.svg
|
||||||
|
|
||||||
== pattern-basic-01.svg pattern-basic-01.svg
|
== pattern-basic-01.svg pattern-basic-01.svg
|
||||||
== pattern-invalid-01.svg pattern-invalid-01.svg
|
== pattern-invalid-01.svg pattern-invalid-01.svg
|
||||||
fuzzy-if(skiaContent,1,5) == pattern-live-01a.svg pattern-live-01a.svg
|
fuzzy-if(skiaContent,1,5) == pattern-live-01a.svg pattern-live-01a.svg
|
||||||
|
@ -277,39 +327,61 @@ fuzzy-if(skiaContent,1,5) == pattern-scale-01a.svg pattern-scale-01a.svg
|
||||||
fuzzy-if(skiaContent,3,5) == pattern-scale-01c.svg pattern-scale-01c.svg
|
fuzzy-if(skiaContent,3,5) == pattern-scale-01c.svg pattern-scale-01c.svg
|
||||||
== pattern-transform-presence-01.svg pattern-transform-presence-01.svg
|
== pattern-transform-presence-01.svg pattern-transform-presence-01.svg
|
||||||
== pattern-transformed-01.svg pattern-transformed-01.svg
|
== pattern-transformed-01.svg pattern-transformed-01.svg
|
||||||
|
|
||||||
== polygon-01.svg polygon-01.svg
|
== polygon-01.svg polygon-01.svg
|
||||||
== polygon-marker-01.svg polygon-marker-01.svg
|
== polygon-marker-01.svg polygon-marker-01.svg
|
||||||
== polygon-points-negative-01.svg polygon-points-negative-01.svg
|
== polygon-points-negative-01.svg polygon-points-negative-01.svg
|
||||||
== polyline-points-invalid-01.svg polyline-points-invalid-01.svg
|
== polyline-points-invalid-01.svg polyline-points-invalid-01.svg
|
||||||
|
|
||||||
== pseudo-classes-01.svg pseudo-classes-01.svg
|
== pseudo-classes-01.svg pseudo-classes-01.svg
|
||||||
# This test depends on :visited styles (which are asynchronous), so we run
|
# This test depends on :visited styles (which are asynchronous), so we run
|
||||||
# it in layout/style/test/test_visited_reftests.html instead of using the
|
# it in layout/style/test/test_visited_reftests.html instead of using the
|
||||||
# reftest harness.
|
# reftest harness.
|
||||||
== pseudo-classes-02.svg pseudo-classes-02.svg
|
== pseudo-classes-02.svg pseudo-classes-02.svg
|
||||||
|
|
||||||
== radialGradient-basic-01.svg radialGradient-basic-01.svg
|
== radialGradient-basic-01.svg radialGradient-basic-01.svg
|
||||||
== radialGradient-basic-02.svg radialGradient-basic-02.svg
|
== radialGradient-basic-02.svg radialGradient-basic-02.svg
|
||||||
fuzzy-if(cocoaWidget,4,15982) fuzzy-if(winWidget,4,92) fuzzy-if(skiaContent,4,60) == radialGradient-basic-03.svg radialGradient-basic-03.svg
|
fuzzy-if(cocoaWidget,4,15982) fuzzy-if(winWidget,4,92) fuzzy-if(skiaContent,4,60) == radialGradient-basic-03.svg radialGradient-basic-03.svg
|
||||||
== radialGradient-basic-04.svg radialGradient-basic-04.svg
|
== radialGradient-basic-04.svg radialGradient-basic-04.svg
|
||||||
|
|
||||||
fuzzy-if(skiaContent,1,3600) == rect-01.svg rect-01.svg
|
fuzzy-if(skiaContent,1,3600) == rect-01.svg rect-01.svg
|
||||||
== rect-02.svg rect-02.svg
|
== rect-02.svg rect-02.svg
|
||||||
== rect-03.svg rect-03.svg
|
== rect-03.svg rect-03.svg
|
||||||
== rect-04.svg rect-04.svg
|
== rect-04.svg rect-04.svg
|
||||||
== rect-with-rx-and-ry-01.svg rect-with-rx-and-ry-01.svg
|
== rect-with-rx-and-ry-01.svg rect-with-rx-and-ry-01.svg
|
||||||
== rect-with-rx-or-ry-01.svg rect-with-rx-or-ry-01.svg
|
== rect-with-rx-or-ry-01.svg rect-with-rx-or-ry-01.svg
|
||||||
|
|
||||||
== rootElement-null-01.svg rootElement-null-01.svg
|
== rootElement-null-01.svg rootElement-null-01.svg
|
||||||
|
|
||||||
== script-empty-01.svg script-empty-01.svg
|
== script-empty-01.svg script-empty-01.svg
|
||||||
|
|
||||||
== selector-01.svg selector-01.svg
|
== selector-01.svg selector-01.svg
|
||||||
|
== stroke-dasharray-01.svg stroke-dasharray-01.svg
|
||||||
|
fuzzy-if(skiaContent,1,340) == stroke-dasharray-02.svg stroke-dasharray-02.svg
|
||||||
|
fuzzy-if(skiaContent,1,340) == stroke-dasharray-03.svg stroke-dasharray-03.svg
|
||||||
|
== stroke-dasharray-and-pathLength-01.svg stroke-dasharray-and-pathLength-01.svg
|
||||||
|
== stroke-dasharray-and-text-01.svg stroke-dasharray-and-text-01.svg
|
||||||
|
== stroke-dashoffset-01.svg stroke-dashoffset-01.svg
|
||||||
|
== stroke-dashoffset-and-pathLength-01.svg stroke-dashoffset-and-pathLength-01.svg
|
||||||
== stroke-linecap-circle-ellipse-01.svg stroke-linecap-circle-ellipse-01.svg
|
== stroke-linecap-circle-ellipse-01.svg stroke-linecap-circle-ellipse-01.svg
|
||||||
== stroke-linecap-circle-ellipse-dashed-01.svg stroke-linecap-circle-ellipse-dashed-01.svg
|
== stroke-linecap-circle-ellipse-dashed-01.svg stroke-linecap-circle-ellipse-dashed-01.svg
|
||||||
|
== stroke-linecap-round-w-zero-length-segs-01.svg stroke-linecap-round-w-zero-length-segs-01.svg
|
||||||
|
== stroke-linecap-round-w-zero-length-segs-02.svg stroke-linecap-round-w-zero-length-segs-02.svg
|
||||||
|
== stroke-linecap-square-w-zero-length-segs-01.svg stroke-linecap-square-w-zero-length-segs-01.svg
|
||||||
|
== stroke-linecap-square-w-zero-length-segs-02.svg stroke-linecap-square-w-zero-length-segs-02.svg
|
||||||
|
|
||||||
== stroke-width-percentage-01.svg stroke-width-percentage-01.svg
|
== stroke-width-percentage-01.svg stroke-width-percentage-01.svg
|
||||||
== stroke-width-percentage-02a.svg stroke-width-percentage-02a.svg
|
== stroke-width-percentage-02a.svg stroke-width-percentage-02a.svg
|
||||||
== stroke-width-percentage-02b.svg stroke-width-percentage-02b.svg
|
== stroke-width-percentage-02b.svg stroke-width-percentage-02b.svg
|
||||||
== stroke-width-percentage-03.xhtml stroke-width-percentage-03.xhtml
|
== stroke-width-percentage-03.xhtml stroke-width-percentage-03.xhtml
|
||||||
|
|
||||||
== style-property-on-script-element-01.svg style-property-on-script-element-01.svg
|
== style-property-on-script-element-01.svg style-property-on-script-element-01.svg
|
||||||
== style-without-type-attribute.svg style-without-type-attribute.svg
|
== style-without-type-attribute.svg style-without-type-attribute.svg
|
||||||
== svg-in-foreignObject-01.xhtml svg-in-foreignObject-01.xhtml
|
== svg-in-foreignObject-01.xhtml svg-in-foreignObject-01.xhtml
|
||||||
== svg-in-foreignObject-02.xhtml svg-in-foreignObject-02.xhtml
|
== svg-in-foreignObject-02.xhtml svg-in-foreignObject-02.xhtml
|
||||||
|
|
||||||
== switch-01.svg switch-01.svg
|
== switch-01.svg switch-01.svg
|
||||||
|
|
||||||
== suspend-01.svg suspend-01.svg
|
== suspend-01.svg suspend-01.svg
|
||||||
== suspend-02.svg suspend-02.svg
|
== suspend-02.svg suspend-02.svg
|
||||||
== suspend-03.svg suspend-03.svg
|
== suspend-03.svg suspend-03.svg
|
||||||
|
@ -318,9 +390,15 @@ fuzzy-if(skiaContent,1,3600) == rect-01.svg rect-01.svg
|
||||||
== suspend-06.svg suspend-06.svg
|
== suspend-06.svg suspend-06.svg
|
||||||
== suspend-07.svg suspend-07.svg
|
== suspend-07.svg suspend-07.svg
|
||||||
== suspend-08.svg suspend-08.svg
|
== suspend-08.svg suspend-08.svg
|
||||||
|
|
||||||
|
== svg-effects-area-unzoomed.xhtml svg-effects-area-unzoomed.xhtml
|
||||||
|
== svg-effects-area-zoomed-in.xhtml svg-effects-area-zoomed-in.xhtml
|
||||||
|
== svg-effects-area-zoomed-out.xhtml svg-effects-area-zoomed-out.xhtml
|
||||||
== svg-transform-01.svg svg-transform-01.svg
|
== svg-transform-01.svg svg-transform-01.svg
|
||||||
== svg-transform-02.svg svg-transform-02.svg
|
== svg-transform-02.svg svg-transform-02.svg
|
||||||
|
|
||||||
== symbol-01.svg symbol-01.svg
|
== symbol-01.svg symbol-01.svg
|
||||||
|
|
||||||
== text-font-size-01.svg text-font-size-01.svg
|
== text-font-size-01.svg text-font-size-01.svg
|
||||||
random-if(gtkWidget) == text-font-weight-01.svg text-font-weight-01.svg
|
random-if(gtkWidget) == text-font-weight-01.svg text-font-weight-01.svg
|
||||||
== text-gradient-01.svg text-gradient-01.svg
|
== text-gradient-01.svg text-gradient-01.svg
|
||||||
|
@ -333,6 +411,7 @@ HTTP(..) == text-gradient-04.svg text-gradient-04.svg
|
||||||
# Tests for bug 546813: sanity-check using HTML text, then test SVG behavior.
|
# Tests for bug 546813: sanity-check using HTML text, then test SVG behavior.
|
||||||
== text-language-00.xhtml text-language-00.xhtml
|
== text-language-00.xhtml text-language-00.xhtml
|
||||||
random-if(gtkWidget) == text-language-01.xhtml text-language-01.xhtml
|
random-if(gtkWidget) == text-language-01.xhtml text-language-01.xhtml
|
||||||
|
|
||||||
fuzzy-if(OSX==1007,6,2) fuzzy-if(OSX==1008,46,26) == text-layout-01.svg text-layout-01.svg
|
fuzzy-if(OSX==1007,6,2) fuzzy-if(OSX==1008,46,26) == text-layout-01.svg text-layout-01.svg
|
||||||
== text-layout-02.svg text-layout-02.svg
|
== text-layout-02.svg text-layout-02.svg
|
||||||
== text-layout-03.svg text-layout-03.svg
|
== text-layout-03.svg text-layout-03.svg
|
||||||
|
@ -341,34 +420,28 @@ fuzzy-if(OSX==1007,6,2) fuzzy-if(OSX==1008,46,26) == text-layout-01.svg text-lay
|
||||||
fuzzy-if(cocoaWidget&&layersGPUAccelerated,1,3) == text-layout-06.svg text-layout-06.svg
|
fuzzy-if(cocoaWidget&&layersGPUAccelerated,1,3) == text-layout-06.svg text-layout-06.svg
|
||||||
== text-layout-07.svg text-layout-07.svg
|
== text-layout-07.svg text-layout-07.svg
|
||||||
== text-layout-08.svg text-layout-08.svg
|
== text-layout-08.svg text-layout-08.svg
|
||||||
|
|
||||||
== text-scale-01.svg text-scale-01.svg
|
== text-scale-01.svg text-scale-01.svg
|
||||||
fuzzy-if(skiaContent,2,1000) HTTP(..) == text-scale-02.svg text-scale-02.svg
|
fuzzy-if(skiaContent,2,1000) HTTP(..) == text-scale-02.svg text-scale-02.svg
|
||||||
HTTP(..) == text-scale-03.svg text-scale-03.svg
|
HTTP(..) == text-scale-03.svg text-scale-03.svg
|
||||||
== text-stroke-scaling-01.svg text-stroke-scaling-01.svg
|
== text-stroke-scaling-01.svg text-stroke-scaling-01.svg
|
||||||
== stroke-dasharray-01.svg stroke-dasharray-01.svg
|
|
||||||
fuzzy-if(skiaContent,1,340) == stroke-dasharray-02.svg stroke-dasharray-02.svg
|
|
||||||
fuzzy-if(skiaContent,1,340) == stroke-dasharray-03.svg stroke-dasharray-03.svg
|
|
||||||
== stroke-dasharray-and-pathLength-01.svg stroke-dasharray-and-pathLength-01.svg
|
|
||||||
== stroke-dasharray-and-text-01.svg stroke-dasharray-and-text-01.svg
|
|
||||||
== stroke-dashoffset-01.svg stroke-dashoffset-01.svg
|
|
||||||
== stroke-dashoffset-and-pathLength-01.svg stroke-dashoffset-and-pathLength-01.svg
|
|
||||||
== stroke-linecap-round-w-zero-length-segs-01.svg stroke-linecap-round-w-zero-length-segs-01.svg
|
|
||||||
== stroke-linecap-round-w-zero-length-segs-02.svg stroke-linecap-round-w-zero-length-segs-02.svg
|
|
||||||
== stroke-linecap-square-w-zero-length-segs-01.svg stroke-linecap-square-w-zero-length-segs-01.svg
|
|
||||||
== stroke-linecap-square-w-zero-length-segs-02.svg stroke-linecap-square-w-zero-length-segs-02.svg
|
|
||||||
== textPath-01.svg textPath-01.svg
|
|
||||||
== textPath-02.svg textPath-02.svg
|
|
||||||
fuzzy-if(skiaContent,1,610) == textPath-03.svg textPath-03.svg
|
|
||||||
== textPath-04.svg textPath-04.svg
|
|
||||||
== textPath-05.html textPath-05.html
|
|
||||||
== text-style-01a.svg text-style-01a.svg
|
== text-style-01a.svg text-style-01a.svg
|
||||||
== text-style-01b.svg text-style-01b.svg
|
== text-style-01b.svg text-style-01b.svg
|
||||||
== text-style-01c.svg text-style-01c.svg
|
== text-style-01c.svg text-style-01c.svg
|
||||||
== text-style-01d.svg text-style-01d.svg
|
== text-style-01d.svg text-style-01d.svg
|
||||||
== text-style-01e.svg text-style-01e.svg
|
== text-style-01e.svg text-style-01e.svg
|
||||||
|
|
||||||
== text-white-space-01.svg text-white-space-01.svg
|
== text-white-space-01.svg text-white-space-01.svg
|
||||||
|
|
||||||
|
== textPath-01.svg textPath-01.svg
|
||||||
|
== textPath-02.svg textPath-02.svg
|
||||||
|
fuzzy-if(skiaContent,1,610) == textPath-03.svg textPath-03.svg
|
||||||
|
== textPath-04.svg textPath-04.svg
|
||||||
|
== textPath-05.html textPath-05.html
|
||||||
|
|
||||||
== thin-stroke-01.svg thin-stroke-01.svg
|
== thin-stroke-01.svg thin-stroke-01.svg
|
||||||
== zero-stroke-01.svg zero-stroke-01.svg
|
|
||||||
== tspan-dxdy-01.svg tspan-dxdy-01.svg
|
== tspan-dxdy-01.svg tspan-dxdy-01.svg
|
||||||
== tspan-dxdy-02.svg tspan-dxdy-02.svg
|
== tspan-dxdy-02.svg tspan-dxdy-02.svg
|
||||||
== tspan-dxdy-03.svg tspan-dxdy-03.svg
|
== tspan-dxdy-03.svg tspan-dxdy-03.svg
|
||||||
|
@ -394,7 +467,24 @@ fuzzy-if(skiaContent,1,300) == tspan-xy-05.svg tspan-xy-05.svg
|
||||||
fuzzy-if(skiaContent,1,300) == tspan-xy-06.svg tspan-xy-06.svg
|
fuzzy-if(skiaContent,1,300) == tspan-xy-06.svg tspan-xy-06.svg
|
||||||
fuzzy-if(skiaContent,1,100) == tspan-xy-anchor-middle-01.svg tspan-xy-anchor-middle-01.svg
|
fuzzy-if(skiaContent,1,100) == tspan-xy-anchor-middle-01.svg tspan-xy-anchor-middle-01.svg
|
||||||
fuzzy-if(skiaContent,1,100) == tspan-xy-anchor-end-01.svg tspan-xy-anchor-end-01.svg
|
fuzzy-if(skiaContent,1,100) == tspan-xy-anchor-end-01.svg tspan-xy-anchor-end-01.svg
|
||||||
|
|
||||||
|
== use-01.svg use-01.svg
|
||||||
|
== use-01-extref.svg use-01-extref.svg
|
||||||
|
== use-02-extref.svg use-02-extref.svg
|
||||||
|
== use-extref-dataURI-01.svg use-extref-dataURI-01.svg
|
||||||
|
== use-children.svg use-children.svg
|
||||||
|
|
||||||
|
# test case for Fragment URLs
|
||||||
|
# https://drafts.csswg.org/css-values/#local-urls
|
||||||
|
== use-localRef-marker-01.svg use-localRef-marker-01.svg
|
||||||
|
== use-localRef-clipPath-01.svg use-localRef-clipPath-01.svg
|
||||||
|
== use-localRef-filter-01.svg use-localRef-filter-01.svg
|
||||||
|
== use-localRef-fill-01.svg use-localRef-fill-01.svg
|
||||||
|
== use-localRef-stroke-01.svg use-localRef-stroke-01.svg
|
||||||
|
== use-localRef-mask-01.svg use-localRef-mask-01.svg
|
||||||
|
|
||||||
== userSpaceOnUse-and-pattern-01.svg userSpaceOnUse-and-pattern-01.svg
|
== userSpaceOnUse-and-pattern-01.svg userSpaceOnUse-and-pattern-01.svg
|
||||||
|
|
||||||
== viewBox-and-pattern-01.svg viewBox-and-pattern-01.svg
|
== viewBox-and-pattern-01.svg viewBox-and-pattern-01.svg
|
||||||
== viewBox-and-pattern-02.svg viewBox-and-pattern-02.svg
|
== viewBox-and-pattern-02.svg viewBox-and-pattern-02.svg
|
||||||
== viewBox-and-pattern-03.svg viewBox-and-pattern-03.svg
|
== viewBox-and-pattern-03.svg viewBox-and-pattern-03.svg
|
||||||
|
@ -406,59 +496,4 @@ fuzzy-if(skiaContent,1,100) == tspan-xy-anchor-end-01.svg tspan-xy-anchor-end-01
|
||||||
== viewport-percent-graphic-user-01.svg viewport-percent-graphic-user-01.svg
|
== viewport-percent-graphic-user-01.svg viewport-percent-graphic-user-01.svg
|
||||||
== winding-01.svg winding-01.svg
|
== winding-01.svg winding-01.svg
|
||||||
|
|
||||||
== svg-effects-area-unzoomed.xhtml svg-effects-area-unzoomed.xhtml
|
== zero-stroke-01.svg zero-stroke-01.svg
|
||||||
== svg-effects-area-zoomed-in.xhtml svg-effects-area-zoomed-in.xhtml
|
|
||||||
== svg-effects-area-zoomed-out.xhtml svg-effects-area-zoomed-out.xhtml
|
|
||||||
== href-attr-change-restyles.svg href-attr-change-restyles.svg
|
|
||||||
== mask-img.html mask-img.html
|
|
||||||
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-color-burn.svg blend-color-burn.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-color-dodge.svg blend-color-dodge.svg
|
|
||||||
skip-if(stylo) pref(layout.css.mix-blend-mode.enabled,true) == blend-color.svg blend-color.svg # Too intermittent
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-darken.svg blend-darken.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-difference.svg blend-difference.svg
|
|
||||||
skip-if(Android) fuzzy-if(skiaContent,1,1600) pref(layout.css.mix-blend-mode.enabled,true) == blend-exclusion.svg blend-exclusion.svg
|
|
||||||
skip-if(stylo) pref(layout.css.mix-blend-mode.enabled,true) == blend-hard-light.svg blend-hard-light.svg # Too intermittent
|
|
||||||
skip-if(stylo) pref(layout.css.mix-blend-mode.enabled,true) == blend-hue.svg blend-hue.svg # Too intermittent
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-blend.svg blend-layer-blend.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-filter.svg blend-layer-filter.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-mask.svg blend-layer-mask.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-opacity.svg blend-layer-opacity.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-lighten.svg blend-lighten.svg
|
|
||||||
skip-if(stylo) pref(layout.css.mix-blend-mode.enabled,true) == blend-luminosity.svg blend-luminosity.svg # Too intermittent
|
|
||||||
skip-if(stylo) skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-multiply-alpha.svg blend-multiply-alpha.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-multiply.svg blend-multiply.svg
|
|
||||||
pref(layout.css.mix-blend-mode.enabled,true) == blend-normal.svg blend-normal.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-overlay.svg blend-overlay.svg
|
|
||||||
skip-if(stylo) skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-saturation.svg blend-saturation.svg
|
|
||||||
skip-if(stylo) skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-screen.svg blend-screen.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-soft-light.svg blend-soft-light.svg
|
|
||||||
== blend-difference-stacking.html blend-difference-stacking.html
|
|
||||||
|
|
||||||
# test case for Fragment URLs
|
|
||||||
# https://drafts.csswg.org/css-values/#local-urls
|
|
||||||
== use-localRef-marker-01.svg use-localRef-marker-01.svg
|
|
||||||
== use-localRef-clipPath-01.svg use-localRef-clipPath-01.svg
|
|
||||||
== use-localRef-filter-01.svg use-localRef-filter-01.svg
|
|
||||||
== use-localRef-fill-01.svg use-localRef-fill-01.svg
|
|
||||||
== use-localRef-stroke-01.svg use-localRef-stroke-01.svg
|
|
||||||
== use-localRef-mask-01.svg use-localRef-mask-01.svg
|
|
||||||
|
|
||||||
fuzzy(1,5000) == mask-opacity-01.svg mask-opacity-01.svg
|
|
||||||
|
|
||||||
== clipPath-on-outflowElement-01a.html clipPath-on-outflowElement-01a.html
|
|
||||||
== clipPath-on-outflowElement-01b.html clipPath-on-outflowElement-01b.html
|
|
||||||
|
|
||||||
default-preferences pref(layout.css.clip-path-shapes.enabled,true)
|
|
||||||
fuzzy(1,32400) == clipPath-on-outflowElement-02a.html clipPath-on-outflowElement-02a.html
|
|
||||||
fuzzy(1,32400) == clipPath-on-outflowElement-02b.html clipPath-on-outflowElement-02b.html
|
|
||||||
default-preferences
|
|
||||||
|
|
||||||
fails == mask-on-outflowElement-01a.html mask-on-outflowElement-01a.html
|
|
||||||
fails == mask-on-outflowElement-01b.html mask-on-outflowElement-01b.html
|
|
||||||
|
|
||||||
== clipPath-and-mask-on-outflowElement-01a.html clipPath-and-mask-on-outflowElement-01a.html
|
|
||||||
fails == clipPath-and-mask-on-outflowElement-01b.html clipPath-and-mask-on-outflowElement-01b.html
|
|
||||||
|
|
||||||
== nested-mask-mode.svg nested-mask-mode.svg
|
|
||||||
== mask-empty-size.svg mask-empty-size.svg
|
|
||||||
|
|
|
@ -25,12 +25,47 @@ include moz-only/reftest.list
|
||||||
# svg-integration tests (using svg effects in e.g. HTML)
|
# svg-integration tests (using svg effects in e.g. HTML)
|
||||||
include svg-integration/reftest.list
|
include svg-integration/reftest.list
|
||||||
|
|
||||||
|
== background-svg-without-height.html background-ref.html
|
||||||
|
== background-svg-without-height-width.html background-ref.html
|
||||||
|
== background-svg-without-width.html background-ref.html
|
||||||
|
|
||||||
== baseline-middle-01.svg pass.svg
|
== baseline-middle-01.svg pass.svg
|
||||||
|
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-color-burn.svg blend-color-burn-ref.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-color-dodge.svg blend-color-dodge-ref.svg
|
||||||
|
# pref(layout.css.mix-blend-mode.enabled,true) == blend-color.svg blend-color-ref.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-darken.svg blend-darken-ref.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-difference.svg blend-difference-ref.svg
|
||||||
|
skip-if(Android) fuzzy-if(skiaContent,1,1600) pref(layout.css.mix-blend-mode.enabled,true) == blend-exclusion.svg blend-exclusion-ref.svg
|
||||||
|
# pref(layout.css.mix-blend-mode.enabled,true) == blend-hard-light.svg blend-hard-light-ref.svg
|
||||||
|
# pref(layout.css.mix-blend-mode.enabled,true) == blend-hue.svg blend-hue-ref.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-blend.svg blend-layer-blend-ref.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-filter.svg blend-layer-filter-ref.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-mask.svg blend-layer-mask-ref.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-opacity.svg blend-layer-opacity-ref.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-lighten.svg blend-lighten-ref.svg
|
||||||
|
# pref(layout.css.mix-blend-mode.enabled,true) == blend-luminosity.svg blend-luminosity-ref.svg
|
||||||
|
#skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-multiply-alpha.svg blend-multiply-alpha-ref.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-multiply.svg blend-multiply-ref.svg
|
||||||
|
pref(layout.css.mix-blend-mode.enabled,true) == blend-normal.svg blend-normal-ref.svg
|
||||||
|
#skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-overlay.svg blend-overlay-ref.svg
|
||||||
|
#skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-saturation.svg blend-saturation-ref.svg
|
||||||
|
#skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-screen.svg blend-screen-ref.svg
|
||||||
|
#skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-soft-light.svg blend-soft-light-ref.svg
|
||||||
|
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) fails-if(webrender) == blend-difference-stacking.html blend-difference-stacking-ref.html
|
||||||
|
|
||||||
== border-radius-01.html pass.svg
|
== border-radius-01.html pass.svg
|
||||||
|
|
||||||
== clip-01.svg pass.svg
|
== clip-01.svg pass.svg
|
||||||
== clip-02a.svg clip-02-ref.svg
|
== clip-02a.svg clip-02-ref.svg
|
||||||
== clip-02b.svg clip-02-ref.svg
|
== clip-02b.svg clip-02-ref.svg
|
||||||
|
== clip-surface-clone-01.svg clip-surface-clone-01-ref.svg
|
||||||
|
== clip-use-element-01.svg pass.svg
|
||||||
|
== clip-use-element-02.svg pass.svg
|
||||||
|
|
||||||
== clipPath-advanced-01.svg pass.svg
|
== clipPath-advanced-01.svg pass.svg
|
||||||
|
== clipPath-and-mask-on-outflowElement-01a.html clipPath-on-outflowElement-01-ref.html
|
||||||
|
== clipPath-and-mask-on-outflowElement-01b.html clipPath-on-outflowElement-01-ref.html
|
||||||
fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)||/^Windows\x20NT\x206\.[12]/.test(http.oscpu),1,5) fuzzy-if(OSX,1,6) fuzzy-if(skiaContent,1,630) == clipPath-and-shape-rendering-01.svg clipPath-and-shape-rendering-01-ref.svg # bug 614840
|
fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)||/^Windows\x20NT\x206\.[12]/.test(http.oscpu),1,5) fuzzy-if(OSX,1,6) fuzzy-if(skiaContent,1,630) == clipPath-and-shape-rendering-01.svg clipPath-and-shape-rendering-01-ref.svg # bug 614840
|
||||||
== clipPath-and-transform-01.svg pass.svg
|
== clipPath-and-transform-01.svg pass.svg
|
||||||
== clipPath-basic-01.svg pass.svg
|
== clipPath-basic-01.svg pass.svg
|
||||||
|
@ -40,9 +75,16 @@ fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)||/^Windows\x20NT\x206\.[12]/
|
||||||
== clipPath-basic-05.svg pass.svg
|
== clipPath-basic-05.svg pass.svg
|
||||||
== clipPath-basic-06.svg pass.svg
|
== clipPath-basic-06.svg pass.svg
|
||||||
== clipPath-basic-07.svg pass.svg
|
== clipPath-basic-07.svg pass.svg
|
||||||
|
== clipPath-on-outflowElement-01a.html clipPath-on-outflowElement-01-ref.html
|
||||||
|
== clipPath-on-outflowElement-01b.html clipPath-on-outflowElement-01-ref.html
|
||||||
|
default-preferences pref(layout.css.clip-path-shapes.enabled,true)
|
||||||
|
fuzzy(1,32400) == clipPath-on-outflowElement-02a.html clipPath-on-outflowElement-02-ref.html
|
||||||
|
fuzzy(1,32400) == clipPath-on-outflowElement-02b.html clipPath-on-outflowElement-02-ref.html
|
||||||
|
default-preferences
|
||||||
== clipPath-winding-01.svg pass.svg
|
== clipPath-winding-01.svg pass.svg
|
||||||
== clip-surface-clone-01.svg clip-surface-clone-01-ref.svg
|
|
||||||
== comments-in-pres-attrs.svg pass.svg
|
== comments-in-pres-attrs.svg pass.svg
|
||||||
|
|
||||||
== conditions-01.svg pass.svg
|
== conditions-01.svg pass.svg
|
||||||
== conditions-02.svg pass.svg
|
== conditions-02.svg pass.svg
|
||||||
== conditions-03.svg pass.svg
|
== conditions-03.svg pass.svg
|
||||||
|
@ -51,12 +93,15 @@ fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)||/^Windows\x20NT\x206\.[12]/
|
||||||
== conditions-07.svg pass.svg
|
== conditions-07.svg pass.svg
|
||||||
fuzzy-if(skiaContent,1,320) == conditions-08.svg conditions-08-ref.svg
|
fuzzy-if(skiaContent,1,320) == conditions-08.svg conditions-08-ref.svg
|
||||||
== conditions-09.svg conditions-09-ref.svg
|
== conditions-09.svg conditions-09-ref.svg
|
||||||
|
|
||||||
== currentColor-01.svg pass.svg
|
== currentColor-01.svg pass.svg
|
||||||
== currentColor-02.svg pass.svg
|
== currentColor-02.svg pass.svg
|
||||||
== currentColor-03.svg pass.svg
|
== currentColor-03.svg pass.svg
|
||||||
|
|
||||||
== data-uri-with-filter-01.xhtml data-uri-with-filter-01-ref.svg
|
== data-uri-with-filter-01.xhtml data-uri-with-filter-01-ref.svg
|
||||||
== data-uri-with-gradient-01.xhtml data-uri-with-gradient-01-ref.svg
|
== data-uri-with-gradient-01.xhtml data-uri-with-gradient-01-ref.svg
|
||||||
== data-uri-with-pattern-01.xhtml pass.svg
|
== data-uri-with-pattern-01.xhtml pass.svg
|
||||||
|
|
||||||
== dynamic-attr-removal-1.svg pass.svg
|
== dynamic-attr-removal-1.svg pass.svg
|
||||||
== dynamic-attr-removal-2.svg pass.svg
|
== dynamic-attr-removal-2.svg pass.svg
|
||||||
== dynamic-attr-change-1.svg pass.svg
|
== dynamic-attr-change-1.svg pass.svg
|
||||||
|
@ -136,20 +181,14 @@ random == dynamic-use-nested-01b.svg dynamic-use-nested-01-ref.svg
|
||||||
== dynamic-viewBox-change-01.svg pass.svg
|
== dynamic-viewBox-change-01.svg pass.svg
|
||||||
== dynamic-viewBox-change-02.svg pass.svg
|
== dynamic-viewBox-change-02.svg pass.svg
|
||||||
== dynamic-viewBox-change-03.svg pass.svg
|
== dynamic-viewBox-change-03.svg pass.svg
|
||||||
== fragmentIdentifier-01.xhtml pass.svg
|
|
||||||
== linked-filter-01.svg pass.svg
|
|
||||||
== linked-pattern-01.svg pass.svg
|
|
||||||
== use-01.svg pass.svg
|
|
||||||
== use-01-extref.svg pass.svg
|
|
||||||
== use-02-extref.svg use-02-extref-ref.svg
|
|
||||||
== use-extref-dataURI-01.svg pass.svg
|
|
||||||
== use-children.svg pass.svg
|
|
||||||
== fallback-color-01a.svg pass.svg
|
== fallback-color-01a.svg pass.svg
|
||||||
== fallback-color-01b.svg pass.svg
|
== fallback-color-01b.svg pass.svg
|
||||||
== fallback-color-02a.svg fallback-color-02-ref.svg
|
== fallback-color-02a.svg fallback-color-02-ref.svg
|
||||||
== fallback-color-02b.svg fallback-color-02-ref.svg
|
== fallback-color-02b.svg fallback-color-02-ref.svg
|
||||||
== fallback-color-03.svg pass.svg
|
== fallback-color-03.svg pass.svg
|
||||||
fuzzy-if(skiaContent,1,2) == fallback-color-04.svg pass.svg
|
fuzzy-if(skiaContent,1,2) == fallback-color-04.svg pass.svg
|
||||||
|
|
||||||
== filter-basic-01.svg pass.svg
|
== filter-basic-01.svg pass.svg
|
||||||
== filter-basic-02.svg pass.svg
|
== filter-basic-02.svg pass.svg
|
||||||
== filter-basic-03.svg pass.svg
|
== filter-basic-03.svg pass.svg
|
||||||
|
@ -162,11 +201,14 @@ fails-if(Android) pref(security.fileuri.strict_origin_policy,true) == filter-ext
|
||||||
== filter-foreignObject-01.svg pass.svg
|
== filter-foreignObject-01.svg pass.svg
|
||||||
== filter-in-mask-01.svg pass.svg
|
== filter-in-mask-01.svg pass.svg
|
||||||
== filter-invalidation-01.svg pass.svg
|
== filter-invalidation-01.svg pass.svg
|
||||||
|
fuzzy(71,817) == filter-on-continuation-box-01.html filter-on-continuation-box-ref.html
|
||||||
== filter-result-01.svg filter-result-01-ref.svg
|
== filter-result-01.svg filter-result-01-ref.svg
|
||||||
== filter-scaled-01.svg pass.svg
|
== filter-scaled-01.svg pass.svg
|
||||||
fuzzy-if(skiaContent,1,500) == filter-scaled-02.html filter-scaled-02-ref.html
|
fuzzy-if(skiaContent,1,500) == filter-scaled-02.html filter-scaled-02-ref.html
|
||||||
== filter-translated-01.svg filter-translated-01-ref.svg
|
== filter-translated-01.svg filter-translated-01-ref.svg
|
||||||
|
== filter-use-element-01.svg pass.svg
|
||||||
fuzzy-if(skiaContent,1,800000) == filters-and-group-opacity-01.svg filters-and-group-opacity-01-ref.svg
|
fuzzy-if(skiaContent,1,800000) == filters-and-group-opacity-01.svg filters-and-group-opacity-01-ref.svg
|
||||||
|
|
||||||
== foreignObject-01.svg pass.svg
|
== foreignObject-01.svg pass.svg
|
||||||
== foreignObject-02.svg foreignObject-02-ref.svg
|
== foreignObject-02.svg foreignObject-02-ref.svg
|
||||||
== foreignObject-ancestor-style-change-01.svg foreignObject-ancestor-style-change-01-ref.svg
|
== foreignObject-ancestor-style-change-01.svg foreignObject-ancestor-style-change-01-ref.svg
|
||||||
|
@ -184,13 +226,19 @@ fuzzy-if(Android,18,600) == foreignObject-fixedpos-01.html foreignObject-dynamic
|
||||||
== foreignObject-fixedpos-02.html foreignObject-fixedpos-ref.html
|
== foreignObject-fixedpos-02.html foreignObject-fixedpos-ref.html
|
||||||
== foreignObject-dynamic-fixedpos-01.html foreignObject-dynamic-abspos-01-ref.html
|
== foreignObject-dynamic-fixedpos-01.html foreignObject-dynamic-abspos-01-ref.html
|
||||||
== foreignObject-vertical-01.svg foreignObject-vertical-01-ref.svg
|
== foreignObject-vertical-01.svg foreignObject-vertical-01-ref.svg
|
||||||
|
|
||||||
|
== fragmentIdentifier-01.xhtml pass.svg
|
||||||
|
|
||||||
== g-transform-01.svg pass.svg
|
== g-transform-01.svg pass.svg
|
||||||
|
|
||||||
== getElementById-a-element-01.svg pass.svg
|
== getElementById-a-element-01.svg pass.svg
|
||||||
|
|
||||||
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01a.svg gradient-live-01-ref.svg
|
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01a.svg gradient-live-01-ref.svg
|
||||||
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01b.svg gradient-live-01-ref.svg
|
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01b.svg gradient-live-01-ref.svg
|
||||||
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01c.svg gradient-live-01-ref.svg
|
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01c.svg gradient-live-01-ref.svg
|
||||||
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01d.svg gradient-live-01-ref.svg
|
fuzzy-if(Android,9,980) fuzzy-if(skiaContent,3,32000) == gradient-live-01d.svg gradient-live-01-ref.svg
|
||||||
== gradient-transform-01.svg pass.svg
|
== gradient-transform-01.svg pass.svg
|
||||||
|
== href-attr-change-restyles.svg href-attr-change-restyles-ref.svg
|
||||||
fuzzy-if(skiaContent,1,550) == import-svg-01.html pass.svg
|
fuzzy-if(skiaContent,1,550) == import-svg-01.html pass.svg
|
||||||
== invalid-text-01.svg pass.svg
|
== invalid-text-01.svg pass.svg
|
||||||
== lang-attribute-01.svg pass.svg
|
== lang-attribute-01.svg pass.svg
|
||||||
|
@ -200,6 +248,10 @@ fuzzy-if(skiaContent,1,550) == import-svg-01.html pass.svg
|
||||||
== linearGradient-basic-02.svg pass.svg
|
== linearGradient-basic-02.svg pass.svg
|
||||||
# off-by-one fuzziness expected. OS X is broken with bad aliasing though (bug 1023640).
|
# off-by-one fuzziness expected. OS X is broken with bad aliasing though (bug 1023640).
|
||||||
fuzzy-if(cocoaWidget,15,19679) fuzzy-if(winWidget,1,8800) fuzzy-if(!cocoaWidget&&!winWidget,1,4000) fuzzy-if(skiaContent,1,5000) == linearGradient-basic-03.svg linearGradient-basic-03-ref.svg
|
fuzzy-if(cocoaWidget,15,19679) fuzzy-if(winWidget,1,8800) fuzzy-if(!cocoaWidget&&!winWidget,1,4000) fuzzy-if(skiaContent,1,5000) == linearGradient-basic-03.svg linearGradient-basic-03-ref.svg
|
||||||
|
|
||||||
|
== linked-filter-01.svg pass.svg
|
||||||
|
== linked-pattern-01.svg pass.svg
|
||||||
|
|
||||||
fuzzy-if(skiaContent,1,800000) == markers-and-group-opacity-01.svg markers-and-group-opacity-01-ref.svg
|
fuzzy-if(skiaContent,1,800000) == markers-and-group-opacity-01.svg markers-and-group-opacity-01-ref.svg
|
||||||
== marker-attribute-01.svg pass.svg
|
== marker-attribute-01.svg pass.svg
|
||||||
== marker-effects-01.svg marker-effects-01-ref.svg
|
== marker-effects-01.svg marker-effects-01-ref.svg
|
||||||
|
@ -208,27 +260,40 @@ fuzzy-if(skiaContent,1,100) == marker-orientation-01.svg marker-orientation-01-r
|
||||||
fuzzy-if(skiaContent,1,5) pref(svg.marker-improvements.enabled,true) == marker-orientation-02.svg marker-orientation-02-ref.svg
|
fuzzy-if(skiaContent,1,5) pref(svg.marker-improvements.enabled,true) == marker-orientation-02.svg marker-orientation-02-ref.svg
|
||||||
== marker-orientation-03.svg pass.svg
|
== marker-orientation-03.svg pass.svg
|
||||||
== marker-orientation-04.svg pass.svg
|
== marker-orientation-04.svg pass.svg
|
||||||
|
|
||||||
|
fuzzy(28,28) == mask-and-clipPath.html mask-and-clipPath-ref.html
|
||||||
|
== mask-and-clipPath-2.svg pass.svg
|
||||||
== mask-basic-01.svg pass.svg
|
== mask-basic-01.svg pass.svg
|
||||||
fuzzy-if(skiaContent,1,10000) == mask-basic-02.svg mask-basic-02-ref.svg
|
fuzzy-if(skiaContent,1,10000) == mask-basic-02.svg mask-basic-02-ref.svg
|
||||||
== mask-basic-03.svg pass.svg
|
== mask-basic-03.svg pass.svg
|
||||||
== mask-basic-04.svg pass.svg
|
== mask-basic-04.svg pass.svg
|
||||||
== mask-extref-dataURI-01.svg pass.svg
|
|
||||||
== mask-containing-masked-content-01.svg pass.svg
|
== mask-containing-masked-content-01.svg pass.svg
|
||||||
|
== mask-contains-inner-svg-01.svg pass.svg
|
||||||
|
== mask-contains-inner-svg-02.svg pass.svg
|
||||||
|
== mask-empty-size.svg about:blank
|
||||||
|
== mask-extref-dataURI-01.svg pass.svg
|
||||||
|
== mask-img.html mask-img-ref.html
|
||||||
|
== mask-on-outflowElement-01a.html clipPath-on-outflowElement-01-ref.html
|
||||||
|
== mask-on-outflowElement-01b.html clipPath-on-outflowElement-01-ref.html
|
||||||
|
fuzzy(1,5000) == mask-opacity-01.svg mask-opacity-01-ref.svg
|
||||||
== mask-transformed-01.svg mask-transformed-01-ref.svg
|
== mask-transformed-01.svg mask-transformed-01-ref.svg
|
||||||
== mask-transformed-02.svg pass.svg
|
== mask-transformed-02.svg pass.svg
|
||||||
== mask-transformed-child-01.svg mask-transformed-child-01-ref.svg
|
== mask-transformed-child-01.svg mask-transformed-child-01-ref.svg
|
||||||
# fuzzy because of the differences between clipPath and mask clipping
|
# fuzzy because of the differences between clipPath and mask clipping
|
||||||
fuzzy(28,28) == mask-and-clipPath.html mask-and-clipPath-ref.html
|
|
||||||
== mask-and-clipPath-2.svg pass.svg
|
|
||||||
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-01.svg mask-type-01-ref.svg
|
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-01.svg mask-type-01-ref.svg
|
||||||
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-02.svg mask-type-01-ref.svg
|
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-02.svg mask-type-01-ref.svg
|
||||||
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-03.svg mask-type-01-ref.svg
|
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-03.svg mask-type-01-ref.svg
|
||||||
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-04.svg mask-type-01-ref.svg
|
fuzzy-if(d2d||skiaContent,1,6400) == mask-type-04.svg mask-type-01-ref.svg
|
||||||
|
== mask-use-element-01.svg pass.svg
|
||||||
|
|
||||||
|
!= nested-mask-mode.svg about:blank
|
||||||
== nested-viewBox-01.svg pass.svg
|
== nested-viewBox-01.svg pass.svg
|
||||||
fuzzy-if(skiaContent,3,448000) == nesting-invalid-01.svg nesting-invalid-01-ref.svg
|
fuzzy-if(skiaContent,3,448000) == nesting-invalid-01.svg nesting-invalid-01-ref.svg
|
||||||
|
|
||||||
fuzzy-if(d2d&&/^Windows\x20NT\x20(6\.1|10\.0)/.test(http.oscpu),63,168) fuzzy-if(cocoaWidget,1,122) fuzzy-if(skiaContent,2,1000) == non-scaling-stroke-01.svg non-scaling-stroke-01-ref.svg # bug 1074161 for Win7 and OSX 10.8
|
fuzzy-if(d2d&&/^Windows\x20NT\x20(6\.1|10\.0)/.test(http.oscpu),63,168) fuzzy-if(cocoaWidget,1,122) fuzzy-if(skiaContent,2,1000) == non-scaling-stroke-01.svg non-scaling-stroke-01-ref.svg # bug 1074161 for Win7 and OSX 10.8
|
||||||
fuzzy-if(gtkWidget,1,99) fuzzy-if(!contentSameGfxBackendAsCanvas,9,99) fuzzy-if(Android,9,586) == non-scaling-stroke-02.svg non-scaling-stroke-02-ref.svg
|
fuzzy-if(gtkWidget,1,99) fuzzy-if(!contentSameGfxBackendAsCanvas,9,99) fuzzy-if(Android,9,586) == non-scaling-stroke-02.svg non-scaling-stroke-02-ref.svg
|
||||||
== non-scaling-stroke-03.svg non-scaling-stroke-03-ref.svg
|
== non-scaling-stroke-03.svg non-scaling-stroke-03-ref.svg
|
||||||
|
|
||||||
== objectBoundingBox-and-clipPath.svg pass.svg
|
== objectBoundingBox-and-clipPath.svg pass.svg
|
||||||
# Bug 588684
|
# Bug 588684
|
||||||
random-if(gtkWidget) == objectBoundingBox-and-fePointLight-01.svg objectBoundingBox-and-fePointLight-01-ref.svg
|
random-if(gtkWidget) == objectBoundingBox-and-fePointLight-01.svg objectBoundingBox-and-fePointLight-01-ref.svg
|
||||||
|
@ -240,12 +305,16 @@ random-if(gtkWidget) == objectBoundingBox-and-fePointLight-02.svg objectBounding
|
||||||
== objectBoundingBox-and-pattern-01c.svg objectBoundingBox-and-pattern-01-ref.svg
|
== objectBoundingBox-and-pattern-01c.svg objectBoundingBox-and-pattern-01-ref.svg
|
||||||
== objectBoundingBox-and-pattern-02.svg pass.svg
|
== objectBoundingBox-and-pattern-02.svg pass.svg
|
||||||
== objectBoundingBox-and-pattern-03.svg objectBoundingBox-and-pattern-03-ref.svg
|
== objectBoundingBox-and-pattern-03.svg objectBoundingBox-and-pattern-03-ref.svg
|
||||||
|
|
||||||
== opacity-and-gradient-01.svg pass.svg
|
== opacity-and-gradient-01.svg pass.svg
|
||||||
skip-if(d2d) fuzzy-if(cocoaWidget,1,99974) fuzzy-if(skiaContent,1,200000) == opacity-and-gradient-02.svg opacity-and-gradient-02-ref.svg
|
skip-if(d2d) fuzzy-if(cocoaWidget,1,99974) fuzzy-if(skiaContent,1,200000) == opacity-and-gradient-02.svg opacity-and-gradient-02-ref.svg
|
||||||
== opacity-and-pattern-01.svg pass.svg
|
== opacity-and-pattern-01.svg pass.svg
|
||||||
fuzzy-if(skiaContent,1,10000) == opacity-and-transform-01.svg opacity-and-transform-01-ref.svg
|
fuzzy-if(skiaContent,1,10000) == opacity-and-transform-01.svg opacity-and-transform-01-ref.svg
|
||||||
|
|
||||||
fuzzy-if(Android,8,200) == outer-svg-border-and-padding-01.svg outer-svg-border-and-padding-01-ref.svg
|
fuzzy-if(Android,8,200) == outer-svg-border-and-padding-01.svg outer-svg-border-and-padding-01-ref.svg
|
||||||
|
|
||||||
== outline.html outline-ref.html
|
== outline.html outline-ref.html
|
||||||
|
|
||||||
== overflow-on-outer-svg-01.svg overflow-on-outer-svg-01-ref.svg
|
== overflow-on-outer-svg-01.svg overflow-on-outer-svg-01-ref.svg
|
||||||
== overflow-on-outer-svg-02a.xhtml overflow-on-outer-svg-02-ref.xhtml
|
== overflow-on-outer-svg-02a.xhtml overflow-on-outer-svg-02-ref.xhtml
|
||||||
== overflow-on-outer-svg-02b.xhtml overflow-on-outer-svg-02-ref.xhtml
|
== overflow-on-outer-svg-02b.xhtml overflow-on-outer-svg-02-ref.xhtml
|
||||||
|
@ -253,9 +322,14 @@ fuzzy-if(Android,8,200) == outer-svg-border-and-padding-01.svg outer-svg-border-
|
||||||
== overflow-on-outer-svg-02d.xhtml overflow-on-outer-svg-02-ref.xhtml
|
== overflow-on-outer-svg-02d.xhtml overflow-on-outer-svg-02-ref.xhtml
|
||||||
== overflow-on-outer-svg-03a.xhtml overflow-on-outer-svg-03-ref.xhtml
|
== overflow-on-outer-svg-03a.xhtml overflow-on-outer-svg-03-ref.xhtml
|
||||||
== overflow-on-outer-svg-03b.xhtml overflow-on-outer-svg-03-ref.xhtml
|
== overflow-on-outer-svg-03b.xhtml overflow-on-outer-svg-03-ref.xhtml
|
||||||
|
|
||||||
|
== paint-on-maskLayer-1a.html paint-on-maskLayer-1-ref.html
|
||||||
|
== paint-on-maskLayer-1b.html paint-on-maskLayer-1-ref.html
|
||||||
|
pref(layout.css.clip-path-shapes.enabled,true) == paint-on-maskLayer-1c.html paint-on-maskLayer-1-ref.html
|
||||||
pref(svg.paint-order.enabled,true) == paint-order-01.svg paint-order-01-ref.svg
|
pref(svg.paint-order.enabled,true) == paint-order-01.svg paint-order-01-ref.svg
|
||||||
pref(svg.paint-order.enabled,true) == paint-order-02.svg paint-order-02-ref.svg
|
pref(svg.paint-order.enabled,true) == paint-order-02.svg paint-order-02-ref.svg
|
||||||
pref(svg.paint-order.enabled,true) == paint-order-03.svg paint-order-03-ref.svg
|
pref(svg.paint-order.enabled,true) == paint-order-03.svg paint-order-03-ref.svg
|
||||||
|
|
||||||
#fuzzy(23,60) fails-if(d2d) == path-01.svg path-01-ref.svg
|
#fuzzy(23,60) fails-if(d2d) == path-01.svg path-01-ref.svg
|
||||||
== path-02.svg pass.svg
|
== path-02.svg pass.svg
|
||||||
== path-03.svg pass.svg
|
== path-03.svg pass.svg
|
||||||
|
@ -264,8 +338,10 @@ pref(svg.paint-order.enabled,true) == paint-order-03.svg paint-order-03-ref.svg
|
||||||
fuzzy-if(skiaContent,1,400) == path-06.svg path-06-ref.svg
|
fuzzy-if(skiaContent,1,400) == path-06.svg path-06-ref.svg
|
||||||
== path-07.svg path-07-ref.svg
|
== path-07.svg path-07-ref.svg
|
||||||
== path-08.svg pass.svg
|
== path-08.svg pass.svg
|
||||||
|
|
||||||
== pathLength-01.svg pass.svg
|
== pathLength-01.svg pass.svg
|
||||||
== pathLength-02.svg pass.svg
|
== pathLength-02.svg pass.svg
|
||||||
|
|
||||||
== pattern-basic-01.svg pass.svg
|
== pattern-basic-01.svg pass.svg
|
||||||
== pattern-invalid-01.svg pattern-invalid-01-ref.svg
|
== pattern-invalid-01.svg pattern-invalid-01-ref.svg
|
||||||
fuzzy-if(skiaContent,1,5) == pattern-live-01a.svg pattern-live-01-ref.svg
|
fuzzy-if(skiaContent,1,5) == pattern-live-01a.svg pattern-live-01-ref.svg
|
||||||
|
@ -276,39 +352,61 @@ fuzzy-if(skiaContent,1,5) == pattern-scale-01a.svg pattern-scale-01-ref.svg
|
||||||
fuzzy-if(skiaContent,3,5) == pattern-scale-01c.svg pattern-scale-01-ref.svg
|
fuzzy-if(skiaContent,3,5) == pattern-scale-01c.svg pattern-scale-01-ref.svg
|
||||||
== pattern-transform-presence-01.svg pattern-transform-presence-01-ref.svg
|
== pattern-transform-presence-01.svg pattern-transform-presence-01-ref.svg
|
||||||
== pattern-transformed-01.svg pattern-transformed-01-ref.svg
|
== pattern-transformed-01.svg pattern-transformed-01-ref.svg
|
||||||
|
|
||||||
== polygon-01.svg polygon-01-ref.svg
|
== polygon-01.svg polygon-01-ref.svg
|
||||||
== polygon-marker-01.svg pass.svg
|
== polygon-marker-01.svg pass.svg
|
||||||
== polygon-points-negative-01.svg pass.svg
|
== polygon-points-negative-01.svg pass.svg
|
||||||
== polyline-points-invalid-01.svg pass.svg
|
== polyline-points-invalid-01.svg pass.svg
|
||||||
|
|
||||||
== pseudo-classes-01.svg pass.svg
|
== pseudo-classes-01.svg pass.svg
|
||||||
# This test depends on :visited styles (which are asynchronous), so we run
|
# This test depends on :visited styles (which are asynchronous), so we run
|
||||||
# it in layout/style/test/test_visited_reftests.html instead of using the
|
# it in layout/style/test/test_visited_reftests.html instead of using the
|
||||||
# reftest harness.
|
# reftest harness.
|
||||||
# == pseudo-classes-02.svg pseudo-classes-02-ref.svg
|
# == pseudo-classes-02.svg pseudo-classes-02-ref.svg
|
||||||
|
|
||||||
== radialGradient-basic-01.svg pass.svg
|
== radialGradient-basic-01.svg pass.svg
|
||||||
== radialGradient-basic-02.svg pass.svg
|
== radialGradient-basic-02.svg pass.svg
|
||||||
fuzzy-if(cocoaWidget,4,15982) fuzzy-if(winWidget,4,92) fuzzy-if(skiaContent,4,60) == radialGradient-basic-03.svg radialGradient-basic-03-ref.svg
|
fuzzy-if(cocoaWidget,4,15982) fuzzy-if(winWidget,4,92) fuzzy-if(skiaContent,4,60) == radialGradient-basic-03.svg radialGradient-basic-03-ref.svg
|
||||||
== radialGradient-basic-04.svg pass.svg
|
== radialGradient-basic-04.svg pass.svg
|
||||||
|
|
||||||
fuzzy-if(skiaContent,1,3600) == rect-01.svg pass.svg
|
fuzzy-if(skiaContent,1,3600) == rect-01.svg pass.svg
|
||||||
== rect-02.svg pass.svg
|
== rect-02.svg pass.svg
|
||||||
== rect-03.svg pass.svg
|
== rect-03.svg pass.svg
|
||||||
== rect-04.svg pass.svg
|
== rect-04.svg pass.svg
|
||||||
== rect-with-rx-and-ry-01.svg pass.svg
|
== rect-with-rx-and-ry-01.svg pass.svg
|
||||||
== rect-with-rx-or-ry-01.svg rect-with-rx-or-ry-01-ref.svg
|
== rect-with-rx-or-ry-01.svg rect-with-rx-or-ry-01-ref.svg
|
||||||
|
|
||||||
== rootElement-null-01.svg pass.svg
|
== rootElement-null-01.svg pass.svg
|
||||||
|
|
||||||
== script-empty-01.svg pass.svg
|
== script-empty-01.svg pass.svg
|
||||||
|
|
||||||
== selector-01.svg pass.svg
|
== selector-01.svg pass.svg
|
||||||
|
|
||||||
|
== stroke-dasharray-01.svg stroke-dasharray-01-ref.svg
|
||||||
|
fuzzy-if(skiaContent,1,340) == stroke-dasharray-02.svg pass.svg
|
||||||
|
fuzzy-if(skiaContent,1,340) == stroke-dasharray-03.svg pass.svg
|
||||||
|
== stroke-dasharray-and-pathLength-01.svg pass.svg
|
||||||
|
== stroke-dasharray-and-text-01.svg stroke-dasharray-and-text-01-ref.svg
|
||||||
|
== stroke-dashoffset-01.svg pass.svg
|
||||||
|
== stroke-dashoffset-and-pathLength-01.svg pass.svg
|
||||||
== stroke-linecap-circle-ellipse-01.svg stroke-linecap-circle-ellipse-01-ref.svg
|
== stroke-linecap-circle-ellipse-01.svg stroke-linecap-circle-ellipse-01-ref.svg
|
||||||
== stroke-linecap-circle-ellipse-dashed-01.svg pass.svg
|
== stroke-linecap-circle-ellipse-dashed-01.svg pass.svg
|
||||||
|
== stroke-linecap-round-w-zero-length-segs-01.svg pass.svg
|
||||||
|
== stroke-linecap-round-w-zero-length-segs-02.svg pass.svg
|
||||||
|
== stroke-linecap-square-w-zero-length-segs-01.svg pass.svg
|
||||||
|
== stroke-linecap-square-w-zero-length-segs-02.svg pass.svg
|
||||||
== stroke-width-percentage-01.svg pass.svg
|
== stroke-width-percentage-01.svg pass.svg
|
||||||
== stroke-width-percentage-02a.svg stroke-width-percentage-02-ref.svg
|
== stroke-width-percentage-02a.svg stroke-width-percentage-02-ref.svg
|
||||||
== stroke-width-percentage-02b.svg stroke-width-percentage-02-ref.svg
|
== stroke-width-percentage-02b.svg stroke-width-percentage-02-ref.svg
|
||||||
== stroke-width-percentage-03.xhtml stroke-width-percentage-03-ref.xhtml
|
== stroke-width-percentage-03.xhtml stroke-width-percentage-03-ref.xhtml
|
||||||
|
|
||||||
== style-property-on-script-element-01.svg pass.svg
|
== style-property-on-script-element-01.svg pass.svg
|
||||||
== style-without-type-attribute.svg pass.svg
|
== style-without-type-attribute.svg pass.svg
|
||||||
|
|
||||||
== svg-in-foreignObject-01.xhtml svg-in-foreignObject-01-ref.xhtml
|
== svg-in-foreignObject-01.xhtml svg-in-foreignObject-01-ref.xhtml
|
||||||
fuzzy-if(skiaContent,1,2600) == svg-in-foreignObject-02.xhtml svg-in-foreignObject-01-ref.xhtml # reuse -01-ref.xhtml
|
fuzzy-if(skiaContent,1,2600) == svg-in-foreignObject-02.xhtml svg-in-foreignObject-01-ref.xhtml # reuse -01-ref.xhtml
|
||||||
== switch-01.svg pass.svg
|
== switch-01.svg pass.svg
|
||||||
|
|
||||||
== suspend-01.svg pass.svg
|
== suspend-01.svg pass.svg
|
||||||
== suspend-02.svg pass.svg
|
== suspend-02.svg pass.svg
|
||||||
== suspend-03.svg pass.svg
|
== suspend-03.svg pass.svg
|
||||||
|
@ -317,9 +415,15 @@ fuzzy-if(skiaContent,1,2600) == svg-in-foreignObject-02.xhtml svg-in-foreignObje
|
||||||
== suspend-06.svg pass.svg
|
== suspend-06.svg pass.svg
|
||||||
== suspend-07.svg pass.svg
|
== suspend-07.svg pass.svg
|
||||||
== suspend-08.svg pass.svg
|
== suspend-08.svg pass.svg
|
||||||
|
|
||||||
|
== svg-effects-area-unzoomed.xhtml svg-effects-area-unzoomed-ref.xhtml
|
||||||
|
== svg-effects-area-zoomed-in.xhtml svg-effects-area-zoomed-in-ref.xhtml
|
||||||
|
== svg-effects-area-zoomed-out.xhtml svg-effects-area-zoomed-out-ref.xhtml
|
||||||
== svg-transform-01.svg pass.svg
|
== svg-transform-01.svg pass.svg
|
||||||
== svg-transform-02.svg pass.svg
|
== svg-transform-02.svg pass.svg
|
||||||
|
|
||||||
== symbol-01.svg symbol-01-ref.svg
|
== symbol-01.svg symbol-01-ref.svg
|
||||||
|
|
||||||
== text-font-size-01.svg pass.svg
|
== text-font-size-01.svg pass.svg
|
||||||
random-if(gtkWidget) == text-font-weight-01.svg text-font-weight-01-ref.svg # bug 386713
|
random-if(gtkWidget) == text-font-weight-01.svg text-font-weight-01-ref.svg # bug 386713
|
||||||
== text-gradient-01.svg text-gradient-01-ref.svg
|
== text-gradient-01.svg text-gradient-01-ref.svg
|
||||||
|
@ -343,31 +447,23 @@ fuzzy-if(cocoaWidget&&layersGPUAccelerated,1,3) == text-layout-06.svg text-layou
|
||||||
== text-scale-01.svg text-scale-01-ref.svg
|
== text-scale-01.svg text-scale-01-ref.svg
|
||||||
fuzzy-if(skiaContent,2,1000) HTTP(..) == text-scale-02.svg text-scale-02-ref.svg
|
fuzzy-if(skiaContent,2,1000) HTTP(..) == text-scale-02.svg text-scale-02-ref.svg
|
||||||
HTTP(..) == text-scale-03.svg text-scale-03-ref.svg
|
HTTP(..) == text-scale-03.svg text-scale-03-ref.svg
|
||||||
== text-stroke-scaling-01.svg text-stroke-scaling-01-ref.svg
|
|
||||||
== stroke-dasharray-01.svg stroke-dasharray-01-ref.svg
|
|
||||||
fuzzy-if(skiaContent,1,340) == stroke-dasharray-02.svg pass.svg
|
|
||||||
fuzzy-if(skiaContent,1,340) == stroke-dasharray-03.svg pass.svg
|
|
||||||
== stroke-dasharray-and-pathLength-01.svg pass.svg
|
|
||||||
== stroke-dasharray-and-text-01.svg stroke-dasharray-and-text-01-ref.svg
|
|
||||||
== stroke-dashoffset-01.svg pass.svg
|
|
||||||
== stroke-dashoffset-and-pathLength-01.svg pass.svg
|
|
||||||
== stroke-linecap-round-w-zero-length-segs-01.svg pass.svg
|
|
||||||
== stroke-linecap-round-w-zero-length-segs-02.svg pass.svg
|
|
||||||
== stroke-linecap-square-w-zero-length-segs-01.svg pass.svg
|
|
||||||
== stroke-linecap-square-w-zero-length-segs-02.svg pass.svg
|
|
||||||
== textPath-01.svg textPath-01-ref.svg
|
|
||||||
== textPath-02.svg pass.svg
|
|
||||||
fuzzy-if(skiaContent,1,610) == textPath-03.svg pass.svg
|
|
||||||
== textPath-04.svg pass.svg
|
|
||||||
== textPath-05.html pass.svg
|
|
||||||
== text-style-01a.svg text-style-01-ref.svg
|
== text-style-01a.svg text-style-01-ref.svg
|
||||||
== text-style-01b.svg text-style-01-ref.svg
|
== text-style-01b.svg text-style-01-ref.svg
|
||||||
== text-style-01c.svg text-style-01-ref.svg
|
== text-style-01c.svg text-style-01-ref.svg
|
||||||
== text-style-01d.svg text-style-01-ref.svg
|
== text-style-01d.svg text-style-01-ref.svg
|
||||||
== text-style-01e.svg text-style-01-ref.svg
|
== text-style-01e.svg text-style-01-ref.svg
|
||||||
|
|
||||||
|
== text-stroke-scaling-01.svg text-stroke-scaling-01-ref.svg
|
||||||
|
== textPath-01.svg textPath-01-ref.svg
|
||||||
|
== textPath-02.svg pass.svg
|
||||||
|
fuzzy-if(skiaContent,1,610) == textPath-03.svg pass.svg
|
||||||
|
== textPath-04.svg pass.svg
|
||||||
|
== textPath-05.html pass.svg
|
||||||
|
|
||||||
== text-white-space-01.svg text-white-space-01-ref.svg
|
== text-white-space-01.svg text-white-space-01-ref.svg
|
||||||
|
|
||||||
== thin-stroke-01.svg pass.svg
|
== thin-stroke-01.svg pass.svg
|
||||||
== zero-stroke-01.svg pass.svg
|
|
||||||
== tspan-dxdy-01.svg tspan-dxdy-ref.svg
|
== tspan-dxdy-01.svg tspan-dxdy-ref.svg
|
||||||
== tspan-dxdy-02.svg tspan-dxdy-ref.svg
|
== tspan-dxdy-02.svg tspan-dxdy-ref.svg
|
||||||
== tspan-dxdy-03.svg tspan-dxdy-ref.svg
|
== tspan-dxdy-03.svg tspan-dxdy-ref.svg
|
||||||
|
@ -393,7 +489,24 @@ fuzzy-if(skiaContent,1,300) == tspan-xy-05.svg tspan-xy-ref.svg
|
||||||
fuzzy-if(skiaContent,1,300) == tspan-xy-06.svg tspan-xy-ref.svg
|
fuzzy-if(skiaContent,1,300) == tspan-xy-06.svg tspan-xy-ref.svg
|
||||||
fuzzy-if(skiaContent,1,100) == tspan-xy-anchor-middle-01.svg tspan-xy-anchor-middle-ref.svg
|
fuzzy-if(skiaContent,1,100) == tspan-xy-anchor-middle-01.svg tspan-xy-anchor-middle-ref.svg
|
||||||
fuzzy-if(skiaContent,1,100) == tspan-xy-anchor-end-01.svg tspan-xy-anchor-end-ref.svg
|
fuzzy-if(skiaContent,1,100) == tspan-xy-anchor-end-01.svg tspan-xy-anchor-end-ref.svg
|
||||||
|
|
||||||
|
== use-01.svg pass.svg
|
||||||
|
== use-01-extref.svg pass.svg
|
||||||
|
== use-02-extref.svg use-02-extref-ref.svg
|
||||||
|
== use-extref-dataURI-01.svg pass.svg
|
||||||
|
== use-children.svg pass.svg
|
||||||
|
|
||||||
|
# test case for Fragment URLs
|
||||||
|
# https://drafts.csswg.org/css-values/#local-urls
|
||||||
|
== use-localRef-marker-01.svg use-localRef-marker-01-ref.svg
|
||||||
|
== use-localRef-clipPath-01.svg use-localRef-clipPath-01-ref.svg
|
||||||
|
== use-localRef-filter-01.svg use-localRef-filter-01-ref.svg
|
||||||
|
== use-localRef-fill-01.svg use-localRef-fill-01-ref.svg
|
||||||
|
== use-localRef-stroke-01.svg use-localRef-stroke-01-ref.svg
|
||||||
|
== use-localRef-mask-01.svg use-localRef-mask-01-ref.svg
|
||||||
|
|
||||||
== userSpaceOnUse-and-pattern-01.svg userSpaceOnUse-and-pattern-01-ref.svg
|
== userSpaceOnUse-and-pattern-01.svg userSpaceOnUse-and-pattern-01-ref.svg
|
||||||
|
|
||||||
== viewBox-and-pattern-01.svg pass.svg
|
== viewBox-and-pattern-01.svg pass.svg
|
||||||
== viewBox-and-pattern-02.svg pass.svg
|
== viewBox-and-pattern-02.svg pass.svg
|
||||||
== viewBox-and-pattern-03.svg pass.svg
|
== viewBox-and-pattern-03.svg pass.svg
|
||||||
|
@ -405,76 +518,4 @@ fuzzy-if(skiaContent,1,100) == tspan-xy-anchor-end-01.svg tspan-xy-anchor-end-re
|
||||||
== viewport-percent-graphic-user-01.svg pass.svg
|
== viewport-percent-graphic-user-01.svg pass.svg
|
||||||
== winding-01.svg pass.svg
|
== winding-01.svg pass.svg
|
||||||
|
|
||||||
== svg-effects-area-unzoomed.xhtml svg-effects-area-unzoomed-ref.xhtml
|
== zero-stroke-01.svg pass.svg
|
||||||
== svg-effects-area-zoomed-in.xhtml svg-effects-area-zoomed-in-ref.xhtml
|
|
||||||
== svg-effects-area-zoomed-out.xhtml svg-effects-area-zoomed-out-ref.xhtml
|
|
||||||
== href-attr-change-restyles.svg href-attr-change-restyles-ref.svg
|
|
||||||
== mask-img.html mask-img-ref.html
|
|
||||||
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-color-burn.svg blend-color-burn-ref.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-color-dodge.svg blend-color-dodge-ref.svg
|
|
||||||
# pref(layout.css.mix-blend-mode.enabled,true) == blend-color.svg blend-color-ref.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-darken.svg blend-darken-ref.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-difference.svg blend-difference-ref.svg
|
|
||||||
skip-if(Android) fuzzy-if(skiaContent,1,1600) pref(layout.css.mix-blend-mode.enabled,true) == blend-exclusion.svg blend-exclusion-ref.svg
|
|
||||||
# pref(layout.css.mix-blend-mode.enabled,true) == blend-hard-light.svg blend-hard-light-ref.svg
|
|
||||||
# pref(layout.css.mix-blend-mode.enabled,true) == blend-hue.svg blend-hue-ref.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-blend.svg blend-layer-blend-ref.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-filter.svg blend-layer-filter-ref.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-mask.svg blend-layer-mask-ref.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-opacity.svg blend-layer-opacity-ref.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-lighten.svg blend-lighten-ref.svg
|
|
||||||
# pref(layout.css.mix-blend-mode.enabled,true) == blend-luminosity.svg blend-luminosity-ref.svg
|
|
||||||
#skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-multiply-alpha.svg blend-multiply-alpha-ref.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-multiply.svg blend-multiply-ref.svg
|
|
||||||
pref(layout.css.mix-blend-mode.enabled,true) == blend-normal.svg blend-normal-ref.svg
|
|
||||||
#skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-overlay.svg blend-overlay-ref.svg
|
|
||||||
#skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-saturation.svg blend-saturation-ref.svg
|
|
||||||
#skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-screen.svg blend-screen-ref.svg
|
|
||||||
#skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-soft-light.svg blend-soft-light-ref.svg
|
|
||||||
skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-difference-stacking.html blend-difference-stacking-ref.html
|
|
||||||
|
|
||||||
# test case for Fragment URLs
|
|
||||||
# https://drafts.csswg.org/css-values/#local-urls
|
|
||||||
== use-localRef-marker-01.svg use-localRef-marker-01-ref.svg
|
|
||||||
== use-localRef-clipPath-01.svg use-localRef-clipPath-01-ref.svg
|
|
||||||
== use-localRef-filter-01.svg use-localRef-filter-01-ref.svg
|
|
||||||
== use-localRef-fill-01.svg use-localRef-fill-01-ref.svg
|
|
||||||
== use-localRef-stroke-01.svg use-localRef-stroke-01-ref.svg
|
|
||||||
== use-localRef-mask-01.svg use-localRef-mask-01-ref.svg
|
|
||||||
|
|
||||||
fuzzy(1,5000) == mask-opacity-01.svg mask-opacity-01-ref.svg
|
|
||||||
|
|
||||||
== clipPath-on-outflowElement-01a.html clipPath-on-outflowElement-01-ref.html
|
|
||||||
== clipPath-on-outflowElement-01b.html clipPath-on-outflowElement-01-ref.html
|
|
||||||
|
|
||||||
default-preferences pref(layout.css.clip-path-shapes.enabled,true)
|
|
||||||
fuzzy(1,32400) == clipPath-on-outflowElement-02a.html clipPath-on-outflowElement-02-ref.html
|
|
||||||
fuzzy(1,32400) == clipPath-on-outflowElement-02b.html clipPath-on-outflowElement-02-ref.html
|
|
||||||
default-preferences
|
|
||||||
|
|
||||||
== mask-on-outflowElement-01a.html clipPath-on-outflowElement-01-ref.html
|
|
||||||
== mask-on-outflowElement-01b.html clipPath-on-outflowElement-01-ref.html
|
|
||||||
|
|
||||||
== clipPath-and-mask-on-outflowElement-01a.html clipPath-on-outflowElement-01-ref.html
|
|
||||||
== clipPath-and-mask-on-outflowElement-01b.html clipPath-on-outflowElement-01-ref.html
|
|
||||||
|
|
||||||
!= nested-mask-mode.svg about:blank
|
|
||||||
== mask-empty-size.svg about:blank
|
|
||||||
|
|
||||||
== paint-on-maskLayer-1a.html paint-on-maskLayer-1-ref.html
|
|
||||||
== paint-on-maskLayer-1b.html paint-on-maskLayer-1-ref.html
|
|
||||||
pref(layout.css.clip-path-shapes.enabled,true) == paint-on-maskLayer-1c.html paint-on-maskLayer-1-ref.html
|
|
||||||
|
|
||||||
fuzzy(71,817) == filter-on-continuation-box-01.html filter-on-continuation-box-ref.html
|
|
||||||
== mask-contains-inner-svg-01.svg pass.svg
|
|
||||||
== mask-contains-inner-svg-02.svg pass.svg
|
|
||||||
|
|
||||||
== mask-use-element-01.svg pass.svg
|
|
||||||
== clip-use-element-01.svg pass.svg
|
|
||||||
== clip-use-element-02.svg pass.svg
|
|
||||||
== filter-use-element-01.svg pass.svg
|
|
||||||
|
|
||||||
== background-svg-without-height.html background-ref.html
|
|
||||||
== background-svg-without-height-width.html background-ref.html
|
|
||||||
== background-svg-without-width.html background-ref.html
|
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#ifndef mozilla_dom_CSSNamespaceRule_h
|
||||||
|
#define mozilla_dom_CSSNamespaceRule_h
|
||||||
|
|
||||||
|
#include "mozilla/css/Rule.h"
|
||||||
|
#include "mozilla/dom/CSSNamespaceRuleBinding.h"
|
||||||
|
|
||||||
|
class nsIAtom;
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
namespace dom {
|
||||||
|
|
||||||
|
class CSSNamespaceRule : public css::Rule
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
using Rule::Rule;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool IsCCLeaf() const final {
|
||||||
|
return Rule::IsCCLeaf();
|
||||||
|
}
|
||||||
|
int32_t GetType() const final {
|
||||||
|
return Rule::NAMESPACE_RULE;
|
||||||
|
}
|
||||||
|
using Rule::GetType;
|
||||||
|
|
||||||
|
virtual nsIAtom* GetPrefix() const = 0;
|
||||||
|
virtual void GetURLSpec(nsString& aURLSpec) const = 0;
|
||||||
|
|
||||||
|
// WebIDL interfaces
|
||||||
|
uint16_t Type() const final {
|
||||||
|
return nsIDOMCSSRule::NAMESPACE_RULE;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const = 0;
|
||||||
|
|
||||||
|
JSObject* WrapObject(JSContext* aCx,
|
||||||
|
JS::Handle<JSObject*> aGivenProto) final {
|
||||||
|
return CSSNamespaceRuleBinding::Wrap(aCx, this, aGivenProto);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace dom
|
||||||
|
} // namespace mozilla
|
||||||
|
|
||||||
|
#endif // mozilla_dom_CSSNamespaceRule_h
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
#include "mozilla/Attributes.h"
|
#include "mozilla/Attributes.h"
|
||||||
#include "mozilla/MemoryReporting.h"
|
#include "mozilla/MemoryReporting.h"
|
||||||
#include "mozilla/css/Rule.h"
|
#include "mozilla/dom/CSSNamespaceRule.h"
|
||||||
|
|
||||||
#include "nsIDOMCSSRule.h"
|
#include "nsIDOMCSSRule.h"
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ class nsIAtom;
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace css {
|
namespace css {
|
||||||
|
|
||||||
class NameSpaceRule final : public Rule
|
class NameSpaceRule final : public dom::CSSNamespaceRule
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NameSpaceRule(nsIAtom* aPrefix, const nsString& aURLSpec,
|
NameSpaceRule(nsIAtom* aPrefix, const nsString& aURLSpec,
|
||||||
|
@ -37,28 +37,19 @@ public:
|
||||||
NS_DECLARE_STATIC_IID_ACCESSOR(NS_CSS_NAMESPACE_RULE_IMPL_CID)
|
NS_DECLARE_STATIC_IID_ACCESSOR(NS_CSS_NAMESPACE_RULE_IMPL_CID)
|
||||||
|
|
||||||
NS_DECL_ISUPPORTS_INHERITED
|
NS_DECL_ISUPPORTS_INHERITED
|
||||||
virtual bool IsCCLeaf() const override;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
virtual void List(FILE* out = stdout, int32_t aIndent = 0) const override;
|
virtual void List(FILE* out = stdout, int32_t aIndent = 0) const override;
|
||||||
#endif
|
#endif
|
||||||
virtual int32_t GetType() const override;
|
|
||||||
using Rule::GetType;
|
|
||||||
virtual already_AddRefed<Rule> Clone() const override;
|
virtual already_AddRefed<Rule> Clone() const override;
|
||||||
|
|
||||||
nsIAtom* GetPrefix() const { return mPrefix; }
|
nsIAtom* GetPrefix() const final { return mPrefix; }
|
||||||
|
void GetURLSpec(nsString& aURLSpec) const final { aURLSpec = mURLSpec; }
|
||||||
void GetURLSpec(nsString& aURLSpec) const { aURLSpec = mURLSpec; }
|
|
||||||
|
|
||||||
// WebIDL interface
|
// WebIDL interface
|
||||||
uint16_t Type() const override;
|
|
||||||
void GetCssTextImpl(nsAString& aCssText) const override;
|
void GetCssTextImpl(nsAString& aCssText) const override;
|
||||||
|
|
||||||
virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
|
size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const final;
|
||||||
override MOZ_MUST_OVERRIDE;
|
|
||||||
|
|
||||||
virtual JSObject* WrapObject(JSContext* aCx,
|
|
||||||
JS::Handle<JSObject*> aGivenProto) override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
nsCOMPtr<nsIAtom> mPrefix;
|
nsCOMPtr<nsIAtom> mPrefix;
|
||||||
|
|
|
@ -15,3 +15,4 @@ SERVO_ARC_TYPE(ImportRule, RawServoImportRule)
|
||||||
SERVO_ARC_TYPE(AnimationValue, RawServoAnimationValue)
|
SERVO_ARC_TYPE(AnimationValue, RawServoAnimationValue)
|
||||||
SERVO_ARC_TYPE(MediaList, RawServoMediaList)
|
SERVO_ARC_TYPE(MediaList, RawServoMediaList)
|
||||||
SERVO_ARC_TYPE(MediaRule, RawServoMediaRule)
|
SERVO_ARC_TYPE(MediaRule, RawServoMediaRule)
|
||||||
|
SERVO_ARC_TYPE(NamespaceRule, RawServoNamespaceRule)
|
||||||
|
|
|
@ -76,10 +76,6 @@ SERVO_BINDING_FUNC(Servo_StyleSet_FillKeyframesForName, bool,
|
||||||
SERVO_BINDING_FUNC(Servo_CssRules_ListTypes, void,
|
SERVO_BINDING_FUNC(Servo_CssRules_ListTypes, void,
|
||||||
ServoCssRulesBorrowed rules,
|
ServoCssRulesBorrowed rules,
|
||||||
nsTArrayBorrowed_uintptr_t result)
|
nsTArrayBorrowed_uintptr_t result)
|
||||||
SERVO_BINDING_FUNC(Servo_CssRules_GetStyleRuleAt, RawServoStyleRuleStrong,
|
|
||||||
ServoCssRulesBorrowed rules, uint32_t index)
|
|
||||||
SERVO_BINDING_FUNC(Servo_CssRules_GetMediaRuleAt, RawServoMediaRuleStrong,
|
|
||||||
ServoCssRulesBorrowed rules, uint32_t index)
|
|
||||||
SERVO_BINDING_FUNC(Servo_CssRules_InsertRule, nsresult,
|
SERVO_BINDING_FUNC(Servo_CssRules_InsertRule, nsresult,
|
||||||
ServoCssRulesBorrowed rules,
|
ServoCssRulesBorrowed rules,
|
||||||
RawServoStyleSheetBorrowed sheet, const nsACString* rule,
|
RawServoStyleSheetBorrowed sheet, const nsACString* rule,
|
||||||
|
@ -88,25 +84,33 @@ SERVO_BINDING_FUNC(Servo_CssRules_DeleteRule, nsresult,
|
||||||
ServoCssRulesBorrowed rules, uint32_t index)
|
ServoCssRulesBorrowed rules, uint32_t index)
|
||||||
|
|
||||||
// CSS Rules
|
// CSS Rules
|
||||||
SERVO_BINDING_FUNC(Servo_StyleRule_Debug, void,
|
#define BASIC_RULE_FUNCS(type_) \
|
||||||
RawServoStyleRuleBorrowed rule, nsACString* result)
|
SERVO_BINDING_FUNC(Servo_CssRules_Get##type_##RuleAt, \
|
||||||
|
RawServo##type_##RuleStrong, \
|
||||||
|
ServoCssRulesBorrowed rules, uint32_t index) \
|
||||||
|
SERVO_BINDING_FUNC(Servo_##type_##Rule_Debug, void, \
|
||||||
|
RawServo##type_##RuleBorrowed rule, nsACString* result) \
|
||||||
|
SERVO_BINDING_FUNC(Servo_##type_##Rule_GetCssText, void, \
|
||||||
|
RawServo##type_##RuleBorrowed rule, nsAString* result)
|
||||||
|
BASIC_RULE_FUNCS(Style)
|
||||||
|
BASIC_RULE_FUNCS(Media)
|
||||||
|
BASIC_RULE_FUNCS(Namespace)
|
||||||
|
#undef BASIC_RULE_FUNCS
|
||||||
SERVO_BINDING_FUNC(Servo_StyleRule_GetStyle, RawServoDeclarationBlockStrong,
|
SERVO_BINDING_FUNC(Servo_StyleRule_GetStyle, RawServoDeclarationBlockStrong,
|
||||||
RawServoStyleRuleBorrowed rule)
|
RawServoStyleRuleBorrowed rule)
|
||||||
SERVO_BINDING_FUNC(Servo_StyleRule_SetStyle, void,
|
SERVO_BINDING_FUNC(Servo_StyleRule_SetStyle, void,
|
||||||
RawServoStyleRuleBorrowed rule,
|
RawServoStyleRuleBorrowed rule,
|
||||||
RawServoDeclarationBlockBorrowed declarations)
|
RawServoDeclarationBlockBorrowed declarations)
|
||||||
SERVO_BINDING_FUNC(Servo_StyleRule_GetCssText, void,
|
|
||||||
RawServoStyleRuleBorrowed rule, nsAString* result)
|
|
||||||
SERVO_BINDING_FUNC(Servo_StyleRule_GetSelectorText, void,
|
SERVO_BINDING_FUNC(Servo_StyleRule_GetSelectorText, void,
|
||||||
RawServoStyleRuleBorrowed rule, nsAString* result)
|
RawServoStyleRuleBorrowed rule, nsAString* result)
|
||||||
SERVO_BINDING_FUNC(Servo_MediaRule_Debug, void,
|
|
||||||
RawServoMediaRuleBorrowed rule, nsACString* result)
|
|
||||||
SERVO_BINDING_FUNC(Servo_MediaRule_GetMedia, RawServoMediaListStrong,
|
SERVO_BINDING_FUNC(Servo_MediaRule_GetMedia, RawServoMediaListStrong,
|
||||||
RawServoMediaRuleBorrowed rule)
|
RawServoMediaRuleBorrowed rule)
|
||||||
SERVO_BINDING_FUNC(Servo_MediaRule_GetRules, ServoCssRulesStrong,
|
SERVO_BINDING_FUNC(Servo_MediaRule_GetRules, ServoCssRulesStrong,
|
||||||
RawServoMediaRuleBorrowed rule)
|
RawServoMediaRuleBorrowed rule)
|
||||||
SERVO_BINDING_FUNC(Servo_MediaRule_GetCssText, void,
|
SERVO_BINDING_FUNC(Servo_NamespaceRule_GetPrefix, nsIAtom*,
|
||||||
RawServoMediaRuleBorrowed rule, nsAString* result)
|
RawServoNamespaceRuleBorrowed rule)
|
||||||
|
SERVO_BINDING_FUNC(Servo_NamespaceRule_GetURI, nsIAtom*,
|
||||||
|
RawServoNamespaceRuleBorrowed rule)
|
||||||
|
|
||||||
// Animations API
|
// Animations API
|
||||||
SERVO_BINDING_FUNC(Servo_ParseProperty,
|
SERVO_BINDING_FUNC(Servo_ParseProperty,
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include "mozilla/ServoBindings.h"
|
#include "mozilla/ServoBindings.h"
|
||||||
#include "mozilla/ServoStyleRule.h"
|
#include "mozilla/ServoStyleRule.h"
|
||||||
#include "mozilla/ServoMediaRule.h"
|
#include "mozilla/ServoMediaRule.h"
|
||||||
|
#include "mozilla/ServoNamespaceRule.h"
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
|
|
||||||
|
@ -70,19 +71,18 @@ ServoCSSRuleList::GetRule(uint32_t aIndex)
|
||||||
if (rule <= kMaxRuleType) {
|
if (rule <= kMaxRuleType) {
|
||||||
RefPtr<css::Rule> ruleObj = nullptr;
|
RefPtr<css::Rule> ruleObj = nullptr;
|
||||||
switch (rule) {
|
switch (rule) {
|
||||||
case nsIDOMCSSRule::STYLE_RULE: {
|
#define CASE_RULE(const_, name_) \
|
||||||
ruleObj = new ServoStyleRule(
|
case nsIDOMCSSRule::const_##_RULE: { \
|
||||||
Servo_CssRules_GetStyleRuleAt(mRawRules, aIndex).Consume());
|
ruleObj = new Servo##name_##Rule( \
|
||||||
break;
|
Servo_CssRules_Get##name_##RuleAt(mRawRules, aIndex).Consume()); \
|
||||||
}
|
break; \
|
||||||
case nsIDOMCSSRule::MEDIA_RULE: {
|
|
||||||
ruleObj = new ServoMediaRule(
|
|
||||||
Servo_CssRules_GetMediaRuleAt(mRawRules, aIndex).Consume());
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
CASE_RULE(STYLE, Style)
|
||||||
|
CASE_RULE(MEDIA, Media)
|
||||||
|
CASE_RULE(NAMESPACE, Namespace)
|
||||||
|
#undef CASE_RULE
|
||||||
case nsIDOMCSSRule::FONT_FACE_RULE:
|
case nsIDOMCSSRule::FONT_FACE_RULE:
|
||||||
case nsIDOMCSSRule::KEYFRAMES_RULE:
|
case nsIDOMCSSRule::KEYFRAMES_RULE:
|
||||||
case nsIDOMCSSRule::NAMESPACE_RULE:
|
|
||||||
// XXX create corresponding rules
|
// XXX create corresponding rules
|
||||||
default:
|
default:
|
||||||
NS_WARNING("stylo: not implemented yet");
|
NS_WARNING("stylo: not implemented yet");
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#include "mozilla/ServoNamespaceRule.h"
|
||||||
|
|
||||||
|
#include "mozilla/ServoBindings.h"
|
||||||
|
|
||||||
|
using namespace mozilla::dom;
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
|
||||||
|
ServoNamespaceRule::~ServoNamespaceRule()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMPL_ADDREF_INHERITED(ServoNamespaceRule, CSSNamespaceRule)
|
||||||
|
NS_IMPL_RELEASE_INHERITED(ServoNamespaceRule, CSSNamespaceRule)
|
||||||
|
|
||||||
|
NS_INTERFACE_MAP_BEGIN(ServoNamespaceRule)
|
||||||
|
NS_INTERFACE_MAP_END_INHERITING(CSSNamespaceRule)
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
void
|
||||||
|
ServoNamespaceRule::List(FILE* out, int32_t aIndent) const
|
||||||
|
{
|
||||||
|
nsAutoCString str;
|
||||||
|
for (int32_t i = 0; i < aIndent; i++) {
|
||||||
|
str.AppendLiteral(" ");
|
||||||
|
}
|
||||||
|
Servo_NamespaceRule_Debug(mRawRule, &str);
|
||||||
|
fprintf_stderr(out, "%s\n", str.get());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
already_AddRefed<css::Rule>
|
||||||
|
ServoNamespaceRule::Clone() const
|
||||||
|
{
|
||||||
|
// Rule::Clone is only used when CSSStyleSheetInner is cloned in
|
||||||
|
// preparation of being mutated. However, ServoStyleSheet never clones
|
||||||
|
// anything, so this method should never be called.
|
||||||
|
MOZ_ASSERT_UNREACHABLE("Shouldn't be cloning ServoNamespaceRule");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsIAtom*
|
||||||
|
ServoNamespaceRule::GetPrefix() const
|
||||||
|
{
|
||||||
|
return Servo_NamespaceRule_GetPrefix(mRawRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ServoNamespaceRule::GetURLSpec(nsString& aURLSpec) const
|
||||||
|
{
|
||||||
|
nsIAtom* atom = Servo_NamespaceRule_GetURI(mRawRule);
|
||||||
|
atom->ToString(aURLSpec);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ServoNamespaceRule::GetCssTextImpl(nsAString& aCssText) const
|
||||||
|
{
|
||||||
|
Servo_NamespaceRule_GetCssText(mRawRule, &aCssText);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
ServoNamespaceRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
|
||||||
|
{
|
||||||
|
return aMallocSizeOf(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace mozilla
|
|
@ -0,0 +1,47 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#ifndef mozilla_ServoNamespaceRule_h
|
||||||
|
#define mozilla_ServoNamespaceRule_h
|
||||||
|
|
||||||
|
#include "mozilla/ServoBindingTypes.h"
|
||||||
|
#include "mozilla/dom/CSSNamespaceRule.h"
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
|
||||||
|
class ServoNamespaceRule : public dom::CSSNamespaceRule
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit ServoNamespaceRule(already_AddRefed<RawServoNamespaceRule> aRule)
|
||||||
|
: CSSNamespaceRule(0, 0)
|
||||||
|
, mRawRule(Move(aRule))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_DECL_ISUPPORTS_INHERITED
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
void List(FILE* out = stdout, int32_t aIndent = 0) const final;
|
||||||
|
#endif
|
||||||
|
already_AddRefed<Rule> Clone() const final;
|
||||||
|
|
||||||
|
nsIAtom* GetPrefix() const final;
|
||||||
|
void GetURLSpec(nsString& aURLSpec) const final;
|
||||||
|
|
||||||
|
// WebIDL interface
|
||||||
|
void GetCssTextImpl(nsAString& aCssText) const final;
|
||||||
|
|
||||||
|
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const final;
|
||||||
|
|
||||||
|
private:
|
||||||
|
~ServoNamespaceRule();
|
||||||
|
|
||||||
|
RefPtr<RawServoNamespaceRule> mRawRule;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace mozilla
|
||||||
|
|
||||||
|
#endif // mozilla_ServoNamespaceRule_h
|
|
@ -104,6 +104,7 @@ EXPORTS.mozilla += [
|
||||||
'ServoElementSnapshot.h',
|
'ServoElementSnapshot.h',
|
||||||
'ServoMediaList.h',
|
'ServoMediaList.h',
|
||||||
'ServoMediaRule.h',
|
'ServoMediaRule.h',
|
||||||
|
'ServoNamespaceRule.h',
|
||||||
'ServoPropPrefList.h',
|
'ServoPropPrefList.h',
|
||||||
'ServoSpecifiedValues.h',
|
'ServoSpecifiedValues.h',
|
||||||
'ServoStyleRule.h',
|
'ServoStyleRule.h',
|
||||||
|
@ -128,6 +129,7 @@ EXPORTS.mozilla.dom += [
|
||||||
'CSS.h',
|
'CSS.h',
|
||||||
'CSSLexer.h',
|
'CSSLexer.h',
|
||||||
'CSSMediaRule.h',
|
'CSSMediaRule.h',
|
||||||
|
'CSSNamespaceRule.h',
|
||||||
'CSSRuleList.h',
|
'CSSRuleList.h',
|
||||||
'CSSValue.h',
|
'CSSValue.h',
|
||||||
'FontFace.h',
|
'FontFace.h',
|
||||||
|
@ -218,6 +220,7 @@ UNIFIED_SOURCES += [
|
||||||
'ServoElementSnapshot.cpp',
|
'ServoElementSnapshot.cpp',
|
||||||
'ServoMediaList.cpp',
|
'ServoMediaList.cpp',
|
||||||
'ServoMediaRule.cpp',
|
'ServoMediaRule.cpp',
|
||||||
|
'ServoNamespaceRule.cpp',
|
||||||
'ServoSpecifiedValues.cpp',
|
'ServoSpecifiedValues.cpp',
|
||||||
'ServoStyleRule.cpp',
|
'ServoStyleRule.cpp',
|
||||||
'ServoStyleSet.cpp',
|
'ServoStyleSet.cpp',
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include "nsCSSParser.h"
|
#include "nsCSSParser.h"
|
||||||
#include "nsDOMClassInfoID.h"
|
#include "nsDOMClassInfoID.h"
|
||||||
#include "mozilla/dom/CSSStyleDeclarationBinding.h"
|
#include "mozilla/dom/CSSStyleDeclarationBinding.h"
|
||||||
#include "mozilla/dom/CSSNamespaceRuleBinding.h"
|
|
||||||
#include "mozilla/dom/CSSImportRuleBinding.h"
|
#include "mozilla/dom/CSSImportRuleBinding.h"
|
||||||
#include "mozilla/dom/CSSSupportsRuleBinding.h"
|
#include "mozilla/dom/CSSSupportsRuleBinding.h"
|
||||||
#include "mozilla/dom/CSSMozDocumentRuleBinding.h"
|
#include "mozilla/dom/CSSMozDocumentRuleBinding.h"
|
||||||
|
@ -773,14 +772,14 @@ DocumentRule::AppendConditionText(nsAString& aCssText) const
|
||||||
|
|
||||||
NameSpaceRule::NameSpaceRule(nsIAtom* aPrefix, const nsString& aURLSpec,
|
NameSpaceRule::NameSpaceRule(nsIAtom* aPrefix, const nsString& aURLSpec,
|
||||||
uint32_t aLineNumber, uint32_t aColumnNumber)
|
uint32_t aLineNumber, uint32_t aColumnNumber)
|
||||||
: Rule(aLineNumber, aColumnNumber),
|
: CSSNamespaceRule(aLineNumber, aColumnNumber),
|
||||||
mPrefix(aPrefix),
|
mPrefix(aPrefix),
|
||||||
mURLSpec(aURLSpec)
|
mURLSpec(aURLSpec)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
NameSpaceRule::NameSpaceRule(const NameSpaceRule& aCopy)
|
NameSpaceRule::NameSpaceRule(const NameSpaceRule& aCopy)
|
||||||
: Rule(aCopy),
|
: CSSNamespaceRule(aCopy),
|
||||||
mPrefix(aCopy.mPrefix),
|
mPrefix(aCopy.mPrefix),
|
||||||
mURLSpec(aCopy.mURLSpec)
|
mURLSpec(aCopy.mURLSpec)
|
||||||
{
|
{
|
||||||
|
@ -790,8 +789,8 @@ NameSpaceRule::~NameSpaceRule()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMPL_ADDREF_INHERITED(NameSpaceRule, Rule)
|
NS_IMPL_ADDREF_INHERITED(NameSpaceRule, CSSNamespaceRule)
|
||||||
NS_IMPL_RELEASE_INHERITED(NameSpaceRule, Rule)
|
NS_IMPL_RELEASE_INHERITED(NameSpaceRule, CSSNamespaceRule)
|
||||||
|
|
||||||
// QueryInterface implementation for NameSpaceRule
|
// QueryInterface implementation for NameSpaceRule
|
||||||
// If this ever gets its own cycle-collection bits, reevaluate our IsCCLeaf
|
// If this ever gets its own cycle-collection bits, reevaluate our IsCCLeaf
|
||||||
|
@ -803,13 +802,7 @@ NS_INTERFACE_MAP_BEGIN(NameSpaceRule)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
NS_INTERFACE_MAP_END_INHERITING(Rule)
|
NS_INTERFACE_MAP_END_INHERITING(CSSNamespaceRule)
|
||||||
|
|
||||||
bool
|
|
||||||
NameSpaceRule::IsCCLeaf() const
|
|
||||||
{
|
|
||||||
return Rule::IsCCLeaf();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
/* virtual */ void
|
/* virtual */ void
|
||||||
|
@ -837,12 +830,6 @@ NameSpaceRule::List(FILE* out, int32_t aIndent) const
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* virtual */ int32_t
|
|
||||||
NameSpaceRule::GetType() const
|
|
||||||
{
|
|
||||||
return Rule::NAMESPACE_RULE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* virtual */ already_AddRefed<Rule>
|
/* virtual */ already_AddRefed<Rule>
|
||||||
NameSpaceRule::Clone() const
|
NameSpaceRule::Clone() const
|
||||||
{
|
{
|
||||||
|
@ -850,12 +837,6 @@ NameSpaceRule::Clone() const
|
||||||
return clone.forget();
|
return clone.forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t
|
|
||||||
NameSpaceRule::Type() const
|
|
||||||
{
|
|
||||||
return nsIDOMCSSRule::NAMESPACE_RULE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
NameSpaceRule::GetCssTextImpl(nsAString& aCssText) const
|
NameSpaceRule::GetCssTextImpl(nsAString& aCssText) const
|
||||||
{
|
{
|
||||||
|
@ -879,13 +860,6 @@ NameSpaceRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
|
||||||
// - mURLSpec
|
// - mURLSpec
|
||||||
}
|
}
|
||||||
|
|
||||||
/* virtual */ JSObject*
|
|
||||||
NameSpaceRule::WrapObject(JSContext* aCx,
|
|
||||||
JS::Handle<JSObject*> aGivenProto)
|
|
||||||
{
|
|
||||||
return CSSNamespaceRuleBinding::Wrap(aCx, this, aGivenProto);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace css
|
} // namespace css
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|
||||||
|
|
|
@ -536,7 +536,7 @@ nsMediaList::Matches(nsPresContext* aPresContext,
|
||||||
return mArray.IsEmpty();
|
return mArray.IsEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
already_AddRefed<MediaList>
|
already_AddRefed<dom::MediaList>
|
||||||
nsMediaList::Clone()
|
nsMediaList::Clone()
|
||||||
{
|
{
|
||||||
RefPtr<nsMediaList> result = new nsMediaList();
|
RefPtr<nsMediaList> result = new nsMediaList();
|
||||||
|
|
|
@ -61,10 +61,6 @@ Any line which doesn't follow the format above would be ignored like comment.
|
||||||
* test_value_storage.html `animation` [280]
|
* test_value_storage.html `animation` [280]
|
||||||
* test_any_dynamic.html: -moz-any pseudo class [2]
|
* test_any_dynamic.html: -moz-any pseudo class [2]
|
||||||
* CSSOM support:
|
* CSSOM support:
|
||||||
* @namespace ##easy##
|
|
||||||
* test_at_rule_parse_serialize.html [1]
|
|
||||||
* test_bug765590.html [1]
|
|
||||||
* test_font_face_parser.html `@namespace` [1]
|
|
||||||
* @import
|
* @import
|
||||||
* test_bug221428.html [1]
|
* test_bug221428.html [1]
|
||||||
* @media
|
* @media
|
||||||
|
@ -317,8 +313,6 @@ Any line which doesn't follow the format above would be ignored like comment.
|
||||||
* test_value_storage.html `-moz-element` [49]
|
* test_value_storage.html `-moz-element` [49]
|
||||||
* -moz-anchor-decoration value on text-decoration
|
* -moz-anchor-decoration value on text-decoration
|
||||||
* test_value_storage.html `-moz-anchor-decoration` [10]
|
* test_value_storage.html `-moz-anchor-decoration` [10]
|
||||||
* various values on -{webkit,moz}-user-select **need investigation**
|
|
||||||
* test_value_storage.html `user-select` [3]
|
|
||||||
* several prefixed values in cursor property
|
* several prefixed values in cursor property
|
||||||
* test_value_storage.html `cursor` [4]
|
* test_value_storage.html `cursor` [4]
|
||||||
* moz-prefixed values of overflow shorthand bug 1330888
|
* moz-prefixed values of overflow shorthand bug 1330888
|
||||||
|
|
|
@ -182,7 +182,9 @@ nsFilterInstance::nsFilterInstance(nsIFrame *aTargetFrame,
|
||||||
mTargetBBox = *aOverrideBBox;
|
mTargetBBox = *aOverrideBBox;
|
||||||
} else {
|
} else {
|
||||||
MOZ_ASSERT(mTargetFrame, "Need to supply a frame when there's no aOverrideBBox");
|
MOZ_ASSERT(mTargetFrame, "Need to supply a frame when there's no aOverrideBBox");
|
||||||
mTargetBBox = nsSVGUtils::GetBBox(mTargetFrame);
|
mTargetBBox = nsSVGUtils::GetBBox(mTargetFrame,
|
||||||
|
nsSVGUtils::eUseFrameBoundsForOuterSVG |
|
||||||
|
nsSVGUtils::eBBoxIncludeFillGeometry);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute user space to filter space transforms.
|
// Compute user space to filter space transforms.
|
||||||
|
|
|
@ -192,8 +192,8 @@ nsSVGIntegrationUtils::GetSVGCoordContextForNonSVGFrame(nsIFrame* aNonSVGFrame)
|
||||||
gfxRect
|
gfxRect
|
||||||
nsSVGIntegrationUtils::GetSVGBBoxForNonSVGFrame(nsIFrame* aNonSVGFrame)
|
nsSVGIntegrationUtils::GetSVGBBoxForNonSVGFrame(nsIFrame* aNonSVGFrame)
|
||||||
{
|
{
|
||||||
NS_ASSERTION(!aNonSVGFrame->IsFrameOfType(nsIFrame::eSVG),
|
NS_ASSERTION(!(aNonSVGFrame->GetStateBits() & NS_FRAME_SVG_LAYOUT),
|
||||||
"SVG frames should not get here");
|
"Frames with SVG layout should not get here");
|
||||||
nsIFrame* firstFrame =
|
nsIFrame* firstFrame =
|
||||||
nsLayoutUtils::FirstContinuationOrIBSplitSibling(aNonSVGFrame);
|
nsLayoutUtils::FirstContinuationOrIBSplitSibling(aNonSVGFrame);
|
||||||
// 'r' is in "user space":
|
// 'r' is in "user space":
|
||||||
|
|
|
@ -1097,7 +1097,10 @@ nsSVGUtils::GetBBox(nsIFrame *aFrame, uint32_t aFlags)
|
||||||
}
|
}
|
||||||
gfxRect bbox;
|
gfxRect bbox;
|
||||||
nsISVGChildFrame *svg = do_QueryFrame(aFrame);
|
nsISVGChildFrame *svg = do_QueryFrame(aFrame);
|
||||||
if (svg || aFrame->IsSVGText()) {
|
const bool hasSVGLayout = aFrame->GetStateBits() & NS_FRAME_SVG_LAYOUT;
|
||||||
|
if (hasSVGLayout || aFrame->IsSVGText() ||
|
||||||
|
// if we evaluate the following, |svg| can only be an outer-<svg> or null
|
||||||
|
(svg && !(aFlags & eUseFrameBoundsForOuterSVG))) {
|
||||||
// It is possible to apply a gradient, pattern, clipping path, mask or
|
// It is possible to apply a gradient, pattern, clipping path, mask or
|
||||||
// filter to text. When one of these facilities is applied to text
|
// filter to text. When one of these facilities is applied to text
|
||||||
// the bounding box is the entire text element in all
|
// the bounding box is the entire text element in all
|
||||||
|
|
|
@ -403,7 +403,11 @@ public:
|
||||||
eBBoxIncludeStroke = 1 << 2,
|
eBBoxIncludeStroke = 1 << 2,
|
||||||
eBBoxIncludeStrokeGeometry = 1 << 3,
|
eBBoxIncludeStrokeGeometry = 1 << 3,
|
||||||
eBBoxIncludeMarkers = 1 << 4,
|
eBBoxIncludeMarkers = 1 << 4,
|
||||||
eBBoxIncludeClipped = 1 << 5
|
eBBoxIncludeClipped = 1 << 5,
|
||||||
|
// Normally a getBBox call on outer-<svg> should only return the
|
||||||
|
// bounds of the elements children. This flag will cause the
|
||||||
|
// element's bounds to be returned instead.
|
||||||
|
eUseFrameBoundsForOuterSVG = 1 << 6
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* Get the SVG bbox (the SVG spec's simplified idea of bounds) of aFrame in
|
* Get the SVG bbox (the SVG spec's simplified idea of bounds) of aFrame in
|
||||||
|
|
|
@ -1157,4 +1157,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
|
||||||
|
|
||||||
static const int32_t kUnknownId = -1;
|
static const int32_t kUnknownId = -1;
|
||||||
|
|
||||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1497971135298000);
|
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1498057610195000);
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
0x0a.net: could not connect to host
|
0x0a.net: could not connect to host
|
||||||
0x1337.eu: could not connect to host
|
0x1337.eu: could not connect to host
|
||||||
0x44.net: did not receive HSTS header
|
0x44.net: did not receive HSTS header
|
||||||
0x90.in: could not connect to host
|
|
||||||
0xa.in: could not connect to host
|
0xa.in: could not connect to host
|
||||||
0xacab.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 118" data: no]
|
0xacab.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 118" data: no]
|
||||||
0xb612.org: could not connect to host
|
0xb612.org: could not connect to host
|
||||||
|
@ -29,6 +28,7 @@
|
||||||
1xcess.com: did not receive HSTS header
|
1xcess.com: did not receive HSTS header
|
||||||
206rc.net: max-age too low: 2592000
|
206rc.net: max-age too low: 2592000
|
||||||
247loan.com: max-age too low: 0
|
247loan.com: max-age too low: 0
|
||||||
|
247quickbooks.com: did not receive HSTS header
|
||||||
24hourpaint.com: could not connect to host
|
24hourpaint.com: could not connect to host
|
||||||
25daysof.io: could not connect to host
|
25daysof.io: could not connect to host
|
||||||
263.info: could not connect to host
|
263.info: could not connect to host
|
||||||
|
@ -53,7 +53,6 @@
|
||||||
3yearloans.com: max-age too low: 0
|
3yearloans.com: max-age too low: 0
|
||||||
404.sh: max-age too low: 0
|
404.sh: max-age too low: 0
|
||||||
42ms.org: could not connect to host
|
42ms.org: could not connect to host
|
||||||
441jj.com: did not receive HSTS header
|
|
||||||
4455software.com: did not receive HSTS header
|
4455software.com: did not receive HSTS header
|
||||||
4679.space: could not connect to host
|
4679.space: could not connect to host
|
||||||
47ronin.com: did not receive HSTS header
|
47ronin.com: did not receive HSTS header
|
||||||
|
@ -130,7 +129,7 @@ adhs-chaoten.net: did not receive HSTS header
|
||||||
admin.google.com: did not receive HSTS header (error ignored - included regardless)
|
admin.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||||
admitcard.co.in: did not receive HSTS header
|
admitcard.co.in: did not receive HSTS header
|
||||||
admsel.ec: could not connect to host
|
admsel.ec: could not connect to host
|
||||||
adopteunsiteflash.com: could not connect to host
|
adopteunsiteflash.com: did not receive HSTS header
|
||||||
adquisitio.co.uk: could not connect to host
|
adquisitio.co.uk: could not connect to host
|
||||||
adquisitio.de: could not connect to host
|
adquisitio.de: could not connect to host
|
||||||
adquisitio.es: could not connect to host
|
adquisitio.es: could not connect to host
|
||||||
|
@ -153,6 +152,7 @@ afp548.tk: could not connect to host
|
||||||
agalaxyfarfaraway.co.uk: could not connect to host
|
agalaxyfarfaraway.co.uk: could not connect to host
|
||||||
agbremen.de: did not receive HSTS header
|
agbremen.de: did not receive HSTS header
|
||||||
agentseeker.ca: did not receive HSTS header
|
agentseeker.ca: did not receive HSTS header
|
||||||
|
agowa338.de: could not connect to host
|
||||||
agrimap.com: did not receive HSTS header
|
agrimap.com: did not receive HSTS header
|
||||||
agrios.de: did not receive HSTS header
|
agrios.de: did not receive HSTS header
|
||||||
agro-id.gov.ua: could not connect to host
|
agro-id.gov.ua: could not connect to host
|
||||||
|
@ -190,13 +190,12 @@ alethearose.com: did not receive HSTS header
|
||||||
alexandre.sh: did not receive HSTS header
|
alexandre.sh: did not receive HSTS header
|
||||||
alexisabarca.com: did not receive HSTS header
|
alexisabarca.com: did not receive HSTS header
|
||||||
alexsergeyev.com: could not connect to host
|
alexsergeyev.com: could not connect to host
|
||||||
alexvetter.de: did not receive HSTS header
|
|
||||||
alfa24.pro: could not connect to host
|
alfa24.pro: could not connect to host
|
||||||
alittlebitcheeky.com: did not receive HSTS header
|
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 118" data: no]
|
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 118" data: no]
|
||||||
alkami.com: did not receive HSTS header
|
alkami.com: did not receive HSTS header
|
||||||
all-subtitles.com: did not receive HSTS header
|
all-subtitles.com: did not receive HSTS header
|
||||||
all.tf: could not connect to host
|
all.tf: did not receive HSTS header
|
||||||
alldaymonitoring.com: could not connect to host
|
alldaymonitoring.com: could not connect to host
|
||||||
allforyou.at: could not connect to host
|
allforyou.at: could not connect to host
|
||||||
allinnote.com: could not connect to host
|
allinnote.com: could not connect to host
|
||||||
|
@ -237,7 +236,6 @@ andiplusben.com: could not connect to host
|
||||||
andreasbreitenlohner.de: did not receive HSTS header
|
andreasbreitenlohner.de: did not receive HSTS header
|
||||||
andreastoneman.com: could not connect to host
|
andreastoneman.com: could not connect to host
|
||||||
andreigec.net: did not receive HSTS header
|
andreigec.net: did not receive HSTS header
|
||||||
andrew.london: did not receive HSTS header
|
|
||||||
andrewbroekman.com: could not connect to host
|
andrewbroekman.com: could not connect to host
|
||||||
andrewmichaud.beer: could not connect to host
|
andrewmichaud.beer: could not connect to host
|
||||||
andrewregan.me: could not connect to host
|
andrewregan.me: could not connect to host
|
||||||
|
@ -274,6 +272,7 @@ antoniomarques.eu: did not receive HSTS header
|
||||||
antoniorequena.com.ve: could not connect to host
|
antoniorequena.com.ve: could not connect to host
|
||||||
antscript.com: did not receive HSTS header
|
antscript.com: did not receive HSTS header
|
||||||
anycoin.me: could not connect to host
|
anycoin.me: could not connect to host
|
||||||
|
aosc.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 118" data: no]
|
||||||
apachelounge.com: did not receive HSTS header
|
apachelounge.com: did not receive HSTS header
|
||||||
aparaatti.org: could not connect to host
|
aparaatti.org: could not connect to host
|
||||||
apeasternpower.com: could not connect to host
|
apeasternpower.com: could not connect to host
|
||||||
|
@ -284,7 +283,6 @@ apis.world: did not receive HSTS header
|
||||||
apmg-certified.com: did not receive HSTS header
|
apmg-certified.com: did not receive HSTS header
|
||||||
apmg-cyber.com: did not receive HSTS header
|
apmg-cyber.com: did not receive HSTS header
|
||||||
apnakliyat.com: did not receive HSTS header
|
apnakliyat.com: did not receive HSTS header
|
||||||
apolloyl.com: could not connect to host
|
|
||||||
aponkralsunucu.com: could not connect to host
|
aponkralsunucu.com: could not connect to host
|
||||||
app-arena.com: did not receive HSTS header
|
app-arena.com: did not receive HSTS header
|
||||||
app.lookout.com: did not receive HSTS header
|
app.lookout.com: did not receive HSTS header
|
||||||
|
@ -394,6 +392,7 @@ avinet.com: max-age too low: 0
|
||||||
avqueen.cn: did not receive HSTS header
|
avqueen.cn: did not receive HSTS header
|
||||||
avus-automobile.com: did not receive HSTS header
|
avus-automobile.com: did not receive HSTS header
|
||||||
awg-mode.de: did not receive HSTS header
|
awg-mode.de: did not receive HSTS header
|
||||||
|
awxg.com: could not connect to host
|
||||||
axado.com.br: did not receive HSTS header
|
axado.com.br: did not receive HSTS header
|
||||||
axeny.com: did not receive HSTS header
|
axeny.com: did not receive HSTS header
|
||||||
axg.io: could not connect to host
|
axg.io: could not connect to host
|
||||||
|
@ -402,6 +401,7 @@ azazy.net: max-age too low: 2592000
|
||||||
azprep.us: could not connect to host
|
azprep.us: could not connect to host
|
||||||
azuxul.fr: could not connect to host
|
azuxul.fr: could not connect to host
|
||||||
b3orion.com: max-age too low: 0
|
b3orion.com: max-age too low: 0
|
||||||
|
b422edu.com: could not connect to host
|
||||||
b64.club: could not connect to host
|
b64.club: could not connect to host
|
||||||
babettelandmesser.de: max-age too low: 0
|
babettelandmesser.de: max-age too low: 0
|
||||||
baby-click.de: did not receive HSTS header
|
baby-click.de: did not receive HSTS header
|
||||||
|
@ -852,7 +852,6 @@ clint.id.au: max-age too low: 0
|
||||||
clintonbloodworth.com: did not receive HSTS header
|
clintonbloodworth.com: did not receive HSTS header
|
||||||
clintonbloodworth.io: could not connect to host
|
clintonbloodworth.io: could not connect to host
|
||||||
clintwilson.technology: max-age too low: 2592000
|
clintwilson.technology: max-age too low: 2592000
|
||||||
clip.mx: did not receive HSTS header
|
|
||||||
clipped4u.com: could not connect to host
|
clipped4u.com: could not connect to host
|
||||||
cloud.wtf: could not connect to host
|
cloud.wtf: could not connect to host
|
||||||
cloudapi.vc: could not connect to host
|
cloudapi.vc: could not connect to host
|
||||||
|
@ -862,16 +861,17 @@ clouddesktop.co.nz: could not connect to host
|
||||||
cloudey.net: did not receive HSTS header
|
cloudey.net: did not receive HSTS header
|
||||||
cloudflare.com: did not receive HSTS header
|
cloudflare.com: did not receive HSTS header
|
||||||
cloudia.org: could not connect to host
|
cloudia.org: could not connect to host
|
||||||
cloudily.com: could not connect to host
|
|
||||||
cloudimag.es: could not connect to host
|
cloudimag.es: could not connect to host
|
||||||
cloudlink.club: could not connect to host
|
cloudlink.club: could not connect to host
|
||||||
cloudns.com.au: could not connect to host
|
cloudns.com.au: could not connect to host
|
||||||
cloudspotterapp.com: did not receive HSTS header
|
cloudspotterapp.com: did not receive HSTS header
|
||||||
cloudstoragemaus.com: could not connect to host
|
cloudstoragemaus.com: could not connect to host
|
||||||
cloudstorm.me: could not connect to host
|
cloudstorm.me: could not connect to host
|
||||||
|
cloudup.com: did not receive HSTS header
|
||||||
cloudwalk.io: did not receive HSTS header
|
cloudwalk.io: did not receive HSTS header
|
||||||
cloverleaf.net: max-age too low: 0
|
cloverleaf.net: max-age too low: 0
|
||||||
clubmate.rocks: could not connect to host
|
clubmate.rocks: could not connect to host
|
||||||
|
cluster.id: could not connect to host
|
||||||
clvrwebdesign.com: did not receive HSTS header
|
clvrwebdesign.com: did not receive HSTS header
|
||||||
clycat.ru: could not connect to host
|
clycat.ru: could not connect to host
|
||||||
clywedogmaths.co.uk: could not connect to host
|
clywedogmaths.co.uk: could not connect to host
|
||||||
|
@ -908,7 +908,6 @@ codewiththepros.org: could not connect to host
|
||||||
codiva.io: max-age too low: 2592000
|
codiva.io: max-age too low: 2592000
|
||||||
coffeeetc.co.uk: did not receive HSTS header
|
coffeeetc.co.uk: did not receive HSTS header
|
||||||
coffeestrategies.com: max-age too low: 2592000
|
coffeestrategies.com: max-age too low: 2592000
|
||||||
cohesive.io: did not receive HSTS header
|
|
||||||
coiffeurschnittstelle.ch: did not receive HSTS header
|
coiffeurschnittstelle.ch: did not receive HSTS header
|
||||||
coindam.com: could not connect to host
|
coindam.com: could not connect to host
|
||||||
coldlostsick.net: could not connect to host
|
coldlostsick.net: could not connect to host
|
||||||
|
@ -923,6 +922,7 @@ coloradocomputernetworking.net: could not connect to host
|
||||||
combron.nl: did not receive HSTS header
|
combron.nl: did not receive HSTS header
|
||||||
comfortdom.ua: did not receive HSTS header
|
comfortdom.ua: did not receive HSTS header
|
||||||
comfortticket.de: did not receive HSTS header
|
comfortticket.de: did not receive HSTS header
|
||||||
|
comfy.moe: did not receive HSTS header
|
||||||
comicspines.com: could not connect to host
|
comicspines.com: could not connect to host
|
||||||
comotalk.com: could not connect to host
|
comotalk.com: could not connect to host
|
||||||
compalytics.com: could not connect to host
|
compalytics.com: could not connect to host
|
||||||
|
@ -964,7 +964,6 @@ correctpaardbatterijnietje.nl: did not receive HSTS header
|
||||||
corruption-mc.net: could not connect to host
|
corruption-mc.net: could not connect to host
|
||||||
corruption-rsps.net: could not connect to host
|
corruption-rsps.net: could not connect to host
|
||||||
corruption-server.net: could not connect to host
|
corruption-server.net: could not connect to host
|
||||||
cosmeticasimple.com: could not connect to host
|
|
||||||
count.sh: could not connect to host
|
count.sh: could not connect to host
|
||||||
couragewhispers.ca: did not receive HSTS header
|
couragewhispers.ca: did not receive HSTS header
|
||||||
coursdeprogrammation.com: could not connect to host
|
coursdeprogrammation.com: could not connect to host
|
||||||
|
@ -1029,6 +1028,7 @@ cumshots-video.ru: could not connect to host
|
||||||
cunha.be: could not connect to host
|
cunha.be: could not connect to host
|
||||||
cuntflaps.me: did not receive HSTS header
|
cuntflaps.me: did not receive HSTS header
|
||||||
cuongquach.com: did not receive HSTS header
|
cuongquach.com: did not receive HSTS header
|
||||||
|
cup.al: could not connect to host
|
||||||
cupidmentor.com: did not receive HSTS header
|
cupidmentor.com: did not receive HSTS header
|
||||||
curlyroots.com: did not receive HSTS header
|
curlyroots.com: did not receive HSTS header
|
||||||
curroapp.com: could not connect to host
|
curroapp.com: could not connect to host
|
||||||
|
@ -1082,6 +1082,7 @@ dashburst.com: did not receive HSTS header
|
||||||
dashnimorad.com: did not receive HSTS header
|
dashnimorad.com: did not receive HSTS header
|
||||||
data-abundance.com: could not connect to host
|
data-abundance.com: could not connect to host
|
||||||
datahove.no: did not receive HSTS header
|
datahove.no: did not receive HSTS header
|
||||||
|
dataisme.com: did not receive HSTS header
|
||||||
datajapan.co.jp: could not connect to host
|
datajapan.co.jp: could not connect to host
|
||||||
datarank.com: max-age too low: 0
|
datarank.com: max-age too low: 0
|
||||||
dataretention.solutions: could not connect to host
|
dataretention.solutions: could not connect to host
|
||||||
|
@ -1135,6 +1136,7 @@ demdis.org: could not connect to host
|
||||||
demilitarized.ninja: could not connect to host
|
demilitarized.ninja: could not connect to host
|
||||||
democracychronicles.com: did not receive HSTS header
|
democracychronicles.com: did not receive HSTS header
|
||||||
demotops.com: did not receive HSTS header
|
demotops.com: did not receive HSTS header
|
||||||
|
dengchangdong.com: did not receive HSTS header
|
||||||
dengyong.org: could not connect to host
|
dengyong.org: could not connect to host
|
||||||
denh.am: did not receive HSTS header
|
denh.am: did not receive HSTS header
|
||||||
denisjean.fr: could not connect to host
|
denisjean.fr: could not connect to host
|
||||||
|
@ -1182,12 +1184,12 @@ digitalriver.tk: could not connect to host
|
||||||
digitalskillswap.com: could not connect to host
|
digitalskillswap.com: could not connect to host
|
||||||
dim.lighting: could not connect to host
|
dim.lighting: could not connect to host
|
||||||
dinamoelektrik.com: max-age too low: 0
|
dinamoelektrik.com: max-age too low: 0
|
||||||
|
dingcc.com: did not receive HSTS header
|
||||||
dinkum.online: could not connect to host
|
dinkum.online: could not connect to host
|
||||||
discoveringdocker.com: did not receive HSTS header
|
discoveringdocker.com: did not receive HSTS header
|
||||||
discovery.lookout.com: did not receive HSTS header
|
discovery.lookout.com: did not receive HSTS header
|
||||||
dislocated.de: did not receive HSTS header
|
dislocated.de: did not receive HSTS header
|
||||||
disowned.net: max-age too low: 0
|
disowned.net: max-age too low: 0
|
||||||
dissectcyber.com: could not connect to host
|
|
||||||
dissimulo.me: could not connect to host
|
dissimulo.me: could not connect to host
|
||||||
ditrutoancau.vn: could not connect to host
|
ditrutoancau.vn: could not connect to host
|
||||||
dittvertshus.no: could not connect to host
|
dittvertshus.no: could not connect to host
|
||||||
|
@ -1213,7 +1215,6 @@ do.search.yahoo.com: did not receive HSTS header
|
||||||
dobet.in: could not connect to host
|
dobet.in: could not connect to host
|
||||||
docid.io: could not connect to host
|
docid.io: could not connect to host
|
||||||
docket.news: could not connect to host
|
docket.news: could not connect to host
|
||||||
docs.google.com: did not receive HSTS header (error ignored - included regardless)
|
|
||||||
docset.io: could not connect to host
|
docset.io: could not connect to host
|
||||||
docufiel.com: could not connect to host
|
docufiel.com: could not connect to host
|
||||||
doeswindowssuckforeveryoneorjustme.com: could not connect to host
|
doeswindowssuckforeveryoneorjustme.com: could not connect to host
|
||||||
|
@ -1259,9 +1260,7 @@ dreadbyte.com: could not connect to host
|
||||||
dreid.org: did not receive HSTS header
|
dreid.org: did not receive HSTS header
|
||||||
drhopeson.com: could not connect to host
|
drhopeson.com: could not connect to host
|
||||||
drishti.guru: could not connect to host
|
drishti.guru: could not connect to host
|
||||||
drive.google.com: did not receive HSTS header (error ignored - included regardless)
|
|
||||||
drkmtrx.xyz: could not connect to host
|
drkmtrx.xyz: could not connect to host
|
||||||
drobniuch.pl: could not connect to host
|
|
||||||
droidboss.com: did not receive HSTS header
|
droidboss.com: did not receive HSTS header
|
||||||
dropcam.com: did not receive HSTS header
|
dropcam.com: did not receive HSTS header
|
||||||
drtroyhendrickson.com: could not connect to host
|
drtroyhendrickson.com: could not connect to host
|
||||||
|
@ -1323,7 +1322,6 @@ edmodo.com: did not receive HSTS header
|
||||||
edp-collaborative.com: max-age too low: 2500
|
edp-collaborative.com: max-age too low: 2500
|
||||||
eduvance.in: did not receive HSTS header
|
eduvance.in: did not receive HSTS header
|
||||||
edwards.me.uk: could not connect to host
|
edwards.me.uk: could not connect to host
|
||||||
eelzak.nl: could not connect to host
|
|
||||||
effectiveosgi.com: could not connect to host
|
effectiveosgi.com: could not connect to host
|
||||||
efficienthealth.com: did not receive HSTS header
|
efficienthealth.com: did not receive HSTS header
|
||||||
effortlesshr.com: did not receive HSTS header
|
effortlesshr.com: did not receive HSTS header
|
||||||
|
@ -1335,6 +1333,7 @@ ehito.ovh: could not connect to host
|
||||||
ehrenamt-skpfcw.de: could not connect to host
|
ehrenamt-skpfcw.de: could not connect to host
|
||||||
eicfood.com: could not connect to host
|
eicfood.com: could not connect to host
|
||||||
eidolonhost.com: did not receive HSTS header
|
eidolonhost.com: did not receive HSTS header
|
||||||
|
eisp.it: could not connect to host
|
||||||
ekbanden.nl: could not connect to host
|
ekbanden.nl: could not connect to host
|
||||||
elaintehtaat.fi: did not receive HSTS header
|
elaintehtaat.fi: did not receive HSTS header
|
||||||
elan-organics.com: did not receive HSTS header
|
elan-organics.com: did not receive HSTS header
|
||||||
|
@ -1367,6 +1366,7 @@ emmable.com: could not connect to host
|
||||||
emnitech.com: could not connect to host
|
emnitech.com: could not connect to host
|
||||||
empleosentorreon.mx: could not connect to host
|
empleosentorreon.mx: could not connect to host
|
||||||
empleostampico.com: did not receive HSTS header
|
empleostampico.com: did not receive HSTS header
|
||||||
|
empty-r.com: could not connect to host
|
||||||
enaah.de: could not connect to host
|
enaah.de: could not connect to host
|
||||||
enargia.jp: max-age too low: 0
|
enargia.jp: max-age too low: 0
|
||||||
encode.host: did not receive HSTS header
|
encode.host: did not receive HSTS header
|
||||||
|
@ -1382,6 +1382,7 @@ enersec.co.uk: could not connect to host
|
||||||
engelwerbung.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 118" data: no]
|
engelwerbung.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 118" data: no]
|
||||||
engg.ca: could not connect to host
|
engg.ca: could not connect to host
|
||||||
enginepit.com: could not connect to host
|
enginepit.com: could not connect to host
|
||||||
|
enginsight.com: did not receive HSTS header
|
||||||
enigmacpt.com: did not receive HSTS header
|
enigmacpt.com: did not receive HSTS header
|
||||||
enigmail.net: did not receive HSTS header
|
enigmail.net: did not receive HSTS header
|
||||||
enjoy-nepal.de: max-age too low: 0
|
enjoy-nepal.de: max-age too low: 0
|
||||||
|
@ -1439,10 +1440,12 @@ etula.ga: could not connect to host
|
||||||
etula.me: could not connect to host
|
etula.me: could not connect to host
|
||||||
euanbaines.com: did not receive HSTS header
|
euanbaines.com: did not receive HSTS header
|
||||||
eucl3d.com: did not receive HSTS header
|
eucl3d.com: did not receive HSTS header
|
||||||
|
euclideanpostulates.xyz: could not connect to host
|
||||||
eulerpi.io: could not connect to host
|
eulerpi.io: could not connect to host
|
||||||
eupho.me: could not connect to host
|
eupho.me: could not connect to host
|
||||||
euroshop24.net: could not connect to host
|
euroshop24.net: could not connect to host
|
||||||
evafojtova.cz: did not receive HSTS header
|
evafojtova.cz: did not receive HSTS header
|
||||||
|
evalesc.com: could not connect to host
|
||||||
evantage.org: could not connect to host
|
evantage.org: could not connect to host
|
||||||
evdenevenakliyatankara.pw: did not receive HSTS header
|
evdenevenakliyatankara.pw: did not receive HSTS header
|
||||||
everybooks.com: max-age too low: 60
|
everybooks.com: max-age too low: 60
|
||||||
|
@ -1461,7 +1464,6 @@ exitus.jp: max-age too low: 0
|
||||||
exno.co: could not connect to host
|
exno.co: could not connect to host
|
||||||
exon.io: did not receive HSTS header
|
exon.io: did not receive HSTS header
|
||||||
exousiakaidunamis.xyz: did not receive HSTS header
|
exousiakaidunamis.xyz: did not receive HSTS header
|
||||||
expatads.com: did not receive HSTS header
|
|
||||||
expertmile.com: did not receive HSTS header
|
expertmile.com: did not receive HSTS header
|
||||||
expoundite.net: did not receive HSTS header
|
expoundite.net: did not receive HSTS header
|
||||||
expressfinance.co.za: did not receive HSTS header
|
expressfinance.co.za: did not receive HSTS header
|
||||||
|
@ -1517,7 +1519,6 @@ fedux.com.ar: could not connect to host
|
||||||
feezmodo.com: max-age too low: 0
|
feezmodo.com: max-age too low: 0
|
||||||
felisslovakia.sk: [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 118" data: no]
|
felisslovakia.sk: [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 118" data: no]
|
||||||
feliwyn.fr: did not receive HSTS header
|
feliwyn.fr: did not receive HSTS header
|
||||||
felixklein.at: could not connect to host
|
|
||||||
feminists.co: could not connect to host
|
feminists.co: could not connect to host
|
||||||
fenteo.com: could not connect to host
|
fenteo.com: could not connect to host
|
||||||
feragon.net: did not receive HSTS header
|
feragon.net: did not receive HSTS header
|
||||||
|
@ -1551,7 +1552,7 @@ firstdogonthemoon.com.au: did not receive HSTS header
|
||||||
firstforex.co.uk: did not receive HSTS header
|
firstforex.co.uk: did not receive HSTS header
|
||||||
fish2.me: did not receive HSTS header
|
fish2.me: did not receive HSTS header
|
||||||
fit4medien.de: did not receive HSTS header
|
fit4medien.de: did not receive HSTS header
|
||||||
fitbylo.com: could not connect to host
|
fitbylo.com: did not receive HSTS header
|
||||||
fitiapp.com: could not connect to host
|
fitiapp.com: could not connect to host
|
||||||
fitnesswerk.de: could not connect to host
|
fitnesswerk.de: could not connect to host
|
||||||
five.vn: did not receive HSTS header
|
five.vn: did not receive HSTS header
|
||||||
|
@ -1595,7 +1596,7 @@ foreignexchangeresource.com: did not receive HSTS header
|
||||||
foreveralone.io: could not connect to host
|
foreveralone.io: could not connect to host
|
||||||
forex-dan.com: did not receive HSTS header
|
forex-dan.com: did not receive HSTS header
|
||||||
forextimes.ru: [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 118" data: no]
|
forextimes.ru: [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 118" data: no]
|
||||||
formazioneopen.it: did not receive HSTS header
|
formazioneopen.it: could not connect to host
|
||||||
formbetter.com: could not connect to host
|
formbetter.com: could not connect to host
|
||||||
formula.cf: could not connect to host
|
formula.cf: could not connect to host
|
||||||
fotiu.com: could not connect to host
|
fotiu.com: could not connect to host
|
||||||
|
@ -1613,6 +1614,7 @@ foxtrot.pw: could not connect to host
|
||||||
fr33d0m.link: could not connect to host
|
fr33d0m.link: could not connect to host
|
||||||
francevpn.xyz: could not connect to host
|
francevpn.xyz: could not connect to host
|
||||||
frangor.info: did not receive HSTS header
|
frangor.info: did not receive HSTS header
|
||||||
|
frank.fyi: could not connect to host
|
||||||
frankwei.xyz: did not receive HSTS header
|
frankwei.xyz: did not receive HSTS header
|
||||||
franta.biz: did not receive HSTS header
|
franta.biz: did not receive HSTS header
|
||||||
franta.email: did not receive HSTS header
|
franta.email: did not receive HSTS header
|
||||||
|
@ -1620,7 +1622,6 @@ franzt.de: could not connect to host
|
||||||
frasys.io: did not receive HSTS header
|
frasys.io: did not receive HSTS header
|
||||||
fredvoyage.fr: did not receive HSTS header
|
fredvoyage.fr: did not receive HSTS header
|
||||||
freeflow.tv: could not connect to host
|
freeflow.tv: could not connect to host
|
||||||
freemanning.de: did not receive HSTS header
|
|
||||||
freematthale.net: did not receive HSTS header
|
freematthale.net: did not receive HSTS header
|
||||||
freemedforms.com: did not receive HSTS header
|
freemedforms.com: did not receive HSTS header
|
||||||
freesoftwaredriver.com: did not receive HSTS header
|
freesoftwaredriver.com: did not receive HSTS header
|
||||||
|
@ -1632,6 +1633,7 @@ frenzel.dk: could not connect to host
|
||||||
freqlabs.com: could not connect to host
|
freqlabs.com: could not connect to host
|
||||||
freshfind.xyz: could not connect to host
|
freshfind.xyz: could not connect to host
|
||||||
freshlymind.com: did not receive HSTS header
|
freshlymind.com: did not receive HSTS header
|
||||||
|
fretscha.com: could not connect to host
|
||||||
frforms.com: did not receive HSTS header
|
frforms.com: did not receive HSTS header
|
||||||
friendica.ch: could not connect to host
|
friendica.ch: could not connect to host
|
||||||
friendlyfiregameshow.com: could not connect to host
|
friendlyfiregameshow.com: could not connect to host
|
||||||
|
@ -1656,6 +1658,7 @@ furiffic.com: did not receive HSTS header
|
||||||
furnation.com: could not connect to host
|
furnation.com: could not connect to host
|
||||||
furry.be: max-age too low: 86400
|
furry.be: max-age too low: 86400
|
||||||
fusedrops.com: could not connect to host
|
fusedrops.com: could not connect to host
|
||||||
|
fushee.com: could not connect to host
|
||||||
fusionmate.com: could not connect to host
|
fusionmate.com: could not connect to host
|
||||||
futbol11.com: did not receive HSTS header
|
futbol11.com: did not receive HSTS header
|
||||||
futurenda.com: could not connect to host
|
futurenda.com: could not connect to host
|
||||||
|
@ -1675,6 +1678,7 @@ g5led.nl: could not connect to host
|
||||||
gabber.scot: could not connect to host
|
gabber.scot: could not connect to host
|
||||||
gaelleetarnaud.com: did not receive HSTS header
|
gaelleetarnaud.com: did not receive HSTS header
|
||||||
gafachi.com: could not connect to host
|
gafachi.com: could not connect to host
|
||||||
|
gaiserik.com: could not connect to host
|
||||||
gakkainavi.jp: did not receive HSTS header
|
gakkainavi.jp: did not receive HSTS header
|
||||||
gakkainavi4.com: could not connect to host
|
gakkainavi4.com: could not connect to host
|
||||||
gakkainavi4.net: did not receive HSTS header
|
gakkainavi4.net: did not receive HSTS header
|
||||||
|
@ -1840,7 +1844,6 @@ gregorytlee.me: did not receive HSTS header
|
||||||
gremots.com: could not connect to host
|
gremots.com: could not connect to host
|
||||||
greplin.com: could not connect to host
|
greplin.com: could not connect to host
|
||||||
gresb.com: did not receive HSTS header
|
gresb.com: did not receive HSTS header
|
||||||
greyline.se: could not connect to host
|
|
||||||
gribani.com: could not connect to host
|
gribani.com: could not connect to host
|
||||||
grigalanzsoftware.com: could not connect to host
|
grigalanzsoftware.com: could not connect to host
|
||||||
gripopgriep.net: could not connect to host
|
gripopgriep.net: could not connect to host
|
||||||
|
@ -1859,6 +1862,7 @@ gtlfsonlinepay.com: did not receive HSTS header
|
||||||
gtraxapp.com: could not connect to host
|
gtraxapp.com: could not connect to host
|
||||||
gts-schulsoftware.de: did not receive HSTS header
|
gts-schulsoftware.de: did not receive HSTS header
|
||||||
guava.studio: did not receive HSTS header
|
guava.studio: did not receive HSTS header
|
||||||
|
guge.gq: could not connect to host
|
||||||
gugga.dk: did not receive HSTS header
|
gugga.dk: did not receive HSTS header
|
||||||
guilde-vindicta.fr: did not receive HSTS header
|
guilde-vindicta.fr: did not receive HSTS header
|
||||||
gulenet.com: could not connect to host
|
gulenet.com: could not connect to host
|
||||||
|
@ -1866,6 +1870,8 @@ gunnarhafdal.com: did not receive HSTS header
|
||||||
gurom.lv: could not connect to host
|
gurom.lv: could not connect to host
|
||||||
gurusupe.com: could not connect to host
|
gurusupe.com: could not connect to host
|
||||||
guso.gq: could not connect to host
|
guso.gq: could not connect to host
|
||||||
|
guso.ml: could not connect to host
|
||||||
|
guso.tech: could not connect to host
|
||||||
gussi.is: did not receive HSTS header
|
gussi.is: did not receive HSTS header
|
||||||
gvt2.com: could not connect to host (error ignored - included regardless)
|
gvt2.com: could not connect to host (error ignored - included regardless)
|
||||||
gvt3.com: could not connect to host (error ignored - included regardless)
|
gvt3.com: could not connect to host (error ignored - included regardless)
|
||||||
|
@ -1885,7 +1891,6 @@ habbo.life: did not receive HSTS header
|
||||||
hablemosdetecnologia.com.ve: could not connect to host
|
hablemosdetecnologia.com.ve: could not connect to host
|
||||||
hack.cz: could not connect to host
|
hack.cz: could not connect to host
|
||||||
hack.li: could not connect to host
|
hack.li: could not connect to host
|
||||||
hackerchai.com: could not connect to host
|
|
||||||
hackerforever.com: did not receive HSTS header
|
hackerforever.com: did not receive HSTS header
|
||||||
hackerone-ext-adroll.com: could not connect to host
|
hackerone-ext-adroll.com: could not connect to host
|
||||||
hackest.org: did not receive HSTS header
|
hackest.org: did not receive HSTS header
|
||||||
|
@ -2008,6 +2013,7 @@ hostedtalkgadget.google.com: did not receive HSTS header (error ignored - includ
|
||||||
hostgarou.com: did not receive HSTS header
|
hostgarou.com: did not receive HSTS header
|
||||||
hostinaus.com.au: could not connect to host
|
hostinaus.com.au: could not connect to host
|
||||||
hostisan.com: did not receive HSTS header
|
hostisan.com: did not receive HSTS header
|
||||||
|
hotartup.com: could not connect to host
|
||||||
hotchillibox.com: max-age too low: 0
|
hotchillibox.com: max-age too low: 0
|
||||||
hotchoc.io: did not receive HSTS header
|
hotchoc.io: did not receive HSTS header
|
||||||
houkago-step.com: did not receive HSTS header
|
houkago-step.com: did not receive HSTS header
|
||||||
|
@ -2018,6 +2024,7 @@ howtocuremysciatica.com: could not connect to host
|
||||||
hr-intranet.com: did not receive HSTS header
|
hr-intranet.com: did not receive HSTS header
|
||||||
hsandbox.tech: max-age too low: 2592000
|
hsandbox.tech: max-age too low: 2592000
|
||||||
hsir.me: could not connect to host
|
hsir.me: could not connect to host
|
||||||
|
hsts.com.br: could not connect to host
|
||||||
hsts.date: could not connect to host
|
hsts.date: could not connect to host
|
||||||
http418.xyz: could not connect to host
|
http418.xyz: could not connect to host
|
||||||
httpstatuscode418.xyz: could not connect to host
|
httpstatuscode418.xyz: could not connect to host
|
||||||
|
@ -2031,6 +2038,7 @@ humeurs.net: could not connect to host
|
||||||
humpi.at: could not connect to host
|
humpi.at: could not connect to host
|
||||||
humpteedumptee.in: did not receive HSTS header
|
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 118" data: no]
|
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 118" data: no]
|
||||||
|
hup.blue: could not connect to host
|
||||||
hurricanelabs.com: did not receive HSTS header
|
hurricanelabs.com: did not receive HSTS header
|
||||||
huskybutt.dog: could not connect to host
|
huskybutt.dog: could not connect to host
|
||||||
hxying.com: could not connect to host
|
hxying.com: could not connect to host
|
||||||
|
@ -2094,7 +2102,7 @@ ilikerainbows.co: could not connect to host
|
||||||
ilikerainbows.co.uk: could not connect to host
|
ilikerainbows.co.uk: could not connect to host
|
||||||
ilmconpm.de: did not receive HSTS header
|
ilmconpm.de: did not receive HSTS header
|
||||||
ilona.graphics: max-age too low: 3600
|
ilona.graphics: max-age too low: 3600
|
||||||
iluvscotland.co.uk: could not connect to host
|
iluvscotland.co.uk: did not receive HSTS header
|
||||||
imakepoems.net: could not connect to host
|
imakepoems.net: could not connect to host
|
||||||
imanolbarba.net: could not connect to host
|
imanolbarba.net: could not connect to host
|
||||||
ime.moe: could not connect to host
|
ime.moe: could not connect to host
|
||||||
|
@ -2111,6 +2119,7 @@ immunicity.works: did not receive HSTS header
|
||||||
immunicity.world: did not receive HSTS header
|
immunicity.world: did not receive HSTS header
|
||||||
imolug.org: did not receive HSTS header
|
imolug.org: did not receive HSTS header
|
||||||
imouto.my: max-age too low: 5184000
|
imouto.my: max-age too low: 5184000
|
||||||
|
imouyang.com: did not receive HSTS header
|
||||||
imperialwebsolutions.com: did not receive HSTS header
|
imperialwebsolutions.com: did not receive HSTS header
|
||||||
imu.li: did not receive HSTS header
|
imu.li: did not receive HSTS header
|
||||||
imusic.dk: did not receive HSTS header
|
imusic.dk: did not receive HSTS header
|
||||||
|
@ -2138,7 +2147,6 @@ inksupply.com: did not receive HSTS header
|
||||||
inleaked.com: could not connect to host
|
inleaked.com: could not connect to host
|
||||||
inmyarea.com: max-age too low: 0
|
inmyarea.com: max-age too low: 0
|
||||||
innophate-security.nl: could not connect to host
|
innophate-security.nl: could not connect to host
|
||||||
inquisitive.io: did not receive HSTS header
|
|
||||||
ins1gn1a.com: did not receive HSTS header
|
ins1gn1a.com: did not receive HSTS header
|
||||||
insane-bullets.com: could not connect to host
|
insane-bullets.com: could not connect to host
|
||||||
insane.zone: could not connect to host
|
insane.zone: could not connect to host
|
||||||
|
@ -2146,11 +2154,13 @@ insite-feedback.com: did not receive HSTS header
|
||||||
inspire-av.com: did not receive HSTS header
|
inspire-av.com: did not receive HSTS header
|
||||||
inspiroinc.com: could not connect to host
|
inspiroinc.com: could not connect to host
|
||||||
instacart.com: did not receive HSTS header
|
instacart.com: did not receive HSTS header
|
||||||
|
installgentoo.net: could not connect to host
|
||||||
instantdev.io: could not connect to host
|
instantdev.io: could not connect to host
|
||||||
institutoflordelavida.com: could not connect to host
|
institutoflordelavida.com: could not connect to host
|
||||||
intel.li: could not connect to host
|
intel.li: 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 118" data: no]
|
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 118" data: no]
|
||||||
interlun.com: could not connect to host
|
interlun.com: could not connect to host
|
||||||
|
internect.co.za: did not receive HSTS header
|
||||||
internetcasinos.de: could not connect to host
|
internetcasinos.de: could not connect to host
|
||||||
internetcensus.org: could not connect to host
|
internetcensus.org: could not connect to host
|
||||||
interserved.com: did not receive HSTS header
|
interserved.com: did not receive HSTS header
|
||||||
|
@ -2165,6 +2175,7 @@ inverselink.com: could not connect to host
|
||||||
invictusmc.uk: did not receive HSTS header
|
invictusmc.uk: did not receive HSTS header
|
||||||
invite24.pro: could not connect to host
|
invite24.pro: could not connect to host
|
||||||
inwesttitle.com: max-age too low: 0
|
inwesttitle.com: max-age too low: 0
|
||||||
|
ioiart.eu: could not connect to host
|
||||||
ionx.co.uk: did not receive HSTS header
|
ionx.co.uk: did not receive HSTS header
|
||||||
iop.intuit.com: max-age too low: 86400
|
iop.intuit.com: max-age too low: 86400
|
||||||
iora.fr: could not connect to host
|
iora.fr: could not connect to host
|
||||||
|
@ -2177,7 +2188,7 @@ iprody.com: could not connect to host
|
||||||
iptel.by: max-age too low: 0
|
iptel.by: max-age too low: 0
|
||||||
iptel.ro: could not connect to host
|
iptel.ro: could not connect to host
|
||||||
ipv6cloud.club: could not connect to host
|
ipv6cloud.club: could not connect to host
|
||||||
iqcn.co: did not receive HSTS header
|
iqcn.co: could not connect to host
|
||||||
iqualtech.com: did not receive HSTS header
|
iqualtech.com: did not receive HSTS header
|
||||||
iranianlawschool.com: could not connect to host
|
iranianlawschool.com: could not connect to host
|
||||||
iraqidinar.org: did not receive HSTS header
|
iraqidinar.org: did not receive HSTS header
|
||||||
|
@ -2201,7 +2212,6 @@ it-go.net: did not receive HSTS header
|
||||||
itechgeek.com: max-age too low: 0
|
itechgeek.com: max-age too low: 0
|
||||||
ithakama.com: did not receive HSTS header
|
ithakama.com: did not receive HSTS header
|
||||||
ithakama.cz: did not receive HSTS header
|
ithakama.cz: did not receive HSTS header
|
||||||
ithenrik.com: could not connect to host
|
|
||||||
itos.asia: did not receive HSTS header
|
itos.asia: did not receive HSTS header
|
||||||
itos.pl: did not receive HSTS header
|
itos.pl: did not receive HSTS header
|
||||||
itriskltd.com: could not connect to host
|
itriskltd.com: could not connect to host
|
||||||
|
@ -2217,7 +2227,7 @@ ivi-fertility.com: max-age too low: 0
|
||||||
ivi.es: max-age too low: 0
|
ivi.es: max-age too low: 0
|
||||||
ivk.website: could not connect to host
|
ivk.website: could not connect to host
|
||||||
ivo.co.za: could not connect to host
|
ivo.co.za: could not connect to host
|
||||||
ixec2.tk: did not receive HSTS header
|
ixec2.tk: could not connect to host
|
||||||
izdiwho.com: could not connect to host
|
izdiwho.com: could not connect to host
|
||||||
izolight.ch: could not connect to host
|
izolight.ch: could not connect to host
|
||||||
izoox.com: did not receive HSTS header
|
izoox.com: did not receive HSTS header
|
||||||
|
@ -2241,6 +2251,7 @@ jamesconroyfinn.com: did not receive HSTS header
|
||||||
jamesdoell.com: could not connect to host
|
jamesdoell.com: could not connect to host
|
||||||
jamesdoylephoto.com: did not receive HSTS header
|
jamesdoylephoto.com: did not receive HSTS header
|
||||||
jamesf.xyz: could not connect to host
|
jamesf.xyz: could not connect to host
|
||||||
|
jamesheald.com: did not receive HSTS header
|
||||||
jamesmaurer.com: did not receive HSTS header
|
jamesmaurer.com: did not receive HSTS header
|
||||||
jamesmorrison.me: did not receive HSTS header
|
jamesmorrison.me: did not receive HSTS header
|
||||||
jamessan.com: did not receive HSTS header
|
jamessan.com: did not receive HSTS header
|
||||||
|
@ -2312,6 +2323,7 @@ joedavison.me: could not connect to host
|
||||||
johannes-sprink.de: could not connect to host
|
johannes-sprink.de: could not connect to host
|
||||||
johners.me: could not connect to host
|
johners.me: could not connect to host
|
||||||
johnrom.com: did not receive HSTS header
|
johnrom.com: did not receive HSTS header
|
||||||
|
jollausers.de: could not connect to host
|
||||||
jonas-keidel.de: did not receive HSTS header
|
jonas-keidel.de: did not receive HSTS header
|
||||||
jonasgroth.se: did not receive HSTS header
|
jonasgroth.se: did not receive HSTS header
|
||||||
jonathan.ir: could not connect to host
|
jonathan.ir: could not connect to host
|
||||||
|
@ -2319,7 +2331,6 @@ jonn.me: could not connect to host
|
||||||
joostbovee.nl: did not receive HSTS header
|
joostbovee.nl: did not receive HSTS header
|
||||||
jordanhamilton.me: could not connect to host
|
jordanhamilton.me: could not connect to host
|
||||||
joretapo.fr: did not receive HSTS header
|
joretapo.fr: did not receive HSTS header
|
||||||
jornane.no: could not connect to host
|
|
||||||
josahrens.me: could not connect to host
|
josahrens.me: could not connect to host
|
||||||
joshi.su: could not connect to host
|
joshi.su: could not connect to host
|
||||||
joshstroup.me: could not connect to host
|
joshstroup.me: could not connect to host
|
||||||
|
@ -2354,7 +2365,6 @@ k-dev.de: could not connect to host
|
||||||
ka-clan.com: could not connect to host
|
ka-clan.com: could not connect to host
|
||||||
kabinapp.com: could not connect to host
|
kabinapp.com: could not connect to host
|
||||||
kabuabc.com: did not receive HSTS header
|
kabuabc.com: did not receive HSTS header
|
||||||
kabus.org: could not connect to host
|
|
||||||
kadioglumakina.com.tr: did not receive HSTS header
|
kadioglumakina.com.tr: did not receive HSTS header
|
||||||
kaela.design: could not connect to host
|
kaela.design: could not connect to host
|
||||||
kahopoon.net: could not connect to host
|
kahopoon.net: could not connect to host
|
||||||
|
@ -2459,7 +2469,6 @@ krayx.com: could not connect to host
|
||||||
kreavis.com: did not receive HSTS header
|
kreavis.com: did not receive HSTS header
|
||||||
kredite.sale: could not connect to host
|
kredite.sale: could not connect to host
|
||||||
kriegt.es: did not receive HSTS header
|
kriegt.es: did not receive HSTS header
|
||||||
kristikala.nl: could not connect to host
|
|
||||||
krizevci.info: did not receive HSTS header
|
krizevci.info: did not receive HSTS header
|
||||||
kroetenfuchs.de: could not connect to host
|
kroetenfuchs.de: could not connect to host
|
||||||
kropkait.pl: could not connect to host
|
kropkait.pl: could not connect to host
|
||||||
|
@ -2492,7 +2501,6 @@ kz.search.yahoo.com: did not receive HSTS header
|
||||||
kzjnet.com: could not connect to host
|
kzjnet.com: could not connect to host
|
||||||
l2guru.ru: could not connect to host
|
l2guru.ru: could not connect to host
|
||||||
labaia.info: could not connect to host
|
labaia.info: could not connect to host
|
||||||
labfox.de: could not connect to host
|
|
||||||
labina.com.tr: did not receive HSTS header
|
labina.com.tr: did not receive HSTS header
|
||||||
laboiteapc.fr: did not receive HSTS header
|
laboiteapc.fr: did not receive HSTS header
|
||||||
labordata.io: did not receive HSTS header
|
labordata.io: did not receive HSTS header
|
||||||
|
@ -2534,6 +2542,7 @@ leadership9.com: could not connect to host
|
||||||
leardev.de: did not receive HSTS header
|
leardev.de: did not receive HSTS header
|
||||||
learnfrenchfluently.com: did not receive HSTS header
|
learnfrenchfluently.com: did not receive HSTS header
|
||||||
learningorder.com: could not connect to host
|
learningorder.com: could not connect to host
|
||||||
|
lebal.se: did not receive HSTS header
|
||||||
lechiennoir.net: did not receive HSTS header
|
lechiennoir.net: did not receive HSTS header
|
||||||
ledgerscope.net: could not connect to host
|
ledgerscope.net: could not connect to host
|
||||||
leermotorrijden.nl: max-age too low: 300
|
leermotorrijden.nl: max-age too low: 300
|
||||||
|
@ -2584,7 +2593,6 @@ lianye6.cc: could not connect to host
|
||||||
lianyexiuchang.in: could not connect to host
|
lianyexiuchang.in: could not connect to host
|
||||||
liaoshuma.com: could not connect to host
|
liaoshuma.com: could not connect to host
|
||||||
libanco.com: could not connect to host
|
libanco.com: could not connect to host
|
||||||
libbitcoin.org: could not connect to host
|
|
||||||
libertyrp.org: could not connect to host
|
libertyrp.org: could not connect to host
|
||||||
library.linode.com: did not receive HSTS header
|
library.linode.com: did not receive HSTS header
|
||||||
librechan.net: could not connect to host
|
librechan.net: could not connect to host
|
||||||
|
@ -2621,7 +2629,6 @@ linuxforyou.com: could not connect to host
|
||||||
linuxgeek.ro: could not connect to host
|
linuxgeek.ro: could not connect to host
|
||||||
linuxmonitoring.net: did not receive HSTS header
|
linuxmonitoring.net: did not receive HSTS header
|
||||||
liquorsanthe.in: could not connect to host
|
liquorsanthe.in: could not connect to host
|
||||||
lisonfan.com: did not receive HSTS header
|
|
||||||
listafirmelor.com: could not connect to host
|
listafirmelor.com: could not connect to host
|
||||||
litespeed.io: could not connect to host
|
litespeed.io: could not connect to host
|
||||||
litz.ca: could not connect to host
|
litz.ca: could not connect to host
|
||||||
|
@ -2629,8 +2636,6 @@ litzenberger.ca: could not connect to host
|
||||||
livedemo.io: could not connect to host
|
livedemo.io: could not connect to host
|
||||||
livej.am: could not connect to host
|
livej.am: could not connect to host
|
||||||
livi.co: did not receive HSTS header
|
livi.co: did not receive HSTS header
|
||||||
livnev.me: could not connect to host
|
|
||||||
livnev.xyz: could not connect to host
|
|
||||||
loadingdeck.com: did not receive HSTS header
|
loadingdeck.com: did not receive HSTS header
|
||||||
loadso.me: could not connect to host
|
loadso.me: could not connect to host
|
||||||
loafbox.com: could not connect to host
|
loafbox.com: could not connect to host
|
||||||
|
@ -2666,6 +2671,7 @@ lt.search.yahoo.com: did not receive HSTS header
|
||||||
ltbytes.com: could not connect to host
|
ltbytes.com: could not connect to host
|
||||||
lu.search.yahoo.com: did not receive HSTS header
|
lu.search.yahoo.com: did not receive HSTS header
|
||||||
lucaterzini.com: could not connect to host
|
lucaterzini.com: could not connect to host
|
||||||
|
ludwiggrill.de: could not connect to host
|
||||||
lufthansaexperts.com: max-age too low: 2592000
|
lufthansaexperts.com: max-age too low: 2592000
|
||||||
luine.xyz: did not receive HSTS header
|
luine.xyz: did not receive HSTS header
|
||||||
luis-checa.com: could not connect to host
|
luis-checa.com: could not connect to host
|
||||||
|
@ -2702,7 +2708,7 @@ mac-torrents.me: did not receive HSTS header
|
||||||
macchaberrycream.com: could not connect to host
|
macchaberrycream.com: could not connect to host
|
||||||
macdj.tk: could not connect to host
|
macdj.tk: could not connect to host
|
||||||
macgeneral.de: did not receive HSTS header
|
macgeneral.de: did not receive HSTS header
|
||||||
macsandcheesedreams.com: did not receive HSTS header
|
macsandcheesedreams.com: could not connect to host
|
||||||
madars.org: did not receive HSTS header
|
madars.org: did not receive HSTS header
|
||||||
maddin.ga: could not connect to host
|
maddin.ga: could not connect to host
|
||||||
madebymagnitude.com: did not receive HSTS header
|
madebymagnitude.com: did not receive HSTS header
|
||||||
|
@ -2731,8 +2737,7 @@ mamaxi.org: did not receive HSTS header
|
||||||
mammothmail.com: could not connect to host
|
mammothmail.com: could not connect to host
|
||||||
mammothmail.net: could not connect to host
|
mammothmail.net: could not connect to host
|
||||||
mammothmail.org: could not connect to host
|
mammothmail.org: could not connect to host
|
||||||
managemynetsuite.com: could not connect to host
|
managemynetsuite.com: did not receive HSTS header
|
||||||
managewp.org: did not receive HSTS header
|
|
||||||
maniadeprazer.com.br: could not connect to host
|
maniadeprazer.com.br: could not connect to host
|
||||||
manifestbin.com: did not receive HSTS header
|
manifestbin.com: did not receive HSTS header
|
||||||
manningbrothers.com: did not receive HSTS header
|
manningbrothers.com: did not receive HSTS header
|
||||||
|
@ -2741,14 +2746,17 @@ mansion-note.com: did not receive HSTS header
|
||||||
maomaofuli.vip: could not connect to host
|
maomaofuli.vip: could not connect to host
|
||||||
maple5.com: did not receive HSTS header
|
maple5.com: did not receive HSTS header
|
||||||
marchagen.nl: did not receive HSTS header
|
marchagen.nl: did not receive HSTS header
|
||||||
|
marcoececilia.it: could not connect to host
|
||||||
marcofinke.de: could not connect to host
|
marcofinke.de: could not connect to host
|
||||||
marcontrol.com: did not receive HSTS header
|
marcontrol.com: did not receive HSTS header
|
||||||
|
marcosteixeira.tk: could not connect to host
|
||||||
marcuskoh.com: did not receive HSTS header
|
marcuskoh.com: did not receive HSTS header
|
||||||
margaretrosefashions.co.uk: could not connect to host
|
margaretrosefashions.co.uk: could not connect to host
|
||||||
mariannematthew.com: could not connect to host
|
mariannematthew.com: could not connect to host
|
||||||
marie-curie.fr: could not connect to host
|
marie-curie.fr: could not connect to host
|
||||||
marie-elisabeth.dk: did not receive HSTS header
|
marie-elisabeth.dk: did not receive HSTS header
|
||||||
marie-en-provence.com: did not receive HSTS header
|
marie-en-provence.com: did not receive HSTS header
|
||||||
|
marie.club: could not connect to host
|
||||||
markaconnor.com: could not connect to host
|
markaconnor.com: could not connect to host
|
||||||
markayapilandirma.com: could not connect to host
|
markayapilandirma.com: could not connect to host
|
||||||
market.android.com: did not receive HSTS header (error ignored - included regardless)
|
market.android.com: did not receive HSTS header (error ignored - included regardless)
|
||||||
|
@ -3032,6 +3040,7 @@ mypension.ca: could not connect to host
|
||||||
myphonebox.de: could not connect to host
|
myphonebox.de: could not connect to host
|
||||||
mysecretrewards.com: did not receive HSTS header
|
mysecretrewards.com: did not receive HSTS header
|
||||||
mystery-science-theater-3000.de: did not receive HSTS header
|
mystery-science-theater-3000.de: did not receive HSTS header
|
||||||
|
mythslegendscollection.com: did not receive HSTS header
|
||||||
mytweeps.com: could not connect to host
|
mytweeps.com: could not connect to host
|
||||||
myvirtualserver.com: max-age too low: 2592000
|
myvirtualserver.com: max-age too low: 2592000
|
||||||
myzone.com: did not receive HSTS header
|
myzone.com: did not receive HSTS header
|
||||||
|
@ -3082,7 +3091,6 @@ nedzad.me: could not connect to host
|
||||||
neels.ch: [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 118" data: no]
|
neels.ch: [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 118" data: no]
|
||||||
neftaly.com: did not receive HSTS header
|
neftaly.com: did not receive HSTS header
|
||||||
neilgreen.net: did not receive HSTS header
|
neilgreen.net: did not receive HSTS header
|
||||||
neillans.com: did not receive HSTS header
|
|
||||||
neko-life.com: did not receive HSTS header
|
neko-life.com: did not receive HSTS header
|
||||||
neko-system.com: did not receive HSTS header
|
neko-system.com: did not receive HSTS header
|
||||||
nemno.de: could not connect to host
|
nemno.de: could not connect to host
|
||||||
|
@ -3097,6 +3105,7 @@ netherwind.eu: could not connect to host
|
||||||
netloanusa.com: max-age too low: 0
|
netloanusa.com: max-age too low: 0
|
||||||
netmagik.com: did not receive HSTS header
|
netmagik.com: did not receive HSTS header
|
||||||
nettefoundation.com: could not connect to host
|
nettefoundation.com: could not connect to host
|
||||||
|
networth.at: could not connect to host
|
||||||
networx-online.de: could not connect to host
|
networx-online.de: could not connect to host
|
||||||
netzbit.de: could not connect to host
|
netzbit.de: could not connect to host
|
||||||
netzpolitik.org: did not receive HSTS header
|
netzpolitik.org: did not receive HSTS header
|
||||||
|
@ -3107,6 +3116,7 @@ neuronfactor.com: [Exception... "Component returned failure code: 0x80004005 (NS
|
||||||
neutralox.com: did not receive HSTS header
|
neutralox.com: did not receive HSTS header
|
||||||
never-afk.de: did not receive HSTS header
|
never-afk.de: did not receive HSTS header
|
||||||
neveta.com: could not connect to host
|
neveta.com: could not connect to host
|
||||||
|
new.travel.pl: did not receive HSTS header
|
||||||
newcitygas.ca: max-age too low: 0
|
newcitygas.ca: max-age too low: 0
|
||||||
newgenerationplus.org: could not connect to host
|
newgenerationplus.org: could not connect to host
|
||||||
newhdmovies.io: did not receive HSTS header
|
newhdmovies.io: did not receive HSTS header
|
||||||
|
@ -3132,16 +3142,16 @@ nicoborghuis.nl: could not connect to host
|
||||||
nicolasbettag.me: did not receive HSTS header
|
nicolasbettag.me: did not receive HSTS header
|
||||||
niconiconi.xyz: could not connect to host
|
niconiconi.xyz: could not connect to host
|
||||||
niconode.com: could not connect to host
|
niconode.com: could not connect to host
|
||||||
|
niduxcomercial.com: could not connect to host
|
||||||
nien.chat: could not connect to host
|
nien.chat: could not connect to host
|
||||||
nightwinds.tk: could not connect to host
|
nightwinds.tk: could not connect to host
|
||||||
nightx.uk: could not connect to host
|
nightx.uk: could not connect to host
|
||||||
niho.jp: [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 118" data: no]
|
niho.jp: [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 118" data: no]
|
||||||
nikcub.com: could not connect to host
|
nikcub.com: could not connect to host
|
||||||
niklas.pw: could not connect to host
|
|
||||||
niklaslindblad.se: did not receive HSTS header
|
niklaslindblad.se: did not receive HSTS header
|
||||||
nikomo.fi: could not connect to host
|
nikomo.fi: could not connect to host
|
||||||
ninchisho-online.com: did not receive HSTS header
|
ninchisho-online.com: did not receive HSTS header
|
||||||
ninhs.org: could not connect to host
|
ninhs.org: did not receive HSTS header
|
||||||
nippler.org: did not receive HSTS header
|
nippler.org: did not receive HSTS header
|
||||||
nippombashi.net: could not connect to host
|
nippombashi.net: could not connect to host
|
||||||
nipponcareers.com: did not receive HSTS header
|
nipponcareers.com: did not receive HSTS header
|
||||||
|
@ -3178,7 +3188,6 @@ notenoughtime.de: could not connect to host
|
||||||
nottheonion.net: did not receive HSTS header
|
nottheonion.net: did not receive HSTS header
|
||||||
nouvelle-vague-saint-cast.fr: did not receive HSTS header
|
nouvelle-vague-saint-cast.fr: did not receive HSTS header
|
||||||
novacoast.com: did not receive HSTS header
|
novacoast.com: did not receive HSTS header
|
||||||
novascan.net: could not connect to host
|
|
||||||
novatrucking.de: could not connect to host
|
novatrucking.de: could not connect to host
|
||||||
novawave.ca: did not receive HSTS header
|
novawave.ca: did not receive HSTS header
|
||||||
nowak.ninja: did not receive HSTS header
|
nowak.ninja: did not receive HSTS header
|
||||||
|
@ -3267,6 +3276,7 @@ oneminutefilm.tv: could not connect to host
|
||||||
onepluscamps.com: could not connect to host
|
onepluscamps.com: could not connect to host
|
||||||
onespiritinc.com: did not receive HSTS header
|
onespiritinc.com: did not receive HSTS header
|
||||||
onet.space: could not connect to host
|
onet.space: could not connect to host
|
||||||
|
onewpst.com: did not receive HSTS header
|
||||||
oniichan.us: did not receive HSTS header
|
oniichan.us: did not receive HSTS header
|
||||||
online-casino.eu: did not receive HSTS header
|
online-casino.eu: did not receive HSTS header
|
||||||
online-wetten.de: did not receive HSTS header
|
online-wetten.de: did not receive HSTS header
|
||||||
|
@ -3299,7 +3309,7 @@ openshift.redhat.com: did not receive HSTS header
|
||||||
opensrd.com: could not connect to host
|
opensrd.com: could not connect to host
|
||||||
openxmpp.com: could not connect to host
|
openxmpp.com: could not connect to host
|
||||||
opim.ca: did not receive HSTS header
|
opim.ca: did not receive HSTS header
|
||||||
opperwall.net: could not connect to host
|
opperwall.net: did not receive HSTS header
|
||||||
opsafewinter.net: could not connect to host
|
opsafewinter.net: could not connect to host
|
||||||
opsbears.com: did not receive HSTS header
|
opsbears.com: did not receive HSTS header
|
||||||
optenhoefel.de: could not connect to host
|
optenhoefel.de: could not connect to host
|
||||||
|
@ -3321,6 +3331,7 @@ orleika.ml: could not connect to host
|
||||||
orthodoxy.lt: did not receive HSTS header
|
orthodoxy.lt: did not receive HSTS header
|
||||||
orwell1984.today: could not connect to host
|
orwell1984.today: could not connect to host
|
||||||
osaiyuwu.com: could not connect to host
|
osaiyuwu.com: could not connect to host
|
||||||
|
oskuro.net: could not connect to host
|
||||||
oslfoundation.org: could not connect to host
|
oslfoundation.org: could not connect to host
|
||||||
oslinux.net: did not receive HSTS header
|
oslinux.net: did not receive HSTS header
|
||||||
osp.cx: could not connect to host
|
osp.cx: could not connect to host
|
||||||
|
@ -3350,6 +3361,7 @@ owncloud.help: could not connect to host
|
||||||
ownmovies.fr: could not connect to host
|
ownmovies.fr: could not connect to host
|
||||||
oxygenabsorbers.com: did not receive HSTS header
|
oxygenabsorbers.com: did not receive HSTS header
|
||||||
oxynux.fr: could not connect to host
|
oxynux.fr: could not connect to host
|
||||||
|
oxynux.xyz: could not connect to host
|
||||||
p.linode.com: could not connect to host
|
p.linode.com: could not connect to host
|
||||||
p8r.de: could not connect to host
|
p8r.de: could not connect to host
|
||||||
pa.search.yahoo.com: did not receive HSTS header
|
pa.search.yahoo.com: did not receive HSTS header
|
||||||
|
@ -3368,7 +3380,7 @@ pamplona.tv: could not connect to host
|
||||||
pamsoft.pl: max-age too low: 0
|
pamsoft.pl: max-age too low: 0
|
||||||
panaceallc.net: could not connect to host
|
panaceallc.net: could not connect to host
|
||||||
panamaequity.com: did not receive HSTS header
|
panamaequity.com: did not receive HSTS header
|
||||||
panamateakforestry.com: could not connect to host
|
panamateakforestry.com: did not receive HSTS header
|
||||||
panoranordic.net: could not connect to host
|
panoranordic.net: could not connect to host
|
||||||
pansu.space: could not connect to host
|
pansu.space: could not connect to host
|
||||||
pants-off.xyz: could not connect to host
|
pants-off.xyz: could not connect to host
|
||||||
|
@ -3454,6 +3466,7 @@ petsittersservices.com: could not connect to host
|
||||||
pettsy.com: could not connect to host
|
pettsy.com: could not connect to host
|
||||||
pewboards.com: could not connect to host
|
pewboards.com: could not connect to host
|
||||||
pexieapp.com: did not receive HSTS header
|
pexieapp.com: did not receive HSTS header
|
||||||
|
peytonfarrar.com: did not receive HSTS header
|
||||||
pflege.de: did not receive HSTS header
|
pflege.de: did not receive HSTS header
|
||||||
pgpm.io: could not connect to host
|
pgpm.io: could not connect to host
|
||||||
pharmgkb.org: could not connect to host
|
pharmgkb.org: could not connect to host
|
||||||
|
@ -3477,7 +3490,6 @@ piggott.me.uk: did not receive HSTS header
|
||||||
pilgermaske.org: did not receive HSTS header
|
pilgermaske.org: did not receive HSTS header
|
||||||
piligrimname.com: could not connect to host
|
piligrimname.com: could not connect to host
|
||||||
pillowandpepper.com: did not receive HSTS header
|
pillowandpepper.com: did not receive HSTS header
|
||||||
pimpmymac.ru: could not connect to host
|
|
||||||
pincodeit.com: could not connect to host
|
pincodeit.com: could not connect to host
|
||||||
pippen.io: could not connect to host
|
pippen.io: could not connect to host
|
||||||
piratedb.com: could not connect to host
|
piratedb.com: could not connect to host
|
||||||
|
@ -3506,6 +3518,7 @@ play.google.com: did not receive HSTS header (error ignored - included regardles
|
||||||
playflick.com: did not receive HSTS header
|
playflick.com: did not receive HSTS header
|
||||||
playkh.com: did not receive HSTS header
|
playkh.com: did not receive HSTS header
|
||||||
playmaker.io: could not connect to host
|
playmaker.io: could not connect to host
|
||||||
|
playmyplay.com: did not receive HSTS header
|
||||||
playnation.io: could not connect to host
|
playnation.io: could not connect to host
|
||||||
pleier-it.de: did not receive HSTS header
|
pleier-it.de: did not receive HSTS header
|
||||||
pleier.it: could not connect to host
|
pleier.it: could not connect to host
|
||||||
|
@ -3519,6 +3532,7 @@ ploup.net: could not connect to host
|
||||||
pluff.nl: could not connect to host
|
pluff.nl: could not connect to host
|
||||||
plur.com.au: did not receive HSTS header
|
plur.com.au: did not receive HSTS header
|
||||||
pmnts.io: could not connect to host
|
pmnts.io: could not connect to host
|
||||||
|
pnona.cz: could not connect to host
|
||||||
po.gl: did not receive HSTS header
|
po.gl: did not receive HSTS header
|
||||||
pocketsix.com: could not connect to host
|
pocketsix.com: could not connect to host
|
||||||
pocloud.homelinux.net: could not connect to host
|
pocloud.homelinux.net: could not connect to host
|
||||||
|
@ -3537,16 +3551,17 @@ polypho.nyc: could not connect to host
|
||||||
pompompoes.com: could not connect to host
|
pompompoes.com: could not connect to host
|
||||||
pontualcomp.com: max-age too low: 2592000
|
pontualcomp.com: max-age too low: 2592000
|
||||||
poolsandstuff.com: did not receive HSTS header
|
poolsandstuff.com: did not receive HSTS header
|
||||||
poolvilla-margarita.net: did not receive HSTS header
|
poolvilla-margarita.net: could not connect to host
|
||||||
poon.tech: could not connect to host
|
poon.tech: could not connect to host
|
||||||
porno-gif.ru: did not receive HSTS header
|
porno-gif.ru: did not receive HSTS header
|
||||||
portalplatform.net: did not receive HSTS header
|
portalplatform.net: did not receive HSTS header
|
||||||
poshpak.com: max-age too low: 86400
|
poshpak.com: max-age too low: 86400
|
||||||
postcodewise.co.uk: did not receive HSTS header
|
postcodewise.co.uk: did not receive HSTS header
|
||||||
posterspy.com: did not receive HSTS header
|
|
||||||
postscheduler.org: could not connect to host
|
postscheduler.org: could not connect to host
|
||||||
posylka.de: did not receive HSTS header
|
posylka.de: did not receive HSTS header
|
||||||
potatoheads.net: could not connect to host
|
potatoheads.net: could not connect to host
|
||||||
|
potbar.com: could not connect to host
|
||||||
|
potlytics.com: could not connect to host
|
||||||
poussinooz.fr: could not connect to host
|
poussinooz.fr: could not connect to host
|
||||||
povitria.net: could not connect to host
|
povitria.net: could not connect to host
|
||||||
power99press.com: did not receive HSTS header
|
power99press.com: did not receive HSTS header
|
||||||
|
@ -3672,10 +3687,11 @@ rastreador.com.es: did not receive HSTS header
|
||||||
ratajczak.fr: could not connect to host
|
ratajczak.fr: could not connect to host
|
||||||
rate-esport.de: could not connect to host
|
rate-esport.de: could not connect to host
|
||||||
rationalism.com: could not connect to host
|
rationalism.com: could not connect to host
|
||||||
rauchenwald.net: did not receive HSTS header
|
rauchenwald.net: could not connect to host
|
||||||
raulfraile.net: could not connect to host
|
raulfraile.net: could not connect to host
|
||||||
raven.lipetsk.ru: could not connect to host
|
raven.lipetsk.ru: could not connect to host
|
||||||
rawet.se: could not connect to host
|
rawet.se: could not connect to host
|
||||||
|
rawoil.com: could not connect to host
|
||||||
rawstorieslondon.com: could not connect to host
|
rawstorieslondon.com: could not connect to host
|
||||||
raydan.space: could not connect to host
|
raydan.space: could not connect to host
|
||||||
raydobe.me: could not connect to host
|
raydobe.me: could not connect to host
|
||||||
|
@ -3692,7 +3708,6 @@ realmic.net: could not connect to host
|
||||||
realmofespionage.com: could not connect to host
|
realmofespionage.com: could not connect to host
|
||||||
reaper.rip: could not connect to host
|
reaper.rip: could not connect to host
|
||||||
reardenporn.com: could not connect to host
|
reardenporn.com: could not connect to host
|
||||||
recolic.net: did not receive HSTS header
|
|
||||||
recommended.reviews: could not connect to host
|
recommended.reviews: could not connect to host
|
||||||
redable.hosting: could not connect to host
|
redable.hosting: could not connect to host
|
||||||
redar.xyz: could not connect to host
|
redar.xyz: could not connect to host
|
||||||
|
@ -3709,6 +3724,7 @@ regalpalms.com: did not receive HSTS header
|
||||||
regenbogenwald.de: did not receive HSTS header
|
regenbogenwald.de: did not receive HSTS header
|
||||||
regenerescence.com: did not receive HSTS header
|
regenerescence.com: did not receive HSTS header
|
||||||
reggae-cdmx.com: did not receive HSTS header
|
reggae-cdmx.com: did not receive HSTS header
|
||||||
|
rei.ki: could not connect to host
|
||||||
reic.me: could not connect to host
|
reic.me: could not connect to host
|
||||||
reisyukaku.org: did not receive HSTS header
|
reisyukaku.org: did not receive HSTS header
|
||||||
reithguard-it.de: did not receive HSTS header
|
reithguard-it.de: did not receive HSTS header
|
||||||
|
@ -3844,6 +3860,7 @@ s.how: did not receive HSTS header
|
||||||
safematix.com: could not connect to host
|
safematix.com: could not connect to host
|
||||||
safemovescheme.co.uk: did not receive HSTS header
|
safemovescheme.co.uk: did not receive HSTS header
|
||||||
saferedirect.link: could not connect to host
|
saferedirect.link: could not connect to host
|
||||||
|
safetyrisk.net: did not receive HSTS header
|
||||||
safewings-nh.nl: did not receive HSTS header
|
safewings-nh.nl: did not receive HSTS header
|
||||||
sageth.com: max-age too low: 0
|
sageth.com: max-age too low: 0
|
||||||
sah3.net: could not connect to host
|
sah3.net: could not connect to host
|
||||||
|
@ -3946,7 +3963,6 @@ securityinet.net: did not receive HSTS header
|
||||||
securityinet.org.il: did not receive HSTS header
|
securityinet.org.il: did not receive HSTS header
|
||||||
securiviera.ch: did not receive HSTS header
|
securiviera.ch: did not receive HSTS header
|
||||||
sedrubal.de: could not connect to host
|
sedrubal.de: could not connect to host
|
||||||
sedziapilkarski.pl: could not connect to host
|
|
||||||
seedboxers.net: did not receive HSTS header
|
seedboxers.net: did not receive HSTS header
|
||||||
seele.ca: could not connect to host
|
seele.ca: could not connect to host
|
||||||
segulink.com: could not connect to host
|
segulink.com: could not connect to host
|
||||||
|
@ -4018,7 +4034,6 @@ shooshosha.com: did not receive HSTS header
|
||||||
shopontarget.com: did not receive HSTS header
|
shopontarget.com: did not receive HSTS header
|
||||||
shoprose.ru: could not connect to host
|
shoprose.ru: could not connect to host
|
||||||
shops.neonisi.com: could not connect to host
|
shops.neonisi.com: could not connect to host
|
||||||
shortpath.com: could not connect to host
|
|
||||||
shortr.li: could not connect to host
|
shortr.li: could not connect to host
|
||||||
showkeeper.tv: did not receive HSTS header
|
showkeeper.tv: did not receive HSTS header
|
||||||
shu-kin.net: could not connect to host
|
shu-kin.net: could not connect to host
|
||||||
|
@ -4054,15 +4069,13 @@ simpleai.net: max-age too low: 600
|
||||||
simplefraud.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 118" data: no]
|
simplefraud.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 118" data: no]
|
||||||
simplelearner.com: could not connect to host
|
simplelearner.com: could not connect to host
|
||||||
simplepractice.com: did not receive HSTS header
|
simplepractice.com: did not receive HSTS header
|
||||||
simplixos.org: could not connect to host
|
simply-premium.com: did not receive HSTS header
|
||||||
simply-premium.com: max-age too low: 0
|
|
||||||
sin30.net: could not connect to host
|
sin30.net: could not connect to host
|
||||||
sincron.org: could not connect to host
|
sincron.org: could not connect to host
|
||||||
sinful.pw: could not connect to host
|
sinful.pw: could not connect to host
|
||||||
sinfulforums.net: could not connect to host
|
sinfulforums.net: could not connect to host
|
||||||
singul4rity.com: could not connect to host
|
singul4rity.com: could not connect to host
|
||||||
sinosky.org: could not connect to host
|
sinosky.org: could not connect to host
|
||||||
siraweb.org: did not receive HSTS header
|
|
||||||
siriad.com: could not connect to host
|
siriad.com: could not connect to host
|
||||||
sirius-lee.net: could not connect to host
|
sirius-lee.net: could not connect to host
|
||||||
sitennisclub.com: did not receive HSTS header
|
sitennisclub.com: did not receive HSTS header
|
||||||
|
@ -4087,15 +4100,16 @@ slash-dev.de: did not receive HSTS header
|
||||||
slashand.co: did not receive HSTS header
|
slashand.co: did not receive HSTS header
|
||||||
slashem.me: did not receive HSTS header
|
slashem.me: did not receive HSTS header
|
||||||
slattery.co: could not connect to host
|
slattery.co: could not connect to host
|
||||||
|
slauber.de: did not receive HSTS header
|
||||||
sleep10.com: could not connect to host
|
sleep10.com: could not connect to host
|
||||||
slicketl.com: did not receive HSTS header
|
slicketl.com: did not receive HSTS header
|
||||||
slightfuture.click: could not connect to host
|
slightfuture.click: could not connect to host
|
||||||
slix.io: could not connect to host
|
slix.io: could not connect to host
|
||||||
slope.haus: could not connect to host
|
slope.haus: could not connect to host
|
||||||
slovakiana.sk: did not receive HSTS header
|
slovakiana.sk: did not receive HSTS header
|
||||||
|
slowfood.es: could not connect to host
|
||||||
sluitkampzeist.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 118" data: no]
|
sluitkampzeist.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 118" data: no]
|
||||||
slycurity.de: could not connect to host
|
slycurity.de: could not connect to host
|
||||||
smallchat.nl: could not connect to host
|
|
||||||
smart-mirror.de: did not receive HSTS header
|
smart-mirror.de: did not receive HSTS header
|
||||||
smart-ov.nl: could not connect to host
|
smart-ov.nl: could not connect to host
|
||||||
smartcoin.com.br: could not connect to host
|
smartcoin.com.br: could not connect to host
|
||||||
|
@ -4119,6 +4133,7 @@ snapworks.net: did not receive HSTS header
|
||||||
snel4u.nl: could not connect to host
|
snel4u.nl: could not connect to host
|
||||||
snelwerk.be: did not receive HSTS header
|
snelwerk.be: did not receive HSTS header
|
||||||
sng.my: could not connect to host
|
sng.my: could not connect to host
|
||||||
|
sniderman.eu.org: could not connect to host
|
||||||
snille.com: could not connect to host
|
snille.com: could not connect to host
|
||||||
snip.host: could not connect to host
|
snip.host: could not connect to host
|
||||||
snoozedds.com: max-age too low: 600
|
snoozedds.com: max-age too low: 600
|
||||||
|
@ -4151,7 +4166,6 @@ sonic.network: did not receive HSTS header
|
||||||
sonicrainboom.rocks: could not connect to host
|
sonicrainboom.rocks: could not connect to host
|
||||||
soobi.org: did not receive HSTS header
|
soobi.org: did not receive HSTS header
|
||||||
soondy.com: did not receive HSTS header
|
soondy.com: did not receive HSTS header
|
||||||
sotiran.com: could not connect to host
|
|
||||||
sotor.de: 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 118" data: no]
|
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 118" data: no]
|
||||||
soulfulglamour.uk: could not connect to host
|
soulfulglamour.uk: could not connect to host
|
||||||
|
@ -4212,6 +4226,7 @@ ssl.rip: could not connect to host
|
||||||
ssmato.me: could not connect to host
|
ssmato.me: could not connect to host
|
||||||
ssnc.org: max-age too low: 300
|
ssnc.org: max-age too low: 300
|
||||||
sss3s.com: could not connect to host
|
sss3s.com: could not connect to host
|
||||||
|
sstewartgallus.com: could not connect to host
|
||||||
ssworld.ga: could not connect to host
|
ssworld.ga: could not connect to host
|
||||||
stabletoken.com: could not connect to host
|
stabletoken.com: could not connect to host
|
||||||
stadjerspasonline.nl: could not connect to host
|
stadjerspasonline.nl: could not connect to host
|
||||||
|
@ -4225,6 +4240,7 @@ starsam80.net: could not connect to host
|
||||||
starttraffic.com: did not receive HSTS header
|
starttraffic.com: did not receive HSTS header
|
||||||
startuponcloud.com: max-age too low: 2678400
|
startuponcloud.com: max-age too low: 2678400
|
||||||
startuppeople.co.uk: did not receive HSTS header
|
startuppeople.co.uk: did not receive HSTS header
|
||||||
|
stash.ai: did not receive HSTS header
|
||||||
state-sponsored-actors.net: could not connect to host
|
state-sponsored-actors.net: could not connect to host
|
||||||
statementinsertsforless.com: did not receive HSTS header
|
statementinsertsforless.com: did not receive HSTS header
|
||||||
stateofexception.io: could not connect to host
|
stateofexception.io: could not connect to host
|
||||||
|
@ -4258,6 +4274,7 @@ stocktrade.de: could not connect to host
|
||||||
stoffe-monster.de: did not receive HSTS header
|
stoffe-monster.de: did not receive HSTS header
|
||||||
stole-my.bike: could not connect to host
|
stole-my.bike: could not connect to host
|
||||||
stole-my.tv: could not connect to host
|
stole-my.tv: could not connect to host
|
||||||
|
stomt.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 118" data: no]
|
||||||
stopwoodfin.org: could not connect to host
|
stopwoodfin.org: could not connect to host
|
||||||
storecove.com: did not receive HSTS header
|
storecove.com: did not receive HSTS header
|
||||||
storefrontify.com: did not receive HSTS header
|
storefrontify.com: did not receive HSTS header
|
||||||
|
@ -4288,12 +4305,12 @@ studybay.com: did not receive HSTS header
|
||||||
studydrive.net: did not receive HSTS header
|
studydrive.net: did not receive HSTS header
|
||||||
studyhub.cf: did not receive HSTS header
|
studyhub.cf: did not receive HSTS header
|
||||||
stugb.de: did not receive HSTS header
|
stugb.de: did not receive HSTS header
|
||||||
stuntmen.xyz: could not connect to host
|
|
||||||
stw-group.at: could not connect to host
|
stw-group.at: could not connect to host
|
||||||
stylenda.com: could not connect to host
|
stylenda.com: could not connect to host
|
||||||
styles.pm: could not connect to host
|
styles.pm: could not connect to host
|
||||||
subbing.work: could not connect to host
|
subbing.work: could not connect to host
|
||||||
subdimension.org: could not connect to host
|
subdimension.org: could not connect to host
|
||||||
|
subeesu.com: could not connect to host
|
||||||
subrosa.io: could not connect to host
|
subrosa.io: could not connect to host
|
||||||
subsys.no: did not receive HSTS header
|
subsys.no: did not receive HSTS header
|
||||||
subtitle.rip: could not connect to host
|
subtitle.rip: could not connect to host
|
||||||
|
@ -4345,6 +4362,7 @@ syntheticmotoroil.org: did not receive HSTS header
|
||||||
syriatalk.biz: could not connect to host
|
syriatalk.biz: could not connect to host
|
||||||
syriatalk.org: could not connect to host
|
syriatalk.org: could not connect to host
|
||||||
syrocon.ch: could not connect to host
|
syrocon.ch: could not connect to host
|
||||||
|
sysadmin.pm: could not connect to host
|
||||||
sysadmin.xyz: [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 118" data: no]
|
sysadmin.xyz: [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 118" data: no]
|
||||||
syso.name: could not connect to host
|
syso.name: could not connect to host
|
||||||
szaszm.tk: max-age too low: 0
|
szaszm.tk: max-age too low: 0
|
||||||
|
@ -4448,6 +4466,7 @@ theamateurs.net: did not receive HSTS header
|
||||||
theater.cf: could not connect to host
|
theater.cf: could not connect to host
|
||||||
theberkshirescompany.com: did not receive HSTS header
|
theberkshirescompany.com: did not receive HSTS header
|
||||||
thebigfail.net: could not connect to host
|
thebigfail.net: could not connect to host
|
||||||
|
thebigwave.de: could not connect to host
|
||||||
thebrotherswarde.com: could not connect to host
|
thebrotherswarde.com: could not connect to host
|
||||||
thecapitalbank.com: did not receive HSTS header
|
thecapitalbank.com: did not receive HSTS header
|
||||||
thecharlestonwaldorf.com: did not receive HSTS header
|
thecharlestonwaldorf.com: did not receive HSTS header
|
||||||
|
@ -4458,6 +4477,7 @@ thecrochetcottage.net: could not connect to host
|
||||||
thediaryofadam.com: did not receive HSTS header
|
thediaryofadam.com: did not receive HSTS header
|
||||||
theendofzion.com: did not receive HSTS header
|
theendofzion.com: did not receive HSTS header
|
||||||
theescapistswiki.com: could not connect to host
|
theescapistswiki.com: could not connect to host
|
||||||
|
theeyeopener.com: did not receive HSTS header
|
||||||
theflowerbasketonline.com: could not connect to host
|
theflowerbasketonline.com: could not connect to host
|
||||||
thefootballanalyst.com: could not connect to host
|
thefootballanalyst.com: could not connect to host
|
||||||
thefrozenfire.com: did not receive HSTS header
|
thefrozenfire.com: did not receive HSTS header
|
||||||
|
@ -4511,13 +4531,14 @@ tickreport.com: did not receive HSTS header
|
||||||
ticktock.today: did not receive HSTS header
|
ticktock.today: did not receive HSTS header
|
||||||
tictactux.de: could not connect to host
|
tictactux.de: could not connect to host
|
||||||
tidmore.us: could not connect to host
|
tidmore.us: could not connect to host
|
||||||
|
tie-online.org: did not receive HSTS header
|
||||||
tiensnet.com: did not receive HSTS header
|
tiensnet.com: did not receive HSTS header
|
||||||
tightlineproductions.com: did not receive HSTS header
|
tightlineproductions.com: did not receive HSTS header
|
||||||
tikutiku.pl: could not connect to host
|
tikutiku.pl: could not connect to host
|
||||||
tildebot.com: could not connect to host
|
tildebot.com: could not connect to host
|
||||||
tilkah.com.au: could not connect to host
|
tilkah.com.au: could not connect to host
|
||||||
timbeilby.com: could not connect to host
|
timbeilby.com: could not connect to host
|
||||||
timbuktutimber.com: could not connect to host
|
timbuktutimber.com: did not receive HSTS header
|
||||||
timcamara.com: did not receive HSTS header
|
timcamara.com: did not receive HSTS header
|
||||||
time-river.xyz: could not connect to host
|
time-river.xyz: could not connect to host
|
||||||
timestamp.io: did not receive HSTS header
|
timestamp.io: did not receive HSTS header
|
||||||
|
@ -4527,6 +4548,7 @@ timotrans.eu: did not receive HSTS header
|
||||||
timowi.de: could not connect to host
|
timowi.de: could not connect to host
|
||||||
timowi.net: could not connect to host
|
timowi.net: could not connect to host
|
||||||
timwittenberg.com: could not connect to host
|
timwittenberg.com: could not connect to host
|
||||||
|
timysewyn.be: could not connect to host
|
||||||
tink.network: could not connect to host
|
tink.network: could not connect to host
|
||||||
tipbox.is: could not connect to host
|
tipbox.is: could not connect to host
|
||||||
tipsyk.ru: could not connect to host
|
tipsyk.ru: could not connect to host
|
||||||
|
@ -4548,6 +4570,7 @@ tmitchell.io: could not connect to host
|
||||||
tmprod.com: did not receive HSTS header
|
tmprod.com: did not receive HSTS header
|
||||||
tncnanet.com.br: could not connect to host
|
tncnanet.com.br: could not connect to host
|
||||||
tnrsca.jp: did not receive HSTS header
|
tnrsca.jp: did not receive HSTS header
|
||||||
|
toast.al: could not connect to host
|
||||||
tobias-bielefeld.de: did not receive HSTS header
|
tobias-bielefeld.de: did not receive HSTS header
|
||||||
tobiasmathes.com: could not connect to host
|
tobiasmathes.com: could not connect to host
|
||||||
tobiasmathes.name: could not connect to host
|
tobiasmathes.name: could not connect to host
|
||||||
|
@ -4659,6 +4682,7 @@ tzappa.net: could not connect to host
|
||||||
u-blox.com: max-age too low: 0
|
u-blox.com: max-age too low: 0
|
||||||
ua.search.yahoo.com: did not receive HSTS header
|
ua.search.yahoo.com: did not receive HSTS header
|
||||||
uadp.pw: did not receive HSTS header
|
uadp.pw: did not receive HSTS header
|
||||||
|
ubanquity.com: could not connect to host
|
||||||
uberfunction.com: did not receive HSTS header
|
uberfunction.com: did not receive HSTS header
|
||||||
ubicloud.de: could not connect to host
|
ubicloud.de: could not connect to host
|
||||||
ubicv.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 118" data: no]
|
ubicv.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 118" data: no]
|
||||||
|
@ -4704,7 +4728,7 @@ unknownphenomena.net: could not connect to host
|
||||||
unmanaged.space: did not receive HSTS header
|
unmanaged.space: did not receive HSTS header
|
||||||
unplugg3r.dk: could not connect to host
|
unplugg3r.dk: could not connect to host
|
||||||
unravel.ie: could not connect to host
|
unravel.ie: could not connect to host
|
||||||
unsystem.net: could not connect to host
|
unsystem.net: did not receive HSTS header
|
||||||
unterschicht.tv: could not connect to host
|
unterschicht.tv: could not connect to host
|
||||||
unwiredbrain.com: could not connect to host
|
unwiredbrain.com: could not connect to host
|
||||||
unyq.me: could not connect to host
|
unyq.me: could not connect to host
|
||||||
|
@ -4717,7 +4741,6 @@ uprotect.it: could not connect to host
|
||||||
upstats.eu: could not connect to host
|
upstats.eu: could not connect to host
|
||||||
ur-lauber.de: did not receive HSTS header
|
ur-lauber.de: did not receive HSTS header
|
||||||
urandom.eu.org: did not receive HSTS header
|
urandom.eu.org: did not receive HSTS header
|
||||||
urbanstylestaging.com: did not receive HSTS header
|
|
||||||
urphp.com: could not connect to host
|
urphp.com: could not connect to host
|
||||||
us-immigration.com: did not receive HSTS header
|
us-immigration.com: did not receive HSTS header
|
||||||
usaa.com: did not receive HSTS header
|
usaa.com: did not receive HSTS header
|
||||||
|
@ -4732,7 +4755,7 @@ ustr.gov: max-age too low: 86400
|
||||||
utilitarianism.net: did not receive HSTS header
|
utilitarianism.net: did not receive HSTS header
|
||||||
utleieplassen.no: could not connect to host
|
utleieplassen.no: could not connect to host
|
||||||
utopiagalaxy.space: could not connect to host
|
utopiagalaxy.space: could not connect to host
|
||||||
utopianhomespa.com: could not connect to host
|
utopianhomespa.com: did not receive HSTS header
|
||||||
utumno.ch: could not connect to host
|
utumno.ch: could not connect to host
|
||||||
utvbloggen.se: [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 118" data: no]
|
utvbloggen.se: [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 118" data: no]
|
||||||
uvarov.pw: did not receive HSTS header
|
uvarov.pw: did not receive HSTS header
|
||||||
|
@ -4775,6 +4798,7 @@ venixplays-stream.ml: could not connect to host
|
||||||
verifikatorindonesia.com: could not connect to host
|
verifikatorindonesia.com: could not connect to host
|
||||||
vermontcareergateway.org: could not connect to host
|
vermontcareergateway.org: could not connect to host
|
||||||
versia.ru: did not receive HSTS header
|
versia.ru: did not receive HSTS header
|
||||||
|
verspai.de: could not connect to host
|
||||||
veryhax.de: could not connect to host
|
veryhax.de: could not connect to host
|
||||||
vetmgmt.com: could not connect to host
|
vetmgmt.com: could not connect to host
|
||||||
vfree.org: could not connect to host
|
vfree.org: could not connect to host
|
||||||
|
@ -4794,7 +4818,6 @@ vigilo.ga: could not connect to host
|
||||||
vijos.org: did not receive HSTS header
|
vijos.org: did not receive HSTS header
|
||||||
viktor-machnik.de: could not connect to host
|
viktor-machnik.de: could not connect to host
|
||||||
viktorsvantesson.net: did not receive HSTS header
|
viktorsvantesson.net: did not receive HSTS header
|
||||||
vinasec.se: could not connect to host
|
|
||||||
vincentkooijman.at: did not receive HSTS header
|
vincentkooijman.at: did not receive HSTS header
|
||||||
vincentkooijman.nl: did not receive HSTS header
|
vincentkooijman.nl: did not receive HSTS header
|
||||||
vincentpancol.com: could not connect to host
|
vincentpancol.com: could not connect to host
|
||||||
|
@ -4861,7 +4884,7 @@ wapjt.cn: could not connect to host
|
||||||
warandpeace.xyz: could not connect to host
|
warandpeace.xyz: could not connect to host
|
||||||
warehost.de: did not receive HSTS header
|
warehost.de: did not receive HSTS header
|
||||||
warhistoryonline.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 118" data: no]
|
warhistoryonline.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 118" data: no]
|
||||||
warlions.info: could not connect to host
|
warlions.info: did not receive HSTS header
|
||||||
warped.com: did not receive HSTS header
|
warped.com: did not receive HSTS header
|
||||||
warsentech.com: did not receive HSTS header
|
warsentech.com: did not receive HSTS header
|
||||||
washingtonviews.com: did not receive HSTS header
|
washingtonviews.com: did not receive HSTS header
|
||||||
|
@ -4947,7 +4970,6 @@ wilf1rst.com: could not connect to host
|
||||||
willcipriano.com: could not connect to host
|
willcipriano.com: could not connect to host
|
||||||
william.si: did not receive HSTS header
|
william.si: did not receive HSTS header
|
||||||
willosagiede.com: did not receive HSTS header
|
willosagiede.com: did not receive HSTS header
|
||||||
willow.technology: could not connect to host
|
|
||||||
wimake.solutions: did not receive HSTS header
|
wimake.solutions: did not receive HSTS header
|
||||||
winaes.com: did not receive HSTS header
|
winaes.com: did not receive HSTS header
|
||||||
winclient.cn: could not connect to host
|
winclient.cn: could not connect to host
|
||||||
|
@ -4985,7 +5007,6 @@ wonderfall.xyz: could not connect to host
|
||||||
wonderhost.info: could not connect to host
|
wonderhost.info: could not connect to host
|
||||||
wondershift.biz: did not receive HSTS header
|
wondershift.biz: did not receive HSTS header
|
||||||
woodmafia.com.au: max-age too low: 0
|
woodmafia.com.au: max-age too low: 0
|
||||||
woontegelwinkel.nl: did not receive HSTS header
|
|
||||||
woording.com: could not connect to host
|
woording.com: could not connect to host
|
||||||
wootton95.com: could not connect to host
|
wootton95.com: could not connect to host
|
||||||
woresite.jp: did not receive HSTS header
|
woresite.jp: did not receive HSTS header
|
||||||
|
@ -5000,7 +5021,6 @@ wphostingspot.com: did not receive HSTS header
|
||||||
wpmetadatastandardsproject.org: could not connect to host
|
wpmetadatastandardsproject.org: could not connect to host
|
||||||
writeapp.me: could not connect to host
|
writeapp.me: could not connect to host
|
||||||
wsscompany.com.ve: could not connect to host
|
wsscompany.com.ve: could not connect to host
|
||||||
wth.in: could not connect to host
|
|
||||||
wufu.org: did not receive HSTS header
|
wufu.org: did not receive HSTS header
|
||||||
wuhengmin.com: did not receive HSTS header
|
wuhengmin.com: did not receive HSTS header
|
||||||
wurzelzwerg.net: could not connect to host
|
wurzelzwerg.net: could not connect to host
|
||||||
|
@ -5029,7 +5049,7 @@ www.surfeasy.com: did not receive HSTS header
|
||||||
www.zenpayroll.com: did not receive HSTS header
|
www.zenpayroll.com: did not receive HSTS header
|
||||||
www3.info: did not receive HSTS header
|
www3.info: did not receive HSTS header
|
||||||
wxukang.cn: could not connect to host
|
wxukang.cn: could not connect to host
|
||||||
wyzphoto.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 118" data: no]
|
wyzphoto.nl: could not connect to host
|
||||||
x2w.io: could not connect to host
|
x2w.io: could not connect to host
|
||||||
x3led.com: could not connect to host
|
x3led.com: could not connect to host
|
||||||
x509.pub: could not connect to host
|
x509.pub: could not connect to host
|
||||||
|
@ -5051,6 +5071,7 @@ xiaody.me: could not connect to host
|
||||||
xiaolvmu.me: could not connect to host
|
xiaolvmu.me: could not connect to host
|
||||||
xiaoxiao.im: could not connect to host
|
xiaoxiao.im: could not connect to host
|
||||||
ximens.me: did not receive HSTS header
|
ximens.me: did not receive HSTS header
|
||||||
|
xing.ml: could not connect to host
|
||||||
xisa.it: could not connect to host
|
xisa.it: could not connect to host
|
||||||
xiyu.moe: could not connect to host
|
xiyu.moe: could not connect to host
|
||||||
xmppwocky.net: could not connect to host
|
xmppwocky.net: could not connect to host
|
||||||
|
@ -5066,7 +5087,7 @@ xn--80aaihqncaejjobbu6v.xn--p1ai: max-age too low: 10000
|
||||||
xn--9pr52k0p5a.com: did not receive HSTS header
|
xn--9pr52k0p5a.com: did not receive HSTS header
|
||||||
xn--datenrettung-mnchen-jbc.com: did not receive HSTS header
|
xn--datenrettung-mnchen-jbc.com: did not receive HSTS header
|
||||||
xn--dmonenjger-q5ag.net: could not connect to host
|
xn--dmonenjger-q5ag.net: could not connect to host
|
||||||
xn--fischereiverein-mnsterhausen-i7c.de: could not connect to host
|
xn--knstler-n2a.tips: could not connect to host
|
||||||
xn--lgb3a8bcpn.cf: could not connect to host
|
xn--lgb3a8bcpn.cf: could not connect to host
|
||||||
xn--lgb3a8bcpn.ga: could not connect to host
|
xn--lgb3a8bcpn.ga: could not connect to host
|
||||||
xn--lgb3a8bcpn.gq: could not connect to host
|
xn--lgb3a8bcpn.gq: could not connect to host
|
||||||
|
@ -5135,6 +5156,7 @@ yu.gg: did not receive HSTS header
|
||||||
yuan.ga: did not receive HSTS header
|
yuan.ga: did not receive HSTS header
|
||||||
yuhen.ru: did not receive HSTS header
|
yuhen.ru: did not receive HSTS header
|
||||||
yuko.moe: could not connect to host
|
yuko.moe: could not connect to host
|
||||||
|
yunpan.blue: could not connect to host
|
||||||
yunzhu.li: did not receive HSTS header
|
yunzhu.li: did not receive HSTS header
|
||||||
yunzhu.org: could not connect to host
|
yunzhu.org: could not connect to host
|
||||||
yutabon.com: could not connect to host
|
yutabon.com: could not connect to host
|
||||||
|
@ -5150,7 +5172,6 @@ zamorano.edu: could not connect to host
|
||||||
zao.fi: could not connect to host
|
zao.fi: could not connect to host
|
||||||
zap.yt: could not connect to host
|
zap.yt: could not connect to host
|
||||||
zarooba.com: could not connect to host
|
zarooba.com: could not connect to host
|
||||||
zberger.com: could not connect to host
|
|
||||||
zbigniewgalucki.eu: did not receive HSTS header
|
zbigniewgalucki.eu: did not receive HSTS header
|
||||||
zebrababy.cn: did not receive HSTS header
|
zebrababy.cn: did not receive HSTS header
|
||||||
zefiris.org: did not receive HSTS header
|
zefiris.org: did not receive HSTS header
|
||||||
|
@ -5187,12 +5208,12 @@ zoo24.de: did not receive HSTS header
|
||||||
zoomingin.net: max-age too low: 5184000
|
zoomingin.net: max-age too low: 5184000
|
||||||
zoommailing.com: did not receive HSTS header
|
zoommailing.com: did not receive HSTS header
|
||||||
zorasvobodova.cz: did not receive HSTS header
|
zorasvobodova.cz: did not receive HSTS header
|
||||||
|
zorgclustertool.nl: could not connect to host
|
||||||
zortium.report: could not connect to host
|
zortium.report: could not connect to host
|
||||||
zoznamrealit.sk: did not receive HSTS header
|
zoznamrealit.sk: did not receive HSTS header
|
||||||
zqhong.com: could not connect to host
|
zqhong.com: could not connect to host
|
||||||
ztan.tk: could not connect to host
|
ztan.tk: could not connect to host
|
||||||
ztcaoll222.cn: did not receive HSTS header
|
ztcaoll222.cn: did not receive HSTS header
|
||||||
zten.org: could not connect to host
|
|
||||||
zulu7.com: could not connect to host
|
zulu7.com: could not connect to host
|
||||||
zvncloud.com: did not receive HSTS header
|
zvncloud.com: did not receive HSTS header
|
||||||
zwollemagazine.nl: did not receive HSTS header
|
zwollemagazine.nl: did not receive HSTS header
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1133,7 +1133,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "html5ever"
|
name = "html5ever"
|
||||||
version = "0.13.1"
|
version = "0.14.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -2252,7 +2252,7 @@ dependencies = [
|
||||||
"gfx_traits 0.0.1",
|
"gfx_traits 0.0.1",
|
||||||
"heapsize 0.3.8 (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.4 (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 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"html5ever-atoms 0.2.0 (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 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)",
|
"hyper_serde 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -3412,7 +3412,7 @@ dependencies = [
|
||||||
"checksum heartbeats-simple 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9ad003ce233955e9d95f2c69cde84e68302ba9ba4a673d351c9bff93c738aadc"
|
"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 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 hpack 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d2da7d3a34cf6406d9d700111b8eafafe9a251de41ae71d8052748259343b58"
|
||||||
"checksum html5ever 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d60508177ec4e5774a112efcf4d4d5f123cb00a43476fa5940b7da568371a165"
|
"checksum html5ever 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a3b2e982006a000535c1976213cd1baa3f455cd19335d50992ab219ffe1d3c06"
|
||||||
"checksum html5ever-atoms 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f9bd86e3b6a5a7933a272cc0a854f24e371f31576e585c0b41e8f857270c5134"
|
"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 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"
|
"checksum hyper 0.9.18 (registry+https://github.com/rust-lang/crates.io-index)" = "1b9bf64f730d6ee4b0528a5f0a316363da9d8104318731509d4ccc86248f82b3"
|
||||||
|
|
|
@ -108,7 +108,7 @@ use servo_config::opts;
|
||||||
use servo_config::prefs::PREFS;
|
use servo_config::prefs::PREFS;
|
||||||
use servo_rand::{Rng, SeedableRng, ServoRng, random};
|
use servo_rand::{Rng, SeedableRng, ServoRng, random};
|
||||||
use servo_remutex::ReentrantMutex;
|
use servo_remutex::ReentrantMutex;
|
||||||
use servo_url::ServoUrl;
|
use servo_url::{Host, ServoUrl};
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
use std::collections::{HashMap, VecDeque};
|
use std::collections::{HashMap, VecDeque};
|
||||||
use std::iter::once;
|
use std::iter::once;
|
||||||
|
@ -229,13 +229,13 @@ pub struct Constellation<Message, LTF, STF> {
|
||||||
/// event loop for each registered domain name (aka eTLD+1) in
|
/// event loop for each registered domain name (aka eTLD+1) in
|
||||||
/// each top-level frame. We store the event loops in a map
|
/// each top-level frame. We store the event loops in a map
|
||||||
/// indexed by top-level frame id (as a `FrameId`) and registered
|
/// indexed by top-level frame id (as a `FrameId`) and registered
|
||||||
/// domain name (as a `String`) to event loops. This double
|
/// domain name (as a `Host`) to event loops. This double
|
||||||
/// indirection ensures that separate tabs do not share event
|
/// indirection ensures that separate tabs do not share event
|
||||||
/// loops, even if the same domain is loaded in each.
|
/// loops, even if the same domain is loaded in each.
|
||||||
/// It is important that scripts with the same eTLD+1
|
/// It is important that scripts with the same eTLD+1
|
||||||
/// share an event loop, since they can use `document.domain`
|
/// share an event loop, since they can use `document.domain`
|
||||||
/// to become same-origin, at which point they can share DOM objects.
|
/// to become same-origin, at which point they can share DOM objects.
|
||||||
event_loops: HashMap<FrameId, HashMap<String, Weak<EventLoop>>>,
|
event_loops: HashMap<FrameId, HashMap<Host, Weak<EventLoop>>>,
|
||||||
|
|
||||||
/// The set of all the pipelines in the browser.
|
/// The set of all the pipelines in the browser.
|
||||||
/// (See the `pipeline` module for more details.)
|
/// (See the `pipeline` module for more details.)
|
||||||
|
@ -604,16 +604,18 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
None => self.root_frame_id,
|
None => self.root_frame_id,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
debug!("Creating new pipeline {} in top-level frame {}.", pipeline_id, top_level_frame_id);
|
||||||
|
|
||||||
let (event_loop, host) = match sandbox {
|
let (event_loop, host) = match sandbox {
|
||||||
IFrameSandboxState::IFrameSandboxed => (None, None),
|
IFrameSandboxState::IFrameSandboxed => (None, None),
|
||||||
IFrameSandboxState::IFrameUnsandboxed => match reg_host(&load_data.url) {
|
IFrameSandboxState::IFrameUnsandboxed => match reg_host(&load_data.url) {
|
||||||
None => (None, None),
|
None => (None, None),
|
||||||
Some(host) => {
|
Some(host) => {
|
||||||
let event_loop = self.event_loops.get(&top_level_frame_id)
|
let event_loop = self.event_loops.get(&top_level_frame_id)
|
||||||
.and_then(|map| map.get(host))
|
.and_then(|map| map.get(&host))
|
||||||
.and_then(|weak| weak.upgrade());
|
.and_then(|weak| weak.upgrade());
|
||||||
match event_loop {
|
match event_loop {
|
||||||
None => (None, Some(String::from(host))),
|
None => (None, Some(host)),
|
||||||
Some(event_loop) => (Some(event_loop.clone()), None),
|
Some(event_loop) => (Some(event_loop.clone()), None),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -677,6 +679,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(host) = host {
|
if let Some(host) = host {
|
||||||
|
debug!("Adding new host entry {} for top-level frame {}.", host, top_level_frame_id);
|
||||||
self.event_loops.entry(top_level_frame_id)
|
self.event_loops.entry(top_level_frame_id)
|
||||||
.or_insert_with(HashMap::new)
|
.or_insert_with(HashMap::new)
|
||||||
.insert(host, Rc::downgrade(&pipeline.event_loop));
|
.insert(host, Rc::downgrade(&pipeline.event_loop));
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
//! those cases are not present.
|
//! those cases are not present.
|
||||||
|
|
||||||
use servo_config::resource_files::read_resource_file;
|
use servo_config::resource_files::read_resource_file;
|
||||||
use servo_url::ServoUrl;
|
use servo_url::{Host, ImmutableOrigin, ServoUrl};
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::iter::FromIterator;
|
use std::iter::FromIterator;
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
|
@ -146,6 +146,10 @@ pub fn is_reg_domain(domain: &str) -> bool {
|
||||||
/// Returns None if the URL has no host name.
|
/// Returns None if the URL has no host name.
|
||||||
/// Returns the registered suffix for the host name if it is a domain.
|
/// Returns the registered suffix for the host name if it is a domain.
|
||||||
/// Leaves the host name alone if it is an IP address.
|
/// Leaves the host name alone if it is an IP address.
|
||||||
pub fn reg_host<'a>(url: &'a ServoUrl) -> Option<&'a str> {
|
pub fn reg_host(url: &ServoUrl) -> Option<Host> {
|
||||||
url.domain().map(reg_suffix).or(url.host_str())
|
match url.origin() {
|
||||||
|
ImmutableOrigin::Tuple(_, Host::Domain(domain), _) => Some(Host::Domain(String::from(reg_suffix(&*domain)))),
|
||||||
|
ImmutableOrigin::Tuple(_, ip, _) => Some(ip),
|
||||||
|
ImmutableOrigin::Opaque(_) => None,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ fnv = "1.0"
|
||||||
gfx_traits = {path = "../gfx_traits"}
|
gfx_traits = {path = "../gfx_traits"}
|
||||||
heapsize = "0.3.6"
|
heapsize = "0.3.6"
|
||||||
heapsize_derive = "0.1"
|
heapsize_derive = "0.1"
|
||||||
html5ever = {version = "0.13", features = ["heap_size", "unstable"]}
|
html5ever = {version = "0.14", features = ["heap_size", "unstable"]}
|
||||||
html5ever-atoms = {version = "0.2", features = ["heap_size"]}
|
html5ever-atoms = {version = "0.2", features = ["heap_size"]}
|
||||||
hyper = "0.9.9"
|
hyper = "0.9.9"
|
||||||
hyper_serde = "0.5"
|
hyper_serde = "0.5"
|
||||||
|
|
|
@ -10,7 +10,6 @@ use dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::CSSStyleDeclar
|
||||||
use dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods;
|
use dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods;
|
||||||
use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
|
use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
|
||||||
use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods;
|
use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods;
|
||||||
use dom::bindings::codegen::Bindings::LocationBinding::LocationMethods;
|
|
||||||
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
||||||
use dom::bindings::conversions::{ConversionResult, FromJSValConvertible, jsstring_to_str};
|
use dom::bindings::conversions::{ConversionResult, FromJSValConvertible, jsstring_to_str};
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
|
@ -261,6 +260,6 @@ pub fn handle_request_animation_frame(documents: &Documents,
|
||||||
pub fn handle_reload(documents: &Documents,
|
pub fn handle_reload(documents: &Documents,
|
||||||
id: PipelineId) {
|
id: PipelineId) {
|
||||||
if let Some(win) = documents.find_window(id) {
|
if let Some(win) = documents.find_window(id) {
|
||||||
win.Location().Reload();
|
win.Location().reload_without_origin_check();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ use dom::htmlbodyelement::HTMLBodyElement;
|
||||||
use dom::htmlcollection::{CollectionFilter, HTMLCollection};
|
use dom::htmlcollection::{CollectionFilter, HTMLCollection};
|
||||||
use dom::htmlelement::HTMLElement;
|
use dom::htmlelement::HTMLElement;
|
||||||
use dom::htmlembedelement::HTMLEmbedElement;
|
use dom::htmlembedelement::HTMLEmbedElement;
|
||||||
use dom::htmlformelement::HTMLFormElement;
|
use dom::htmlformelement::{FormControl, FormControlElementHelpers, HTMLFormElement};
|
||||||
use dom::htmlheadelement::HTMLHeadElement;
|
use dom::htmlheadelement::HTMLHeadElement;
|
||||||
use dom::htmlhtmlelement::HTMLHtmlElement;
|
use dom::htmlhtmlelement::HTMLHtmlElement;
|
||||||
use dom::htmliframeelement::HTMLIFrameElement;
|
use dom::htmliframeelement::HTMLIFrameElement;
|
||||||
|
@ -68,6 +68,7 @@ use dom::location::Location;
|
||||||
use dom::messageevent::MessageEvent;
|
use dom::messageevent::MessageEvent;
|
||||||
use dom::mouseevent::MouseEvent;
|
use dom::mouseevent::MouseEvent;
|
||||||
use dom::node::{self, CloneChildrenFlag, Node, NodeDamage, window_from_node, IS_IN_DOC, LayoutNodeHelpers};
|
use dom::node::{self, CloneChildrenFlag, Node, NodeDamage, window_from_node, IS_IN_DOC, LayoutNodeHelpers};
|
||||||
|
use dom::node::VecPreOrderInsertionHelper;
|
||||||
use dom::nodeiterator::NodeIterator;
|
use dom::nodeiterator::NodeIterator;
|
||||||
use dom::nodelist::NodeList;
|
use dom::nodelist::NodeList;
|
||||||
use dom::pagetransitionevent::PageTransitionEvent;
|
use dom::pagetransitionevent::PageTransitionEvent;
|
||||||
|
@ -103,6 +104,7 @@ use msg::constellation_msg::{FrameId, Key, KeyModifiers, KeyState};
|
||||||
use net_traits::{FetchResponseMsg, IpcSend, ReferrerPolicy};
|
use net_traits::{FetchResponseMsg, IpcSend, ReferrerPolicy};
|
||||||
use net_traits::CookieSource::NonHTTP;
|
use net_traits::CookieSource::NonHTTP;
|
||||||
use net_traits::CoreResourceMsg::{GetCookiesForUrl, SetCookiesForUrl};
|
use net_traits::CoreResourceMsg::{GetCookiesForUrl, SetCookiesForUrl};
|
||||||
|
use net_traits::pub_domains::is_pub_domain;
|
||||||
use net_traits::request::RequestInit;
|
use net_traits::request::RequestInit;
|
||||||
use net_traits::response::HttpsState;
|
use net_traits::response::HttpsState;
|
||||||
use num_traits::ToPrimitive;
|
use num_traits::ToPrimitive;
|
||||||
|
@ -120,7 +122,7 @@ use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl};
|
||||||
use std::ascii::AsciiExt;
|
use std::ascii::AsciiExt;
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
use std::cell::{Cell, Ref, RefMut};
|
use std::cell::{Cell, Ref, RefMut};
|
||||||
use std::collections::{HashMap, VecDeque};
|
use std::collections::{HashMap, HashSet, VecDeque};
|
||||||
use std::collections::hash_map::Entry::{Occupied, Vacant};
|
use std::collections::hash_map::Entry::{Occupied, Vacant};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
use std::iter::once;
|
use std::iter::once;
|
||||||
|
@ -313,6 +315,12 @@ pub struct Document {
|
||||||
dom_count: Cell<u32>,
|
dom_count: Cell<u32>,
|
||||||
/// Entry node for fullscreen.
|
/// Entry node for fullscreen.
|
||||||
fullscreen_element: MutNullableJS<Element>,
|
fullscreen_element: MutNullableJS<Element>,
|
||||||
|
/// Map from ID to set of form control elements that have that ID as
|
||||||
|
/// their 'form' content attribute. Used to reset form controls
|
||||||
|
/// whenever any element with the same ID as the form attribute
|
||||||
|
/// is inserted or removed from the document.
|
||||||
|
/// See https://html.spec.whatwg.org/multipage/#form-owner
|
||||||
|
form_id_listener_map: DOMRefCell<HashMap<Atom, HashSet<JS<Element>>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(JSTraceable, HeapSizeOf)]
|
#[derive(JSTraceable, HeapSizeOf)]
|
||||||
|
@ -576,20 +584,26 @@ impl Document {
|
||||||
self,
|
self,
|
||||||
to_unregister,
|
to_unregister,
|
||||||
id);
|
id);
|
||||||
let mut id_map = self.id_map.borrow_mut();
|
// Limit the scope of the borrow because id_map might be borrowed again by
|
||||||
let is_empty = match id_map.get_mut(&id) {
|
// GetElementById through the following sequence of calls
|
||||||
None => false,
|
// reset_form_owner_for_listeners -> reset_form_owner -> GetElementById
|
||||||
Some(elements) => {
|
{
|
||||||
let position = elements.iter()
|
let mut id_map = self.id_map.borrow_mut();
|
||||||
.position(|element| &**element == to_unregister)
|
let is_empty = match id_map.get_mut(&id) {
|
||||||
.expect("This element should be in registered.");
|
None => false,
|
||||||
elements.remove(position);
|
Some(elements) => {
|
||||||
elements.is_empty()
|
let position = elements.iter()
|
||||||
|
.position(|element| &**element == to_unregister)
|
||||||
|
.expect("This element should be in registered.");
|
||||||
|
elements.remove(position);
|
||||||
|
elements.is_empty()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if is_empty {
|
||||||
|
id_map.remove(&id);
|
||||||
}
|
}
|
||||||
};
|
|
||||||
if is_empty {
|
|
||||||
id_map.remove(&id);
|
|
||||||
}
|
}
|
||||||
|
self.reset_form_owner_for_listeners(&id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Associate an element present in this document with the provided id.
|
/// Associate an element present in this document with the provided id.
|
||||||
|
@ -601,34 +615,34 @@ impl Document {
|
||||||
assert!(element.upcast::<Node>().is_in_doc());
|
assert!(element.upcast::<Node>().is_in_doc());
|
||||||
assert!(!id.is_empty());
|
assert!(!id.is_empty());
|
||||||
|
|
||||||
let mut id_map = self.id_map.borrow_mut();
|
|
||||||
|
|
||||||
let root = self.GetDocumentElement()
|
let root = self.GetDocumentElement()
|
||||||
.expect("The element is in the document, so there must be a document \
|
.expect("The element is in the document, so there must be a document \
|
||||||
element.");
|
element.");
|
||||||
|
|
||||||
match id_map.entry(id) {
|
// Limit the scope of the borrow because id_map might be borrowed again by
|
||||||
Vacant(entry) => {
|
// GetElementById through the following sequence of calls
|
||||||
entry.insert(vec![JS::from_ref(element)]);
|
// reset_form_owner_for_listeners -> reset_form_owner -> GetElementById
|
||||||
}
|
{
|
||||||
Occupied(entry) => {
|
let mut id_map = self.id_map.borrow_mut();
|
||||||
let elements = entry.into_mut();
|
let mut elements = id_map.entry(id.clone()).or_insert(Vec::new());
|
||||||
|
elements.insert_pre_order(element, root.r().upcast::<Node>());
|
||||||
|
}
|
||||||
|
self.reset_form_owner_for_listeners(&id);
|
||||||
|
}
|
||||||
|
|
||||||
let new_node = element.upcast::<Node>();
|
pub fn register_form_id_listener<T: ?Sized + FormControl>(&self, id: DOMString, listener: &T) {
|
||||||
let mut head: usize = 0;
|
let mut map = self.form_id_listener_map.borrow_mut();
|
||||||
let root = root.upcast::<Node>();
|
let listener = listener.to_element();
|
||||||
for node in root.traverse_preorder() {
|
let mut set = map.entry(Atom::from(id)).or_insert(HashSet::new());
|
||||||
if let Some(elem) = node.downcast() {
|
set.insert(JS::from_ref(listener));
|
||||||
if &*(*elements)[head] == elem {
|
}
|
||||||
head += 1;
|
|
||||||
}
|
|
||||||
if new_node == &*node || head == elements.len() {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
elements.insert(head, JS::from_ref(element));
|
pub fn unregister_form_id_listener<T: ?Sized + FormControl>(&self, id: DOMString, listener: &T) {
|
||||||
|
let mut map = self.form_id_listener_map.borrow_mut();
|
||||||
|
if let Occupied(mut entry) = map.entry(Atom::from(id)) {
|
||||||
|
entry.get_mut().remove(&JS::from_ref(listener.to_element()));
|
||||||
|
if entry.get().is_empty() {
|
||||||
|
entry.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1988,6 +2002,55 @@ impl LayoutDocumentHelpers for LayoutJS<Document> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#is-a-registrable-domain-suffix-of-or-is-equal-to
|
||||||
|
// The spec says to return a bool, we actually return an Option<Host> containing
|
||||||
|
// the parsed host in the successful case, to avoid having to re-parse the host.
|
||||||
|
fn get_registrable_domain_suffix_of_or_is_equal_to(host_suffix_string: &str, original_host: Host) -> Option<Host> {
|
||||||
|
// Step 1
|
||||||
|
if host_suffix_string.is_empty() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 2-3.
|
||||||
|
let host = match Host::parse(host_suffix_string) {
|
||||||
|
Ok(host) => host,
|
||||||
|
Err(_) => return None,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Step 4.
|
||||||
|
if host != original_host {
|
||||||
|
// Step 4.1
|
||||||
|
let host = match host {
|
||||||
|
Host::Domain(ref host) => host,
|
||||||
|
_ => return None,
|
||||||
|
};
|
||||||
|
let original_host = match original_host {
|
||||||
|
Host::Domain(ref original_host) => original_host,
|
||||||
|
_ => return None,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Step 4.2
|
||||||
|
let (prefix, suffix) = match original_host.len().checked_sub(host.len()) {
|
||||||
|
Some(index) => original_host.split_at(index),
|
||||||
|
None => return None,
|
||||||
|
};
|
||||||
|
if !prefix.ends_with(".") {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
if suffix != host {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 4.3
|
||||||
|
if is_pub_domain(host) {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 5
|
||||||
|
Some(host)
|
||||||
|
}
|
||||||
|
|
||||||
/// https://url.spec.whatwg.org/#network-scheme
|
/// https://url.spec.whatwg.org/#network-scheme
|
||||||
fn url_has_network_scheme(url: &ServoUrl) -> bool {
|
fn url_has_network_scheme(url: &ServoUrl) -> bool {
|
||||||
match url.scheme() {
|
match url.scheme() {
|
||||||
|
@ -2101,6 +2164,7 @@ impl Document {
|
||||||
spurious_animation_frames: Cell::new(0),
|
spurious_animation_frames: Cell::new(0),
|
||||||
dom_count: Cell::new(1),
|
dom_count: Cell::new(1),
|
||||||
fullscreen_element: MutNullableJS::new(None),
|
fullscreen_element: MutNullableJS::new(None),
|
||||||
|
form_id_listener_map: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2414,6 +2478,17 @@ impl Document {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn reset_form_owner_for_listeners(&self, id: &Atom) {
|
||||||
|
let map = self.form_id_listener_map.borrow();
|
||||||
|
if let Some(listeners) = map.get(id) {
|
||||||
|
for listener in listeners {
|
||||||
|
listener.r().as_maybe_form_control()
|
||||||
|
.expect("Element must be a form control")
|
||||||
|
.reset_form_owner();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2472,7 +2547,7 @@ impl DocumentMethods for Document {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#relaxing-the-same-origin-restriction
|
// https://html.spec.whatwg.org/multipage/#dom-document-domain
|
||||||
fn Domain(&self) -> DOMString {
|
fn Domain(&self) -> DOMString {
|
||||||
// Step 1.
|
// Step 1.
|
||||||
if !self.has_browsing_context {
|
if !self.has_browsing_context {
|
||||||
|
@ -2489,6 +2564,35 @@ impl DocumentMethods for Document {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#dom-document-domain
|
||||||
|
fn SetDomain(&self, value: DOMString) -> ErrorResult {
|
||||||
|
// Step 1.
|
||||||
|
if !self.has_browsing_context {
|
||||||
|
return Err(Error::Security);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Step 2. "If this Document object's active sandboxing
|
||||||
|
// flag set has its sandboxed document.domain browsing context
|
||||||
|
// flag set, then throw a "SecurityError" DOMException."
|
||||||
|
|
||||||
|
// Steps 3-4.
|
||||||
|
let effective_domain = match self.origin.effective_domain() {
|
||||||
|
Some(effective_domain) => effective_domain,
|
||||||
|
None => return Err(Error::Security),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Step 5
|
||||||
|
let host = match get_registrable_domain_suffix_of_or_is_equal_to(&*value, effective_domain) {
|
||||||
|
None => return Err(Error::Security),
|
||||||
|
Some(host) => host,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Step 6
|
||||||
|
self.origin.set_domain(host);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-document-referrer
|
// https://html.spec.whatwg.org/multipage/#dom-document-referrer
|
||||||
fn Referrer(&self) -> DOMString {
|
fn Referrer(&self) -> DOMString {
|
||||||
match self.referrer {
|
match self.referrer {
|
||||||
|
@ -3396,6 +3500,9 @@ impl DocumentMethods for Document {
|
||||||
|
|
||||||
let entry_responsible_document = GlobalScope::entry().as_window().Document();
|
let entry_responsible_document = GlobalScope::entry().as_window().Document();
|
||||||
|
|
||||||
|
// This check is same-origin not same-origin-domain.
|
||||||
|
// https://github.com/whatwg/html/issues/2282
|
||||||
|
// https://github.com/whatwg/html/pull/2288
|
||||||
if !self.origin.same_origin(&entry_responsible_document.origin) {
|
if !self.origin.same_origin(&entry_responsible_document.origin) {
|
||||||
// Step 4.
|
// Step 4.
|
||||||
return Err(Error::Security);
|
return Err(Error::Security);
|
||||||
|
|
|
@ -19,6 +19,7 @@ use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
|
||||||
use dom::bindings::codegen::Bindings::WindowBinding::{ScrollBehavior, ScrollToOptions};
|
use dom::bindings::codegen::Bindings::WindowBinding::{ScrollBehavior, ScrollToOptions};
|
||||||
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
||||||
use dom::bindings::codegen::UnionTypes::NodeOrString;
|
use dom::bindings::codegen::UnionTypes::NodeOrString;
|
||||||
|
use dom::bindings::conversions::DerivedFrom;
|
||||||
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
||||||
use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
||||||
use dom::bindings::js::{JS, LayoutJS, MutNullableJS};
|
use dom::bindings::js::{JS, LayoutJS, MutNullableJS};
|
||||||
|
@ -44,6 +45,7 @@ use dom::htmlcollection::HTMLCollection;
|
||||||
use dom::htmlelement::HTMLElement;
|
use dom::htmlelement::HTMLElement;
|
||||||
use dom::htmlfieldsetelement::HTMLFieldSetElement;
|
use dom::htmlfieldsetelement::HTMLFieldSetElement;
|
||||||
use dom::htmlfontelement::{HTMLFontElement, HTMLFontElementLayoutHelpers};
|
use dom::htmlfontelement::{HTMLFontElement, HTMLFontElementLayoutHelpers};
|
||||||
|
use dom::htmlformelement::FormControlElementHelpers;
|
||||||
use dom::htmlhrelement::{HTMLHRElement, HTMLHRLayoutHelpers};
|
use dom::htmlhrelement::{HTMLHRElement, HTMLHRLayoutHelpers};
|
||||||
use dom::htmliframeelement::{HTMLIFrameElement, HTMLIFrameElementLayoutMethods};
|
use dom::htmliframeelement::{HTMLIFrameElement, HTMLIFrameElementLayoutMethods};
|
||||||
use dom::htmlimageelement::{HTMLImageElement, LayoutHTMLImageElementHelpers};
|
use dom::htmlimageelement::{HTMLImageElement, LayoutHTMLImageElementHelpers};
|
||||||
|
@ -1360,6 +1362,14 @@ impl Element {
|
||||||
let document = document_from_node(self);
|
let document = document_from_node(self);
|
||||||
document.get_allow_fullscreen()
|
document.get_allow_fullscreen()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#home-subtree
|
||||||
|
pub fn is_in_same_home_subtree<T>(&self, other: &T) -> bool
|
||||||
|
where T: DerivedFrom<Element> + DomObject
|
||||||
|
{
|
||||||
|
let other = other.upcast::<Element>();
|
||||||
|
self.root_element() == other.root_element()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ElementMethods for Element {
|
impl ElementMethods for Element {
|
||||||
|
@ -2240,6 +2250,10 @@ impl VirtualMethods for Element {
|
||||||
s.bind_to_tree(tree_in_doc);
|
s.bind_to_tree(tree_in_doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(f) = self.as_maybe_form_control() {
|
||||||
|
f.bind_form_control_to_tree();
|
||||||
|
}
|
||||||
|
|
||||||
if !tree_in_doc {
|
if !tree_in_doc {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2255,6 +2269,10 @@ impl VirtualMethods for Element {
|
||||||
fn unbind_from_tree(&self, context: &UnbindContext) {
|
fn unbind_from_tree(&self, context: &UnbindContext) {
|
||||||
self.super_type().unwrap().unbind_from_tree(context);
|
self.super_type().unwrap().unbind_from_tree(context);
|
||||||
|
|
||||||
|
if let Some(f) = self.as_maybe_form_control() {
|
||||||
|
f.unbind_form_control_from_tree();
|
||||||
|
}
|
||||||
|
|
||||||
if !context.tree_in_doc {
|
if !context.tree_in_doc {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,8 +4,9 @@
|
||||||
|
|
||||||
use dom::bindings::codegen::Bindings::HistoryBinding;
|
use dom::bindings::codegen::Bindings::HistoryBinding;
|
||||||
use dom::bindings::codegen::Bindings::HistoryBinding::HistoryMethods;
|
use dom::bindings::codegen::Bindings::HistoryBinding::HistoryMethods;
|
||||||
use dom::bindings::codegen::Bindings::LocationBinding::LocationMethods;
|
use dom::bindings::codegen::Bindings::LocationBinding::LocationBinding::LocationMethods;
|
||||||
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
||||||
|
use dom::bindings::error::Fallible;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::{JS, Root};
|
use dom::bindings::js::{JS, Root};
|
||||||
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
||||||
|
@ -59,17 +60,17 @@ impl HistoryMethods for History {
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-history-go
|
// https://html.spec.whatwg.org/multipage/#dom-history-go
|
||||||
fn Go(&self, delta: i32) {
|
fn Go(&self, delta: i32) -> Fallible<()> {
|
||||||
let direction = if delta > 0 {
|
let direction = if delta > 0 {
|
||||||
TraversalDirection::Forward(delta as usize)
|
TraversalDirection::Forward(delta as usize)
|
||||||
} else if delta < 0 {
|
} else if delta < 0 {
|
||||||
TraversalDirection::Back(-delta as usize)
|
TraversalDirection::Back(-delta as usize)
|
||||||
} else {
|
} else {
|
||||||
self.window.Location().Reload();
|
return self.window.Location().Reload();
|
||||||
return;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
self.traverse_history(direction);
|
self.traverse_history(direction);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-history-back
|
// https://html.spec.whatwg.org/multipage/#dom-history-back
|
||||||
|
|
|
@ -7,7 +7,7 @@ use dom::attr::Attr;
|
||||||
use dom::bindings::codegen::Bindings::HTMLButtonElementBinding;
|
use dom::bindings::codegen::Bindings::HTMLButtonElementBinding;
|
||||||
use dom::bindings::codegen::Bindings::HTMLButtonElementBinding::HTMLButtonElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLButtonElementBinding::HTMLButtonElementMethods;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::{MutNullableJS, Root};
|
||||||
use dom::bindings::str::DOMString;
|
use dom::bindings::str::DOMString;
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
use dom::element::{AttributeMutation, Element};
|
use dom::element::{AttributeMutation, Element};
|
||||||
|
@ -26,6 +26,7 @@ use dom::virtualmethods::VirtualMethods;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use html5ever_atoms::LocalName;
|
use html5ever_atoms::LocalName;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
use std::default::Default;
|
||||||
use style::element_state::*;
|
use style::element_state::*;
|
||||||
|
|
||||||
#[derive(JSTraceable, PartialEq, Copy, Clone)]
|
#[derive(JSTraceable, PartialEq, Copy, Clone)]
|
||||||
|
@ -40,7 +41,8 @@ enum ButtonType {
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct HTMLButtonElement {
|
pub struct HTMLButtonElement {
|
||||||
htmlelement: HTMLElement,
|
htmlelement: HTMLElement,
|
||||||
button_type: Cell<ButtonType>
|
button_type: Cell<ButtonType>,
|
||||||
|
form_owner: MutNullableJS<HTMLFormElement>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HTMLButtonElement {
|
impl HTMLButtonElement {
|
||||||
|
@ -51,7 +53,8 @@ impl HTMLButtonElement {
|
||||||
htmlelement:
|
htmlelement:
|
||||||
HTMLElement::new_inherited_with_state(IN_ENABLED_STATE,
|
HTMLElement::new_inherited_with_state(IN_ENABLED_STATE,
|
||||||
local_name, prefix, document),
|
local_name, prefix, document),
|
||||||
button_type: Cell::new(ButtonType::Submit)
|
button_type: Cell::new(ButtonType::Submit),
|
||||||
|
form_owner: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,6 +214,9 @@ impl VirtualMethods for HTMLButtonElement {
|
||||||
self.button_type.set(ButtonType::Submit);
|
self.button_type.set(ButtonType::Submit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
&local_name!("form") => {
|
||||||
|
self.form_attribute_mutated(mutation);
|
||||||
}
|
}
|
||||||
_ => {},
|
_ => {},
|
||||||
}
|
}
|
||||||
|
@ -237,7 +243,19 @@ impl VirtualMethods for HTMLButtonElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FormControl for HTMLButtonElement {}
|
impl FormControl for HTMLButtonElement {
|
||||||
|
fn form_owner(&self) -> Option<Root<HTMLFormElement>> {
|
||||||
|
self.form_owner.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_form_owner(&self, form: Option<&HTMLFormElement>) {
|
||||||
|
self.form_owner.set(form);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_element<'a>(&'a self) -> &'a Element {
|
||||||
|
self.upcast::<Element>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Validatable for HTMLButtonElement {
|
impl Validatable for HTMLButtonElement {
|
||||||
fn is_instance_validatable(&self) -> bool {
|
fn is_instance_validatable(&self) -> bool {
|
||||||
|
|
|
@ -6,7 +6,7 @@ use dom::attr::Attr;
|
||||||
use dom::bindings::codegen::Bindings::HTMLFieldSetElementBinding;
|
use dom::bindings::codegen::Bindings::HTMLFieldSetElementBinding;
|
||||||
use dom::bindings::codegen::Bindings::HTMLFieldSetElementBinding::HTMLFieldSetElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLFieldSetElementBinding::HTMLFieldSetElementMethods;
|
||||||
use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::{MutNullableJS, Root};
|
||||||
use dom::bindings::str::DOMString;
|
use dom::bindings::str::DOMString;
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
use dom::element::{AttributeMutation, Element};
|
use dom::element::{AttributeMutation, Element};
|
||||||
|
@ -19,11 +19,13 @@ use dom::validitystate::ValidityState;
|
||||||
use dom::virtualmethods::VirtualMethods;
|
use dom::virtualmethods::VirtualMethods;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use html5ever_atoms::LocalName;
|
use html5ever_atoms::LocalName;
|
||||||
|
use std::default::Default;
|
||||||
use style::element_state::*;
|
use style::element_state::*;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct HTMLFieldSetElement {
|
pub struct HTMLFieldSetElement {
|
||||||
htmlelement: HTMLElement
|
htmlelement: HTMLElement,
|
||||||
|
form_owner: MutNullableJS<HTMLFormElement>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HTMLFieldSetElement {
|
impl HTMLFieldSetElement {
|
||||||
|
@ -33,7 +35,8 @@ impl HTMLFieldSetElement {
|
||||||
HTMLFieldSetElement {
|
HTMLFieldSetElement {
|
||||||
htmlelement:
|
htmlelement:
|
||||||
HTMLElement::new_inherited_with_state(IN_ENABLED_STATE,
|
HTMLElement::new_inherited_with_state(IN_ENABLED_STATE,
|
||||||
local_name, prefix, document)
|
local_name, prefix, document),
|
||||||
|
form_owner: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,9 +151,24 @@ impl VirtualMethods for HTMLFieldSetElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
&local_name!("form") => {
|
||||||
|
self.form_attribute_mutated(mutation);
|
||||||
|
},
|
||||||
_ => {},
|
_ => {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FormControl for HTMLFieldSetElement {}
|
impl FormControl for HTMLFieldSetElement {
|
||||||
|
fn form_owner(&self) -> Option<Root<HTMLFormElement>> {
|
||||||
|
self.form_owner.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_form_owner(&self, form: Option<&HTMLFormElement>) {
|
||||||
|
self.form_owner.set(form);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_element<'a>(&'a self) -> &'a Element {
|
||||||
|
self.upcast::<Element>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
use dom::bindings::cell::DOMRefCell;
|
||||||
use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods;
|
use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods;
|
||||||
use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
|
use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
|
||||||
use dom::bindings::codegen::Bindings::EventBinding::EventMethods;
|
use dom::bindings::codegen::Bindings::EventBinding::EventMethods;
|
||||||
|
@ -11,15 +12,14 @@ use dom::bindings::codegen::Bindings::HTMLFormElementBinding;
|
||||||
use dom::bindings::codegen::Bindings::HTMLFormElementBinding::HTMLFormElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLFormElementBinding::HTMLFormElementMethods;
|
||||||
use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods;
|
||||||
use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaElementMethods;
|
||||||
use dom::bindings::conversions::DerivedFrom;
|
|
||||||
use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
||||||
use dom::bindings::js::{MutNullableJS, Root};
|
use dom::bindings::js::{JS, MutNullableJS, Root, RootedReference};
|
||||||
use dom::bindings::refcounted::Trusted;
|
use dom::bindings::refcounted::Trusted;
|
||||||
use dom::bindings::reflector::DomObject;
|
use dom::bindings::reflector::DomObject;
|
||||||
use dom::bindings::str::DOMString;
|
use dom::bindings::str::DOMString;
|
||||||
use dom::blob::Blob;
|
use dom::blob::Blob;
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
use dom::element::Element;
|
use dom::element::{AttributeMutation, Element};
|
||||||
use dom::eventtarget::EventTarget;
|
use dom::eventtarget::EventTarget;
|
||||||
use dom::file::File;
|
use dom::file::File;
|
||||||
use dom::globalscope::GlobalScope;
|
use dom::globalscope::GlobalScope;
|
||||||
|
@ -29,12 +29,16 @@ use dom::htmldatalistelement::HTMLDataListElement;
|
||||||
use dom::htmlelement::HTMLElement;
|
use dom::htmlelement::HTMLElement;
|
||||||
use dom::htmlfieldsetelement::HTMLFieldSetElement;
|
use dom::htmlfieldsetelement::HTMLFieldSetElement;
|
||||||
use dom::htmlformcontrolscollection::HTMLFormControlsCollection;
|
use dom::htmlformcontrolscollection::HTMLFormControlsCollection;
|
||||||
|
use dom::htmlimageelement::HTMLImageElement;
|
||||||
use dom::htmlinputelement::HTMLInputElement;
|
use dom::htmlinputelement::HTMLInputElement;
|
||||||
|
use dom::htmllabelelement::HTMLLabelElement;
|
||||||
|
use dom::htmllegendelement::HTMLLegendElement;
|
||||||
use dom::htmlobjectelement::HTMLObjectElement;
|
use dom::htmlobjectelement::HTMLObjectElement;
|
||||||
use dom::htmloutputelement::HTMLOutputElement;
|
use dom::htmloutputelement::HTMLOutputElement;
|
||||||
use dom::htmlselectelement::HTMLSelectElement;
|
use dom::htmlselectelement::HTMLSelectElement;
|
||||||
use dom::htmltextareaelement::HTMLTextAreaElement;
|
use dom::htmltextareaelement::HTMLTextAreaElement;
|
||||||
use dom::node::{Node, document_from_node, window_from_node};
|
use dom::node::{Node, PARSER_ASSOCIATED_FORM_OWNER, UnbindContext, VecPreOrderInsertionHelper};
|
||||||
|
use dom::node::{document_from_node, window_from_node};
|
||||||
use dom::validitystate::ValidationFlags;
|
use dom::validitystate::ValidationFlags;
|
||||||
use dom::virtualmethods::VirtualMethods;
|
use dom::virtualmethods::VirtualMethods;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
|
@ -63,7 +67,8 @@ pub struct HTMLFormElement {
|
||||||
htmlelement: HTMLElement,
|
htmlelement: HTMLElement,
|
||||||
marked_for_reset: Cell<bool>,
|
marked_for_reset: Cell<bool>,
|
||||||
elements: MutNullableJS<HTMLFormControlsCollection>,
|
elements: MutNullableJS<HTMLFormControlsCollection>,
|
||||||
generation_id: Cell<GenerationId>
|
generation_id: Cell<GenerationId>,
|
||||||
|
controls: DOMRefCell<Vec<JS<Element>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HTMLFormElement {
|
impl HTMLFormElement {
|
||||||
|
@ -74,7 +79,8 @@ impl HTMLFormElement {
|
||||||
htmlelement: HTMLElement::new_inherited(local_name, prefix, document),
|
htmlelement: HTMLElement::new_inherited(local_name, prefix, document),
|
||||||
marked_for_reset: Cell::new(false),
|
marked_for_reset: Cell::new(false),
|
||||||
elements: Default::default(),
|
elements: Default::default(),
|
||||||
generation_id: Cell::new(GenerationId(0))
|
generation_id: Cell::new(GenerationId(0)),
|
||||||
|
controls: DOMRefCell::new(Vec::new()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -504,16 +510,14 @@ impl HTMLFormElement {
|
||||||
/// https://html.spec.whatwg.org/multipage/#constructing-the-form-data-set
|
/// https://html.spec.whatwg.org/multipage/#constructing-the-form-data-set
|
||||||
/// Steps range from 1 to 3
|
/// Steps range from 1 to 3
|
||||||
fn get_unclean_dataset(&self, submitter: Option<FormSubmitter>) -> Vec<FormDatum> {
|
fn get_unclean_dataset(&self, submitter: Option<FormSubmitter>) -> Vec<FormDatum> {
|
||||||
let node = self.upcast::<Node>();
|
let controls = self.controls.borrow();
|
||||||
// FIXME(#3553): This is an incorrect way of getting controls owned
|
|
||||||
// by the form, but good enough until html5ever lands
|
|
||||||
let mut data_set = Vec::new();
|
let mut data_set = Vec::new();
|
||||||
for child in node.traverse_preorder() {
|
for child in controls.iter() {
|
||||||
// Step 3.1: The field element is disabled.
|
// Step 3.1: The field element is disabled.
|
||||||
match child.downcast::<Element>() {
|
if child.disabled_state() {
|
||||||
Some(el) if !el.disabled_state() => (),
|
continue;
|
||||||
_ => continue,
|
|
||||||
}
|
}
|
||||||
|
let child = child.upcast::<Node>();
|
||||||
|
|
||||||
// Step 3.1: The field element has a datalist element ancestor.
|
// Step 3.1: The field element has a datalist element ancestor.
|
||||||
if child.ancestors()
|
if child.ancestors()
|
||||||
|
@ -627,9 +631,10 @@ impl HTMLFormElement {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: This is an incorrect way of getting controls owned
|
let controls = self.controls.borrow();
|
||||||
// by the form, but good enough until html5ever lands
|
for child in controls.iter() {
|
||||||
for child in self.upcast::<Node>().traverse_preorder() {
|
let child = child.upcast::<Node>();
|
||||||
|
|
||||||
match child.type_id() {
|
match child.type_id() {
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) => {
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) => {
|
||||||
child.downcast::<HTMLInputElement>().unwrap().reset();
|
child.downcast::<HTMLInputElement>().unwrap().reset();
|
||||||
|
@ -647,14 +652,27 @@ impl HTMLFormElement {
|
||||||
}
|
}
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLOutputElement)) => {
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLOutputElement)) => {
|
||||||
// Unimplemented
|
// Unimplemented
|
||||||
{}
|
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
self.marked_for_reset.set(false);
|
self.marked_for_reset.set(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn add_control<T: ?Sized + FormControl>(&self, control: &T) {
|
||||||
|
let root = self.upcast::<Element>().root_element();
|
||||||
|
let root = root.r().upcast::<Node>();
|
||||||
|
|
||||||
|
let mut controls = self.controls.borrow_mut();
|
||||||
|
controls.insert_pre_order(control.to_element(), root);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn remove_control<T: ?Sized + FormControl>(&self, control: &T) {
|
||||||
|
let control = control.to_element();
|
||||||
|
let mut controls = self.controls.borrow_mut();
|
||||||
|
controls.iter().position(|c| c.r() == control)
|
||||||
|
.map(|idx| controls.remove(idx));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(JSTraceable, HeapSizeOf, Clone)]
|
#[derive(JSTraceable, HeapSizeOf, Clone)]
|
||||||
|
@ -844,24 +862,139 @@ impl<'a> FormSubmitter<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait FormControl: DerivedFrom<Element> + DomObject {
|
pub trait FormControl: DomObject {
|
||||||
// FIXME: This is wrong (https://github.com/servo/servo/issues/3553)
|
fn form_owner(&self) -> Option<Root<HTMLFormElement>>;
|
||||||
// but we need html5ever to do it correctly
|
|
||||||
fn form_owner(&self) -> Option<Root<HTMLFormElement>> {
|
fn set_form_owner(&self, form: Option<&HTMLFormElement>);
|
||||||
// https://html.spec.whatwg.org/multipage/#reset-the-form-owner
|
|
||||||
|
fn to_element<'a>(&'a self) -> &'a Element;
|
||||||
|
|
||||||
|
fn is_listed(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#create-an-element-for-the-token
|
||||||
|
// Part of step 12.
|
||||||
|
// '..suppress the running of the reset the form owner algorithm
|
||||||
|
// when the parser subsequently attempts to insert the element..'
|
||||||
|
fn set_form_owner_from_parser(&self, form: &HTMLFormElement) {
|
||||||
let elem = self.to_element();
|
let elem = self.to_element();
|
||||||
let owner = elem.get_string_attribute(&local_name!("form"));
|
let node = elem.upcast::<Node>();
|
||||||
if !owner.is_empty() {
|
node.set_flag(PARSER_ASSOCIATED_FORM_OWNER, true);
|
||||||
let doc = document_from_node(elem);
|
form.add_control(self);
|
||||||
let owner = doc.GetElementById(owner);
|
self.set_form_owner(Some(form));
|
||||||
if let Some(ref o) = owner {
|
}
|
||||||
let maybe_form = o.downcast::<HTMLFormElement>();
|
|
||||||
if maybe_form.is_some() {
|
// https://html.spec.whatwg.org/multipage/#reset-the-form-owner
|
||||||
return maybe_form.map(Root::from_ref);
|
fn reset_form_owner(&self) {
|
||||||
}
|
let elem = self.to_element();
|
||||||
|
let node = elem.upcast::<Node>();
|
||||||
|
let old_owner = self.form_owner();
|
||||||
|
let has_form_id = elem.has_attribute(&local_name!("form"));
|
||||||
|
let nearest_form_ancestor = node.ancestors()
|
||||||
|
.filter_map(Root::downcast::<HTMLFormElement>)
|
||||||
|
.next();
|
||||||
|
|
||||||
|
// Step 1
|
||||||
|
if old_owner.is_some() && !(self.is_listed() && has_form_id) {
|
||||||
|
if nearest_form_ancestor == old_owner {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elem.upcast::<Node>().ancestors().filter_map(Root::downcast).next()
|
|
||||||
|
let new_owner = if self.is_listed() && has_form_id && elem.is_connected() {
|
||||||
|
// Step 3
|
||||||
|
let doc = document_from_node(node);
|
||||||
|
let form_id = elem.get_string_attribute(&local_name!("form"));
|
||||||
|
doc.GetElementById(form_id).and_then(Root::downcast::<HTMLFormElement>)
|
||||||
|
} else {
|
||||||
|
// Step 4
|
||||||
|
nearest_form_ancestor
|
||||||
|
};
|
||||||
|
|
||||||
|
if old_owner != new_owner {
|
||||||
|
if let Some(o) = old_owner {
|
||||||
|
o.remove_control(self);
|
||||||
|
}
|
||||||
|
let new_owner = new_owner.as_ref().map(|o| {
|
||||||
|
o.add_control(self);
|
||||||
|
o.r()
|
||||||
|
});
|
||||||
|
self.set_form_owner(new_owner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#association-of-controls-and-forms
|
||||||
|
fn form_attribute_mutated(&self, mutation: AttributeMutation) {
|
||||||
|
match mutation {
|
||||||
|
AttributeMutation::Set(_) => {
|
||||||
|
self.register_if_necessary();
|
||||||
|
},
|
||||||
|
AttributeMutation::Removed => {
|
||||||
|
self.unregister_if_necessary();
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
self.reset_form_owner();
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#association-of-controls-and-forms
|
||||||
|
fn register_if_necessary(&self) {
|
||||||
|
let elem = self.to_element();
|
||||||
|
let form_id = elem.get_string_attribute(&local_name!("form"));
|
||||||
|
let node = elem.upcast::<Node>();
|
||||||
|
|
||||||
|
if self.is_listed() && !form_id.is_empty() && node.is_in_doc() {
|
||||||
|
let doc = document_from_node(node);
|
||||||
|
doc.register_form_id_listener(form_id, self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unregister_if_necessary(&self) {
|
||||||
|
let elem = self.to_element();
|
||||||
|
let form_id = elem.get_string_attribute(&local_name!("form"));
|
||||||
|
|
||||||
|
if self.is_listed() && !form_id.is_empty() {
|
||||||
|
let doc = document_from_node(elem.upcast::<Node>());
|
||||||
|
doc.unregister_form_id_listener(form_id, self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#association-of-controls-and-forms
|
||||||
|
fn bind_form_control_to_tree(&self) {
|
||||||
|
let elem = self.to_element();
|
||||||
|
let node = elem.upcast::<Node>();
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#create-an-element-for-the-token
|
||||||
|
// Part of step 12.
|
||||||
|
// '..suppress the running of the reset the form owner algorithm
|
||||||
|
// when the parser subsequently attempts to insert the element..'
|
||||||
|
let must_skip_reset = node.get_flag(PARSER_ASSOCIATED_FORM_OWNER);
|
||||||
|
node.set_flag(PARSER_ASSOCIATED_FORM_OWNER, false);
|
||||||
|
|
||||||
|
if !must_skip_reset {
|
||||||
|
self.form_attribute_mutated(AttributeMutation::Set(None));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#association-of-controls-and-forms
|
||||||
|
fn unbind_form_control_from_tree(&self) {
|
||||||
|
let elem = self.to_element();
|
||||||
|
let has_form_attr = elem.has_attribute(&local_name!("form"));
|
||||||
|
let same_subtree = self.form_owner().map_or(true, |form| {
|
||||||
|
elem.is_in_same_home_subtree(&*form)
|
||||||
|
});
|
||||||
|
|
||||||
|
self.unregister_if_necessary();
|
||||||
|
|
||||||
|
// Since this control has been unregistered from the id->listener map
|
||||||
|
// in the previous step, reset_form_owner will not be invoked on it
|
||||||
|
// when the form owner element is unbound (i.e it is in the same
|
||||||
|
// subtree) if it appears later in the tree order. Hence invoke
|
||||||
|
// reset from here if this control has the form attribute set.
|
||||||
|
if !same_subtree || (self.is_listed() && has_form_attr) {
|
||||||
|
self.reset_form_owner();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_form_attribute<InputFn, OwnerFn>(&self,
|
fn get_form_attribute<InputFn, OwnerFn>(&self,
|
||||||
|
@ -870,7 +1003,7 @@ pub trait FormControl: DerivedFrom<Element> + DomObject {
|
||||||
owner: OwnerFn)
|
owner: OwnerFn)
|
||||||
-> DOMString
|
-> DOMString
|
||||||
where InputFn: Fn(&Self) -> DOMString,
|
where InputFn: Fn(&Self) -> DOMString,
|
||||||
OwnerFn: Fn(&HTMLFormElement) -> DOMString
|
OwnerFn: Fn(&HTMLFormElement) -> DOMString, Self: Sized
|
||||||
{
|
{
|
||||||
if self.to_element().has_attribute(attr) {
|
if self.to_element().has_attribute(attr) {
|
||||||
input(self)
|
input(self)
|
||||||
|
@ -885,7 +1018,7 @@ pub trait FormControl: DerivedFrom<Element> + DomObject {
|
||||||
owner: OwnerFn)
|
owner: OwnerFn)
|
||||||
-> bool
|
-> bool
|
||||||
where InputFn: Fn(&Self) -> bool,
|
where InputFn: Fn(&Self) -> bool,
|
||||||
OwnerFn: Fn(&HTMLFormElement) -> bool
|
OwnerFn: Fn(&HTMLFormElement) -> bool, Self: Sized
|
||||||
{
|
{
|
||||||
if self.to_element().has_attribute(attr) {
|
if self.to_element().has_attribute(attr) {
|
||||||
input(self)
|
input(self)
|
||||||
|
@ -894,10 +1027,6 @@ pub trait FormControl: DerivedFrom<Element> + DomObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_element(&self) -> &Element {
|
|
||||||
self.upcast()
|
|
||||||
}
|
|
||||||
|
|
||||||
// XXXKiChjang: Implement these on inheritors
|
// XXXKiChjang: Implement these on inheritors
|
||||||
// fn candidate_for_validation(&self) -> bool;
|
// fn candidate_for_validation(&self) -> bool;
|
||||||
// fn satisfies_constraints(&self) -> bool;
|
// fn satisfies_constraints(&self) -> bool;
|
||||||
|
@ -914,6 +1043,69 @@ impl VirtualMethods for HTMLFormElement {
|
||||||
_ => self.super_type().unwrap().parse_plain_attribute(name, value),
|
_ => self.super_type().unwrap().parse_plain_attribute(name, value),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn unbind_from_tree(&self, context: &UnbindContext) {
|
||||||
|
self.super_type().unwrap().unbind_from_tree(context);
|
||||||
|
|
||||||
|
// Collect the controls to reset because reset_form_owner
|
||||||
|
// will mutably borrow self.controls
|
||||||
|
rooted_vec!(let mut to_reset);
|
||||||
|
to_reset.extend(self.controls.borrow().iter()
|
||||||
|
.filter(|c| !c.is_in_same_home_subtree(self))
|
||||||
|
.map(|c| c.clone()));
|
||||||
|
|
||||||
|
for control in to_reset.iter() {
|
||||||
|
control.as_maybe_form_control()
|
||||||
|
.expect("Element must be a form control")
|
||||||
|
.reset_form_owner();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait FormControlElementHelpers {
|
||||||
|
fn as_maybe_form_control<'a>(&'a self) -> Option<&'a FormControl>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FormControlElementHelpers for Element {
|
||||||
|
fn as_maybe_form_control<'a>(&'a self) -> Option<&'a FormControl> {
|
||||||
|
let node = self.upcast::<Node>();
|
||||||
|
|
||||||
|
match node.type_id() {
|
||||||
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) => {
|
||||||
|
Some(self.downcast::<HTMLButtonElement>().unwrap() as &FormControl)
|
||||||
|
},
|
||||||
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLFieldSetElement)) => {
|
||||||
|
Some(self.downcast::<HTMLFieldSetElement>().unwrap() as &FormControl)
|
||||||
|
},
|
||||||
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLImageElement)) => {
|
||||||
|
Some(self.downcast::<HTMLImageElement>().unwrap() as &FormControl)
|
||||||
|
},
|
||||||
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) => {
|
||||||
|
Some(self.downcast::<HTMLInputElement>().unwrap() as &FormControl)
|
||||||
|
},
|
||||||
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLLabelElement)) => {
|
||||||
|
Some(self.downcast::<HTMLLabelElement>().unwrap() as &FormControl)
|
||||||
|
},
|
||||||
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLLegendElement)) => {
|
||||||
|
Some(self.downcast::<HTMLLegendElement>().unwrap() as &FormControl)
|
||||||
|
},
|
||||||
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLObjectElement)) => {
|
||||||
|
Some(self.downcast::<HTMLObjectElement>().unwrap() as &FormControl)
|
||||||
|
},
|
||||||
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLOutputElement)) => {
|
||||||
|
Some(self.downcast::<HTMLOutputElement>().unwrap() as &FormControl)
|
||||||
|
},
|
||||||
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSelectElement)) => {
|
||||||
|
Some(self.downcast::<HTMLSelectElement>().unwrap() as &FormControl)
|
||||||
|
},
|
||||||
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) => {
|
||||||
|
Some(self.downcast::<HTMLTextAreaElement>().unwrap() as &FormControl)
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PlannedNavigation {
|
struct PlannedNavigation {
|
||||||
|
|
|
@ -327,20 +327,6 @@ impl HTMLIFrameElement {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_content_window(&self) -> Option<Root<Window>> {
|
|
||||||
self.pipeline_id.get()
|
|
||||||
.and_then(|pipeline_id| ScriptThread::find_document(pipeline_id))
|
|
||||||
.and_then(|document| {
|
|
||||||
let current_global = GlobalScope::current();
|
|
||||||
let current_document = current_global.as_window().Document();
|
|
||||||
if document.origin().same_origin(current_document.origin()) {
|
|
||||||
Some(Root::from_ref(document.window()))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait HTMLIFrameElementLayoutMethods {
|
pub trait HTMLIFrameElementLayoutMethods {
|
||||||
|
@ -512,15 +498,31 @@ impl HTMLIFrameElementMethods for HTMLIFrameElement {
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-iframe-contentwindow
|
// https://html.spec.whatwg.org/multipage/#dom-iframe-contentwindow
|
||||||
fn GetContentWindow(&self) -> Option<Root<BrowsingContext>> {
|
fn GetContentWindow(&self) -> Option<Root<BrowsingContext>> {
|
||||||
match self.get_content_window() {
|
self.pipeline_id.get().and_then(|_| ScriptThread::find_browsing_context(self.frame_id))
|
||||||
Some(ref window) => Some(window.browsing_context()),
|
|
||||||
None => None
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-iframe-contentdocument
|
// https://html.spec.whatwg.org/multipage/#dom-iframe-contentdocument
|
||||||
|
// https://html.spec.whatwg.org/multipage/#concept-bcc-content-document
|
||||||
fn GetContentDocument(&self) -> Option<Root<Document>> {
|
fn GetContentDocument(&self) -> Option<Root<Document>> {
|
||||||
self.get_content_window().map(|window| window.Document())
|
// Step 1.
|
||||||
|
let pipeline_id = match self.pipeline_id.get() {
|
||||||
|
None => return None,
|
||||||
|
Some(pipeline_id) => pipeline_id,
|
||||||
|
};
|
||||||
|
// Step 2-3.
|
||||||
|
// Note that this lookup will fail if the document is dissimilar-origin,
|
||||||
|
// so we should return None in that case.
|
||||||
|
let document = match ScriptThread::find_document(pipeline_id) {
|
||||||
|
None => return None,
|
||||||
|
Some(document) => document,
|
||||||
|
};
|
||||||
|
// Step 4.
|
||||||
|
let current = GlobalScope::current().as_window().Document();
|
||||||
|
if !current.origin().same_origin_domain(document.origin()) {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
// Step 5.
|
||||||
|
Some(document)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Experimental mozbrowser implementation is based on the webidl
|
// Experimental mozbrowser implementation is based on the webidl
|
||||||
|
|
|
@ -15,7 +15,7 @@ use dom::bindings::codegen::Bindings::MouseEventBinding::MouseEventMethods;
|
||||||
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
||||||
use dom::bindings::error::Fallible;
|
use dom::bindings::error::Fallible;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::{LayoutJS, Root};
|
use dom::bindings::js::{LayoutJS, MutNullableJS, Root};
|
||||||
use dom::bindings::refcounted::Trusted;
|
use dom::bindings::refcounted::Trusted;
|
||||||
use dom::bindings::reflector::DomObject;
|
use dom::bindings::reflector::DomObject;
|
||||||
use dom::bindings::str::DOMString;
|
use dom::bindings::str::DOMString;
|
||||||
|
@ -26,6 +26,7 @@ use dom::event::Event;
|
||||||
use dom::eventtarget::EventTarget;
|
use dom::eventtarget::EventTarget;
|
||||||
use dom::htmlareaelement::HTMLAreaElement;
|
use dom::htmlareaelement::HTMLAreaElement;
|
||||||
use dom::htmlelement::HTMLElement;
|
use dom::htmlelement::HTMLElement;
|
||||||
|
use dom::htmlformelement::{FormControl, HTMLFormElement};
|
||||||
use dom::htmlmapelement::HTMLMapElement;
|
use dom::htmlmapelement::HTMLMapElement;
|
||||||
use dom::mouseevent::MouseEvent;
|
use dom::mouseevent::MouseEvent;
|
||||||
use dom::node::{Node, NodeDamage, document_from_node, window_from_node};
|
use dom::node::{Node, NodeDamage, document_from_node, window_from_node};
|
||||||
|
@ -78,6 +79,7 @@ pub struct HTMLImageElement {
|
||||||
htmlelement: HTMLElement,
|
htmlelement: HTMLElement,
|
||||||
current_request: DOMRefCell<ImageRequest>,
|
current_request: DOMRefCell<ImageRequest>,
|
||||||
pending_request: DOMRefCell<ImageRequest>,
|
pending_request: DOMRefCell<ImageRequest>,
|
||||||
|
form_owner: MutNullableJS<HTMLFormElement>,
|
||||||
generation: Cell<u32>,
|
generation: Cell<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,6 +386,7 @@ impl HTMLImageElement {
|
||||||
metadata: None,
|
metadata: None,
|
||||||
blocker: None,
|
blocker: None,
|
||||||
}),
|
}),
|
||||||
|
form_owner: Default::default(),
|
||||||
generation: Default::default(),
|
generation: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -689,6 +692,24 @@ impl VirtualMethods for HTMLImageElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl FormControl for HTMLImageElement {
|
||||||
|
fn form_owner(&self) -> Option<Root<HTMLFormElement>> {
|
||||||
|
self.form_owner.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_form_owner(&self, form: Option<&HTMLFormElement>) {
|
||||||
|
self.form_owner.set(form);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_element<'a>(&'a self) -> &'a Element {
|
||||||
|
self.upcast::<Element>()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_listed(&self) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn image_dimension_setter(element: &Element, attr: LocalName, value: u32) {
|
fn image_dimension_setter(element: &Element, attr: LocalName, value: u32) {
|
||||||
// This setter is a bit weird: the IDL type is unsigned long, but it's parsed as
|
// This setter is a bit weird: the IDL type is unsigned long, but it's parsed as
|
||||||
// a dimension for rendering.
|
// a dimension for rendering.
|
||||||
|
|
|
@ -100,6 +100,7 @@ pub struct HTMLInputElement {
|
||||||
value_dirty: Cell<bool>,
|
value_dirty: Cell<bool>,
|
||||||
|
|
||||||
filelist: MutNullableJS<FileList>,
|
filelist: MutNullableJS<FileList>,
|
||||||
|
form_owner: MutNullableJS<HTMLFormElement>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(JSTraceable)]
|
#[derive(JSTraceable)]
|
||||||
|
@ -156,6 +157,7 @@ impl HTMLInputElement {
|
||||||
activation_state: DOMRefCell::new(InputActivationState::new()),
|
activation_state: DOMRefCell::new(InputActivationState::new()),
|
||||||
value_dirty: Cell::new(false),
|
value_dirty: Cell::new(false),
|
||||||
filelist: MutNullableJS::new(None),
|
filelist: MutNullableJS::new(None),
|
||||||
|
form_owner: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1044,7 +1046,10 @@ impl VirtualMethods for HTMLInputElement {
|
||||||
el.set_read_write_state(!el.disabled_state());
|
el.set_read_write_state(!el.disabled_state());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
&local_name!("form") => {
|
||||||
|
self.form_attribute_mutated(mutation);
|
||||||
|
},
|
||||||
_ => {},
|
_ => {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1163,7 +1168,19 @@ impl VirtualMethods for HTMLInputElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FormControl for HTMLInputElement {}
|
impl FormControl for HTMLInputElement {
|
||||||
|
fn form_owner(&self) -> Option<Root<HTMLFormElement>> {
|
||||||
|
self.form_owner.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_form_owner(&self, form: Option<&HTMLFormElement>) {
|
||||||
|
self.form_owner.set(form);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_element<'a>(&'a self) -> &'a Element {
|
||||||
|
self.upcast::<Element>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Validatable for HTMLInputElement {
|
impl Validatable for HTMLInputElement {
|
||||||
fn is_instance_validatable(&self) -> bool {
|
fn is_instance_validatable(&self) -> bool {
|
||||||
|
|
|
@ -3,17 +3,18 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
use dom::activation::{Activatable, ActivationSource, synthetic_click_activation};
|
use dom::activation::{Activatable, ActivationSource, synthetic_click_activation};
|
||||||
|
use dom::attr::Attr;
|
||||||
use dom::bindings::codegen::Bindings::HTMLLabelElementBinding;
|
use dom::bindings::codegen::Bindings::HTMLLabelElementBinding;
|
||||||
use dom::bindings::codegen::Bindings::HTMLLabelElementBinding::HTMLLabelElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLLabelElementBinding::HTMLLabelElementMethods;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::Root;
|
||||||
use dom::bindings::str::DOMString;
|
use dom::bindings::str::DOMString;
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
use dom::element::Element;
|
use dom::element::{AttributeMutation, Element};
|
||||||
use dom::event::Event;
|
use dom::event::Event;
|
||||||
use dom::eventtarget::EventTarget;
|
use dom::eventtarget::EventTarget;
|
||||||
use dom::htmlelement::HTMLElement;
|
use dom::htmlelement::HTMLElement;
|
||||||
use dom::htmlformelement::{FormControl, HTMLFormElement};
|
use dom::htmlformelement::{FormControl, FormControlElementHelpers, HTMLFormElement};
|
||||||
use dom::node::{document_from_node, Node};
|
use dom::node::{document_from_node, Node};
|
||||||
use dom::virtualmethods::VirtualMethods;
|
use dom::virtualmethods::VirtualMethods;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
|
@ -22,7 +23,7 @@ use style::attr::AttrValue;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct HTMLLabelElement {
|
pub struct HTMLLabelElement {
|
||||||
htmlelement: HTMLElement,
|
htmlelement: HTMLElement
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HTMLLabelElement {
|
impl HTMLLabelElement {
|
||||||
|
@ -31,7 +32,7 @@ impl HTMLLabelElement {
|
||||||
document: &Document) -> HTMLLabelElement {
|
document: &Document) -> HTMLLabelElement {
|
||||||
HTMLLabelElement {
|
HTMLLabelElement {
|
||||||
htmlelement:
|
htmlelement:
|
||||||
HTMLElement::new_inherited(local_name, prefix, document)
|
HTMLElement::new_inherited(local_name, prefix, document),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,6 +129,16 @@ impl VirtualMethods for HTMLLabelElement {
|
||||||
_ => self.super_type().unwrap().parse_plain_attribute(name, value),
|
_ => self.super_type().unwrap().parse_plain_attribute(name, value),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
|
||||||
|
self.super_type().unwrap().attribute_mutated(attr, mutation);
|
||||||
|
match attr.local_name() {
|
||||||
|
&local_name!("form") => {
|
||||||
|
self.form_attribute_mutated(mutation);
|
||||||
|
},
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HTMLLabelElement {
|
impl HTMLLabelElement {
|
||||||
|
@ -140,4 +151,19 @@ impl HTMLLabelElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FormControl for HTMLLabelElement {}
|
impl FormControl for HTMLLabelElement {
|
||||||
|
fn form_owner(&self) -> Option<Root<HTMLFormElement>> {
|
||||||
|
self.GetControl().map(Root::upcast::<Element>).and_then(|elem| {
|
||||||
|
elem.as_maybe_form_control().and_then(|control| control.form_owner())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_form_owner(&self, _: Option<&HTMLFormElement>) {
|
||||||
|
// Label is a special case for form owner, it reflects its control's
|
||||||
|
// form owner. Therefore it doesn't hold form owner itself.
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_element<'a>(&'a self) -> &'a Element {
|
||||||
|
self.upcast::<Element>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::HTMLLegendElementBinding;
|
||||||
use dom::bindings::codegen::Bindings::HTMLLegendElementBinding::HTMLLegendElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLLegendElementBinding::HTMLLegendElementMethods;
|
||||||
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
|
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::{MutNullableJS, Root};
|
||||||
use dom::bindings::str::DOMString;
|
use dom::bindings::str::DOMString;
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
use dom::element::Element;
|
use dom::element::Element;
|
||||||
|
@ -21,6 +21,7 @@ use html5ever_atoms::LocalName;
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct HTMLLegendElement {
|
pub struct HTMLLegendElement {
|
||||||
htmlelement: HTMLElement,
|
htmlelement: HTMLElement,
|
||||||
|
form_owner: MutNullableJS<HTMLFormElement>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HTMLLegendElement {
|
impl HTMLLegendElement {
|
||||||
|
@ -28,7 +29,10 @@ impl HTMLLegendElement {
|
||||||
prefix: Option<DOMString>,
|
prefix: Option<DOMString>,
|
||||||
document: &Document)
|
document: &Document)
|
||||||
-> HTMLLegendElement {
|
-> HTMLLegendElement {
|
||||||
HTMLLegendElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document) }
|
HTMLLegendElement {
|
||||||
|
htmlelement: HTMLElement::new_inherited(local_name, prefix, document),
|
||||||
|
form_owner: Default::default(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
|
@ -83,4 +87,16 @@ impl HTMLLegendElementMethods for HTMLLegendElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FormControl for HTMLLegendElement {}
|
impl FormControl for HTMLLegendElement {
|
||||||
|
fn form_owner(&self) -> Option<Root<HTMLFormElement>> {
|
||||||
|
self.form_owner.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_form_owner(&self, form: Option<&HTMLFormElement>) {
|
||||||
|
self.form_owner.set(form);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_element<'a>(&'a self) -> &'a Element {
|
||||||
|
self.upcast::<Element>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ use dom::bindings::cell::DOMRefCell;
|
||||||
use dom::bindings::codegen::Bindings::HTMLObjectElementBinding;
|
use dom::bindings::codegen::Bindings::HTMLObjectElementBinding;
|
||||||
use dom::bindings::codegen::Bindings::HTMLObjectElementBinding::HTMLObjectElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLObjectElementBinding::HTMLObjectElementMethods;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::{MutNullableJS, Root};
|
||||||
use dom::bindings::str::DOMString;
|
use dom::bindings::str::DOMString;
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
use dom::element::{AttributeMutation, Element};
|
use dom::element::{AttributeMutation, Element};
|
||||||
|
@ -20,6 +20,7 @@ use dom::virtualmethods::VirtualMethods;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use html5ever_atoms::LocalName;
|
use html5ever_atoms::LocalName;
|
||||||
use net_traits::image::base::Image;
|
use net_traits::image::base::Image;
|
||||||
|
use std::default::Default;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
|
@ -27,6 +28,7 @@ pub struct HTMLObjectElement {
|
||||||
htmlelement: HTMLElement,
|
htmlelement: HTMLElement,
|
||||||
#[ignore_heap_size_of = "Arc"]
|
#[ignore_heap_size_of = "Arc"]
|
||||||
image: DOMRefCell<Option<Arc<Image>>>,
|
image: DOMRefCell<Option<Arc<Image>>>,
|
||||||
|
form_owner: MutNullableJS<HTMLFormElement>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HTMLObjectElement {
|
impl HTMLObjectElement {
|
||||||
|
@ -37,6 +39,7 @@ impl HTMLObjectElement {
|
||||||
htmlelement:
|
htmlelement:
|
||||||
HTMLElement::new_inherited(local_name, prefix, document),
|
HTMLElement::new_inherited(local_name, prefix, document),
|
||||||
image: DOMRefCell::new(None),
|
image: DOMRefCell::new(None),
|
||||||
|
form_owner: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,9 +117,24 @@ impl VirtualMethods for HTMLObjectElement {
|
||||||
self.process_data_url();
|
self.process_data_url();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
&local_name!("form") => {
|
||||||
|
self.form_attribute_mutated(mutation);
|
||||||
|
},
|
||||||
_ => {},
|
_ => {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FormControl for HTMLObjectElement {}
|
impl FormControl for HTMLObjectElement {
|
||||||
|
fn form_owner(&self) -> Option<Root<HTMLFormElement>> {
|
||||||
|
self.form_owner.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_form_owner(&self, form: Option<&HTMLFormElement>) {
|
||||||
|
self.form_owner.set(form);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_element<'a>(&'a self) -> &'a Element {
|
||||||
|
self.upcast::<Element>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -2,23 +2,27 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
use dom::attr::Attr;
|
||||||
use dom::bindings::codegen::Bindings::HTMLOutputElementBinding;
|
use dom::bindings::codegen::Bindings::HTMLOutputElementBinding;
|
||||||
use dom::bindings::codegen::Bindings::HTMLOutputElementBinding::HTMLOutputElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLOutputElementBinding::HTMLOutputElementMethods;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::{MutNullableJS, Root};
|
||||||
use dom::bindings::str::DOMString;
|
use dom::bindings::str::DOMString;
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
|
use dom::element::{AttributeMutation, Element};
|
||||||
use dom::htmlelement::HTMLElement;
|
use dom::htmlelement::HTMLElement;
|
||||||
use dom::htmlformelement::{FormControl, HTMLFormElement};
|
use dom::htmlformelement::{FormControl, HTMLFormElement};
|
||||||
use dom::node::{Node, window_from_node};
|
use dom::node::{Node, window_from_node};
|
||||||
use dom::nodelist::NodeList;
|
use dom::nodelist::NodeList;
|
||||||
use dom::validitystate::ValidityState;
|
use dom::validitystate::ValidityState;
|
||||||
|
use dom::virtualmethods::VirtualMethods;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use html5ever_atoms::LocalName;
|
use html5ever_atoms::LocalName;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct HTMLOutputElement {
|
pub struct HTMLOutputElement {
|
||||||
htmlelement: HTMLElement
|
htmlelement: HTMLElement,
|
||||||
|
form_owner: MutNullableJS<HTMLFormElement>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HTMLOutputElement {
|
impl HTMLOutputElement {
|
||||||
|
@ -27,7 +31,8 @@ impl HTMLOutputElement {
|
||||||
document: &Document) -> HTMLOutputElement {
|
document: &Document) -> HTMLOutputElement {
|
||||||
HTMLOutputElement {
|
HTMLOutputElement {
|
||||||
htmlelement:
|
htmlelement:
|
||||||
HTMLElement::new_inherited(local_name, prefix, document)
|
HTMLElement::new_inherited(local_name, prefix, document),
|
||||||
|
form_owner: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,4 +64,32 @@ impl HTMLOutputElementMethods for HTMLOutputElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FormControl for HTMLOutputElement {}
|
impl VirtualMethods for HTMLOutputElement {
|
||||||
|
fn super_type<'b>(&'b self) -> Option<&'b VirtualMethods> {
|
||||||
|
Some(self.upcast::<HTMLElement>() as &VirtualMethods)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
|
||||||
|
self.super_type().unwrap().attribute_mutated(attr, mutation);
|
||||||
|
match attr.local_name() {
|
||||||
|
&local_name!("form") => {
|
||||||
|
self.form_attribute_mutated(mutation);
|
||||||
|
},
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FormControl for HTMLOutputElement {
|
||||||
|
fn form_owner(&self) -> Option<Root<HTMLFormElement>> {
|
||||||
|
self.form_owner.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_form_owner(&self, form: Option<&HTMLFormElement>) {
|
||||||
|
self.form_owner.set(form);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_element<'a>(&'a self) -> &'a Element {
|
||||||
|
self.upcast::<Element>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ use dom::validitystate::{ValidityState, ValidationFlags};
|
||||||
use dom::virtualmethods::VirtualMethods;
|
use dom::virtualmethods::VirtualMethods;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use html5ever_atoms::LocalName;
|
use html5ever_atoms::LocalName;
|
||||||
|
use std::default::Default;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
use style::attr::AttrValue;
|
use style::attr::AttrValue;
|
||||||
use style::element_state::*;
|
use style::element_state::*;
|
||||||
|
@ -61,6 +62,7 @@ impl CollectionFilter for OptionsFilter {
|
||||||
pub struct HTMLSelectElement {
|
pub struct HTMLSelectElement {
|
||||||
htmlelement: HTMLElement,
|
htmlelement: HTMLElement,
|
||||||
options: MutNullableJS<HTMLOptionsCollection>,
|
options: MutNullableJS<HTMLOptionsCollection>,
|
||||||
|
form_owner: MutNullableJS<HTMLFormElement>,
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEFAULT_SELECT_SIZE: u32 = 0;
|
static DEFAULT_SELECT_SIZE: u32 = 0;
|
||||||
|
@ -73,7 +75,8 @@ impl HTMLSelectElement {
|
||||||
htmlelement:
|
htmlelement:
|
||||||
HTMLElement::new_inherited_with_state(IN_ENABLED_STATE,
|
HTMLElement::new_inherited_with_state(IN_ENABLED_STATE,
|
||||||
local_name, prefix, document),
|
local_name, prefix, document),
|
||||||
options: Default::default()
|
options: Default::default(),
|
||||||
|
form_owner: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -344,19 +347,25 @@ impl VirtualMethods for HTMLSelectElement {
|
||||||
|
|
||||||
fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
|
fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
|
||||||
self.super_type().unwrap().attribute_mutated(attr, mutation);
|
self.super_type().unwrap().attribute_mutated(attr, mutation);
|
||||||
if attr.local_name() == &local_name!("disabled") {
|
match attr.local_name() {
|
||||||
let el = self.upcast::<Element>();
|
&local_name!("disabled") => {
|
||||||
match mutation {
|
let el = self.upcast::<Element>();
|
||||||
AttributeMutation::Set(_) => {
|
match mutation {
|
||||||
el.set_disabled_state(true);
|
AttributeMutation::Set(_) => {
|
||||||
el.set_enabled_state(false);
|
el.set_disabled_state(true);
|
||||||
},
|
el.set_enabled_state(false);
|
||||||
AttributeMutation::Removed => {
|
},
|
||||||
el.set_disabled_state(false);
|
AttributeMutation::Removed => {
|
||||||
el.set_enabled_state(true);
|
el.set_disabled_state(false);
|
||||||
el.check_ancestors_disabled_state_for_form_control();
|
el.set_enabled_state(true);
|
||||||
|
el.check_ancestors_disabled_state_for_form_control();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
&local_name!("form") => {
|
||||||
|
self.form_attribute_mutated(mutation);
|
||||||
|
},
|
||||||
|
_ => {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -388,7 +397,19 @@ impl VirtualMethods for HTMLSelectElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FormControl for HTMLSelectElement {}
|
impl FormControl for HTMLSelectElement {
|
||||||
|
fn form_owner(&self) -> Option<Root<HTMLFormElement>> {
|
||||||
|
self.form_owner.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_form_owner(&self, form: Option<&HTMLFormElement>) {
|
||||||
|
self.form_owner.set(form);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_element<'a>(&'a self) -> &'a Element {
|
||||||
|
self.upcast::<Element>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Validatable for HTMLSelectElement {
|
impl Validatable for HTMLSelectElement {
|
||||||
fn is_instance_validatable(&self) -> bool {
|
fn is_instance_validatable(&self) -> bool {
|
||||||
|
|
|
@ -9,7 +9,7 @@ use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding;
|
||||||
use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaElementMethods;
|
||||||
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
|
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::{LayoutJS, Root};
|
use dom::bindings::js::{LayoutJS, MutNullableJS, Root};
|
||||||
use dom::bindings::str::DOMString;
|
use dom::bindings::str::DOMString;
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
use dom::element::{AttributeMutation, Element};
|
use dom::element::{AttributeMutation, Element};
|
||||||
|
@ -30,6 +30,7 @@ use html5ever_atoms::LocalName;
|
||||||
use ipc_channel::ipc::IpcSender;
|
use ipc_channel::ipc::IpcSender;
|
||||||
use script_traits::ScriptMsg as ConstellationMsg;
|
use script_traits::ScriptMsg as ConstellationMsg;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
use std::default::Default;
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
use style::attr::AttrValue;
|
use style::attr::AttrValue;
|
||||||
use style::element_state::*;
|
use style::element_state::*;
|
||||||
|
@ -43,6 +44,7 @@ pub struct HTMLTextAreaElement {
|
||||||
placeholder: DOMRefCell<DOMString>,
|
placeholder: DOMRefCell<DOMString>,
|
||||||
// https://html.spec.whatwg.org/multipage/#concept-textarea-dirty
|
// https://html.spec.whatwg.org/multipage/#concept-textarea-dirty
|
||||||
value_changed: Cell<bool>,
|
value_changed: Cell<bool>,
|
||||||
|
form_owner: MutNullableJS<HTMLFormElement>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait LayoutHTMLTextAreaElementHelpers {
|
pub trait LayoutHTMLTextAreaElementHelpers {
|
||||||
|
@ -116,6 +118,7 @@ impl HTMLTextAreaElement {
|
||||||
textinput: DOMRefCell::new(TextInput::new(
|
textinput: DOMRefCell::new(TextInput::new(
|
||||||
Lines::Multiple, DOMString::new(), chan, None, None, SelectionDirection::None)),
|
Lines::Multiple, DOMString::new(), chan, None, None, SelectionDirection::None)),
|
||||||
value_changed: Cell::new(false),
|
value_changed: Cell::new(false),
|
||||||
|
form_owner: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,7 +345,10 @@ impl VirtualMethods for HTMLTextAreaElement {
|
||||||
el.set_read_write_state(!el.disabled_state());
|
el.set_read_write_state(!el.disabled_state());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
local_name!("form") => {
|
||||||
|
self.form_attribute_mutated(mutation);
|
||||||
|
},
|
||||||
_ => {},
|
_ => {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -435,7 +441,19 @@ impl VirtualMethods for HTMLTextAreaElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FormControl for HTMLTextAreaElement {}
|
impl FormControl for HTMLTextAreaElement {
|
||||||
|
fn form_owner(&self) -> Option<Root<HTMLFormElement>> {
|
||||||
|
self.form_owner.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_form_owner(&self, form: Option<&HTMLFormElement>) {
|
||||||
|
self.form_owner.set(form);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_element<'a>(&'a self) -> &'a Element {
|
||||||
|
self.upcast::<Element>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
impl Validatable for HTMLTextAreaElement {}
|
impl Validatable for HTMLTextAreaElement {}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
use core::nonzero::NonZero;
|
use core::nonzero::NonZero;
|
||||||
use dom::bindings::codegen::Bindings::ImageDataBinding;
|
use dom::bindings::codegen::Bindings::ImageDataBinding;
|
||||||
use dom::bindings::codegen::Bindings::ImageDataBinding::ImageDataMethods;
|
use dom::bindings::codegen::Bindings::ImageDataBinding::ImageDataMethods;
|
||||||
|
use dom::bindings::error::{Fallible, Error};
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::Root;
|
||||||
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
||||||
use dom::globalscope::GlobalScope;
|
use dom::globalscope::GlobalScope;
|
||||||
|
@ -28,14 +29,7 @@ pub struct ImageData {
|
||||||
impl ImageData {
|
impl ImageData {
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
pub fn new(global: &GlobalScope, width: u32, height: u32, mut data: Option<Vec<u8>>) -> Root<ImageData> {
|
pub fn new(global: &GlobalScope, width: u32, height: u32, mut data: Option<Vec<u8>>) -> Root<ImageData> {
|
||||||
let imagedata = box ImageData {
|
|
||||||
reflector_: Reflector::new(),
|
|
||||||
width: width,
|
|
||||||
height: height,
|
|
||||||
data: Heap::default(),
|
|
||||||
};
|
|
||||||
let len = width * height * 4;
|
let len = width * height * 4;
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let cx = global.get_cx();
|
let cx = global.get_cx();
|
||||||
rooted!(in (cx) let mut js_object = ptr::null_mut());
|
rooted!(in (cx) let mut js_object = ptr::null_mut());
|
||||||
|
@ -47,11 +41,88 @@ impl ImageData {
|
||||||
None => CreateWith::Length(len),
|
None => CreateWith::Length(len),
|
||||||
};
|
};
|
||||||
Uint8ClampedArray::create(cx, data, js_object.handle_mut()).unwrap();
|
Uint8ClampedArray::create(cx, data, js_object.handle_mut()).unwrap();
|
||||||
(*imagedata).data.set(js_object.get());
|
Self::new_with_jsobject(global, width, Some(height), Some(js_object.get())).unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(unsafe_code)]
|
||||||
|
unsafe fn new_with_jsobject(global: &GlobalScope,
|
||||||
|
width: u32,
|
||||||
|
mut opt_height: Option<u32>,
|
||||||
|
opt_jsobject: Option<*mut JSObject>)
|
||||||
|
-> Fallible<Root<ImageData>> {
|
||||||
|
assert!(opt_jsobject.is_some() || opt_height.is_some());
|
||||||
|
|
||||||
|
if width == 0 {
|
||||||
|
return Err(Error::IndexSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
reflect_dom_object(imagedata,
|
// checking jsobject type and verifying (height * width * 4 == jsobject.byte_len())
|
||||||
global, ImageDataBinding::Wrap)
|
if let Some(jsobject) = opt_jsobject {
|
||||||
|
let cx = global.get_cx();
|
||||||
|
typedarray!(in(cx) let array_res: Uint8ClampedArray = jsobject);
|
||||||
|
let mut array = try!(array_res
|
||||||
|
.map_err(|_| Error::Type("Argument to Image data is not an Uint8ClampedArray".to_owned())));
|
||||||
|
|
||||||
|
let byte_len = array.as_slice().len() as u32;
|
||||||
|
if byte_len % 4 != 0 {
|
||||||
|
return Err(Error::InvalidState);
|
||||||
|
}
|
||||||
|
|
||||||
|
let len = byte_len / 4;
|
||||||
|
if width == 0 || len % width != 0 {
|
||||||
|
return Err(Error::IndexSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
let height = len / width;
|
||||||
|
if opt_height.map_or(false, |x| height != x) {
|
||||||
|
return Err(Error::IndexSize);
|
||||||
|
} else {
|
||||||
|
opt_height = Some(height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let height = opt_height.unwrap();
|
||||||
|
if height == 0 {
|
||||||
|
return Err(Error::IndexSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
let imagedata = box ImageData {
|
||||||
|
reflector_: Reflector::new(),
|
||||||
|
width: width,
|
||||||
|
height: height,
|
||||||
|
data: Heap::default(),
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(jsobject) = opt_jsobject {
|
||||||
|
(*imagedata).data.set(jsobject);
|
||||||
|
} else {
|
||||||
|
let len = width * height * 4;
|
||||||
|
let cx = global.get_cx();
|
||||||
|
rooted!(in (cx) let mut array = ptr::null_mut());
|
||||||
|
Uint8ClampedArray::create(cx, CreateWith::Length(len), array.handle_mut()).unwrap();
|
||||||
|
(*imagedata).data.set(array.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(reflect_dom_object(imagedata, global, ImageDataBinding::Wrap))
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#pixel-manipulation:dom-imagedata-3
|
||||||
|
#[allow(unsafe_code)]
|
||||||
|
pub fn Constructor(global: &GlobalScope, width: u32, height: u32) -> Fallible<Root<Self>> {
|
||||||
|
unsafe { Self::new_with_jsobject(global, width, Some(height), None) }
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#pixel-manipulation:dom-imagedata-4
|
||||||
|
#[allow(unsafe_code)]
|
||||||
|
#[allow(unused_variables)]
|
||||||
|
pub unsafe fn Constructor_(cx: *mut JSContext,
|
||||||
|
global: &GlobalScope,
|
||||||
|
jsobject: *mut JSObject,
|
||||||
|
width: u32,
|
||||||
|
opt_height: Option<u32>)
|
||||||
|
-> Fallible<Root<Self>> {
|
||||||
|
Self::new_with_jsobject(global, width, opt_height, Some(jsobject))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
|
|
|
@ -4,10 +4,12 @@
|
||||||
|
|
||||||
use dom::bindings::codegen::Bindings::LocationBinding;
|
use dom::bindings::codegen::Bindings::LocationBinding;
|
||||||
use dom::bindings::codegen::Bindings::LocationBinding::LocationMethods;
|
use dom::bindings::codegen::Bindings::LocationBinding::LocationMethods;
|
||||||
use dom::bindings::error::{Error, ErrorResult};
|
use dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods;
|
||||||
|
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
||||||
use dom::bindings::js::{JS, Root};
|
use dom::bindings::js::{JS, Root};
|
||||||
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
||||||
use dom::bindings::str::{DOMString, USVString};
|
use dom::bindings::str::{DOMString, USVString};
|
||||||
|
use dom::globalscope::GlobalScope;
|
||||||
use dom::urlhelper::UrlHelper;
|
use dom::urlhelper::UrlHelper;
|
||||||
use dom::window::Window;
|
use dom::window::Window;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
|
@ -43,11 +45,27 @@ impl Location {
|
||||||
setter(&mut url, value);
|
setter(&mut url, value);
|
||||||
self.window.load_url(url, false, false, None);
|
self.window.load_url(url, false, false, None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn check_same_origin_domain(&self) -> ErrorResult {
|
||||||
|
let entry_document = GlobalScope::entry().as_window().Document();
|
||||||
|
let this_document = self.window.Document();
|
||||||
|
if entry_document.origin().same_origin_domain(this_document.origin()) {
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(Error::Security)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#dom-location-reload
|
||||||
|
pub fn reload_without_origin_check(&self) {
|
||||||
|
self.window.load_url(self.get_url(), true, true, None);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LocationMethods for Location {
|
impl LocationMethods for Location {
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-assign
|
// https://html.spec.whatwg.org/multipage/#dom-location-assign
|
||||||
fn Assign(&self, url: USVString) -> ErrorResult {
|
fn Assign(&self, url: USVString) -> ErrorResult {
|
||||||
|
try!(self.check_same_origin_domain());
|
||||||
// TODO: per spec, we should use the _API base URL_ specified by the
|
// TODO: per spec, we should use the _API base URL_ specified by the
|
||||||
// _entry settings object_.
|
// _entry settings object_.
|
||||||
let base_url = self.window.get_url();
|
let base_url = self.window.get_url();
|
||||||
|
@ -60,12 +78,15 @@ impl LocationMethods for Location {
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-reload
|
// https://html.spec.whatwg.org/multipage/#dom-location-reload
|
||||||
fn Reload(&self) {
|
fn Reload(&self) -> ErrorResult {
|
||||||
|
try!(self.check_same_origin_domain());
|
||||||
self.window.load_url(self.get_url(), true, true, None);
|
self.window.load_url(self.get_url(), true, true, None);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-replace
|
// https://html.spec.whatwg.org/multipage/#dom-location-replace
|
||||||
fn Replace(&self, url: USVString) -> ErrorResult {
|
fn Replace(&self, url: USVString) -> ErrorResult {
|
||||||
|
// Note: no call to self.check_same_origin_domain()
|
||||||
// TODO: per spec, we should use the _API base URL_ specified by the
|
// TODO: per spec, we should use the _API base URL_ specified by the
|
||||||
// _entry settings object_.
|
// _entry settings object_.
|
||||||
let base_url = self.window.get_url();
|
let base_url = self.window.get_url();
|
||||||
|
@ -78,97 +99,124 @@ impl LocationMethods for Location {
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-hash
|
// https://html.spec.whatwg.org/multipage/#dom-location-hash
|
||||||
fn Hash(&self) -> USVString {
|
fn GetHash(&self) -> Fallible<USVString> {
|
||||||
UrlHelper::Hash(&self.get_url())
|
try!(self.check_same_origin_domain());
|
||||||
|
Ok(UrlHelper::Hash(&self.get_url()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-hash
|
// https://html.spec.whatwg.org/multipage/#dom-location-hash
|
||||||
fn SetHash(&self, mut value: USVString) {
|
fn SetHash(&self, mut value: USVString) -> ErrorResult {
|
||||||
if value.0.is_empty() {
|
if value.0.is_empty() {
|
||||||
value = USVString("#".to_owned());
|
value = USVString("#".to_owned());
|
||||||
}
|
}
|
||||||
|
try!(self.check_same_origin_domain());
|
||||||
self.set_url_component(value, UrlHelper::SetHash);
|
self.set_url_component(value, UrlHelper::SetHash);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-host
|
// https://html.spec.whatwg.org/multipage/#dom-location-host
|
||||||
fn Host(&self) -> USVString {
|
fn GetHost(&self) -> Fallible<USVString> {
|
||||||
UrlHelper::Host(&self.get_url())
|
try!(self.check_same_origin_domain());
|
||||||
|
Ok(UrlHelper::Host(&self.get_url()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-host
|
// https://html.spec.whatwg.org/multipage/#dom-location-host
|
||||||
fn SetHost(&self, value: USVString) {
|
fn SetHost(&self, value: USVString) -> ErrorResult {
|
||||||
|
try!(self.check_same_origin_domain());
|
||||||
self.set_url_component(value, UrlHelper::SetHost);
|
self.set_url_component(value, UrlHelper::SetHost);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-origin
|
// https://html.spec.whatwg.org/multipage/#dom-location-origin
|
||||||
fn Origin(&self) -> USVString {
|
fn GetOrigin(&self) -> Fallible<USVString> {
|
||||||
UrlHelper::Origin(&self.get_url())
|
try!(self.check_same_origin_domain());
|
||||||
|
Ok(UrlHelper::Origin(&self.get_url()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-hostname
|
// https://html.spec.whatwg.org/multipage/#dom-location-hostname
|
||||||
fn Hostname(&self) -> USVString {
|
fn GetHostname(&self) -> Fallible<USVString> {
|
||||||
UrlHelper::Hostname(&self.get_url())
|
try!(self.check_same_origin_domain());
|
||||||
|
Ok(UrlHelper::Hostname(&self.get_url()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-hostname
|
// https://html.spec.whatwg.org/multipage/#dom-location-hostname
|
||||||
fn SetHostname(&self, value: USVString) {
|
fn SetHostname(&self, value: USVString) -> ErrorResult {
|
||||||
|
try!(self.check_same_origin_domain());
|
||||||
self.set_url_component(value, UrlHelper::SetHostname);
|
self.set_url_component(value, UrlHelper::SetHostname);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-href
|
// https://html.spec.whatwg.org/multipage/#dom-location-href
|
||||||
fn Href(&self) -> USVString {
|
fn GetHref(&self) -> Fallible<USVString> {
|
||||||
UrlHelper::Href(&self.get_url())
|
try!(self.check_same_origin_domain());
|
||||||
|
Ok(UrlHelper::Href(&self.get_url()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-href
|
// https://html.spec.whatwg.org/multipage/#dom-location-href
|
||||||
fn SetHref(&self, value: USVString) {
|
fn SetHref(&self, value: USVString) -> ErrorResult {
|
||||||
if let Ok(url) = self.window.get_url().join(&value.0) {
|
// Note: no call to self.check_same_origin_domain()
|
||||||
self.window.load_url(url, false, false, None);
|
let url = match self.window.get_url().join(&value.0) {
|
||||||
}
|
Ok(url) => url,
|
||||||
|
Err(e) => return Err(Error::Type(format!("Couldn't parse URL: {}", e))),
|
||||||
|
};
|
||||||
|
self.window.load_url(url, false, false, None);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-pathname
|
// https://html.spec.whatwg.org/multipage/#dom-location-pathname
|
||||||
fn Pathname(&self) -> USVString {
|
fn GetPathname(&self) -> Fallible<USVString> {
|
||||||
UrlHelper::Pathname(&self.get_url())
|
try!(self.check_same_origin_domain());
|
||||||
|
Ok(UrlHelper::Pathname(&self.get_url()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-pathname
|
// https://html.spec.whatwg.org/multipage/#dom-location-pathname
|
||||||
fn SetPathname(&self, value: USVString) {
|
fn SetPathname(&self, value: USVString) -> ErrorResult {
|
||||||
|
try!(self.check_same_origin_domain());
|
||||||
self.set_url_component(value, UrlHelper::SetPathname);
|
self.set_url_component(value, UrlHelper::SetPathname);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-port
|
// https://html.spec.whatwg.org/multipage/#dom-location-port
|
||||||
fn Port(&self) -> USVString {
|
fn GetPort(&self) -> Fallible<USVString> {
|
||||||
UrlHelper::Port(&self.get_url())
|
try!(self.check_same_origin_domain());
|
||||||
|
Ok(UrlHelper::Port(&self.get_url()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-port
|
// https://html.spec.whatwg.org/multipage/#dom-location-port
|
||||||
fn SetPort(&self, value: USVString) {
|
fn SetPort(&self, value: USVString) -> ErrorResult {
|
||||||
|
try!(self.check_same_origin_domain());
|
||||||
self.set_url_component(value, UrlHelper::SetPort);
|
self.set_url_component(value, UrlHelper::SetPort);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-protocol
|
// https://html.spec.whatwg.org/multipage/#dom-location-protocol
|
||||||
fn Protocol(&self) -> USVString {
|
fn GetProtocol(&self) -> Fallible<USVString> {
|
||||||
UrlHelper::Protocol(&self.get_url())
|
try!(self.check_same_origin_domain());
|
||||||
|
Ok(UrlHelper::Protocol(&self.get_url()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-protocol
|
// https://html.spec.whatwg.org/multipage/#dom-location-protocol
|
||||||
fn SetProtocol(&self, value: USVString) {
|
fn SetProtocol(&self, value: USVString) -> ErrorResult {
|
||||||
|
try!(self.check_same_origin_domain());
|
||||||
self.set_url_component(value, UrlHelper::SetProtocol);
|
self.set_url_component(value, UrlHelper::SetProtocol);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-href
|
// https://html.spec.whatwg.org/multipage/#dom-location-href
|
||||||
fn Stringifier(&self) -> DOMString {
|
fn Stringifier(&self) -> Fallible<DOMString> {
|
||||||
DOMString::from(self.Href().0)
|
Ok(DOMString::from(try!(self.GetHref()).0))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-search
|
// https://html.spec.whatwg.org/multipage/#dom-location-search
|
||||||
fn Search(&self) -> USVString {
|
fn GetSearch(&self) -> Fallible<USVString> {
|
||||||
UrlHelper::Search(&self.get_url())
|
try!(self.check_same_origin_domain());
|
||||||
|
Ok(UrlHelper::Search(&self.get_url()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-search
|
// https://html.spec.whatwg.org/multipage/#dom-location-search
|
||||||
fn SetSearch(&self, value: USVString) {
|
fn SetSearch(&self, value: USVString) -> ErrorResult {
|
||||||
|
try!(self.check_same_origin_domain());
|
||||||
self.set_url_component(value, UrlHelper::SetSearch);
|
self.set_url_component(value, UrlHelper::SetSearch);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,7 +162,11 @@ bitflags! {
|
||||||
/// Whether any ancestor is a fragmentation container
|
/// Whether any ancestor is a fragmentation container
|
||||||
const CAN_BE_FRAGMENTED = 0x40,
|
const CAN_BE_FRAGMENTED = 0x40,
|
||||||
#[doc = "Specifies whether this node needs to be dirted when viewport size changed."]
|
#[doc = "Specifies whether this node needs to be dirted when viewport size changed."]
|
||||||
const DIRTY_ON_VIEWPORT_SIZE_CHANGE = 0x80
|
const DIRTY_ON_VIEWPORT_SIZE_CHANGE = 0x80,
|
||||||
|
|
||||||
|
#[doc = "Specifies whether the parser has set an associated form owner for \
|
||||||
|
this element. Only applicable for form-associatable elements."]
|
||||||
|
const PARSER_ASSOCIATED_FORM_OWNER = 0x90,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,6 +290,11 @@ impl Node {
|
||||||
for node in child.traverse_preorder() {
|
for node in child.traverse_preorder() {
|
||||||
// Out-of-document elements never have the descendants flag set.
|
// Out-of-document elements never have the descendants flag set.
|
||||||
node.set_flag(IS_IN_DOC | HAS_DIRTY_DESCENDANTS, false);
|
node.set_flag(IS_IN_DOC | HAS_DIRTY_DESCENDANTS, false);
|
||||||
|
}
|
||||||
|
for node in child.traverse_preorder() {
|
||||||
|
// This needs to be in its own loop, because unbind_from_tree may
|
||||||
|
// rely on the state of IS_IN_DOC of the context node's descendants,
|
||||||
|
// e.g. when removing a <form>.
|
||||||
vtable_for(&&*node).unbind_from_tree(&context);
|
vtable_for(&&*node).unbind_from_tree(&context);
|
||||||
node.style_and_layout_data.get().map(|d| node.dispose(d));
|
node.style_and_layout_data.get().map(|d| node.dispose(d));
|
||||||
}
|
}
|
||||||
|
@ -2656,3 +2665,41 @@ impl Into<LayoutElementType> for ElementTypeId {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Helper trait to insert an element into vector whose elements
|
||||||
|
/// are maintained in tree order
|
||||||
|
pub trait VecPreOrderInsertionHelper<T> {
|
||||||
|
fn insert_pre_order(&mut self, elem: &T, tree_root: &Node);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> VecPreOrderInsertionHelper<T> for Vec<JS<T>>
|
||||||
|
where T: DerivedFrom<Node> + DomObject
|
||||||
|
{
|
||||||
|
/// This algorithm relies on the following assumptions:
|
||||||
|
/// * any elements inserted in this vector share the same tree root
|
||||||
|
/// * any time an element is removed from the tree root, it is also removed from this array
|
||||||
|
/// * any time an element is moved within the tree, it is removed from this array and re-inserted
|
||||||
|
///
|
||||||
|
/// Under these assumptions, an element's tree-order position in this array can be determined by
|
||||||
|
/// performing a [preorder traversal](https://dom.spec.whatwg.org/#concept-tree-order) of the tree root's children,
|
||||||
|
/// and increasing the destination index in the array every time a node in the array is encountered during
|
||||||
|
/// the traversal.
|
||||||
|
fn insert_pre_order(&mut self, elem: &T, tree_root: &Node) {
|
||||||
|
if self.is_empty() {
|
||||||
|
self.push(JS::from_ref(elem));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let elem_node = elem.upcast::<Node>();
|
||||||
|
let mut head: usize = 0;
|
||||||
|
for node in tree_root.traverse_preorder() {
|
||||||
|
let head_node = Root::upcast::<Node>(Root::from_ref(&*self[head]));
|
||||||
|
if head_node == node {
|
||||||
|
head += 1;
|
||||||
|
}
|
||||||
|
if elem_node == node.r() || head == self.len() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.insert(head, JS::from_ref(elem));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -15,12 +15,14 @@ use dom::comment::Comment;
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
use dom::documenttype::DocumentType;
|
use dom::documenttype::DocumentType;
|
||||||
use dom::element::{Element, ElementCreator};
|
use dom::element::{Element, ElementCreator};
|
||||||
|
use dom::htmlformelement::{FormControlElementHelpers, HTMLFormElement};
|
||||||
use dom::htmlscriptelement::HTMLScriptElement;
|
use dom::htmlscriptelement::HTMLScriptElement;
|
||||||
use dom::htmltemplateelement::HTMLTemplateElement;
|
use dom::htmltemplateelement::HTMLTemplateElement;
|
||||||
use dom::node::Node;
|
use dom::node::Node;
|
||||||
use dom::processinginstruction::ProcessingInstruction;
|
use dom::processinginstruction::ProcessingInstruction;
|
||||||
use dom::virtualmethods::vtable_for;
|
use dom::virtualmethods::vtable_for;
|
||||||
use html5ever::Attribute;
|
use html5ever::Attribute;
|
||||||
|
use html5ever::QualName;
|
||||||
use html5ever::serialize::{AttrRef, Serializable, Serializer};
|
use html5ever::serialize::{AttrRef, Serializable, Serializer};
|
||||||
use html5ever::serialize::TraversalScope;
|
use html5ever::serialize::TraversalScope;
|
||||||
use html5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode};
|
use html5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode};
|
||||||
|
@ -29,7 +31,6 @@ use html5ever::tokenizer::{Tokenizer as HtmlTokenizer, TokenizerOpts, TokenizerR
|
||||||
use html5ever::tokenizer::buffer_queue::BufferQueue;
|
use html5ever::tokenizer::buffer_queue::BufferQueue;
|
||||||
use html5ever::tree_builder::{NodeOrText, QuirksMode};
|
use html5ever::tree_builder::{NodeOrText, QuirksMode};
|
||||||
use html5ever::tree_builder::{Tracer as HtmlTracer, TreeBuilder, TreeBuilderOpts, TreeSink};
|
use html5ever::tree_builder::{Tracer as HtmlTracer, TreeBuilder, TreeBuilderOpts, TreeSink};
|
||||||
use html5ever_atoms::QualName;
|
|
||||||
use js::jsapi::JSTracer;
|
use js::jsapi::JSTracer;
|
||||||
use servo_url::ServoUrl;
|
use servo_url::ServoUrl;
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
@ -159,6 +160,13 @@ impl TreeSink for Sink {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn same_tree(&self, x: JS<Node>, y: JS<Node>) -> bool {
|
||||||
|
let x = x.downcast::<Element>().expect("Element node expected");
|
||||||
|
let y = y.downcast::<Element>().expect("Element node expected");
|
||||||
|
|
||||||
|
x.is_in_same_home_subtree(y)
|
||||||
|
}
|
||||||
|
|
||||||
fn create_element(&mut self, name: QualName, attrs: Vec<Attribute>)
|
fn create_element(&mut self, name: QualName, attrs: Vec<Attribute>)
|
||||||
-> JS<Node> {
|
-> JS<Node> {
|
||||||
let elem = Element::create(name, None, &*self.document,
|
let elem = Element::create(name, None, &*self.document,
|
||||||
|
@ -176,17 +184,33 @@ impl TreeSink for Sink {
|
||||||
JS::from_ref(comment.upcast())
|
JS::from_ref(comment.upcast())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn has_parent_node(&self, node: JS<Node>) -> bool {
|
||||||
|
node.GetParentNode().is_some()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn associate_with_form(&mut self, target: JS<Node>, form: JS<Node>) {
|
||||||
|
let node = target;
|
||||||
|
let form = Root::downcast::<HTMLFormElement>(Root::from_ref(&*form))
|
||||||
|
.expect("Owner must be a form element");
|
||||||
|
|
||||||
|
let elem = node.downcast::<Element>();
|
||||||
|
let control = elem.as_ref().and_then(|e| e.as_maybe_form_control());
|
||||||
|
|
||||||
|
if let Some(control) = control {
|
||||||
|
control.set_form_owner_from_parser(&form);
|
||||||
|
} else {
|
||||||
|
// TODO remove this code when keygen is implemented.
|
||||||
|
assert!(node.NodeName() == "KEYGEN", "Unknown form-associatable element");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn append_before_sibling(&mut self,
|
fn append_before_sibling(&mut self,
|
||||||
sibling: JS<Node>,
|
sibling: JS<Node>,
|
||||||
new_node: NodeOrText<JS<Node>>) -> Result<(), NodeOrText<JS<Node>>> {
|
new_node: NodeOrText<JS<Node>>) {
|
||||||
// If there is no parent, return the node to the parser.
|
let parent = sibling.GetParentNode()
|
||||||
let parent = match sibling.GetParentNode() {
|
.expect("append_before_sibling called on node without parent");
|
||||||
Some(p) => p,
|
|
||||||
None => return Err(new_node),
|
|
||||||
};
|
|
||||||
|
|
||||||
super::insert(&parent, Some(&*sibling), new_node);
|
super::insert(&parent, Some(&*sibling), new_node);
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_error(&mut self, msg: Cow<'static, str>) {
|
fn parse_error(&mut self, msg: Cow<'static, str>) {
|
||||||
|
|
|
@ -38,6 +38,7 @@ use dom::htmlmetaelement::HTMLMetaElement;
|
||||||
use dom::htmlobjectelement::HTMLObjectElement;
|
use dom::htmlobjectelement::HTMLObjectElement;
|
||||||
use dom::htmloptgroupelement::HTMLOptGroupElement;
|
use dom::htmloptgroupelement::HTMLOptGroupElement;
|
||||||
use dom::htmloptionelement::HTMLOptionElement;
|
use dom::htmloptionelement::HTMLOptionElement;
|
||||||
|
use dom::htmloutputelement::HTMLOutputElement;
|
||||||
use dom::htmlscriptelement::HTMLScriptElement;
|
use dom::htmlscriptelement::HTMLScriptElement;
|
||||||
use dom::htmlselectelement::HTMLSelectElement;
|
use dom::htmlselectelement::HTMLSelectElement;
|
||||||
use dom::htmlstyleelement::HTMLStyleElement;
|
use dom::htmlstyleelement::HTMLStyleElement;
|
||||||
|
@ -212,6 +213,9 @@ pub fn vtable_for(node: &Node) -> &VirtualMethods {
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLOptionElement)) => {
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLOptionElement)) => {
|
||||||
node.downcast::<HTMLOptionElement>().unwrap() as &VirtualMethods
|
node.downcast::<HTMLOptionElement>().unwrap() as &VirtualMethods
|
||||||
}
|
}
|
||||||
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLOutputElement)) => {
|
||||||
|
node.downcast::<HTMLOutputElement>().unwrap() as &VirtualMethods
|
||||||
|
}
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLScriptElement)) => {
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLScriptElement)) => {
|
||||||
node.downcast::<HTMLScriptElement>().unwrap() as &VirtualMethods
|
node.downcast::<HTMLScriptElement>().unwrap() as &VirtualMethods
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,7 +81,7 @@ partial /*sealed*/ interface Document {
|
||||||
// resource metadata management
|
// resource metadata management
|
||||||
[/*PutForwards=href, */Unforgeable]
|
[/*PutForwards=href, */Unforgeable]
|
||||||
readonly attribute Location? location;
|
readonly attribute Location? location;
|
||||||
readonly attribute DOMString domain;
|
[SetterThrows] attribute DOMString domain;
|
||||||
readonly attribute DOMString referrer;
|
readonly attribute DOMString referrer;
|
||||||
[Throws]
|
[Throws]
|
||||||
attribute DOMString cookie;
|
attribute DOMString cookie;
|
||||||
|
|
|
@ -10,7 +10,7 @@ interface History {
|
||||||
readonly attribute unsigned long length;
|
readonly attribute unsigned long length;
|
||||||
// attribute ScrollRestoration scrollRestoration;
|
// attribute ScrollRestoration scrollRestoration;
|
||||||
// readonly attribute any state;
|
// readonly attribute any state;
|
||||||
void go(optional long delta = 0);
|
[Throws] void go(optional long delta = 0);
|
||||||
void back();
|
void back();
|
||||||
void forward();
|
void forward();
|
||||||
// void pushState(any data, DOMString title, optional USVString? url = null);
|
// void pushState(any data, DOMString title, optional USVString? url = null);
|
||||||
|
|
|
@ -9,9 +9,9 @@
|
||||||
* You are granted a license to use, reproduce and create derivative works of this document.
|
* You are granted a license to use, reproduce and create derivative works of this document.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//[Constructor(unsigned long sw, unsigned long sh),
|
[Constructor(unsigned long sw, unsigned long sh),
|
||||||
//Constructor(Uint8ClampedArray data, unsigned long sw, optional unsigned long sh),
|
Constructor(/* Uint8ClampedArray */ object data, unsigned long sw, optional unsigned long sh),
|
||||||
[Exposed=(Window,Worker)]
|
Exposed=(Window,Worker)]
|
||||||
interface ImageData {
|
interface ImageData {
|
||||||
//[Constant]
|
//[Constant]
|
||||||
readonly attribute unsigned long width;
|
readonly attribute unsigned long width;
|
||||||
|
|
|
@ -4,26 +4,24 @@
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#location
|
// https://html.spec.whatwg.org/multipage/#location
|
||||||
[Exposed=Window, Unforgeable] interface Location {
|
[Exposed=Window, Unforgeable] interface Location {
|
||||||
/*stringifier*/ attribute USVString href;
|
/*stringifier*/ [Throws] attribute USVString href;
|
||||||
readonly attribute USVString origin;
|
[Throws] readonly attribute USVString origin;
|
||||||
attribute USVString protocol;
|
[Throws] attribute USVString protocol;
|
||||||
attribute USVString host;
|
[Throws] attribute USVString host;
|
||||||
attribute USVString hostname;
|
[Throws] attribute USVString hostname;
|
||||||
attribute USVString port;
|
[Throws] attribute USVString port;
|
||||||
attribute USVString pathname;
|
[Throws] attribute USVString pathname;
|
||||||
attribute USVString search;
|
[Throws] attribute USVString search;
|
||||||
attribute USVString hash;
|
[Throws] attribute USVString hash;
|
||||||
|
|
||||||
[Throws]
|
[Throws] void assign(USVString url);
|
||||||
void assign(USVString url);
|
[Throws] void replace(USVString url);
|
||||||
[Throws]
|
[Throws] void reload();
|
||||||
void replace(USVString url);
|
|
||||||
void reload();
|
|
||||||
|
|
||||||
//[SameObject] readonly attribute USVString[] ancestorOrigins;
|
//[SameObject] readonly attribute USVString[] ancestorOrigins;
|
||||||
|
|
||||||
// This is only doing as well as gecko right now.
|
// This is only doing as well as gecko right now.
|
||||||
// https://github.com/servo/servo/issues/7590 is on file for
|
// https://github.com/servo/servo/issues/7590 is on file for
|
||||||
// adding attribute stringifier support.
|
// adding attribute stringifier support.
|
||||||
stringifier;
|
[Throws] stringifier;
|
||||||
};
|
};
|
||||||
|
|
|
@ -42,7 +42,7 @@ use dom::location::Location;
|
||||||
use dom::mediaquerylist::{MediaQueryList, WeakMediaQueryListVec};
|
use dom::mediaquerylist::{MediaQueryList, WeakMediaQueryListVec};
|
||||||
use dom::messageevent::MessageEvent;
|
use dom::messageevent::MessageEvent;
|
||||||
use dom::navigator::Navigator;
|
use dom::navigator::Navigator;
|
||||||
use dom::node::{Node, from_untrusted_node_address, window_from_node, NodeDamage};
|
use dom::node::{Node, NodeDamage, document_from_node, from_untrusted_node_address, window_from_node};
|
||||||
use dom::performance::Performance;
|
use dom::performance::Performance;
|
||||||
use dom::promise::Promise;
|
use dom::promise::Promise;
|
||||||
use dom::screen::Screen;
|
use dom::screen::Screen;
|
||||||
|
@ -528,7 +528,24 @@ impl WindowMethods for Window {
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-frameelement
|
// https://html.spec.whatwg.org/multipage/#dom-frameelement
|
||||||
fn GetFrameElement(&self) -> Option<Root<Element>> {
|
fn GetFrameElement(&self) -> Option<Root<Element>> {
|
||||||
self.browsing_context().frame_element().map(Root::from_ref)
|
// Steps 1-3.
|
||||||
|
let context = match self.browsing_context.get() {
|
||||||
|
None => return None,
|
||||||
|
Some(context) => context,
|
||||||
|
};
|
||||||
|
// Step 4-5.
|
||||||
|
let container = match context.frame_element() {
|
||||||
|
None => return None,
|
||||||
|
Some(container) => container,
|
||||||
|
};
|
||||||
|
// Step 6.
|
||||||
|
let container_doc = document_from_node(container);
|
||||||
|
let current_doc = GlobalScope::current().as_window().Document();
|
||||||
|
if !current_doc.origin().same_origin_domain(container_doc.origin()) {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
// Step 7.
|
||||||
|
Some(Root::from_ref(container))
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-navigator
|
// https://html.spec.whatwg.org/multipage/#dom-navigator
|
||||||
|
|
|
@ -27,7 +27,6 @@ use dom::bindings::cell::DOMRefCell;
|
||||||
use dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::CSSStyleDeclarationMethods;
|
use dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::CSSStyleDeclarationMethods;
|
||||||
use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState};
|
use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState};
|
||||||
use dom::bindings::codegen::Bindings::EventBinding::EventInit;
|
use dom::bindings::codegen::Bindings::EventBinding::EventInit;
|
||||||
use dom::bindings::codegen::Bindings::LocationBinding::LocationMethods;
|
|
||||||
use dom::bindings::codegen::Bindings::TransitionEventBinding::TransitionEventInit;
|
use dom::bindings::codegen::Bindings::TransitionEventBinding::TransitionEventInit;
|
||||||
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
||||||
use dom::bindings::conversions::{ConversionResult, FromJSValConvertible, StringificationBehavior};
|
use dom::bindings::conversions::{ConversionResult, FromJSValConvertible, StringificationBehavior};
|
||||||
|
@ -644,6 +643,14 @@ impl ScriptThread {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn find_browsing_context(id: FrameId) -> Option<Root<BrowsingContext>> {
|
||||||
|
SCRIPT_THREAD_ROOT.with(|root| root.get().and_then(|script_thread| {
|
||||||
|
let script_thread = unsafe { &*script_thread };
|
||||||
|
script_thread.browsing_contexts.borrow().get(&id)
|
||||||
|
.map(|context| Root::from_ref(&**context))
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a new script thread.
|
/// Creates a new script thread.
|
||||||
pub fn new(state: InitialScriptState,
|
pub fn new(state: InitialScriptState,
|
||||||
port: Receiver<MainThreadScriptMsg>,
|
port: Receiver<MainThreadScriptMsg>,
|
||||||
|
@ -1348,7 +1355,7 @@ impl ScriptThread {
|
||||||
|
|
||||||
/// Handles activity change message
|
/// Handles activity change message
|
||||||
fn handle_set_document_activity_msg(&self, id: PipelineId, activity: DocumentActivity) {
|
fn handle_set_document_activity_msg(&self, id: PipelineId, activity: DocumentActivity) {
|
||||||
debug!("Setting activity of {} to be {:?}.", id, activity);
|
debug!("Setting activity of {} to be {:?} in {:?}.", id, activity, thread::current().name());
|
||||||
let document = self.documents.borrow().find_document(id);
|
let document = self.documents.borrow().find_document(id);
|
||||||
if let Some(document) = document {
|
if let Some(document) = document {
|
||||||
document.set_activity(activity);
|
document.set_activity(activity);
|
||||||
|
@ -2101,7 +2108,7 @@ impl ScriptThread {
|
||||||
fn handle_reload(&self, pipeline_id: PipelineId) {
|
fn handle_reload(&self, pipeline_id: PipelineId) {
|
||||||
let window = self.documents.borrow().find_window(pipeline_id);
|
let window = self.documents.borrow().find_window(pipeline_id);
|
||||||
if let Some(window) = window {
|
if let Some(window) = window {
|
||||||
window.Location().Reload();
|
window.Location().reload_without_origin_check();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -113,29 +113,24 @@ pub fn handle_get_frame_id(documents: &Documents,
|
||||||
pipeline: PipelineId,
|
pipeline: PipelineId,
|
||||||
webdriver_frame_id: WebDriverFrameId,
|
webdriver_frame_id: WebDriverFrameId,
|
||||||
reply: IpcSender<Result<Option<PipelineId>, ()>>) {
|
reply: IpcSender<Result<Option<PipelineId>, ()>>) {
|
||||||
let window = match webdriver_frame_id {
|
let result = match webdriver_frame_id {
|
||||||
WebDriverFrameId::Short(_) => {
|
WebDriverFrameId::Short(_) => {
|
||||||
// This isn't supported yet
|
// This isn't supported yet
|
||||||
Ok(None)
|
Ok(None)
|
||||||
},
|
},
|
||||||
WebDriverFrameId::Element(x) => {
|
WebDriverFrameId::Element(x) => {
|
||||||
match find_node_by_unique_id(documents, pipeline, x) {
|
find_node_by_unique_id(documents, pipeline, x)
|
||||||
Some(ref node) => {
|
.and_then(|node| node.downcast::<HTMLIFrameElement>().map(|elem| elem.pipeline_id()))
|
||||||
match node.downcast::<HTMLIFrameElement>() {
|
.ok_or(())
|
||||||
Some(ref elem) => Ok(elem.get_content_window()),
|
|
||||||
None => Err(())
|
|
||||||
}
|
|
||||||
},
|
|
||||||
None => Err(())
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
WebDriverFrameId::Parent => {
|
WebDriverFrameId::Parent => {
|
||||||
documents.find_window(pipeline).map(|window| window.parent()).ok_or(())
|
documents.find_window(pipeline)
|
||||||
|
.map(|window| window.parent_info().map(|(parent_id, _)| parent_id))
|
||||||
|
.ok_or(())
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let frame_id = window.map(|x| x.map(|x| x.upcast::<GlobalScope>().pipeline_id()));
|
reply.send(result).unwrap()
|
||||||
reply.send(frame_id).unwrap()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_find_element_css(documents: &Documents, pipeline: PipelineId, selector: String,
|
pub fn handle_find_element_css(documents: &Documents, pipeline: PipelineId, selector: String,
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
#![allow(non_snake_case, missing_docs)]
|
#![allow(non_snake_case, missing_docs)]
|
||||||
|
|
||||||
use gecko_bindings::bindings::{RawServoMediaList, RawServoMediaRule};
|
use gecko_bindings::bindings::{RawServoMediaList, RawServoMediaRule, RawServoNamespaceRule};
|
||||||
use gecko_bindings::bindings::{RawServoStyleSheet, RawServoStyleRule, RawServoImportRule};
|
use gecko_bindings::bindings::{RawServoStyleSheet, RawServoStyleRule, RawServoImportRule};
|
||||||
use gecko_bindings::bindings::{ServoComputedValues, ServoCssRules};
|
use gecko_bindings::bindings::{ServoComputedValues, ServoCssRules};
|
||||||
use gecko_bindings::structs::{RawServoAnimationValue, RawServoDeclarationBlock};
|
use gecko_bindings::structs::{RawServoAnimationValue, RawServoDeclarationBlock};
|
||||||
|
@ -17,7 +17,7 @@ use media_queries::MediaList;
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
use properties::{ComputedValues, PropertyDeclarationBlock};
|
use properties::{ComputedValues, PropertyDeclarationBlock};
|
||||||
use properties::animated_properties::AnimationValue;
|
use properties::animated_properties::AnimationValue;
|
||||||
use stylesheets::{CssRules, Stylesheet, StyleRule, ImportRule, MediaRule};
|
use stylesheets::{CssRules, Stylesheet, StyleRule, ImportRule, MediaRule, NamespaceRule};
|
||||||
|
|
||||||
macro_rules! impl_arc_ffi {
|
macro_rules! impl_arc_ffi {
|
||||||
($servo_type:ty => $gecko_type:ty [$addref:ident, $release:ident]) => {
|
($servo_type:ty => $gecko_type:ty [$addref:ident, $release:ident]) => {
|
||||||
|
@ -64,3 +64,6 @@ impl_arc_ffi!(RwLock<MediaList> => RawServoMediaList
|
||||||
|
|
||||||
impl_arc_ffi!(RwLock<MediaRule> => RawServoMediaRule
|
impl_arc_ffi!(RwLock<MediaRule> => RawServoMediaRule
|
||||||
[Servo_MediaRule_AddRef, Servo_MediaRule_Release]);
|
[Servo_MediaRule_AddRef, Servo_MediaRule_Release]);
|
||||||
|
|
||||||
|
impl_arc_ffi!(RwLock<NamespaceRule> => RawServoNamespaceRule
|
||||||
|
[Servo_NamespaceRule_AddRef, Servo_NamespaceRule_Release]);
|
||||||
|
|
|
@ -4,6 +4,11 @@ pub use nsstring::{nsACString, nsAString, nsString};
|
||||||
type nsACString_internal = nsACString;
|
type nsACString_internal = nsACString;
|
||||||
type nsAString_internal = nsAString;
|
type nsAString_internal = nsAString;
|
||||||
use gecko_bindings::structs::mozilla::css::URLValue;
|
use gecko_bindings::structs::mozilla::css::URLValue;
|
||||||
|
pub type RawServoNamespaceRuleStrong = ::gecko_bindings::sugar::ownership::Strong<RawServoNamespaceRule>;
|
||||||
|
pub type RawServoNamespaceRuleBorrowedOrNull<'a> = Option<&'a RawServoNamespaceRule>;
|
||||||
|
pub type RawServoNamespaceRuleBorrowed<'a> = &'a RawServoNamespaceRule;
|
||||||
|
enum RawServoNamespaceRuleVoid{ }
|
||||||
|
pub struct RawServoNamespaceRule(RawServoNamespaceRuleVoid);
|
||||||
use gecko_bindings::structs::RawGeckoDocument;
|
use gecko_bindings::structs::RawGeckoDocument;
|
||||||
use gecko_bindings::structs::RawGeckoElement;
|
use gecko_bindings::structs::RawGeckoElement;
|
||||||
use gecko_bindings::structs::RawGeckoKeyframeList;
|
use gecko_bindings::structs::RawGeckoKeyframeList;
|
||||||
|
@ -1383,6 +1388,11 @@ extern "C" {
|
||||||
index: u32)
|
index: u32)
|
||||||
-> RawServoMediaRuleStrong;
|
-> RawServoMediaRuleStrong;
|
||||||
}
|
}
|
||||||
|
extern "C" {
|
||||||
|
pub fn Servo_CssRules_GetNamespaceRuleAt(rules: ServoCssRulesBorrowed,
|
||||||
|
index: u32)
|
||||||
|
-> RawServoNamespaceRuleStrong;
|
||||||
|
}
|
||||||
extern "C" {
|
extern "C" {
|
||||||
pub fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed,
|
pub fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed,
|
||||||
sheet: RawServoStyleSheetBorrowed,
|
sheet: RawServoStyleSheetBorrowed,
|
||||||
|
@ -1431,6 +1441,14 @@ extern "C" {
|
||||||
pub fn Servo_MediaRule_GetCssText(rule: RawServoMediaRuleBorrowed,
|
pub fn Servo_MediaRule_GetCssText(rule: RawServoMediaRuleBorrowed,
|
||||||
result: *mut nsAString_internal);
|
result: *mut nsAString_internal);
|
||||||
}
|
}
|
||||||
|
extern "C" {
|
||||||
|
pub fn Servo_NamespaceRule_Debug(rule: RawServoNamespaceRuleBorrowed,
|
||||||
|
result: *mut nsACString_internal);
|
||||||
|
}
|
||||||
|
extern "C" {
|
||||||
|
pub fn Servo_NamespaceRule_GetCssText(rule: RawServoNamespaceRuleBorrowed,
|
||||||
|
result: *mut nsAString_internal);
|
||||||
|
}
|
||||||
extern "C" {
|
extern "C" {
|
||||||
pub fn Servo_ParseProperty(property: *const nsACString_internal,
|
pub fn Servo_ParseProperty(property: *const nsACString_internal,
|
||||||
value: *const nsACString_internal,
|
value: *const nsACString_internal,
|
||||||
|
|
|
@ -17,7 +17,7 @@ ${helpers.single_keyword("ime-mode", "auto normal active disabled inactive",
|
||||||
spec="https://drafts.csswg.org/css-ui/#input-method-editor")}
|
spec="https://drafts.csswg.org/css-ui/#input-method-editor")}
|
||||||
|
|
||||||
${helpers.single_keyword("-moz-user-select", "auto text none all element elements" +
|
${helpers.single_keyword("-moz-user-select", "auto text none all element elements" +
|
||||||
" toggle tri_state -moz-all -moz-none -moz-text",
|
" toggle tri-state -moz-all -moz-none -moz-text",
|
||||||
products="gecko",
|
products="gecko",
|
||||||
alias="-webkit-user-select",
|
alias="-webkit-user-select",
|
||||||
gecko_ffi_name="mUserSelect",
|
gecko_ffi_name="mUserSelect",
|
||||||
|
|
|
@ -28,6 +28,8 @@ use std::path::Path;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use url::{Url, Position};
|
use url::{Url, Position};
|
||||||
|
|
||||||
|
pub use url::Host;
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
|
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
|
||||||
pub struct ServoUrl(Arc<Url>);
|
pub struct ServoUrl(Arc<Url>);
|
||||||
|
|
|
@ -33,8 +33,9 @@ use style::gecko_bindings::bindings;
|
||||||
use style::gecko_bindings::bindings::{RawGeckoKeyframeListBorrowed, RawGeckoKeyframeListBorrowedMut};
|
use style::gecko_bindings::bindings::{RawGeckoKeyframeListBorrowed, RawGeckoKeyframeListBorrowedMut};
|
||||||
use style::gecko_bindings::bindings::{RawServoDeclarationBlockBorrowed, RawServoDeclarationBlockStrong};
|
use style::gecko_bindings::bindings::{RawServoDeclarationBlockBorrowed, RawServoDeclarationBlockStrong};
|
||||||
use style::gecko_bindings::bindings::{RawServoMediaListBorrowed, RawServoMediaListStrong};
|
use style::gecko_bindings::bindings::{RawServoMediaListBorrowed, RawServoMediaListStrong};
|
||||||
use style::gecko_bindings::bindings::{RawServoMediaRuleBorrowed, RawServoMediaRuleStrong};
|
use style::gecko_bindings::bindings::{RawServoMediaRule, RawServoMediaRuleBorrowed};
|
||||||
use style::gecko_bindings::bindings::{RawServoStyleRuleBorrowed, RawServoStyleRuleStrong};
|
use style::gecko_bindings::bindings::{RawServoNamespaceRule, RawServoNamespaceRuleBorrowed};
|
||||||
|
use style::gecko_bindings::bindings::{RawServoStyleRule, RawServoStyleRuleBorrowed};
|
||||||
use style::gecko_bindings::bindings::{RawServoStyleSetBorrowed, RawServoStyleSetOwned};
|
use style::gecko_bindings::bindings::{RawServoStyleSetBorrowed, RawServoStyleSetOwned};
|
||||||
use style::gecko_bindings::bindings::{RawServoStyleSheetBorrowed, ServoComputedValuesBorrowed};
|
use style::gecko_bindings::bindings::{RawServoStyleSheetBorrowed, ServoComputedValuesBorrowed};
|
||||||
use style::gecko_bindings::bindings::{RawServoStyleSheetStrong, ServoComputedValuesStrong};
|
use style::gecko_bindings::bindings::{RawServoStyleSheetStrong, ServoComputedValuesStrong};
|
||||||
|
@ -76,7 +77,8 @@ use style::restyle_hints::{self, RestyleHint};
|
||||||
use style::selector_parser::PseudoElementCascadeType;
|
use style::selector_parser::PseudoElementCascadeType;
|
||||||
use style::sequential;
|
use style::sequential;
|
||||||
use style::string_cache::Atom;
|
use style::string_cache::Atom;
|
||||||
use style::stylesheets::{CssRule, CssRules, ImportRule, MediaRule, Origin, Stylesheet, StyleRule};
|
use style::stylesheets::{CssRule, CssRules, ImportRule, MediaRule, NamespaceRule};
|
||||||
|
use style::stylesheets::{Origin, Stylesheet, StyleRule};
|
||||||
use style::stylesheets::StylesheetLoader as StyleStylesheetLoader;
|
use style::stylesheets::StylesheetLoader as StyleStylesheetLoader;
|
||||||
use style::supports::parse_condition_or_declaration;
|
use style::supports::parse_condition_or_declaration;
|
||||||
use style::thread_state;
|
use style::thread_state;
|
||||||
|
@ -510,30 +512,6 @@ pub extern "C" fn Servo_CssRules_ListTypes(rules: ServoCssRulesBorrowed,
|
||||||
result.iter_mut().zip(iter).fold((), |_, (r, v)| *r = v);
|
result.iter_mut().zip(iter).fold((), |_, (r, v)| *r = v);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn Servo_CssRules_GetStyleRuleAt(rules: ServoCssRulesBorrowed, index: u32)
|
|
||||||
-> RawServoStyleRuleStrong {
|
|
||||||
let rules = RwLock::<CssRules>::as_arc(&rules).read();
|
|
||||||
match rules.0[index as usize] {
|
|
||||||
CssRule::Style(ref rule) => rule.clone().into_strong(),
|
|
||||||
_ => {
|
|
||||||
unreachable!("GetStyleRuleAt should only be called on a style rule");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn Servo_CssRules_GetMediaRuleAt(rules: ServoCssRulesBorrowed, index: u32)
|
|
||||||
-> RawServoMediaRuleStrong {
|
|
||||||
let rules = RwLock::<CssRules>::as_arc(&rules).read();
|
|
||||||
match rules.0[index as usize] {
|
|
||||||
CssRule::Media(ref rule) => rule.clone().into_strong(),
|
|
||||||
_ => {
|
|
||||||
unreachable!("GetMediaRuleAt should only be called on a media rule");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed, sheet: RawServoStyleSheetBorrowed,
|
pub extern "C" fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed, sheet: RawServoStyleSheetBorrowed,
|
||||||
rule: *const nsACString, index: u32, nested: bool,
|
rule: *const nsACString, index: u32, nested: bool,
|
||||||
|
@ -559,11 +537,55 @@ pub extern "C" fn Servo_CssRules_DeleteRule(rules: ServoCssRulesBorrowed, index:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
macro_rules! impl_basic_rule_funcs {
|
||||||
pub extern "C" fn Servo_StyleRule_Debug(rule: RawServoStyleRuleBorrowed, result: *mut nsACString) {
|
{ ($name:ident, $rule_type:ty, $raw_type:ty),
|
||||||
let rule = RwLock::<StyleRule>::as_arc(&rule);
|
getter: $getter:ident,
|
||||||
let result = unsafe { result.as_mut().unwrap() };
|
debug: $debug:ident,
|
||||||
write!(result, "{:?}", *rule.read()).unwrap();
|
to_css: $to_css:ident,
|
||||||
|
} => {
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn $getter(rules: ServoCssRulesBorrowed, index: u32) -> Strong<$raw_type> {
|
||||||
|
let rules = RwLock::<CssRules>::as_arc(&rules).read();
|
||||||
|
match rules.0[index as usize] {
|
||||||
|
CssRule::$name(ref rule) => rule.clone().into_strong(),
|
||||||
|
_ => {
|
||||||
|
unreachable!(concat!(stringify!($getter), "should only be called ",
|
||||||
|
"on a ", stringify!($name), " rule"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn $debug(rule: &$raw_type, result: *mut nsACString) {
|
||||||
|
let rule = RwLock::<$rule_type>::as_arc(&rule);
|
||||||
|
let result = unsafe { result.as_mut().unwrap() };
|
||||||
|
write!(result, "{:?}", *rule.read()).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn $to_css(rule: &$raw_type, result: *mut nsAString) {
|
||||||
|
let rule = RwLock::<$rule_type>::as_arc(&rule);
|
||||||
|
rule.read().to_css(unsafe { result.as_mut().unwrap() }).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_basic_rule_funcs! { (Style, StyleRule, RawServoStyleRule),
|
||||||
|
getter: Servo_CssRules_GetStyleRuleAt,
|
||||||
|
debug: Servo_StyleRule_Debug,
|
||||||
|
to_css: Servo_StyleRule_GetCssText,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_basic_rule_funcs! { (Media, MediaRule, RawServoMediaRule),
|
||||||
|
getter: Servo_CssRules_GetMediaRuleAt,
|
||||||
|
debug: Servo_MediaRule_Debug,
|
||||||
|
to_css: Servo_MediaRule_GetCssText,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_basic_rule_funcs! { (Namespace, NamespaceRule, RawServoNamespaceRule),
|
||||||
|
getter: Servo_CssRules_GetNamespaceRuleAt,
|
||||||
|
debug: Servo_NamespaceRule_Debug,
|
||||||
|
to_css: Servo_NamespaceRule_GetCssText,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
@ -580,25 +602,12 @@ pub extern "C" fn Servo_StyleRule_SetStyle(rule: RawServoStyleRuleBorrowed,
|
||||||
rule.write().block = declarations.clone();
|
rule.write().block = declarations.clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn Servo_StyleRule_GetCssText(rule: RawServoStyleRuleBorrowed, result: *mut nsAString) {
|
|
||||||
let rule = RwLock::<StyleRule>::as_arc(&rule);
|
|
||||||
rule.read().to_css(unsafe { result.as_mut().unwrap() }).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn Servo_StyleRule_GetSelectorText(rule: RawServoStyleRuleBorrowed, result: *mut nsAString) {
|
pub extern "C" fn Servo_StyleRule_GetSelectorText(rule: RawServoStyleRuleBorrowed, result: *mut nsAString) {
|
||||||
let rule = RwLock::<StyleRule>::as_arc(&rule);
|
let rule = RwLock::<StyleRule>::as_arc(&rule);
|
||||||
rule.read().selectors.to_css(unsafe { result.as_mut().unwrap() }).unwrap();
|
rule.read().selectors.to_css(unsafe { result.as_mut().unwrap() }).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn Servo_MediaRule_Debug(rule: RawServoMediaRuleBorrowed, result: *mut nsACString) {
|
|
||||||
let rule = RwLock::<MediaRule>::as_arc(&rule);
|
|
||||||
let result = unsafe { result.as_mut().unwrap() };
|
|
||||||
write!(result, "{:?}", *rule.read()).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn Servo_MediaRule_GetMedia(rule: RawServoMediaRuleBorrowed) -> RawServoMediaListStrong {
|
pub extern "C" fn Servo_MediaRule_GetMedia(rule: RawServoMediaRuleBorrowed) -> RawServoMediaListStrong {
|
||||||
let rule = RwLock::<MediaRule>::as_arc(&rule);
|
let rule = RwLock::<MediaRule>::as_arc(&rule);
|
||||||
|
@ -612,9 +621,15 @@ pub extern "C" fn Servo_MediaRule_GetRules(rule: RawServoMediaRuleBorrowed) -> S
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn Servo_MediaRule_GetCssText(rule: RawServoMediaRuleBorrowed, result: *mut nsAString) {
|
pub extern "C" fn Servo_NamespaceRule_GetPrefix(rule: RawServoNamespaceRuleBorrowed) -> *mut nsIAtom {
|
||||||
let rule = RwLock::<MediaRule>::as_arc(&rule);
|
let rule = RwLock::<NamespaceRule>::as_arc(&rule);
|
||||||
rule.read().to_css(unsafe { result.as_mut().unwrap() }).unwrap();
|
rule.read().prefix.as_ref().unwrap_or(&atom!("")).as_ptr()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn Servo_NamespaceRule_GetURI(rule: RawServoNamespaceRuleBorrowed) -> *mut nsIAtom {
|
||||||
|
let rule = RwLock::<NamespaceRule>::as_arc(&rule);
|
||||||
|
rule.read().url.0.as_ptr()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
|
|
@ -15,7 +15,7 @@ extern crate parking_lot;
|
||||||
extern crate rayon;
|
extern crate rayon;
|
||||||
extern crate selectors;
|
extern crate selectors;
|
||||||
extern crate servo_url;
|
extern crate servo_url;
|
||||||
extern crate style;
|
#[macro_use] extern crate style;
|
||||||
extern crate style_traits;
|
extern crate style_traits;
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
|
|
|
@ -21,7 +21,7 @@ fn test_moz_user_select() {
|
||||||
assert_roundtrip_with_context!(_moz_user_select::parse, "element");
|
assert_roundtrip_with_context!(_moz_user_select::parse, "element");
|
||||||
assert_roundtrip_with_context!(_moz_user_select::parse, "elements");
|
assert_roundtrip_with_context!(_moz_user_select::parse, "elements");
|
||||||
assert_roundtrip_with_context!(_moz_user_select::parse, "toggle");
|
assert_roundtrip_with_context!(_moz_user_select::parse, "toggle");
|
||||||
assert_roundtrip_with_context!(_moz_user_select::parse, "tri_state");
|
assert_roundtrip_with_context!(_moz_user_select::parse, "tri-state");
|
||||||
assert_roundtrip_with_context!(_moz_user_select::parse, "-moz-all");
|
assert_roundtrip_with_context!(_moz_user_select::parse, "-moz-all");
|
||||||
assert_roundtrip_with_context!(_moz_user_select::parse, "-moz-none");
|
assert_roundtrip_with_context!(_moz_user_select::parse, "-moz-none");
|
||||||
assert_roundtrip_with_context!(_moz_user_select::parse, "-moz-text");
|
assert_roundtrip_with_context!(_moz_user_select::parse, "-moz-text");
|
||||||
|
|
|
@ -15,7 +15,7 @@ extern crate parking_lot;
|
||||||
extern crate rayon;
|
extern crate rayon;
|
||||||
extern crate selectors;
|
extern crate selectors;
|
||||||
extern crate servo_url;
|
extern crate servo_url;
|
||||||
extern crate style;
|
#[macro_use] extern crate style;
|
||||||
extern crate style_traits;
|
extern crate style_traits;
|
||||||
|
|
||||||
mod sanity_checks;
|
mod sanity_checks;
|
||||||
|
|
|
@ -89,14 +89,26 @@ qr-tests:
|
||||||
- xpcshell
|
- xpcshell
|
||||||
|
|
||||||
ccov-code-coverage-tests:
|
ccov-code-coverage-tests:
|
||||||
|
- cppunit
|
||||||
- crashtest
|
- crashtest
|
||||||
|
- firefox-ui-functional-local
|
||||||
|
- firefox-ui-functional-remote
|
||||||
- gtest
|
- gtest
|
||||||
|
- jittest
|
||||||
- jsreftest
|
- jsreftest
|
||||||
- marionette
|
- marionette
|
||||||
- mochitest
|
- mochitest
|
||||||
|
- mochitest-a11y
|
||||||
- mochitest-browser-chrome
|
- mochitest-browser-chrome
|
||||||
|
- mochitest-chrome
|
||||||
|
- mochitest-clipboard
|
||||||
- mochitest-devtools-chrome
|
- mochitest-devtools-chrome
|
||||||
|
- mochitest-gpu
|
||||||
|
- mochitest-jetpack
|
||||||
|
- mochitest-media
|
||||||
|
- mochitest-webgl
|
||||||
- reftest
|
- reftest
|
||||||
|
- reftest-no-accel
|
||||||
- web-platform-tests
|
- web-platform-tests
|
||||||
- xpcshell
|
- xpcshell
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,10 @@ cppunit:
|
||||||
description: "CPP Unit Tests"
|
description: "CPP Unit Tests"
|
||||||
suite: cppunittest
|
suite: cppunittest
|
||||||
treeherder-symbol: tc(Cpp)
|
treeherder-symbol: tc(Cpp)
|
||||||
|
instance-size:
|
||||||
|
by-test-platform:
|
||||||
|
linux64-ccov/opt: xlarge
|
||||||
|
default: default
|
||||||
e10s: false
|
e10s: false
|
||||||
docker-image: {"in-tree": "desktop1604-test"}
|
docker-image: {"in-tree": "desktop1604-test"}
|
||||||
run-on-projects:
|
run-on-projects:
|
||||||
|
@ -174,9 +178,17 @@ firefox-ui-functional-local:
|
||||||
description: "Firefox-ui-tests functional run"
|
description: "Firefox-ui-tests functional run"
|
||||||
suite: "firefox-ui/functional local"
|
suite: "firefox-ui/functional local"
|
||||||
treeherder-symbol: tc-Fxfn-l(en-US)
|
treeherder-symbol: tc-Fxfn-l(en-US)
|
||||||
|
instance-size:
|
||||||
|
by-test-platform:
|
||||||
|
linux64-ccov/opt: xlarge
|
||||||
|
default: default
|
||||||
max-run-time: 5400
|
max-run-time: 5400
|
||||||
tier: 1
|
tier: 1
|
||||||
docker-image: {"in-tree": "desktop1604-test"}
|
docker-image: {"in-tree": "desktop1604-test"}
|
||||||
|
e10s:
|
||||||
|
by-test-platform:
|
||||||
|
linux64-ccov/opt: false
|
||||||
|
default: both
|
||||||
mozharness:
|
mozharness:
|
||||||
script: firefox_ui_tests/functional.py
|
script: firefox_ui_tests/functional.py
|
||||||
config:
|
config:
|
||||||
|
@ -190,9 +202,17 @@ firefox-ui-functional-remote:
|
||||||
description: "Firefox-ui-tests functional run"
|
description: "Firefox-ui-tests functional run"
|
||||||
suite: "firefox-ui/functional remote"
|
suite: "firefox-ui/functional remote"
|
||||||
treeherder-symbol: tc-Fxfn-r(en-US)
|
treeherder-symbol: tc-Fxfn-r(en-US)
|
||||||
|
instance-size:
|
||||||
|
by-test-platform:
|
||||||
|
linux64-ccov/opt: xlarge
|
||||||
|
default: default
|
||||||
max-run-time: 5400
|
max-run-time: 5400
|
||||||
tier: 2
|
tier: 2
|
||||||
docker-image: {"in-tree": "desktop1604-test"}
|
docker-image: {"in-tree": "desktop1604-test"}
|
||||||
|
e10s:
|
||||||
|
by-test-platform:
|
||||||
|
linux64-ccov/opt: false
|
||||||
|
default: both
|
||||||
mozharness:
|
mozharness:
|
||||||
script: firefox_ui_tests/functional.py
|
script: firefox_ui_tests/functional.py
|
||||||
config:
|
config:
|
||||||
|
@ -233,6 +253,10 @@ jittest:
|
||||||
description: "JIT Test run"
|
description: "JIT Test run"
|
||||||
suite: jittest/jittest-chunked
|
suite: jittest/jittest-chunked
|
||||||
treeherder-symbol: tc(Jit)
|
treeherder-symbol: tc(Jit)
|
||||||
|
instance-size:
|
||||||
|
by-test-platform:
|
||||||
|
linux64-ccov/opt: xlarge
|
||||||
|
default: default
|
||||||
e10s: false
|
e10s: false
|
||||||
docker-image: {"in-tree": "desktop1604-test"}
|
docker-image: {"in-tree": "desktop1604-test"}
|
||||||
run-on-projects:
|
run-on-projects:
|
||||||
|
@ -449,6 +473,10 @@ mochitest-a11y:
|
||||||
description: "Mochitest a11y run"
|
description: "Mochitest a11y run"
|
||||||
suite: mochitest/a11y
|
suite: mochitest/a11y
|
||||||
treeherder-symbol: tc-M(a11y)
|
treeherder-symbol: tc-M(a11y)
|
||||||
|
instance-size:
|
||||||
|
by-test-platform:
|
||||||
|
linux64-ccov/opt: xlarge
|
||||||
|
default: default
|
||||||
loopback-video: true
|
loopback-video: true
|
||||||
e10s: false
|
e10s: false
|
||||||
docker-image: {"in-tree": "desktop1604-test"}
|
docker-image: {"in-tree": "desktop1604-test"}
|
||||||
|
@ -570,6 +598,7 @@ mochitest-chrome:
|
||||||
instance-size:
|
instance-size:
|
||||||
by-test-platform:
|
by-test-platform:
|
||||||
android.*: xlarge
|
android.*: xlarge
|
||||||
|
linux64-ccov/opt: xlarge
|
||||||
default: default
|
default: default
|
||||||
chunks:
|
chunks:
|
||||||
by-test-platform:
|
by-test-platform:
|
||||||
|
@ -619,6 +648,7 @@ mochitest-clipboard:
|
||||||
e10s:
|
e10s:
|
||||||
by-test-platform:
|
by-test-platform:
|
||||||
macosx64/debug: true
|
macosx64/debug: true
|
||||||
|
linux64-ccov/opt: false
|
||||||
default: both
|
default: both
|
||||||
mozharness:
|
mozharness:
|
||||||
by-test-platform:
|
by-test-platform:
|
||||||
|
@ -708,6 +738,10 @@ mochitest-gpu:
|
||||||
description: "Mochitest GPU run"
|
description: "Mochitest GPU run"
|
||||||
suite: mochitest/gpu
|
suite: mochitest/gpu
|
||||||
treeherder-symbol: tc-M(gpu)
|
treeherder-symbol: tc-M(gpu)
|
||||||
|
instance-size:
|
||||||
|
by-test-platform:
|
||||||
|
linux64-ccov/opt: xlarge
|
||||||
|
default: default
|
||||||
loopback-video: true
|
loopback-video: true
|
||||||
docker-image: {"in-tree": "desktop1604-test"}
|
docker-image: {"in-tree": "desktop1604-test"}
|
||||||
run-on-projects:
|
run-on-projects:
|
||||||
|
@ -719,6 +753,7 @@ mochitest-gpu:
|
||||||
windows.*: both
|
windows.*: both
|
||||||
android.*: false
|
android.*: false
|
||||||
macosx64/opt: both
|
macosx64/opt: both
|
||||||
|
linux64-ccov/opt: false
|
||||||
default: true
|
default: true
|
||||||
mozharness:
|
mozharness:
|
||||||
by-test-platform:
|
by-test-platform:
|
||||||
|
@ -753,6 +788,10 @@ mochitest-jetpack:
|
||||||
description: "Mochitest jetpack run"
|
description: "Mochitest jetpack run"
|
||||||
suite: mochitest/jetpack-package
|
suite: mochitest/jetpack-package
|
||||||
treeherder-symbol: tc-M(JP)
|
treeherder-symbol: tc-M(JP)
|
||||||
|
instance-size:
|
||||||
|
by-test-platform:
|
||||||
|
linux64-ccov/opt: xlarge
|
||||||
|
default: default
|
||||||
loopback-video: true
|
loopback-video: true
|
||||||
e10s: false
|
e10s: false
|
||||||
max-run-time: 5400
|
max-run-time: 5400
|
||||||
|
@ -789,10 +828,12 @@ mochitest-media:
|
||||||
e10s:
|
e10s:
|
||||||
by-test-platform:
|
by-test-platform:
|
||||||
macosx64/debug: true
|
macosx64/debug: true
|
||||||
|
linux64-ccov/opt: false
|
||||||
default: both
|
default: both
|
||||||
instance-size:
|
instance-size:
|
||||||
by-test-platform:
|
by-test-platform:
|
||||||
android.*: xlarge
|
android.*: xlarge
|
||||||
|
linux64-ccov/opt: xlarge
|
||||||
default: large
|
default: large
|
||||||
chunks:
|
chunks:
|
||||||
by-test-platform:
|
by-test-platform:
|
||||||
|
@ -874,6 +915,7 @@ mochitest-webgl:
|
||||||
e10s:
|
e10s:
|
||||||
by-test-platform:
|
by-test-platform:
|
||||||
macosx.*: true
|
macosx.*: true
|
||||||
|
linux64-ccov/opt: false
|
||||||
default: both
|
default: both
|
||||||
loopback-video: true
|
loopback-video: true
|
||||||
max-run-time:
|
max-run-time:
|
||||||
|
@ -883,6 +925,7 @@ mochitest-webgl:
|
||||||
instance-size:
|
instance-size:
|
||||||
by-test-platform:
|
by-test-platform:
|
||||||
android.*: xlarge
|
android.*: xlarge
|
||||||
|
linux64-ccov/opt: xlarge
|
||||||
default: default
|
default: default
|
||||||
# Bug 1296733: llvmpipe with mesa 9.2.1 lacks thread safety
|
# Bug 1296733: llvmpipe with mesa 9.2.1 lacks thread safety
|
||||||
allow-software-gl-layers: false
|
allow-software-gl-layers: false
|
||||||
|
@ -1020,15 +1063,23 @@ reftest-no-accel:
|
||||||
description: "Reftest not accelerated run"
|
description: "Reftest not accelerated run"
|
||||||
suite: reftest/reftest-no-accel
|
suite: reftest/reftest-no-accel
|
||||||
treeherder-symbol: tc-R(Ru)
|
treeherder-symbol: tc-R(Ru)
|
||||||
|
instance-size:
|
||||||
|
by-test-platform:
|
||||||
|
linux64-ccov/opt: xlarge
|
||||||
|
default: default
|
||||||
docker-image: {"in-tree": "desktop1604-test"}
|
docker-image: {"in-tree": "desktop1604-test"}
|
||||||
run-on-projects:
|
run-on-projects:
|
||||||
by-test-platform:
|
by-test-platform:
|
||||||
linux64-qr/.*: ['graphics', 'mozilla-central']
|
linux64-qr/.*: ['graphics', 'mozilla-central']
|
||||||
default: ['all']
|
default: ['all']
|
||||||
chunks:
|
chunks:
|
||||||
by-test-platform:
|
by-test-platform:
|
||||||
macosx.*: 1
|
macosx.*: 1
|
||||||
default: 8
|
default: 8
|
||||||
|
e10s:
|
||||||
|
by-test-platform:
|
||||||
|
linux64-ccov/opt: false
|
||||||
|
default: both
|
||||||
mozharness:
|
mozharness:
|
||||||
script: desktop_unittest.py
|
script: desktop_unittest.py
|
||||||
no-read-buildbot-config: true
|
no-read-buildbot-config: true
|
||||||
|
|
|
@ -44,7 +44,7 @@ def amend_taskgraph(taskgraph, label_to_taskid, to_add):
|
||||||
return taskgraph, label_to_taskid
|
return taskgraph, label_to_taskid
|
||||||
|
|
||||||
|
|
||||||
def derive_misc_task(task, purpose, image, label_to_taskid):
|
def derive_misc_task(task, purpose, image, taskgraph, label_to_taskid):
|
||||||
"""Create the shell of a task that depends on `task` and on the given docker
|
"""Create the shell of a task that depends on `task` and on the given docker
|
||||||
image."""
|
image."""
|
||||||
label = '{}-{}'.format(purpose, task.label)
|
label = '{}-{}'.format(purpose, task.label)
|
||||||
|
@ -80,24 +80,28 @@ def derive_misc_task(task, purpose, image, label_to_taskid):
|
||||||
'maxRunTime': 600,
|
'maxRunTime': 600,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencies = {
|
|
||||||
'parent': task.task_id,
|
# only include the docker-image dependency here if it is actually in the
|
||||||
'docker-image': image_taskid,
|
# taskgraph (has not been optimized). It is included in
|
||||||
}
|
# task_def['dependencies'] unconditionally.
|
||||||
|
dependencies = {'parent': task.task_id}
|
||||||
|
if image_taskid in taskgraph.tasks:
|
||||||
|
dependencies['docker-image'] = image_taskid
|
||||||
|
|
||||||
task = Task(kind='misc', label=label, attributes={}, task=task_def,
|
task = Task(kind='misc', label=label, attributes={}, task=task_def,
|
||||||
dependencies=dependencies)
|
dependencies=dependencies)
|
||||||
task.task_id = slugid()
|
task.task_id = slugid()
|
||||||
return task
|
return task
|
||||||
|
|
||||||
|
|
||||||
def make_index_task(parent_task, label_to_taskid):
|
def make_index_task(parent_task, taskgraph, label_to_taskid):
|
||||||
index_paths = [r.split('.', 1)[1] for r in parent_task.task['routes']
|
index_paths = [r.split('.', 1)[1] for r in parent_task.task['routes']
|
||||||
if r.startswith('index.')]
|
if r.startswith('index.')]
|
||||||
parent_task.task['routes'] = [r for r in parent_task.task['routes']
|
parent_task.task['routes'] = [r for r in parent_task.task['routes']
|
||||||
if not r.startswith('index.')]
|
if not r.startswith('index.')]
|
||||||
|
|
||||||
task = derive_misc_task(parent_task, 'index-task',
|
task = derive_misc_task(parent_task, 'index-task', 'index-task',
|
||||||
'index-task', label_to_taskid)
|
taskgraph, label_to_taskid)
|
||||||
task.task['scopes'] = [
|
task.task['scopes'] = [
|
||||||
'index:insert-task:{}'.format(path) for path in index_paths]
|
'index:insert-task:{}'.format(path) for path in index_paths]
|
||||||
task.task['payload']['command'] = ['insert-indexes.js'] + index_paths
|
task.task['payload']['command'] = ['insert-indexes.js'] + index_paths
|
||||||
|
@ -120,7 +124,7 @@ def add_index_tasks(taskgraph, label_to_taskid):
|
||||||
for label, task in taskgraph.tasks.iteritems():
|
for label, task in taskgraph.tasks.iteritems():
|
||||||
if len(task.task.get('routes', [])) <= MAX_ROUTES:
|
if len(task.task.get('routes', [])) <= MAX_ROUTES:
|
||||||
continue
|
continue
|
||||||
added.append(make_index_task(task, label_to_taskid))
|
added.append(make_index_task(task, taskgraph, label_to_taskid))
|
||||||
|
|
||||||
if added:
|
if added:
|
||||||
taskgraph, label_to_taskid = amend_taskgraph(
|
taskgraph, label_to_taskid = amend_taskgraph(
|
||||||
|
|
|
@ -2278,6 +2278,10 @@ toolbar#nav-bar {
|
||||||
options.e10s = False
|
options.e10s = False
|
||||||
mozinfo.update({"e10s": options.e10s}) # for test manifest parsing.
|
mozinfo.update({"e10s": options.e10s}) # for test manifest parsing.
|
||||||
|
|
||||||
|
# Add flag to mozinfo to indicate that code coverage is enabled.
|
||||||
|
if os.getenv('GCOV_PREFIX') is not None:
|
||||||
|
mozinfo.update({"coverage": True})
|
||||||
|
|
||||||
self.setTestRoot(options)
|
self.setTestRoot(options)
|
||||||
|
|
||||||
# Despite our efforts to clean up servers started by this script, in practice
|
# Despite our efforts to clean up servers started by this script, in practice
|
||||||
|
|
|
@ -17,6 +17,10 @@ from mozharness.mozilla.testing.testbase import (
|
||||||
TestingMixin,
|
TestingMixin,
|
||||||
testing_config_options,
|
testing_config_options,
|
||||||
)
|
)
|
||||||
|
from mozharness.mozilla.testing.codecoverage import (
|
||||||
|
CodeCoverageMixin,
|
||||||
|
code_coverage_config_options
|
||||||
|
)
|
||||||
from mozharness.mozilla.vcstools import VCSToolsScript
|
from mozharness.mozilla.vcstools import VCSToolsScript
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,7 +52,8 @@ firefox_ui_tests_config_options = [
|
||||||
'dest': 'tag',
|
'dest': 'tag',
|
||||||
'help': 'Subset of tests to run (local, remote).',
|
'help': 'Subset of tests to run (local, remote).',
|
||||||
}],
|
}],
|
||||||
] + copy.deepcopy(testing_config_options)
|
] + copy.deepcopy(testing_config_options) \
|
||||||
|
+ copy.deepcopy(code_coverage_config_options)
|
||||||
|
|
||||||
# Command line arguments for update tests
|
# Command line arguments for update tests
|
||||||
firefox_ui_update_harness_config_options = [
|
firefox_ui_update_harness_config_options = [
|
||||||
|
@ -90,7 +95,7 @@ firefox_ui_update_config_options = firefox_ui_update_harness_config_options \
|
||||||
+ copy.deepcopy(firefox_ui_tests_config_options)
|
+ copy.deepcopy(firefox_ui_tests_config_options)
|
||||||
|
|
||||||
|
|
||||||
class FirefoxUITests(TestingMixin, VCSToolsScript):
|
class FirefoxUITests(TestingMixin, VCSToolsScript, CodeCoverageMixin):
|
||||||
|
|
||||||
# Needs to be overwritten in sub classes
|
# Needs to be overwritten in sub classes
|
||||||
cli_script = None
|
cli_script = None
|
||||||
|
@ -243,6 +248,10 @@ class FirefoxUITests(TestingMixin, VCSToolsScript):
|
||||||
env.update({'MINIDUMP_STACKWALK': self.minidump_stackwalk_path})
|
env.update({'MINIDUMP_STACKWALK': self.minidump_stackwalk_path})
|
||||||
env['RUST_BACKTRACE'] = '1'
|
env['RUST_BACKTRACE'] = '1'
|
||||||
|
|
||||||
|
# If code coverage is enabled, set GCOV_PREFIX env variable
|
||||||
|
if self.config.get('code_coverage'):
|
||||||
|
env['GCOV_PREFIX'] = self.gcov_dir
|
||||||
|
|
||||||
if self.config['allow_software_gl_layers']:
|
if self.config['allow_software_gl_layers']:
|
||||||
env['MOZ_LAYERS_ALLOW_SOFTWARE_GL'] = '1'
|
env['MOZ_LAYERS_ALLOW_SOFTWARE_GL'] = '1'
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,8 @@ Cu.import("resource://gre/modules/Services.jsm");
|
||||||
|
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "Preferences",
|
XPCOMUtils.defineLazyModuleGetter(this, "Preferences",
|
||||||
"resource://gre/modules/Preferences.jsm");
|
"resource://gre/modules/Preferences.jsm");
|
||||||
|
XPCOMUtils.defineLazyModuleGetter(this, "LightweightThemeManager",
|
||||||
|
"resource://gre/modules/LightweightThemeManager.jsm");
|
||||||
|
|
||||||
// WeakMap[Extension -> Theme]
|
// WeakMap[Extension -> Theme]
|
||||||
let themeMap = new WeakMap();
|
let themeMap = new WeakMap();
|
||||||
|
@ -50,6 +52,7 @@ class Theme {
|
||||||
if (this.lwtStyles.headerURL &&
|
if (this.lwtStyles.headerURL &&
|
||||||
this.lwtStyles.accentcolor &&
|
this.lwtStyles.accentcolor &&
|
||||||
this.lwtStyles.textcolor) {
|
this.lwtStyles.textcolor) {
|
||||||
|
LightweightThemeManager.fallbackThemeData = this.lwtStyles;
|
||||||
Services.obs.notifyObservers(null,
|
Services.obs.notifyObservers(null,
|
||||||
"lightweight-theme-styling-update",
|
"lightweight-theme-styling-update",
|
||||||
JSON.stringify(this.lwtStyles));
|
JSON.stringify(this.lwtStyles));
|
||||||
|
@ -142,6 +145,7 @@ class Theme {
|
||||||
for (let icon of ICONS) {
|
for (let icon of ICONS) {
|
||||||
lwtStyles.icons[`--${icon}--icon`] = "";
|
lwtStyles.icons[`--${icon}--icon`] = "";
|
||||||
}
|
}
|
||||||
|
LightweightThemeManager.fallbackThemeData = null;
|
||||||
Services.obs.notifyObservers(null,
|
Services.obs.notifyObservers(null,
|
||||||
"lightweight-theme-styling-update",
|
"lightweight-theme-styling-update",
|
||||||
JSON.stringify(lwtStyles));
|
JSON.stringify(lwtStyles));
|
||||||
|
|
|
@ -8,6 +8,7 @@ module.exports = { // eslint-disable-line no-undef
|
||||||
},
|
},
|
||||||
|
|
||||||
"globals": {
|
"globals": {
|
||||||
|
"BrowserTestUtils": true,
|
||||||
"ExtensionTestUtils": false,
|
"ExtensionTestUtils": false,
|
||||||
"XPCOMUtils": true,
|
"XPCOMUtils": true,
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
[DEFAULT]
|
||||||
|
support-files =
|
||||||
|
head.js
|
||||||
|
|
||||||
[browser_ext_themes_chromeparity.js]
|
[browser_ext_themes_chromeparity.js]
|
||||||
[browser_ext_themes_dynamic_updates.js]
|
[browser_ext_themes_dynamic_updates.js]
|
||||||
[browser_ext_themes_lwtsupport.js]
|
[browser_ext_themes_lwtsupport.js]
|
||||||
|
[browser_ext_themes_persistence.js]
|
||||||
|
|
|
@ -1,14 +1,5 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const BACKGROUND = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
|
|
||||||
const ACCENT_COLOR = "#a14040";
|
|
||||||
const TEXT_COLOR = "#fac96e";
|
|
||||||
|
|
||||||
function hexToRGB(hex) {
|
|
||||||
hex = parseInt((hex.indexOf("#") > -1 ? hex.substring(1) : hex), 16);
|
|
||||||
return [hex >> 16, (hex & 0x00FF00) >> 8, (hex & 0x0000FF)];
|
|
||||||
}
|
|
||||||
|
|
||||||
add_task(function* setup() {
|
add_task(function* setup() {
|
||||||
yield SpecialPowers.pushPrefEnv({
|
yield SpecialPowers.pushPrefEnv({
|
||||||
set: [["extensions.webextensions.themes.enabled", true]],
|
set: [["extensions.webextensions.themes.enabled", true]],
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// This test checks whether applied WebExtension themes are persisted and applied
|
||||||
|
// on newly opened windows.
|
||||||
|
|
||||||
|
add_task(function* setup() {
|
||||||
|
yield SpecialPowers.pushPrefEnv({
|
||||||
|
set: [["extensions.webextensions.themes.enabled", true]],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* test_multiple_windows() {
|
||||||
|
let extension = ExtensionTestUtils.loadExtension({
|
||||||
|
manifest: {
|
||||||
|
"theme": {
|
||||||
|
"images": {
|
||||||
|
"headerURL": BACKGROUND,
|
||||||
|
},
|
||||||
|
"colors": {
|
||||||
|
"accentcolor": ACCENT_COLOR,
|
||||||
|
"textcolor": TEXT_COLOR,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
yield extension.startup();
|
||||||
|
|
||||||
|
let docEl = window.document.documentElement;
|
||||||
|
let style = window.getComputedStyle(docEl);
|
||||||
|
|
||||||
|
Assert.ok(docEl.hasAttribute("lwtheme"), "LWT attribute should be set");
|
||||||
|
Assert.equal(docEl.getAttribute("lwthemetextcolor"), "bright",
|
||||||
|
"LWT text color attribute should be set");
|
||||||
|
Assert.equal(style.backgroundImage, 'url("' + BACKGROUND.replace(/"/g, '\\"') + '")',
|
||||||
|
"Expected background image");
|
||||||
|
|
||||||
|
// Now we'll open a new window to see if the theme is also applied there.
|
||||||
|
let window2 = yield BrowserTestUtils.openNewBrowserWindow();
|
||||||
|
docEl = window2.document.documentElement;
|
||||||
|
style = window2.getComputedStyle(docEl);
|
||||||
|
|
||||||
|
Assert.ok(docEl.hasAttribute("lwtheme"), "LWT attribute should be set");
|
||||||
|
Assert.equal(docEl.getAttribute("lwthemetextcolor"), "bright",
|
||||||
|
"LWT text color attribute should be set");
|
||||||
|
Assert.equal(style.backgroundImage, 'url("' + BACKGROUND.replace(/"/g, '\\"') + '")',
|
||||||
|
"Expected background image");
|
||||||
|
|
||||||
|
yield BrowserTestUtils.closeWindow(window2);
|
||||||
|
yield extension.unload();
|
||||||
|
});
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче