MozReview-Commit-ID: BEeGEkSCpNK
This commit is contained in:
Wes Kocher 2017-03-15 14:28:51 -07:00
Родитель 98d60468d1 06af2f1e92
Коммит 5defc5746a
117 изменённых файлов: 17995 добавлений и 16354 удалений

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

@ -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

Разница между файлами не показана из-за своего большого размера Загрузить разницу

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

@ -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();
});

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше