зеркало из https://github.com/mozilla/gecko-dev.git
Merge m-c to inbound, a=merge
MozReview-Commit-ID: Hh4I1wa4u49
This commit is contained in:
Коммит
f8633189c2
|
@ -285,6 +285,7 @@ toolkit/components/osfile/**
|
|||
|
||||
# External code:
|
||||
toolkit/components/microformats/test/**
|
||||
toolkit/components/microformats/microformat-shiv.js
|
||||
toolkit/components/reader/Readability.js
|
||||
toolkit/components/reader/JSDOMParser.js
|
||||
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -4,4 +4,6 @@ support-files =
|
|||
|
||||
[browser_CaptivePortalWatcher.js]
|
||||
skip-if = os == "win" # Bug 1313894
|
||||
[browser_CaptivePortalWatcher_1.js]
|
||||
skip-if = os == "win" # Bug 1313894
|
||||
[browser_captivePortal_certErrorUI.js]
|
||||
|
|
|
@ -1,171 +1,6 @@
|
|||
"use strict";
|
||||
|
||||
Components.utils.import("resource:///modules/RecentWindow.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "CaptivePortalWatcher",
|
||||
"resource:///modules/CaptivePortalWatcher.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "cps",
|
||||
"@mozilla.org/network/captive-portal-service;1",
|
||||
"nsICaptivePortalService");
|
||||
|
||||
const CANONICAL_CONTENT = "success";
|
||||
const CANONICAL_URL = "data:text/plain;charset=utf-8," + CANONICAL_CONTENT;
|
||||
const CANONICAL_URL_REDIRECTED = "data:text/plain;charset=utf-8,redirected";
|
||||
const PORTAL_NOTIFICATION_VALUE = "captive-portal-detected";
|
||||
|
||||
add_task(function* setup() {
|
||||
yield SpecialPowers.pushPrefEnv({
|
||||
set: [["captivedetect.canonicalURL", CANONICAL_URL],
|
||||
["captivedetect.canonicalContent", CANONICAL_CONTENT]],
|
||||
});
|
||||
// We need to test behavior when a portal is detected when there is no browser
|
||||
// window, but we can't close the default window opened by the test harness.
|
||||
// Instead, we deactivate CaptivePortalWatcher in the default window and
|
||||
// exclude it from RecentWindow.getMostRecentBrowserWindow in an attempt to
|
||||
// mask its presence.
|
||||
window.CaptivePortalWatcher.uninit();
|
||||
RecentWindow._getMostRecentBrowserWindowCopy = RecentWindow.getMostRecentBrowserWindow;
|
||||
let defaultWindow = window;
|
||||
RecentWindow.getMostRecentBrowserWindow = () => {
|
||||
let win = RecentWindow._getMostRecentBrowserWindowCopy();
|
||||
if (win == defaultWindow) {
|
||||
return null;
|
||||
}
|
||||
return win;
|
||||
};
|
||||
});
|
||||
|
||||
function* portalDetected() {
|
||||
Services.obs.notifyObservers(null, "captive-portal-login", null);
|
||||
yield BrowserTestUtils.waitForCondition(() => {
|
||||
return cps.state == cps.LOCKED_PORTAL;
|
||||
}, "Waiting for Captive Portal Service to update state after portal detected.");
|
||||
}
|
||||
|
||||
function* freePortal(aSuccess) {
|
||||
Services.obs.notifyObservers(null,
|
||||
"captive-portal-login-" + (aSuccess ? "success" : "abort"), null);
|
||||
yield BrowserTestUtils.waitForCondition(() => {
|
||||
return cps.state != cps.LOCKED_PORTAL;
|
||||
}, "Waiting for Captive Portal Service to update state after portal freed.");
|
||||
}
|
||||
|
||||
// If a window is provided, it will be focused. Otherwise, a new window
|
||||
// will be opened and focused.
|
||||
function* focusWindowAndWaitForPortalUI(aLongRecheck, win) {
|
||||
// CaptivePortalWatcher triggers a recheck when a window gains focus. If
|
||||
// the time taken for the check to complete is under PORTAL_RECHECK_DELAY_MS,
|
||||
// a tab with the login page is opened and selected. If it took longer,
|
||||
// no tab is opened. It's not reliable to time things in an async test,
|
||||
// so use a delay threshold of -1 to simulate a long recheck (so that any
|
||||
// amount of time is considered excessive), and a very large threshold to
|
||||
// simulate a short recheck.
|
||||
Preferences.set("captivedetect.portalRecheckDelayMS", aLongRecheck ? -1 : 1000000);
|
||||
|
||||
if (!win) {
|
||||
win = yield BrowserTestUtils.openNewBrowserWindow();
|
||||
}
|
||||
yield SimpleTest.promiseFocus(win);
|
||||
|
||||
// After a new window is opened, CaptivePortalWatcher asks for a recheck, and
|
||||
// waits for it to complete. We need to manually tell it a recheck completed.
|
||||
yield BrowserTestUtils.waitForCondition(() => {
|
||||
return win.CaptivePortalWatcher._waitingForRecheck;
|
||||
}, "Waiting for CaptivePortalWatcher to trigger a recheck.");
|
||||
Services.obs.notifyObservers(null, "captive-portal-check-complete", null);
|
||||
|
||||
let notification = ensurePortalNotification(win);
|
||||
|
||||
if (aLongRecheck) {
|
||||
ensureNoPortalTab(win);
|
||||
testShowLoginPageButtonVisibility(notification, "visible");
|
||||
return win;
|
||||
}
|
||||
|
||||
let tab = win.gBrowser.tabs[1];
|
||||
if (tab.linkedBrowser.currentURI.spec != CANONICAL_URL) {
|
||||
// The tab should load the canonical URL, wait for it.
|
||||
yield BrowserTestUtils.waitForLocationChange(win.gBrowser, CANONICAL_URL);
|
||||
}
|
||||
is(win.gBrowser.selectedTab, tab,
|
||||
"The captive portal tab should be open and selected in the new window.");
|
||||
testShowLoginPageButtonVisibility(notification, "hidden");
|
||||
return win;
|
||||
}
|
||||
|
||||
function ensurePortalTab(win) {
|
||||
// For the tests that call this function, it's enough to ensure there
|
||||
// are two tabs in the window - the default tab and the portal tab.
|
||||
is(win.gBrowser.tabs.length, 2,
|
||||
"There should be a captive portal tab in the window.");
|
||||
}
|
||||
|
||||
function ensurePortalNotification(win) {
|
||||
let notificationBox =
|
||||
win.document.getElementById("high-priority-global-notificationbox");
|
||||
let notification = notificationBox.getNotificationWithValue(PORTAL_NOTIFICATION_VALUE)
|
||||
isnot(notification, null,
|
||||
"There should be a captive portal notification in the window.");
|
||||
return notification;
|
||||
}
|
||||
|
||||
// Helper to test whether the "Show Login Page" is visible in the captive portal
|
||||
// notification (it should be hidden when the portal tab is selected).
|
||||
function testShowLoginPageButtonVisibility(notification, visibility) {
|
||||
let showLoginPageButton = notification.querySelector("button.notification-button");
|
||||
// If the visibility property was never changed from default, it will be
|
||||
// an empty string, so we pretend it's "visible" (effectively the same).
|
||||
is(showLoginPageButton.style.visibility || "visible", visibility,
|
||||
"The \"Show Login Page\" button should be " + visibility + ".");
|
||||
}
|
||||
|
||||
function ensureNoPortalTab(win) {
|
||||
is(win.gBrowser.tabs.length, 1,
|
||||
"There should be no captive portal tab in the window.");
|
||||
}
|
||||
|
||||
function ensureNoPortalNotification(win) {
|
||||
let notificationBox =
|
||||
win.document.getElementById("high-priority-global-notificationbox");
|
||||
is(notificationBox.getNotificationWithValue(PORTAL_NOTIFICATION_VALUE), null,
|
||||
"There should be no captive portal notification in the window.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Some tests open a new window and close it later. When the window is closed,
|
||||
* the original window opened by mochitest gains focus, generating a
|
||||
* xul-window-visible notification. If the next test also opens a new window
|
||||
* before this notification has a chance to fire, CaptivePortalWatcher picks
|
||||
* up the first one instead of the one from the new window. To avoid this
|
||||
* unfortunate intermittent timing issue, we wait for the notification from
|
||||
* the original window every time we close a window that we opened.
|
||||
*/
|
||||
function waitForXulWindowVisible() {
|
||||
return new Promise(resolve => {
|
||||
Services.obs.addObserver(function observe() {
|
||||
Services.obs.removeObserver(observe, "xul-window-visible");
|
||||
resolve();
|
||||
}, "xul-window-visible", false);
|
||||
});
|
||||
}
|
||||
|
||||
function* closeWindowAndWaitForXulWindowVisible(win) {
|
||||
let p = waitForXulWindowVisible();
|
||||
yield BrowserTestUtils.closeWindow(win);
|
||||
yield p;
|
||||
}
|
||||
|
||||
/**
|
||||
* BrowserTestUtils.openNewBrowserWindow() does not guarantee the newly
|
||||
* opened window has received focus when the promise resolves, so we
|
||||
* have to manually wait every time.
|
||||
*/
|
||||
function* openWindowAndWaitForFocus() {
|
||||
let win = yield BrowserTestUtils.openNewBrowserWindow();
|
||||
yield SimpleTest.promiseFocus(win);
|
||||
return win;
|
||||
}
|
||||
add_task(setupPrefsAndRecentWindowBehavior);
|
||||
|
||||
// Each of the test cases below is run twice: once for login-success and once
|
||||
// for login-abort (aSuccess set to true and false respectively).
|
||||
|
@ -278,101 +113,7 @@ let testCasesForBothSuccessAndAbort = [
|
|||
},
|
||||
];
|
||||
|
||||
let singleRunTestCases = [
|
||||
/**
|
||||
* A portal is detected when there's no browser window,
|
||||
* then a browser window is opened, and the portal is logged into
|
||||
* and redirects to a different page. The portal tab should be added
|
||||
* and focused when the window is opened, and left open after login
|
||||
* since it redirected.
|
||||
*/
|
||||
function* test_detectedWithNoBrowserWindow_Redirect() {
|
||||
yield portalDetected();
|
||||
let win = yield focusWindowAndWaitForPortalUI();
|
||||
let browser = win.gBrowser.selectedTab.linkedBrowser;
|
||||
let loadPromise =
|
||||
BrowserTestUtils.browserLoaded(browser, false, CANONICAL_URL_REDIRECTED);
|
||||
BrowserTestUtils.loadURI(browser, CANONICAL_URL_REDIRECTED);
|
||||
yield loadPromise;
|
||||
yield freePortal(true);
|
||||
ensurePortalTab(win);
|
||||
ensureNoPortalNotification(win);
|
||||
yield closeWindowAndWaitForXulWindowVisible(win);
|
||||
},
|
||||
|
||||
/**
|
||||
* Test the various expected behaviors of the "Show Login Page" button
|
||||
* in the captive portal notification. The button should be visible for
|
||||
* all tabs except the captive portal tab, and when clicked, should
|
||||
* ensure a captive portal tab is open and select it.
|
||||
*/
|
||||
function* test_showLoginPageButton() {
|
||||
let win = yield openWindowAndWaitForFocus();
|
||||
yield portalDetected();
|
||||
let notification = ensurePortalNotification(win);
|
||||
testShowLoginPageButtonVisibility(notification, "visible");
|
||||
|
||||
function testPortalTabSelectedAndButtonNotVisible() {
|
||||
is(win.gBrowser.selectedTab, tab, "The captive portal tab should be selected.");
|
||||
testShowLoginPageButtonVisibility(notification, "hidden");
|
||||
}
|
||||
|
||||
let button = notification.querySelector("button.notification-button");
|
||||
function* clickButtonAndExpectNewPortalTab() {
|
||||
let p = BrowserTestUtils.waitForNewTab(win.gBrowser, CANONICAL_URL);
|
||||
button.click();
|
||||
let tab = yield p;
|
||||
is(win.gBrowser.selectedTab, tab, "The captive portal tab should be selected.");
|
||||
return tab;
|
||||
}
|
||||
|
||||
// Simulate clicking the button. The portal tab should be opened and
|
||||
// selected and the button should hide.
|
||||
let tab = yield clickButtonAndExpectNewPortalTab();
|
||||
testPortalTabSelectedAndButtonNotVisible();
|
||||
|
||||
// Close the tab. The button should become visible.
|
||||
yield BrowserTestUtils.removeTab(tab);
|
||||
ensureNoPortalTab(win);
|
||||
testShowLoginPageButtonVisibility(notification, "visible");
|
||||
|
||||
// When the button is clicked, a new portal tab should be opened and
|
||||
// selected.
|
||||
tab = yield clickButtonAndExpectNewPortalTab();
|
||||
|
||||
// Open another arbitrary tab. The button should become visible. When it's clicked,
|
||||
// the portal tab should be selected.
|
||||
let anotherTab = yield BrowserTestUtils.openNewForegroundTab(win.gBrowser);
|
||||
testShowLoginPageButtonVisibility(notification, "visible");
|
||||
button.click();
|
||||
is(win.gBrowser.selectedTab, tab, "The captive portal tab should be selected.");
|
||||
|
||||
// Close the portal tab and select the arbitrary tab. The button should become
|
||||
// visible and when it's clicked, a new portal tab should be opened.
|
||||
yield BrowserTestUtils.removeTab(tab);
|
||||
win.gBrowser.selectedTab = anotherTab;
|
||||
testShowLoginPageButtonVisibility(notification, "visible");
|
||||
tab = yield clickButtonAndExpectNewPortalTab();
|
||||
|
||||
yield BrowserTestUtils.removeTab(anotherTab);
|
||||
yield freePortal(true);
|
||||
ensureNoPortalTab(win);
|
||||
ensureNoPortalNotification(win);
|
||||
yield closeWindowAndWaitForXulWindowVisible(win);
|
||||
},
|
||||
];
|
||||
|
||||
for (let testcase of testCasesForBothSuccessAndAbort) {
|
||||
add_task(testcase.bind(null, true));
|
||||
add_task(testcase.bind(null, false));
|
||||
}
|
||||
|
||||
for (let testcase of singleRunTestCases) {
|
||||
add_task(testcase);
|
||||
}
|
||||
|
||||
add_task(function* cleanUp() {
|
||||
RecentWindow.getMostRecentBrowserWindow = RecentWindow._getMostRecentBrowserWindowCopy;
|
||||
delete RecentWindow._getMostRecentBrowserWindowCopy;
|
||||
window.CaptivePortalWatcher.init();
|
||||
});
|
||||
|
|
|
@ -0,0 +1,91 @@
|
|||
"use strict";
|
||||
|
||||
add_task(setupPrefsAndRecentWindowBehavior);
|
||||
|
||||
let testcases = [
|
||||
/**
|
||||
* A portal is detected when there's no browser window,
|
||||
* then a browser window is opened, and the portal is logged into
|
||||
* and redirects to a different page. The portal tab should be added
|
||||
* and focused when the window is opened, and left open after login
|
||||
* since it redirected.
|
||||
*/
|
||||
function* test_detectedWithNoBrowserWindow_Redirect() {
|
||||
yield portalDetected();
|
||||
let win = yield focusWindowAndWaitForPortalUI();
|
||||
let browser = win.gBrowser.selectedTab.linkedBrowser;
|
||||
let loadPromise =
|
||||
BrowserTestUtils.browserLoaded(browser, false, CANONICAL_URL_REDIRECTED);
|
||||
BrowserTestUtils.loadURI(browser, CANONICAL_URL_REDIRECTED);
|
||||
yield loadPromise;
|
||||
yield freePortal(true);
|
||||
ensurePortalTab(win);
|
||||
ensureNoPortalNotification(win);
|
||||
yield closeWindowAndWaitForXulWindowVisible(win);
|
||||
},
|
||||
|
||||
/**
|
||||
* Test the various expected behaviors of the "Show Login Page" button
|
||||
* in the captive portal notification. The button should be visible for
|
||||
* all tabs except the captive portal tab, and when clicked, should
|
||||
* ensure a captive portal tab is open and select it.
|
||||
*/
|
||||
function* test_showLoginPageButton() {
|
||||
let win = yield openWindowAndWaitForFocus();
|
||||
yield portalDetected();
|
||||
let notification = ensurePortalNotification(win);
|
||||
testShowLoginPageButtonVisibility(notification, "visible");
|
||||
|
||||
function testPortalTabSelectedAndButtonNotVisible() {
|
||||
is(win.gBrowser.selectedTab, tab, "The captive portal tab should be selected.");
|
||||
testShowLoginPageButtonVisibility(notification, "hidden");
|
||||
}
|
||||
|
||||
let button = notification.querySelector("button.notification-button");
|
||||
function* clickButtonAndExpectNewPortalTab() {
|
||||
let p = BrowserTestUtils.waitForNewTab(win.gBrowser, CANONICAL_URL);
|
||||
button.click();
|
||||
let tab = yield p;
|
||||
is(win.gBrowser.selectedTab, tab, "The captive portal tab should be selected.");
|
||||
return tab;
|
||||
}
|
||||
|
||||
// Simulate clicking the button. The portal tab should be opened and
|
||||
// selected and the button should hide.
|
||||
let tab = yield clickButtonAndExpectNewPortalTab();
|
||||
testPortalTabSelectedAndButtonNotVisible();
|
||||
|
||||
// Close the tab. The button should become visible.
|
||||
yield BrowserTestUtils.removeTab(tab);
|
||||
ensureNoPortalTab(win);
|
||||
testShowLoginPageButtonVisibility(notification, "visible");
|
||||
|
||||
// When the button is clicked, a new portal tab should be opened and
|
||||
// selected.
|
||||
tab = yield clickButtonAndExpectNewPortalTab();
|
||||
|
||||
// Open another arbitrary tab. The button should become visible. When it's clicked,
|
||||
// the portal tab should be selected.
|
||||
let anotherTab = yield BrowserTestUtils.openNewForegroundTab(win.gBrowser);
|
||||
testShowLoginPageButtonVisibility(notification, "visible");
|
||||
button.click();
|
||||
is(win.gBrowser.selectedTab, tab, "The captive portal tab should be selected.");
|
||||
|
||||
// Close the portal tab and select the arbitrary tab. The button should become
|
||||
// visible and when it's clicked, a new portal tab should be opened.
|
||||
yield BrowserTestUtils.removeTab(tab);
|
||||
win.gBrowser.selectedTab = anotherTab;
|
||||
testShowLoginPageButtonVisibility(notification, "visible");
|
||||
tab = yield clickButtonAndExpectNewPortalTab();
|
||||
|
||||
yield BrowserTestUtils.removeTab(anotherTab);
|
||||
yield freePortal(true);
|
||||
ensureNoPortalTab(win);
|
||||
ensureNoPortalNotification(win);
|
||||
yield closeWindowAndWaitForXulWindowVisible(win);
|
||||
},
|
||||
];
|
||||
|
||||
for (let testcase of testcases) {
|
||||
add_task(testcase);
|
||||
}
|
|
@ -5,9 +5,6 @@
|
|||
|
||||
const BAD_CERT_PAGE = "https://expired.example.com/";
|
||||
|
||||
const CANONICAL_CONTENT = "success";
|
||||
const CANONICAL_URL = "data:text/plain;charset=utf-8," + CANONICAL_CONTENT;
|
||||
|
||||
// This tests the alternate cert error UI when we are behind a captive portal.
|
||||
|
||||
add_task(function* checkCaptivePortalCertErrorUI() {
|
||||
|
|
|
@ -1,3 +1,175 @@
|
|||
Components.utils.import("resource:///modules/RecentWindow.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "CaptivePortalWatcher",
|
||||
"resource:///modules/CaptivePortalWatcher.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "cps",
|
||||
"@mozilla.org/network/captive-portal-service;1",
|
||||
"nsICaptivePortalService");
|
||||
|
||||
const CANONICAL_CONTENT = "success";
|
||||
const CANONICAL_URL = "data:text/plain;charset=utf-8," + CANONICAL_CONTENT;
|
||||
const CANONICAL_URL_REDIRECTED = "data:text/plain;charset=utf-8,redirected";
|
||||
const PORTAL_NOTIFICATION_VALUE = "captive-portal-detected";
|
||||
|
||||
function* setupPrefsAndRecentWindowBehavior() {
|
||||
yield SpecialPowers.pushPrefEnv({
|
||||
set: [["captivedetect.canonicalURL", CANONICAL_URL],
|
||||
["captivedetect.canonicalContent", CANONICAL_CONTENT]],
|
||||
});
|
||||
// We need to test behavior when a portal is detected when there is no browser
|
||||
// window, but we can't close the default window opened by the test harness.
|
||||
// Instead, we deactivate CaptivePortalWatcher in the default window and
|
||||
// exclude it from RecentWindow.getMostRecentBrowserWindow in an attempt to
|
||||
// mask its presence.
|
||||
window.CaptivePortalWatcher.uninit();
|
||||
let getMostRecentBrowserWindowCopy = RecentWindow.getMostRecentBrowserWindow;
|
||||
let defaultWindow = window;
|
||||
RecentWindow.getMostRecentBrowserWindow = () => {
|
||||
let win = getMostRecentBrowserWindowCopy();
|
||||
if (win == defaultWindow) {
|
||||
return null;
|
||||
}
|
||||
return win;
|
||||
};
|
||||
|
||||
registerCleanupFunction(function* cleanUp() {
|
||||
RecentWindow.getMostRecentBrowserWindow = getMostRecentBrowserWindowCopy;
|
||||
window.CaptivePortalWatcher.init();
|
||||
});
|
||||
}
|
||||
|
||||
function* portalDetected() {
|
||||
Services.obs.notifyObservers(null, "captive-portal-login", null);
|
||||
yield BrowserTestUtils.waitForCondition(() => {
|
||||
return cps.state == cps.LOCKED_PORTAL;
|
||||
}, "Waiting for Captive Portal Service to update state after portal detected.");
|
||||
}
|
||||
|
||||
function* freePortal(aSuccess) {
|
||||
Services.obs.notifyObservers(null,
|
||||
"captive-portal-login-" + (aSuccess ? "success" : "abort"), null);
|
||||
yield BrowserTestUtils.waitForCondition(() => {
|
||||
return cps.state != cps.LOCKED_PORTAL;
|
||||
}, "Waiting for Captive Portal Service to update state after portal freed.");
|
||||
}
|
||||
|
||||
// If a window is provided, it will be focused. Otherwise, a new window
|
||||
// will be opened and focused.
|
||||
function* focusWindowAndWaitForPortalUI(aLongRecheck, win) {
|
||||
// CaptivePortalWatcher triggers a recheck when a window gains focus. If
|
||||
// the time taken for the check to complete is under PORTAL_RECHECK_DELAY_MS,
|
||||
// a tab with the login page is opened and selected. If it took longer,
|
||||
// no tab is opened. It's not reliable to time things in an async test,
|
||||
// so use a delay threshold of -1 to simulate a long recheck (so that any
|
||||
// amount of time is considered excessive), and a very large threshold to
|
||||
// simulate a short recheck.
|
||||
Preferences.set("captivedetect.portalRecheckDelayMS", aLongRecheck ? -1 : 1000000);
|
||||
|
||||
if (!win) {
|
||||
win = yield BrowserTestUtils.openNewBrowserWindow();
|
||||
}
|
||||
yield SimpleTest.promiseFocus(win);
|
||||
|
||||
// After a new window is opened, CaptivePortalWatcher asks for a recheck, and
|
||||
// waits for it to complete. We need to manually tell it a recheck completed.
|
||||
yield BrowserTestUtils.waitForCondition(() => {
|
||||
return win.CaptivePortalWatcher._waitingForRecheck;
|
||||
}, "Waiting for CaptivePortalWatcher to trigger a recheck.");
|
||||
Services.obs.notifyObservers(null, "captive-portal-check-complete", null);
|
||||
|
||||
let notification = ensurePortalNotification(win);
|
||||
|
||||
if (aLongRecheck) {
|
||||
ensureNoPortalTab(win);
|
||||
testShowLoginPageButtonVisibility(notification, "visible");
|
||||
return win;
|
||||
}
|
||||
|
||||
let tab = win.gBrowser.tabs[1];
|
||||
if (tab.linkedBrowser.currentURI.spec != CANONICAL_URL) {
|
||||
// The tab should load the canonical URL, wait for it.
|
||||
yield BrowserTestUtils.waitForLocationChange(win.gBrowser, CANONICAL_URL);
|
||||
}
|
||||
is(win.gBrowser.selectedTab, tab,
|
||||
"The captive portal tab should be open and selected in the new window.");
|
||||
testShowLoginPageButtonVisibility(notification, "hidden");
|
||||
return win;
|
||||
}
|
||||
|
||||
function ensurePortalTab(win) {
|
||||
// For the tests that call this function, it's enough to ensure there
|
||||
// are two tabs in the window - the default tab and the portal tab.
|
||||
is(win.gBrowser.tabs.length, 2,
|
||||
"There should be a captive portal tab in the window.");
|
||||
}
|
||||
|
||||
function ensurePortalNotification(win) {
|
||||
let notificationBox =
|
||||
win.document.getElementById("high-priority-global-notificationbox");
|
||||
let notification = notificationBox.getNotificationWithValue(PORTAL_NOTIFICATION_VALUE)
|
||||
isnot(notification, null,
|
||||
"There should be a captive portal notification in the window.");
|
||||
return notification;
|
||||
}
|
||||
|
||||
// Helper to test whether the "Show Login Page" is visible in the captive portal
|
||||
// notification (it should be hidden when the portal tab is selected).
|
||||
function testShowLoginPageButtonVisibility(notification, visibility) {
|
||||
let showLoginPageButton = notification.querySelector("button.notification-button");
|
||||
// If the visibility property was never changed from default, it will be
|
||||
// an empty string, so we pretend it's "visible" (effectively the same).
|
||||
is(showLoginPageButton.style.visibility || "visible", visibility,
|
||||
"The \"Show Login Page\" button should be " + visibility + ".");
|
||||
}
|
||||
|
||||
function ensureNoPortalTab(win) {
|
||||
is(win.gBrowser.tabs.length, 1,
|
||||
"There should be no captive portal tab in the window.");
|
||||
}
|
||||
|
||||
function ensureNoPortalNotification(win) {
|
||||
let notificationBox =
|
||||
win.document.getElementById("high-priority-global-notificationbox");
|
||||
is(notificationBox.getNotificationWithValue(PORTAL_NOTIFICATION_VALUE), null,
|
||||
"There should be no captive portal notification in the window.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Some tests open a new window and close it later. When the window is closed,
|
||||
* the original window opened by mochitest gains focus, generating a
|
||||
* xul-window-visible notification. If the next test also opens a new window
|
||||
* before this notification has a chance to fire, CaptivePortalWatcher picks
|
||||
* up the first one instead of the one from the new window. To avoid this
|
||||
* unfortunate intermittent timing issue, we wait for the notification from
|
||||
* the original window every time we close a window that we opened.
|
||||
*/
|
||||
function waitForXulWindowVisible() {
|
||||
return new Promise(resolve => {
|
||||
Services.obs.addObserver(function observe() {
|
||||
Services.obs.removeObserver(observe, "xul-window-visible");
|
||||
resolve();
|
||||
}, "xul-window-visible", false);
|
||||
});
|
||||
}
|
||||
|
||||
function* closeWindowAndWaitForXulWindowVisible(win) {
|
||||
let p = waitForXulWindowVisible();
|
||||
yield BrowserTestUtils.closeWindow(win);
|
||||
yield p;
|
||||
}
|
||||
|
||||
/**
|
||||
* BrowserTestUtils.openNewBrowserWindow() does not guarantee the newly
|
||||
* opened window has received focus when the promise resolves, so we
|
||||
* have to manually wait every time.
|
||||
*/
|
||||
function* openWindowAndWaitForFocus() {
|
||||
let win = yield BrowserTestUtils.openNewBrowserWindow();
|
||||
yield SimpleTest.promiseFocus(win);
|
||||
return win;
|
||||
}
|
||||
|
||||
function waitForCertErrorLoad(browser) {
|
||||
return new Promise(resolve => {
|
||||
info("Waiting for DOMContentLoaded event");
|
||||
|
|
|
@ -106,6 +106,7 @@ support-files =
|
|||
content_aboutAccounts.js
|
||||
[browser_aboutCertError.js]
|
||||
[browser_aboutNetError.js]
|
||||
[browser_aboutSupport.js]
|
||||
[browser_aboutSupport_newtab_security_state.js]
|
||||
[browser_aboutHealthReport.js]
|
||||
skip-if = os == "linux" # Bug 924307
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
Cu.import("resource://gre/modules/AppConstants.jsm");
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
add_task(function* () {
|
||||
yield BrowserTestUtils.withNewTab({ gBrowser, url: "about:support" }, function* (browser) {
|
||||
const strings = Services.strings.createBundle(
|
||||
"chrome://global/locale/aboutSupport.properties");
|
||||
let allowedStates = [strings.GetStringFromName("found"),
|
||||
strings.GetStringFromName("missing")];
|
||||
|
||||
let keyGoogleStatus = yield ContentTask.spawn(browser, null, function* () {
|
||||
let textBox = content.document.getElementById("key-google-box");
|
||||
yield ContentTaskUtils.waitForCondition(() => textBox.textContent.trim(),
|
||||
"Google API key status loaded");
|
||||
return textBox.textContent;
|
||||
});
|
||||
ok(allowedStates.includes(keyGoogleStatus), "Google API key status shown");
|
||||
|
||||
let keyMozillaStatus = yield ContentTask.spawn(browser, null, function* () {
|
||||
let textBox = content.document.getElementById("key-mozilla-box");
|
||||
yield ContentTaskUtils.waitForCondition(() => textBox.textContent.trim(),
|
||||
"Mozilla API key status loaded");
|
||||
return textBox.textContent;
|
||||
});
|
||||
ok(allowedStates.includes(keyMozillaStatus), "Mozilla API key status shown");
|
||||
});
|
||||
});
|
|
@ -315,8 +315,8 @@ var FormAutofillContent = {
|
|||
return formDetails.map(record => record.fieldName);
|
||||
},
|
||||
|
||||
_identifyAutofillFields(doc) {
|
||||
this.log.debug("_identifyAutofillFields:", "" + doc.location);
|
||||
identifyAutofillFields(doc) {
|
||||
this.log.debug("identifyAutofillFields:", "" + doc.location);
|
||||
let forms = [];
|
||||
|
||||
// Collects root forms from inputs.
|
||||
|
|
|
@ -12,6 +12,7 @@ const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
|
|||
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Cu.import("resource://formautofill/FormAutofillContent.jsm");
|
||||
|
||||
/**
|
||||
* Handles content's interactions for the frame.
|
||||
|
@ -38,14 +39,11 @@ var FormAutofillFrameScript = {
|
|||
if (!(doc instanceof Ci.nsIDOMHTMLDocument)) {
|
||||
return;
|
||||
}
|
||||
this.FormAutofillContent._identifyAutofillFields(doc);
|
||||
FormAutofillContent.identifyAutofillFields(doc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(FormAutofillFrameScript, "FormAutofillContent",
|
||||
"resource://formautofill/FormAutofillContent.jsm");
|
||||
|
||||
FormAutofillFrameScript.init();
|
||||
|
|
|
@ -12,6 +12,12 @@
|
|||
-moz-binding: url("chrome://formautofill/content/formautofill.xml#autocomplete-profile-listitem");
|
||||
}
|
||||
|
||||
/* Treat @collpased="true" as display: none similar to how it is for XUL elements.
|
||||
* https://developer.mozilla.org/en-US/docs/Web/CSS/visibility#Values */
|
||||
#PopupAutoComplete > richlistbox > richlistitem[originaltype="autofill-profile"][collapsed="true"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#PopupAutoComplete[firstresultstyle="autofill-profile"] {
|
||||
min-width: 150px !important;
|
||||
}
|
||||
|
|
|
@ -77,7 +77,7 @@ TESTCASES.forEach(testcase => {
|
|||
|
||||
let doc = MockDocument.createTestDocument(
|
||||
"http://localhost:8080/test/", testcase.document);
|
||||
FormAutofillContent._identifyAutofillFields(doc);
|
||||
FormAutofillContent.identifyAutofillFields(doc);
|
||||
|
||||
for (let i in testcase.targetInput) {
|
||||
let input = doc.getElementById(testcase.targetInput[i]);
|
||||
|
|
|
@ -64,7 +64,7 @@ TESTCASES.forEach(testcase => {
|
|||
|
||||
let doc = MockDocument.createTestDocument(
|
||||
"http://localhost:8080/test/", testcase.document);
|
||||
FormAutofillContent._identifyAutofillFields(doc);
|
||||
FormAutofillContent.identifyAutofillFields(doc);
|
||||
|
||||
Assert.deepEqual(markedFieldId, testcase.expectedResult,
|
||||
"Check the fields were marked correctly.");
|
||||
|
|
|
@ -78,9 +78,6 @@ check_and_add_gcc_warning('-Werror=non-literal-null-conversion',
|
|||
# catches string literals used in boolean expressions
|
||||
check_and_add_gcc_warning('-Wstring-conversion')
|
||||
|
||||
# catches inconsistent use of mutexes
|
||||
check_and_add_gcc_warning('-Wthread-safety')
|
||||
|
||||
# we inline 'new' and 'delete' in mozalloc
|
||||
check_and_add_gcc_warning('-Wno-inline-new-delete', cxx_compiler)
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
"use strict";
|
||||
|
||||
const Services = require("Services");
|
||||
const EventEmitter = require("devtools/shared/event-emitter");
|
||||
const { TimelineFront } = require("devtools/shared/fronts/timeline");
|
||||
const { CurlUtils } = require("devtools/client/shared/curl");
|
||||
const { ACTIVITY_TYPE, EVENTS } = require("./constants");
|
||||
|
@ -892,14 +891,6 @@ NetworkEventsHandler.prototype = {
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Convenient way of emitting events from the panel window.
|
||||
*/
|
||||
EventEmitter.decorate(window);
|
||||
|
||||
/**
|
||||
* Preliminary setup for the NetMonitorController object.
|
||||
*/
|
||||
NetMonitorController.TargetEventsHandler = new TargetEventsHandler();
|
||||
NetMonitorController.NetworkEventsHandler = new NetworkEventsHandler();
|
||||
window.gNetwork = NetMonitorController.NetworkEventsHandler;
|
||||
|
|
|
@ -4,7 +4,19 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const { BrowserLoader } = Components.utils.import("resource://devtools/client/shared/browser-loader.js", {});
|
||||
|
||||
function Netmonitor(toolbox) {
|
||||
const require = window.windowRequire = BrowserLoader({
|
||||
baseURI: "resource://devtools/client/netmonitor/",
|
||||
window,
|
||||
commonLibRequire: toolbox.browserRequire,
|
||||
}).require;
|
||||
|
||||
// Inject EventEmitter into netmonitor window.
|
||||
const EventEmitter = require("devtools/shared/event-emitter");
|
||||
EventEmitter.decorate(window);
|
||||
|
||||
window.NetMonitorController = require("./netmonitor-controller").NetMonitorController;
|
||||
window.NetMonitorController._toolbox = toolbox;
|
||||
window.NetMonitorController._target = toolbox.target;
|
||||
|
|
|
@ -8,19 +8,7 @@
|
|||
<link rel="stylesheet" href="chrome://devtools/content/shared/widgets/widgets.css"/>
|
||||
<link rel="stylesheet" href="chrome://devtools/skin/widgets.css"/>
|
||||
<link rel="stylesheet" href="chrome://devtools/skin/netmonitor.css"/>
|
||||
|
||||
<script src="chrome://devtools/content/shared/theme-switching.js"/>
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
const { BrowserLoader } = Components.utils.import(
|
||||
"resource://devtools/client/shared/browser-loader.js", {});
|
||||
const { require } = BrowserLoader({
|
||||
baseURI: "resource://devtools/client/netmonitor/",
|
||||
window,
|
||||
});
|
||||
window.windowRequire = require;
|
||||
</script>
|
||||
</head>
|
||||
<body class="theme-sidebar" role="application">
|
||||
<div class="root"></div>
|
||||
|
|
|
@ -150,8 +150,11 @@
|
|||
|
||||
let doc = node.ownerDocument;
|
||||
const inspectorUrl = "chrome://devtools/content/inspector/inspector.xhtml";
|
||||
const netMonitorUrl = "chrome://devtools/content/netmonitor/netmonitor.xhtml";
|
||||
|
||||
while (doc instanceof XULDocument || doc.location.href === inspectorUrl) {
|
||||
while (doc instanceof XULDocument ||
|
||||
doc.location.href === inspectorUrl ||
|
||||
doc.location.href === netMonitorUrl) {
|
||||
const {frameElement} = doc.defaultView;
|
||||
|
||||
if (!frameElement) {
|
||||
|
|
|
@ -413,12 +413,11 @@ function* generatePageErrorStubs() {
|
|||
for (let [key, code] of pageError) {
|
||||
let received = new Promise(resolve => {
|
||||
toolbox.target.client.addListener("pageError", function onPacket(e, packet) {
|
||||
toolbox.target.client.removeListener("pageError", onPacket);
|
||||
let message = prepareMessage(packet, {getNextId: () => 1});
|
||||
stubs.packets.push(formatPacket(message.messageText, packet));
|
||||
stubs.preparedMessages.push(formatStub(message.messageText, packet));
|
||||
resolve();
|
||||
}, {
|
||||
once: true
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include "mozilla/LookAndFeel.h" // For LookAndFeel::GetInt
|
||||
#include "mozilla/KeyframeUtils.h"
|
||||
#include "mozilla/ServoBindings.h"
|
||||
#include "mozilla/StyleAnimationValueInlines.h"
|
||||
#include "mozilla/TypeTraits.h"
|
||||
#include "Layers.h" // For Layer
|
||||
#include "nsComputedDOMStyle.h" // nsComputedDOMStyle::GetStyleContextForElement
|
||||
#include "nsContentUtils.h" // nsContentUtils::ReportToConsole
|
||||
|
@ -190,6 +190,27 @@ void
|
|||
KeyframeEffectReadOnly::SetKeyframes(nsTArray<Keyframe>&& aKeyframes,
|
||||
nsStyleContext* aStyleContext)
|
||||
{
|
||||
DoSetKeyframes(Move(aKeyframes), Move(aStyleContext));
|
||||
}
|
||||
|
||||
void
|
||||
KeyframeEffectReadOnly::SetKeyframes(
|
||||
nsTArray<Keyframe>&& aKeyframes,
|
||||
const ServoComputedStyleValues& aServoValues)
|
||||
{
|
||||
DoSetKeyframes(Move(aKeyframes), aServoValues);
|
||||
}
|
||||
|
||||
template<typename StyleType>
|
||||
void
|
||||
KeyframeEffectReadOnly::DoSetKeyframes(nsTArray<Keyframe>&& aKeyframes,
|
||||
StyleType&& aStyle)
|
||||
{
|
||||
static_assert(IsSame<StyleType, nsStyleContext*>::value ||
|
||||
IsSame<StyleType, const ServoComputedStyleValues&>::value,
|
||||
"StyleType should be nsStyleContext* or "
|
||||
"const ServoComputedStyleValues&");
|
||||
|
||||
if (KeyframesEqualIgnoringComputedOffsets(aKeyframes, mKeyframes)) {
|
||||
return;
|
||||
}
|
||||
|
@ -205,8 +226,11 @@ KeyframeEffectReadOnly::SetKeyframes(nsTArray<Keyframe>&& aKeyframes,
|
|||
nsNodeUtils::AnimationChanged(mAnimation);
|
||||
}
|
||||
|
||||
if (aStyleContext) {
|
||||
UpdateProperties(aStyleContext);
|
||||
// We need to call UpdateProperties() if the StyleType is
|
||||
// 'const ServoComputedStyleValues&' (i.e. not a pointer) or nsStyleContext*
|
||||
// is not nullptr.
|
||||
if (!IsPointer<StyleType>::value || aStyle) {
|
||||
UpdateProperties(aStyle);
|
||||
MaybeUpdateFrameForCompositor();
|
||||
}
|
||||
}
|
||||
|
@ -275,6 +299,35 @@ KeyframeEffectReadOnly::UpdateProperties(nsStyleContext* aStyleContext)
|
|||
{
|
||||
MOZ_ASSERT(aStyleContext);
|
||||
|
||||
if (!mDocument->IsStyledByServo()) {
|
||||
DoUpdateProperties(Move(aStyleContext));
|
||||
return;
|
||||
}
|
||||
|
||||
const ServoComputedValues* currentStyle =
|
||||
aStyleContext->StyleSource().AsServoComputedValues();
|
||||
const ServoComputedValues* parentStyle =
|
||||
aStyleContext->GetParent()
|
||||
? aStyleContext->GetParent()->StyleSource().AsServoComputedValues()
|
||||
: nullptr;
|
||||
|
||||
const ServoComputedStyleValues servoValues = { currentStyle, parentStyle };
|
||||
DoUpdateProperties(servoValues);
|
||||
}
|
||||
|
||||
void
|
||||
KeyframeEffectReadOnly::UpdateProperties(
|
||||
const ServoComputedStyleValues& aServoValues)
|
||||
{
|
||||
DoUpdateProperties(aServoValues);
|
||||
}
|
||||
|
||||
template<typename StyleType>
|
||||
void
|
||||
KeyframeEffectReadOnly::DoUpdateProperties(StyleType&& aStyle)
|
||||
{
|
||||
MOZ_ASSERT_IF(IsPointer<StyleType>::value, aStyle);
|
||||
|
||||
// Skip updating properties when we are composing style.
|
||||
// FIXME: Bug 1324966. Drop this check once we have a function to get
|
||||
// nsStyleContext without resolving animating style.
|
||||
|
@ -284,11 +337,12 @@ KeyframeEffectReadOnly::UpdateProperties(nsStyleContext* aStyleContext)
|
|||
return;
|
||||
}
|
||||
|
||||
nsTArray<AnimationProperty> properties = BuildProperties(aStyleContext);
|
||||
nsTArray<AnimationProperty> properties =
|
||||
BuildProperties(Forward<StyleType>(aStyle));
|
||||
|
||||
// We need to update base styles even if any properties are not changed at all
|
||||
// since base styles might have been changed due to parent style changes, etc.
|
||||
EnsureBaseStyles(aStyleContext, properties);
|
||||
EnsureBaseStyles(aStyle, properties);
|
||||
|
||||
if (mProperties == properties) {
|
||||
return;
|
||||
|
@ -310,10 +364,7 @@ KeyframeEffectReadOnly::UpdateProperties(nsStyleContext* aStyleContext)
|
|||
runningOnCompositorProperties.HasProperty(property.mProperty);
|
||||
}
|
||||
|
||||
// FIXME (bug 1303235): Do this for Servo too
|
||||
if (aStyleContext->PresContext()->StyleSet()->IsGecko()) {
|
||||
CalculateCumulativeChangeHint(aStyleContext);
|
||||
}
|
||||
CalculateCumulativeChangeHint(aStyle);
|
||||
|
||||
MarkCascadeNeedsUpdate();
|
||||
|
||||
|
@ -854,10 +905,16 @@ KeyframeEffectReadOnly::ConstructKeyframeEffect(const GlobalObject& aGlobal,
|
|||
return effect.forget();
|
||||
}
|
||||
|
||||
template<typename StyleType>
|
||||
nsTArray<AnimationProperty>
|
||||
KeyframeEffectReadOnly::BuildProperties(nsStyleContext* aStyleContext)
|
||||
KeyframeEffectReadOnly::BuildProperties(StyleType&& aStyle)
|
||||
{
|
||||
MOZ_ASSERT(aStyleContext);
|
||||
static_assert(IsSame<StyleType, nsStyleContext*>::value ||
|
||||
IsSame<StyleType, const ServoComputedStyleValues&>::value,
|
||||
"StyleType should be nsStyleContext* or "
|
||||
"const ServoComputedStyleValues&");
|
||||
|
||||
MOZ_ASSERT(aStyle);
|
||||
|
||||
nsTArray<AnimationProperty> result;
|
||||
// If mTarget is null, return an empty property array.
|
||||
|
@ -876,22 +933,22 @@ KeyframeEffectReadOnly::BuildProperties(nsStyleContext* aStyleContext)
|
|||
nsTArray<ComputedKeyframeValues> computedValues =
|
||||
KeyframeUtils::GetComputedKeyframeValues(keyframesCopy,
|
||||
mTarget->mElement,
|
||||
aStyleContext);
|
||||
aStyle);
|
||||
|
||||
// FIXME: Bug 1332633: we have to implement ComputeDistance for
|
||||
// RawServoAnimationValue.
|
||||
if (mEffectOptions.mSpacingMode == SpacingMode::paced &&
|
||||
aStyleContext->PresContext()->StyleSet()->IsGecko()) {
|
||||
!mDocument->IsStyledByServo()) {
|
||||
KeyframeUtils::ApplySpacing(keyframesCopy, SpacingMode::paced,
|
||||
mEffectOptions.mPacedProperty,
|
||||
computedValues, aStyleContext);
|
||||
computedValues, aStyle);
|
||||
}
|
||||
|
||||
result =
|
||||
KeyframeUtils::GetAnimationPropertiesFromKeyframes(keyframesCopy,
|
||||
computedValues,
|
||||
mEffectOptions.mComposite,
|
||||
aStyleContext);
|
||||
KeyframeUtils::GetAnimationPropertiesFromKeyframes(
|
||||
keyframesCopy,
|
||||
computedValues,
|
||||
mEffectOptions.mComposite);
|
||||
|
||||
#ifdef DEBUG
|
||||
MOZ_ASSERT(SpecifiedKeyframeArraysAreEqual(mKeyframes, keyframesCopy),
|
||||
|
@ -1568,6 +1625,10 @@ void
|
|||
KeyframeEffectReadOnly::CalculateCumulativeChangeHint(
|
||||
nsStyleContext *aStyleContext)
|
||||
{
|
||||
if (aStyleContext->PresContext()->StyleSet()->IsServo()) {
|
||||
// FIXME (bug 1303235): Do this for Servo too
|
||||
return;
|
||||
}
|
||||
mCumulativeChangeHint = nsChangeHint(0);
|
||||
|
||||
for (const AnimationProperty& property : mProperties) {
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include "mozilla/KeyframeEffectParams.h"
|
||||
// RawServoDeclarationBlock and associated RefPtrTraits
|
||||
#include "mozilla/ServoBindingTypes.h"
|
||||
#include "mozilla/StyleAnimationValue.h"
|
||||
#include "mozilla/StyleAnimationValueInlines.h"
|
||||
#include "mozilla/dom/AnimationEffectReadOnly.h"
|
||||
#include "mozilla/dom/BindingDeclarations.h"
|
||||
#include "mozilla/dom/Element.h"
|
||||
|
@ -130,6 +130,13 @@ struct AnimationProperty
|
|||
}
|
||||
};
|
||||
|
||||
struct ServoComputedStyleValues
|
||||
{
|
||||
const ServoComputedValues* mCurrentStyle;
|
||||
const ServoComputedValues* mParentStyle;
|
||||
explicit operator bool() const { return true; }
|
||||
};
|
||||
|
||||
struct ElementPropertyTransition;
|
||||
|
||||
namespace dom {
|
||||
|
@ -196,6 +203,8 @@ public:
|
|||
ErrorResult& aRv);
|
||||
void SetKeyframes(nsTArray<Keyframe>&& aKeyframes,
|
||||
nsStyleContext* aStyleContext);
|
||||
void SetKeyframes(nsTArray<Keyframe>&& aKeyframes,
|
||||
const ServoComputedStyleValues& aServoValues);
|
||||
|
||||
// Returns true if the effect includes |aProperty| regardless of whether the
|
||||
// property is overridden by !important rule.
|
||||
|
@ -223,6 +232,8 @@ public:
|
|||
// Update |mProperties| by recalculating from |mKeyframes| using
|
||||
// |aStyleContext| to resolve specified values.
|
||||
void UpdateProperties(nsStyleContext* aStyleContext);
|
||||
// Servo version of the above function.
|
||||
void UpdateProperties(const ServoComputedStyleValues& aServoValues);
|
||||
|
||||
// Updates |aStyleRule| with the animation values produced by this
|
||||
// AnimationEffect for the current time except any properties contained
|
||||
|
@ -277,6 +288,10 @@ public:
|
|||
// Cumulative change hint on each segment for each property.
|
||||
// This is used for deciding the animation is paint-only.
|
||||
void CalculateCumulativeChangeHint(nsStyleContext* aStyleContext);
|
||||
void CalculateCumulativeChangeHint(
|
||||
const ServoComputedStyleValues& aServoValues)
|
||||
{
|
||||
}
|
||||
|
||||
// Returns true if all of animation properties' change hints
|
||||
// can ignore painting if the animation is not visible.
|
||||
|
@ -324,7 +339,8 @@ protected:
|
|||
// Build properties by recalculating from |mKeyframes| using |aStyleContext|
|
||||
// to resolve specified values. This function also applies paced spacing if
|
||||
// needed.
|
||||
nsTArray<AnimationProperty> BuildProperties(nsStyleContext* aStyleContext);
|
||||
template<typename StyleType>
|
||||
nsTArray<AnimationProperty> BuildProperties(StyleType&& aStyle);
|
||||
|
||||
// This effect is registered with its target element so long as:
|
||||
//
|
||||
|
@ -377,6 +393,11 @@ protected:
|
|||
// Ensure the base styles is available for any properties in |aProperties|.
|
||||
void EnsureBaseStyles(nsStyleContext* aStyleContext,
|
||||
const nsTArray<AnimationProperty>& aProperties);
|
||||
void EnsureBaseStyles(const ServoComputedStyleValues& aServoValues,
|
||||
const nsTArray<AnimationProperty>& aProperties)
|
||||
{
|
||||
// FIXME: Bug 1311257: Support missing keyframes.
|
||||
}
|
||||
|
||||
// Returns the base style resolved by |aStyleContext| for |aProperty|.
|
||||
StyleAnimationValue ResolveBaseStyle(nsCSSPropertyID aProperty,
|
||||
|
@ -414,6 +435,12 @@ protected:
|
|||
private:
|
||||
nsChangeHint mCumulativeChangeHint;
|
||||
|
||||
template<typename StyleType>
|
||||
void DoSetKeyframes(nsTArray<Keyframe>&& aKeyframes, StyleType&& aStyle);
|
||||
|
||||
template<typename StyleType>
|
||||
void DoUpdateProperties(StyleType&& aStyle);
|
||||
|
||||
nsIFrame* GetAnimationFrame() const;
|
||||
|
||||
bool CanThrottle() const;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "mozilla/dom/KeyframeEffectReadOnly.h" // For PropertyValuesPair etc.
|
||||
#include "jsapi.h" // For ForOfIterator etc.
|
||||
#include "nsClassHashtable.h"
|
||||
#include "nsContentUtils.h" // For GetContextForContent
|
||||
#include "nsCSSParser.h"
|
||||
#include "nsCSSPropertyIDSet.h"
|
||||
#include "nsCSSProps.h"
|
||||
|
@ -590,6 +591,31 @@ KeyframeUtils::ApplyDistributeSpacing(nsTArray<Keyframe>& aKeyframes)
|
|||
emptyArray, nullptr);
|
||||
}
|
||||
|
||||
/* static */ nsTArray<ComputedKeyframeValues>
|
||||
KeyframeUtils::GetComputedKeyframeValues(
|
||||
const nsTArray<Keyframe>& aKeyframes,
|
||||
dom::Element* aElement,
|
||||
const ServoComputedStyleValues& aServoValues)
|
||||
{
|
||||
MOZ_ASSERT(aElement);
|
||||
MOZ_ASSERT(aElement->OwnerDoc()->IsStyledByServo());
|
||||
|
||||
nsPresContext* presContext = nsContentUtils::GetContextForContent(aElement);
|
||||
MOZ_ASSERT(presContext);
|
||||
|
||||
nsTArray<ComputedKeyframeValues> result(aKeyframes.Length());
|
||||
|
||||
// Construct each nsTArray<PropertyStyleAnimationValuePair> here.
|
||||
result.AppendElements(aKeyframes.Length());
|
||||
|
||||
Servo_GetComputedKeyframeValues(&aKeyframes,
|
||||
aServoValues.mCurrentStyle,
|
||||
aServoValues.mParentStyle,
|
||||
presContext,
|
||||
&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* static */ nsTArray<ComputedKeyframeValues>
|
||||
KeyframeUtils::GetComputedKeyframeValues(const nsTArray<Keyframe>& aKeyframes,
|
||||
dom::Element* aElement,
|
||||
|
@ -598,32 +624,19 @@ KeyframeUtils::GetComputedKeyframeValues(const nsTArray<Keyframe>& aKeyframes,
|
|||
MOZ_ASSERT(aStyleContext);
|
||||
MOZ_ASSERT(aElement);
|
||||
|
||||
StyleBackendType styleBackend = aElement->OwnerDoc()->GetStyleBackendType();
|
||||
|
||||
const size_t len = aKeyframes.Length();
|
||||
nsTArray<ComputedKeyframeValues> result(len);
|
||||
|
||||
const ServoComputedValues* currentStyle = nullptr;
|
||||
const ServoComputedValues* parentStyle = nullptr;
|
||||
|
||||
if (styleBackend == StyleBackendType::Servo) {
|
||||
currentStyle = aStyleContext->StyleSource().AsServoComputedValues();
|
||||
if (aStyleContext->GetParent()) {
|
||||
parentStyle = aStyleContext->GetParent()->StyleSource().AsServoComputedValues();
|
||||
}
|
||||
}
|
||||
|
||||
for (const Keyframe& frame : aKeyframes) {
|
||||
nsCSSPropertyIDSet propertiesOnThisKeyframe;
|
||||
ComputedKeyframeValues* computedValues = result.AppendElement();
|
||||
for (const PropertyValuePair& pair :
|
||||
PropertyPriorityIterator(frame.mPropertyValues)) {
|
||||
MOZ_ASSERT(!pair.mServoDeclarationBlock ||
|
||||
styleBackend == StyleBackendType::Servo,
|
||||
MOZ_ASSERT(!pair.mServoDeclarationBlock,
|
||||
"Animation values were parsed using Servo backend but target"
|
||||
" element is not using Servo backend?");
|
||||
|
||||
if (IsInvalidValuePair(pair, styleBackend)) {
|
||||
if (IsInvalidValuePair(pair, StyleBackendType::Gecko)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -631,48 +644,25 @@ KeyframeUtils::GetComputedKeyframeValues(const nsTArray<Keyframe>& aKeyframes,
|
|||
// a KeyframeValueEntry for each value.
|
||||
nsTArray<PropertyStyleAnimationValuePair> values;
|
||||
|
||||
if (styleBackend == StyleBackendType::Servo) {
|
||||
if (nsCSSProps::IsShorthand(pair.mProperty)) {
|
||||
CSSPROPS_FOR_SHORTHAND_SUBPROPERTIES(p, pair.mProperty,
|
||||
CSSEnabledState::eForAllContent) {
|
||||
if (nsCSSProps::kAnimTypeTable[*p] == eStyleAnimType_None) {
|
||||
// Skip non-animatable component longhands.
|
||||
continue;
|
||||
}
|
||||
PropertyStyleAnimationValuePair* valuePair = values.AppendElement();
|
||||
valuePair->mProperty = *p;
|
||||
}
|
||||
} else {
|
||||
PropertyStyleAnimationValuePair* valuePair = values.AppendElement();
|
||||
valuePair->mProperty = pair.mProperty;
|
||||
// For shorthands, we store the string as a token stream so we need to
|
||||
// extract that first.
|
||||
if (nsCSSProps::IsShorthand(pair.mProperty)) {
|
||||
nsCSSValueTokenStream* tokenStream = pair.mValue.GetTokenStreamValue();
|
||||
if (!StyleAnimationValue::ComputeValues(pair.mProperty,
|
||||
CSSEnabledState::eForAllContent, aElement, aStyleContext,
|
||||
tokenStream->mTokenStream, /* aUseSVGMode */ false, values) ||
|
||||
IsComputeValuesFailureKey(pair)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Servo_AnimationValues_Populate(&values,
|
||||
pair.mServoDeclarationBlock,
|
||||
currentStyle,
|
||||
parentStyle,
|
||||
aStyleContext->PresContext());
|
||||
} else {
|
||||
// For shorthands, we store the string as a token stream so we need to
|
||||
// extract that first.
|
||||
if (nsCSSProps::IsShorthand(pair.mProperty)) {
|
||||
nsCSSValueTokenStream* tokenStream = pair.mValue.GetTokenStreamValue();
|
||||
if (!StyleAnimationValue::ComputeValues(pair.mProperty,
|
||||
CSSEnabledState::eForAllContent, aElement, aStyleContext,
|
||||
tokenStream->mTokenStream, /* aUseSVGMode */ false, values) ||
|
||||
IsComputeValuesFailureKey(pair)) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (!StyleAnimationValue::ComputeValues(pair.mProperty,
|
||||
CSSEnabledState::eForAllContent, aElement, aStyleContext,
|
||||
pair.mValue, /* aUseSVGMode */ false, values)) {
|
||||
continue;
|
||||
}
|
||||
MOZ_ASSERT(values.Length() == 1,
|
||||
"Longhand properties should produce a single"
|
||||
" StyleAnimationValue");
|
||||
if (!StyleAnimationValue::ComputeValues(pair.mProperty,
|
||||
CSSEnabledState::eForAllContent, aElement, aStyleContext,
|
||||
pair.mValue, /* aUseSVGMode */ false, values)) {
|
||||
continue;
|
||||
}
|
||||
MOZ_ASSERT(values.Length() == 1,
|
||||
"Longhand properties should produce a single"
|
||||
" StyleAnimationValue");
|
||||
}
|
||||
|
||||
for (auto& value : values) {
|
||||
|
@ -695,8 +685,7 @@ KeyframeUtils::GetComputedKeyframeValues(const nsTArray<Keyframe>& aKeyframes,
|
|||
KeyframeUtils::GetAnimationPropertiesFromKeyframes(
|
||||
const nsTArray<Keyframe>& aKeyframes,
|
||||
const nsTArray<ComputedKeyframeValues>& aComputedValues,
|
||||
dom::CompositeOperation aEffectComposite,
|
||||
nsStyleContext* aStyleContext)
|
||||
dom::CompositeOperation aEffectComposite)
|
||||
{
|
||||
MOZ_ASSERT(aKeyframes.Length() == aComputedValues.Length(),
|
||||
"Array length mismatch");
|
||||
|
|
|
@ -15,6 +15,7 @@ struct JSContext;
|
|||
class JSObject;
|
||||
class nsIDocument;
|
||||
class nsStyleContext;
|
||||
struct ServoComputedValues;
|
||||
|
||||
namespace mozilla {
|
||||
struct AnimationProperty;
|
||||
|
@ -22,6 +23,7 @@ enum class CSSPseudoElementType : uint8_t;
|
|||
class ErrorResult;
|
||||
struct Keyframe;
|
||||
struct PropertyStyleAnimationValuePair;
|
||||
struct ServoComputedStyleValues;
|
||||
|
||||
namespace dom {
|
||||
class Element;
|
||||
|
@ -83,6 +85,11 @@ public:
|
|||
dom::Element* aElement,
|
||||
nsStyleContext* aStyleContext);
|
||||
|
||||
static nsTArray<ComputedKeyframeValues>
|
||||
GetComputedKeyframeValues(const nsTArray<Keyframe>& aKeyframes,
|
||||
dom::Element* aElement,
|
||||
const ServoComputedStyleValues& aServoValues);
|
||||
|
||||
/**
|
||||
* Fills in the mComputedOffset member of each keyframe in the given array
|
||||
* using the specified spacing mode.
|
||||
|
@ -106,6 +113,14 @@ public:
|
|||
nsCSSPropertyID aProperty,
|
||||
nsTArray<ComputedKeyframeValues>& aComputedValues,
|
||||
nsStyleContext* aStyleContext);
|
||||
static void ApplySpacing(nsTArray<Keyframe>& aKeyframes,
|
||||
SpacingMode aSpacingMode,
|
||||
nsCSSPropertyID aProperty,
|
||||
nsTArray<ComputedKeyframeValues>& aComputedValues,
|
||||
const ServoComputedStyleValues& aServoValues)
|
||||
{
|
||||
NS_WARNING("stylo: ApplySpacing not implemented yet");
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper for ApplySpacing to simplify using distribute spacing.
|
||||
|
@ -130,15 +145,13 @@ public:
|
|||
* @param aEffectComposite The composite operation specified on the effect.
|
||||
* For any keyframes in |aKeyframes| that do not specify a composite
|
||||
* operation, this value will be used.
|
||||
* @param aStyleContext The style context to calculate the style difference.
|
||||
* @return The set of animation properties. If an error occurs, the returned
|
||||
* array will be empty.
|
||||
*/
|
||||
static nsTArray<AnimationProperty> GetAnimationPropertiesFromKeyframes(
|
||||
const nsTArray<Keyframe>& aKeyframes,
|
||||
const nsTArray<ComputedKeyframeValues>& aComputedValues,
|
||||
dom::CompositeOperation aEffectComposite,
|
||||
nsStyleContext* aStyleContext);
|
||||
dom::CompositeOperation aEffectComposite);
|
||||
|
||||
/**
|
||||
* Check if the property or, for shorthands, one or more of
|
||||
|
|
|
@ -41,6 +41,7 @@ namespace {
|
|||
// If true, any new AudioChannelAgent will be muted when created.
|
||||
bool sAudioChannelMutedByDefault = false;
|
||||
bool sAudioChannelCompeting = false;
|
||||
bool sAudioChannelCompetingAllAgents = false;
|
||||
bool sXPCOMShuttingDown = false;
|
||||
|
||||
class NotifyChannelActiveRunnable final : public Runnable
|
||||
|
@ -171,7 +172,7 @@ IsEnableAudioCompetingForAllAgents()
|
|||
#ifdef MOZ_WIDGET_ANDROID
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
return sAudioChannelCompetingAllAgents;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -299,6 +300,8 @@ AudioChannelService::AudioChannelService()
|
|||
"dom.audiochannel.mutedByDefault");
|
||||
Preferences::AddBoolVarCache(&sAudioChannelCompeting,
|
||||
"dom.audiochannel.audioCompeting");
|
||||
Preferences::AddBoolVarCache(&sAudioChannelCompetingAllAgents,
|
||||
"dom.audiochannel.audioCompeting.allAgents");
|
||||
}
|
||||
|
||||
AudioChannelService::~AudioChannelService()
|
||||
|
@ -1087,8 +1090,7 @@ AudioChannelService::ChildStatusReceived(uint64_t aChildID,
|
|||
}
|
||||
|
||||
void
|
||||
AudioChannelService::RefreshAgentsAudioFocusChanged(AudioChannelAgent* aAgent,
|
||||
bool aActive)
|
||||
AudioChannelService::RefreshAgentsAudioFocusChanged(AudioChannelAgent* aAgent)
|
||||
{
|
||||
MOZ_ASSERT(aAgent);
|
||||
|
||||
|
@ -1097,7 +1099,7 @@ AudioChannelService::RefreshAgentsAudioFocusChanged(AudioChannelAgent* aAgent,
|
|||
while (iter.HasMore()) {
|
||||
AudioChannelWindow* winData = iter.GetNext();
|
||||
if (winData->mOwningAudioFocus) {
|
||||
winData->AudioFocusChanged(aAgent, aActive);
|
||||
winData->AudioFocusChanged(aAgent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1156,8 +1158,7 @@ AudioChannelService::AudioChannelWindow::RequestAudioFocus(AudioChannelAgent* aA
|
|||
}
|
||||
|
||||
void
|
||||
AudioChannelService::AudioChannelWindow::NotifyAudioCompetingChanged(AudioChannelAgent* aAgent,
|
||||
bool aActive)
|
||||
AudioChannelService::AudioChannelWindow::NotifyAudioCompetingChanged(AudioChannelAgent* aAgent)
|
||||
{
|
||||
// This function may be called after RemoveAgentAndReduceAgentsNum(), so the
|
||||
// agent may be not contained in mAgent. In addition, the agent would still
|
||||
|
@ -1177,10 +1178,10 @@ AudioChannelService::AudioChannelWindow::NotifyAudioCompetingChanged(AudioChanne
|
|||
|
||||
MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
|
||||
("AudioChannelWindow, NotifyAudioCompetingChanged, this = %p, "
|
||||
"agent = %p, active = %d\n",
|
||||
this, aAgent, aActive));
|
||||
"agent = %p\n",
|
||||
this, aAgent));
|
||||
|
||||
service->RefreshAgentsAudioFocusChanged(aAgent, aActive);
|
||||
service->RefreshAgentsAudioFocusChanged(aAgent);
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -1210,8 +1211,7 @@ AudioChannelService::AudioChannelWindow::IsAudioCompetingInSameTab() const
|
|||
}
|
||||
|
||||
void
|
||||
AudioChannelService::AudioChannelWindow::AudioFocusChanged(AudioChannelAgent* aNewPlayingAgent,
|
||||
bool aActive)
|
||||
AudioChannelService::AudioChannelWindow::AudioFocusChanged(AudioChannelAgent* aNewPlayingAgent)
|
||||
{
|
||||
// This agent isn't always known for the current window, because it can comes
|
||||
// from other window.
|
||||
|
@ -1236,8 +1236,7 @@ AudioChannelService::AudioChannelWindow::AudioFocusChanged(AudioChannelAgent* aN
|
|||
}
|
||||
|
||||
uint32_t type = GetCompetingBehavior(agent,
|
||||
aNewPlayingAgent->AudioChannelType(),
|
||||
aActive);
|
||||
aNewPlayingAgent->AudioChannelType());
|
||||
|
||||
// If window will be suspended, it needs to abandon the audio focus
|
||||
// because only one window can own audio focus at a time. However, we
|
||||
|
@ -1267,8 +1266,7 @@ AudioChannelService::AudioChannelWindow::IsContainingPlayingAgent(AudioChannelAg
|
|||
|
||||
uint32_t
|
||||
AudioChannelService::AudioChannelWindow::GetCompetingBehavior(AudioChannelAgent* aAgent,
|
||||
int32_t aIncomingChannelType,
|
||||
bool aIncomingChannelActive) const
|
||||
int32_t aIncomingChannelType) const
|
||||
{
|
||||
MOZ_ASSERT(aAgent);
|
||||
MOZ_ASSERT(IsEnableAudioCompetingForAllAgents() ?
|
||||
|
@ -1279,8 +1277,7 @@ AudioChannelService::AudioChannelWindow::GetCompetingBehavior(AudioChannelAgent*
|
|||
|
||||
// TODO : add other competing cases for MediaSession API
|
||||
if (presentChannelType == int32_t(AudioChannel::Normal) &&
|
||||
aIncomingChannelType == int32_t(AudioChannel::Normal) &&
|
||||
aIncomingChannelActive) {
|
||||
aIncomingChannelType == int32_t(AudioChannel::Normal)) {
|
||||
competingBehavior = nsISuspendedTypes::SUSPENDED_STOP_DISPOSABLE;
|
||||
}
|
||||
|
||||
|
@ -1314,7 +1311,7 @@ AudioChannelService::AudioChannelWindow::AppendAgent(AudioChannelAgent* aAgent,
|
|||
AudibleChangedReasons::eDataAudibleChanged);
|
||||
} else if (IsEnableAudioCompetingForAllAgents() &&
|
||||
aAudible != AudibleState::eAudible) {
|
||||
NotifyAudioCompetingChanged(aAgent, true);
|
||||
NotifyAudioCompetingChanged(aAgent);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1412,8 +1409,9 @@ AudioChannelService::AudioChannelWindow::AudioAudibleChanged(AudioChannelAgent*
|
|||
RemoveAudibleAgentIfContained(aAgent, aReason);
|
||||
}
|
||||
|
||||
NotifyAudioCompetingChanged(aAgent, aAudible == AudibleState::eAudible);
|
||||
if (aAudible != AudibleState::eNotAudible) {
|
||||
if (aAudible == AudibleState::eAudible) {
|
||||
NotifyAudioCompetingChanged(aAgent);
|
||||
} else if (aAudible != AudibleState::eNotAudible) {
|
||||
MaybeNotifyMediaBlockStart(aAgent);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -233,8 +233,7 @@ private:
|
|||
void SetDefaultVolumeControlChannelInternal(int32_t aChannel,
|
||||
bool aVisible, uint64_t aChildID);
|
||||
|
||||
void RefreshAgentsAudioFocusChanged(AudioChannelAgent* aAgent,
|
||||
bool aActive);
|
||||
void RefreshAgentsAudioFocusChanged(AudioChannelAgent* aAgent);
|
||||
|
||||
class AudioChannelConfig final : public AudioPlaybackConfig
|
||||
{
|
||||
|
@ -261,7 +260,7 @@ private:
|
|||
mChannels[(int16_t)AudioChannel::System].mMuted = false;
|
||||
}
|
||||
|
||||
void AudioFocusChanged(AudioChannelAgent* aNewPlayingAgent, bool aActive);
|
||||
void AudioFocusChanged(AudioChannelAgent* aNewPlayingAgent);
|
||||
void AudioAudibleChanged(AudioChannelAgent* aAgent,
|
||||
AudibleState aAudible,
|
||||
AudibleChangedReasons aReason);
|
||||
|
@ -310,11 +309,12 @@ private:
|
|||
void MaybeNotifyMediaBlockStart(AudioChannelAgent* aAgent);
|
||||
|
||||
void RequestAudioFocus(AudioChannelAgent* aAgent);
|
||||
void NotifyAudioCompetingChanged(AudioChannelAgent* aAgent, bool aActive);
|
||||
|
||||
// We need to do audio competing only when the new incoming agent started.
|
||||
void NotifyAudioCompetingChanged(AudioChannelAgent* aAgent);
|
||||
|
||||
uint32_t GetCompetingBehavior(AudioChannelAgent* aAgent,
|
||||
int32_t aIncomingChannelType,
|
||||
bool aIncomingChannelActive) const;
|
||||
int32_t aIncomingChannelType) const;
|
||||
bool IsAgentInvolvingInAudioCompeting(AudioChannelAgent* aAgent) const;
|
||||
bool IsAudioCompetingInSameTab() const;
|
||||
bool IsContainingPlayingAgent(AudioChannelAgent* aAgent) const;
|
||||
|
|
|
@ -1010,6 +1010,11 @@ private:
|
|||
return AudioChannelService::AudibleState::eMaybeAudible;
|
||||
}
|
||||
|
||||
// Media is suspended.
|
||||
if (mSuspended != nsISuspendedTypes::NONE_SUSPENDED) {
|
||||
return AudioChannelService::AudibleState::eNotAudible;
|
||||
}
|
||||
|
||||
return AudioChannelService::AudibleState::eAudible;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
default-preferences pref(dom.forms.number,true) pref(dom.forms.datetime,true)
|
||||
fails == input-load.html input-load.html
|
||||
fails == input-create.html input-create.html
|
||||
# fuzzy-if(skiaContent,1,3) needs-focus == input-number.html input-number.html
|
||||
fuzzy-if(skiaContent,1,3) skip-if(stylo) needs-focus == input-number.html input-number.html # Bug 1341973
|
||||
fails == input-time.html input-time.html
|
||||
fails == button-load.html button-load.html
|
||||
fails == button-create.html button-create.html
|
||||
|
|
|
@ -283,7 +283,7 @@ HangMonitorChild::HangMonitorChild(ProcessHangMonitor* aMonitor)
|
|||
mForcePaintMonitor =
|
||||
MakeUnique<mozilla::BackgroundHangMonitor>("Gecko_Child_ForcePaint",
|
||||
128, /* ms timeout for microhangs */
|
||||
8192 /* ms timeout for permahangs */,
|
||||
1024, /* ms timeout for permahangs */
|
||||
BackgroundHangMonitor::THREAD_PRIVATE);
|
||||
}
|
||||
|
||||
|
|
|
@ -125,6 +125,7 @@ MediaDataDecoderProxy::ConfigurationChanged(const TrackInfo& aConfig)
|
|||
|
||||
if (!mProxyThread) {
|
||||
mProxyDecoder->ConfigurationChanged(aConfig);
|
||||
return;
|
||||
}
|
||||
RefPtr<MediaDataDecoderProxy> self = this;
|
||||
RefPtr<TrackInfoSharedPtr> config = new TrackInfoSharedPtr(aConfig, 0);
|
||||
|
|
|
@ -10,8 +10,8 @@ fails == plugin-sanity.html plugin-sanity.html # Bug 1341095
|
|||
== border-padding-2.html border-padding-2.html
|
||||
== border-padding-3.html border-padding-3.html
|
||||
# The following two "pluginproblemui-direction" tests are unreliable on all platforms. They should be re-written or replaced.
|
||||
#random-if(cocoaWidget||d2d||/^Windows\x20NT\x205\.1/.test(http.oscpu)) fails-if(!haveTestPlugin&&!Android) == pluginproblemui-direction-1.html pluginproblemui-direction-1.html
|
||||
#random-if(cocoaWidget) fails-if(!haveTestPlugin&&!Android) == pluginproblemui-direction-2.html pluginproblemui-direction-2.html
|
||||
random-if(cocoaWidget||d2d||/^Windows\x20NT\x205\.1/.test(http.oscpu)) fails-if(!haveTestPlugin&&!Android) skip-if(stylo) == pluginproblemui-direction-1.html pluginproblemui-direction-1.html
|
||||
random-if(cocoaWidget) fails-if(!haveTestPlugin&&!Android) skip-if(stylo) == pluginproblemui-direction-2.html pluginproblemui-direction-2.html
|
||||
== plugin-canvas-alpha-zindex.html plugin-canvas-alpha-zindex.html
|
||||
fails == plugin-transform-alpha-zindex.html plugin-transform-alpha-zindex.html
|
||||
== plugin-busy-alpha-zindex.html plugin-busy-alpha-zindex.html
|
||||
|
|
|
@ -108,18 +108,18 @@ fails == spellcheck-superscript-2.html spellcheck-superscript-2.html
|
|||
== 824080-1.html 824080-1.html
|
||||
== 824080-2.html 824080-2.html
|
||||
== 824080-3.html 824080-3.html
|
||||
# needs-focus == 824080-2.html 824080-2.html
|
||||
needs-focus == 824080-2.html 824080-2.html
|
||||
== 824080-4.html 824080-4.html
|
||||
== 824080-5.html 824080-5.html
|
||||
# needs-focus == 824080-4.html 824080-4.html
|
||||
# needs-focus == 824080-6.html 824080-6.html
|
||||
needs-focus == 824080-4.html 824080-4.html
|
||||
fails needs-focus == 824080-6.html 824080-6.html
|
||||
fails needs-focus pref(layout.accessiblecaret.enabled,false) pref(layout.accessiblecaret.enabled_on_touch,false) == 824080-7.html 824080-7.html
|
||||
# needs-focus == 824080-6.html 824080-6.html
|
||||
fails needs-focus == 824080-6.html 824080-6.html
|
||||
# Bug 674927: copy spellcheck-textarea tests to contenteditable
|
||||
== spellcheck-contenteditable-attr.html spellcheck-contenteditable-attr.html
|
||||
== spellcheck-contenteditable-attr.html spellcheck-contenteditable-attr.html
|
||||
# needs-focus == spellcheck-contenteditable-focused.html spellcheck-contenteditable-focused.html
|
||||
# needs-focus == spellcheck-contenteditable-focused-reframe.html spellcheck-contenteditable-focused-reframe.html
|
||||
needs-focus == spellcheck-contenteditable-focused.html spellcheck-contenteditable-focused.html
|
||||
needs-focus == spellcheck-contenteditable-focused-reframe.html spellcheck-contenteditable-focused-reframe.html
|
||||
== spellcheck-contenteditable-nofocus.html spellcheck-contenteditable-nofocus.html
|
||||
== spellcheck-contenteditable-disabled.html spellcheck-contenteditable-disabled.html
|
||||
== spellcheck-contenteditable-disabled-partial.html spellcheck-contenteditable-disabled-partial.html
|
||||
|
|
|
@ -217,6 +217,8 @@ ServoRestyleManager::RecreateStyleContexts(Element* aElement,
|
|||
aStyleSet->GetContext(computedValues.forget(), aParentContext, nullptr,
|
||||
CSSPseudoElementType::NotPseudo, aElement);
|
||||
|
||||
newContext->EnsureStructsForServo(oldStyleContext);
|
||||
|
||||
// XXX This could not always work as expected: there are kinds of content
|
||||
// with the first split and the last sharing style, but others not. We
|
||||
// should handle those properly.
|
||||
|
|
|
@ -75,7 +75,7 @@ public:
|
|||
// Remove a nsFloatCache from this list. Deleting this nsFloatCache
|
||||
// becomes the caller's responsibility.
|
||||
void Remove(nsFloatCache* aElement) { RemoveAndReturnPrev(aElement); }
|
||||
|
||||
|
||||
// Steal away aList's nsFloatCache objects and put them in this
|
||||
// list. aList must not be empty.
|
||||
void Append(nsFloatCacheFreeList& aList);
|
||||
|
@ -87,7 +87,7 @@ protected:
|
|||
// becomes the caller's responsibility. Returns the nsFloatCache that was
|
||||
// before aElement, or nullptr if aElement was the first.
|
||||
nsFloatCache* RemoveAndReturnPrev(nsFloatCache* aElement);
|
||||
|
||||
|
||||
friend class nsFloatCacheFreeList;
|
||||
};
|
||||
|
||||
|
@ -116,7 +116,7 @@ public:
|
|||
nsFloatCache* Tail() const {
|
||||
return mTail;
|
||||
}
|
||||
|
||||
|
||||
bool NotEmpty() const {
|
||||
return nullptr != mHead;
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ public:
|
|||
// Remove an nsFloatCache object from this list and return it, or create
|
||||
// a new one if this one is empty; Set its mFloat to aFloat.
|
||||
nsFloatCache* Alloc(nsIFrame* aFloat);
|
||||
|
||||
|
||||
protected:
|
||||
nsFloatCache* mTail;
|
||||
|
||||
|
@ -204,7 +204,7 @@ class nsLineBox final : public nsLineLink {
|
|||
private:
|
||||
nsLineBox(nsIFrame* aFrame, int32_t aCount, bool aIsBlock);
|
||||
~nsLineBox();
|
||||
|
||||
|
||||
// Infallible overloaded new operator. Uses an arena (which comes from the
|
||||
// presShell) to perform the allocation.
|
||||
void* operator new(size_t sz, nsIPresShell* aPresShell);
|
||||
|
@ -223,7 +223,7 @@ public:
|
|||
return mFlags.mBlock;
|
||||
}
|
||||
bool IsInline() const {
|
||||
return 0 == mFlags.mBlock;
|
||||
return !mFlags.mBlock;
|
||||
}
|
||||
|
||||
// mDirty bit
|
||||
|
@ -404,7 +404,7 @@ public:
|
|||
aBreakType == StyleClear::Right ||
|
||||
aBreakType == StyleClear::Both,
|
||||
"Only float break types are allowed before a line");
|
||||
mFlags.mBreakType = static_cast<int>(aBreakType);
|
||||
mFlags.mBreakType = aBreakType;
|
||||
}
|
||||
StyleClear GetBreakTypeBefore() const {
|
||||
return IsBlock() ? BreakType() : StyleClear::None;
|
||||
|
@ -415,7 +415,7 @@ public:
|
|||
}
|
||||
void SetBreakTypeAfter(StyleClear aBreakType) {
|
||||
MOZ_ASSERT(!IsBlock(), "Only inlines have break-after");
|
||||
mFlags.mBreakType = static_cast<int>(aBreakType);
|
||||
mFlags.mBreakType = aBreakType;
|
||||
}
|
||||
bool HasFloatBreakAfter() const {
|
||||
return !IsBlock() &&
|
||||
|
@ -657,26 +657,26 @@ public:
|
|||
};
|
||||
|
||||
struct FlagBits {
|
||||
uint32_t mDirty : 1;
|
||||
uint32_t mPreviousMarginDirty : 1;
|
||||
uint32_t mHasClearance : 1;
|
||||
uint32_t mBlock : 1;
|
||||
uint32_t mImpactedByFloat : 1;
|
||||
uint32_t mLineWrapped: 1;
|
||||
uint32_t mInvalidateTextRuns : 1;
|
||||
bool mDirty : 1;
|
||||
bool mPreviousMarginDirty : 1;
|
||||
bool mHasClearance : 1;
|
||||
bool mBlock : 1;
|
||||
bool mImpactedByFloat : 1;
|
||||
bool mLineWrapped: 1;
|
||||
bool mInvalidateTextRuns : 1;
|
||||
// default 0 = means that the opt potentially applies to this line.
|
||||
// 1 = never skip reflowing this line for a resize reflow
|
||||
uint32_t mResizeReflowOptimizationDisabled: 1;
|
||||
uint32_t mEmptyCacheValid: 1;
|
||||
uint32_t mEmptyCacheState: 1;
|
||||
bool mResizeReflowOptimizationDisabled: 1;
|
||||
bool mEmptyCacheValid: 1;
|
||||
bool mEmptyCacheState: 1;
|
||||
// mHasBullet indicates that this is an inline line whose block's
|
||||
// bullet is adjacent to this line and non-empty.
|
||||
uint32_t mHasBullet : 1;
|
||||
bool mHasBullet : 1;
|
||||
// Indicates that this line *may* have a placeholder for a float
|
||||
// that was pushed to a later column or page.
|
||||
uint32_t mHadFloatPushed : 1;
|
||||
uint32_t mHasHashedFrames: 1;
|
||||
uint32_t mBreakType : 4;
|
||||
bool mHadFloatPushed : 1;
|
||||
bool mHasHashedFrames: 1;
|
||||
StyleClear mBreakType;
|
||||
};
|
||||
|
||||
struct ExtraData {
|
||||
|
@ -710,7 +710,7 @@ protected:
|
|||
};
|
||||
|
||||
StyleClear BreakType() const {
|
||||
return static_cast<StyleClear>(mFlags.mBreakType);
|
||||
return mFlags.mBreakType;
|
||||
};
|
||||
|
||||
union {
|
||||
|
@ -729,7 +729,7 @@ protected:
|
|||
*
|
||||
* API heavily based on the |list| class in the C++ standard.
|
||||
*/
|
||||
|
||||
|
||||
class nsLineList_iterator {
|
||||
public:
|
||||
friend class nsLineList;
|
||||
|
|
|
@ -42,8 +42,8 @@ fails == offscreen-clipped-blendmode-1.html offscreen-clipped-blendmode-1.html
|
|||
fails == offscreen-clipped-blendmode-2.html offscreen-clipped-blendmode-2.html
|
||||
fuzzy-if(Android,6,4) skip == offscreen-clipped-blendmode-3.html offscreen-clipped-blendmode-3.html
|
||||
fuzzy-if(Android,6,4) skip-if(!asyncPan) == offscreen-clipped-blendmode-4.html offscreen-clipped-blendmode-4.html
|
||||
#fails == perspective-scrolling-1.html perspective-scrolling-1.html
|
||||
#fails == perspective-scrolling-2.html perspective-scrolling-2.html
|
||||
fails == perspective-scrolling-1.html perspective-scrolling-1.html
|
||||
fails == perspective-scrolling-2.html perspective-scrolling-2.html
|
||||
fuzzy-if(Android,7,4) skip-if(!asyncPan) == perspective-scrolling-3.html perspective-scrolling-3.html
|
||||
fuzzy-if(Android,7,4) skip-if(!asyncPan) == perspective-scrolling-4.html perspective-scrolling-4.html
|
||||
pref(apz.disable_for_scroll_linked_effects,true) skip-if(!asyncPan) == disable-apz-for-sle-pages.html disable-apz-for-sle-pages.html
|
||||
|
|
|
@ -27,5 +27,5 @@ fails HTTP(..) == CSS21-t100301.xhtml CSS21-t100301.xhtml
|
|||
== CSS21-t100303-simple.xhtml CSS21-t100303-simple.xhtml
|
||||
== CSS21-t100801-vertical-align.xhtml CSS21-t100801-vertical-align.xhtml
|
||||
== clip-auto.html clip-auto.html
|
||||
fails == clip-rect-auto.html clip-rect-auto.html
|
||||
== clip-rect-auto.html clip-rect-auto.html
|
||||
== width-rounding.html width-rounding.html
|
||||
|
|
|
@ -651,7 +651,7 @@ fails == 371043-1.html 371043-1.html
|
|||
== 371925-1b.html 371925-1b.html
|
||||
fails == 372037-1.html 372037-1.html
|
||||
== 372062-1.html 372062-1.html
|
||||
fails == 372063-1.html 372063-1.html
|
||||
== 372063-1.html 372063-1.html
|
||||
== 372323-1.xhtml 372323-1.xhtml
|
||||
fails == 372553-1.html 372553-1.html
|
||||
fails == 372632-1.html 372632-1.html
|
||||
|
@ -770,7 +770,7 @@ fails == 386470-1c.html 386470-1c.html # Bug 1341725
|
|||
== 388026-1.html 388026-1.html
|
||||
fails == 389074-1.html 389074-1.html
|
||||
== 389224-1.html 389224-1.html
|
||||
fails == 389224-2.html 389224-2.html # Bug 1341728
|
||||
== 389224-2.html 389224-2.html
|
||||
fails == 389468-1.html 389468-1.html
|
||||
== 389623-1.html 389623-1.html
|
||||
== 389636-1.html 389636-1.html
|
||||
|
@ -831,7 +831,7 @@ fails == 398101-1.html 398101-1.html
|
|||
== 398797-1d.html 398797-1d.html
|
||||
== 399209-1.html 399209-1.html
|
||||
== 399209-2.html 399209-2.html
|
||||
fails == 399258-1.html 399258-1.html
|
||||
== 399258-1.html 399258-1.html
|
||||
fails == 399384-1.html 399384-1.html
|
||||
random-if(gtkWidget) == 399636-standards-css.html 399636-standards-css.html
|
||||
random-if(gtkWidget) == 399636-standards-html.html 399636-standards-html.html
|
||||
|
@ -885,7 +885,7 @@ fails == 403519-1.html 403519-1.html
|
|||
fails == 403656-3.html 403656-3.html
|
||||
== 403656-4.html 403656-4.html
|
||||
== 403656-5.html 403656-5.html
|
||||
#== 403657-1.html 403657-1.html
|
||||
== 403657-1.html 403657-1.html
|
||||
fails == 403733-1.html 403733-1.html
|
||||
fails == 403962-1.xhtml 403962-1.xhtml # Bug 1290276
|
||||
== 404030-1.html 404030-1.html
|
||||
|
@ -901,7 +901,7 @@ random-if(cocoaWidget) HTTP(..) == 404149-1.xul 404149-1.xul
|
|||
fails == 404309-1a.html 404309-1a.html
|
||||
fails == 404309-1b.html 404309-1b.html
|
||||
# Disabled due to compartments for now.
|
||||
#== data:application/xml,<foo/> data:application/xml,<foo/>
|
||||
== data:application/xml,<foo/> data:application/xml,<foo/>
|
||||
fails == 404553-1.html 404553-1.html
|
||||
== 404666-1.html 404666-1.html
|
||||
== 404666-2.html 404666-2.html
|
||||
|
@ -1402,7 +1402,7 @@ fails == 502795-1.html 502795-1.html
|
|||
== 503364-1b.html 503364-1b.html
|
||||
# Reftest for bug 503531 marked as failing; should be re-enabled when
|
||||
# bug 607548 gets resolved.
|
||||
# needs-focus fails == 503531-1.html 503531-1.html
|
||||
needs-focus == 503531-1.html 503531-1.html
|
||||
== 504032-1.html 504032-1.html
|
||||
== 505743-1.html 505743-1.html
|
||||
fails == 506481-1.html 506481-1.html
|
||||
|
@ -1503,8 +1503,8 @@ fails == 551463-1.html 551463-1.html
|
|||
fails random == 553571-1.html 553571-1.html
|
||||
== 555388-1.html 555388-1.html
|
||||
== 556661-1.html 556661-1.html
|
||||
# fuzzy-if(skiaContent,4,5) == 557087-1.html 557087-1.html
|
||||
# fails-if(Android) fuzzy-if(skiaContent&&!Android,2,5) == 557087-2.html 557087-2.html
|
||||
fails fuzzy-if(skiaContent,4,5) skip-if(stylo) == 557087-1.html 557087-1.html # Bug 1341973
|
||||
fails fails-if(Android) fuzzy-if(skiaContent&&!Android,2,5) skip-if(stylo) == 557087-2.html 557087-2.html # Bug 1341973
|
||||
fails == 557736-1.html 557736-1.html
|
||||
== 558011-1.xul 558011-1.xul
|
||||
== 559284-1.html 559284-1.html
|
||||
|
@ -1650,7 +1650,7 @@ random-if(winWidget) HTTP(..) == 621918-2.svg 621918-2.svg
|
|||
fails == 622585-1.html 622585-1.html
|
||||
== 625409-1.html 625409-1.html
|
||||
== 627393-1.html 627393-1.html
|
||||
# fuzzy-if(skiaContent,1,500) == 630835-1.html 630835-1.html
|
||||
fuzzy-if(skiaContent,1,500) == 630835-1.html 630835-1.html
|
||||
== 631352-1.html 631352-1.html
|
||||
== 632423-1.html 632423-1.html
|
||||
skip-if(Android) random-if(winWidget||OSX==1010) == 632781-verybig.html 632781-verybig.html
|
||||
|
@ -1761,7 +1761,7 @@ fails == 818276-1.html 818276-1.html
|
|||
fails == 825999.html 825999.html
|
||||
== 827577-1a.html 827577-1a.html
|
||||
== 827577-1b.html 827577-1b.html
|
||||
fails == 827799-1.html 827799-1.html
|
||||
== 827799-1.html 827799-1.html
|
||||
== 829958.html 829958.html
|
||||
== 836844-1.html 836844-1.html
|
||||
== 841192-1.html 841192-1.html
|
||||
|
|
|
@ -67,10 +67,10 @@ random-if(cocoaWidget&&azureSkia) random-if(!cocoaWidget||OSX==1006||OSX==1007)
|
|||
# azure quartz uses CGDrawLinearGradient instead of DrawShading
|
||||
# so we have less control over degenerate behaviour as tested by this
|
||||
# test
|
||||
# fails-if((azureSkia&&!azureSkiaGL)||(azureSkiaGL&&Android)) == linear-gradient-1a.html linear-gradient-1a.html
|
||||
fails-if((azureSkia&&!azureSkiaGL)||(azureSkiaGL&&Android)) skip-if(stylo) == linear-gradient-1a.html linear-gradient-1a.html # Too random.
|
||||
|
||||
# this passes with cairo on 10.7 and 10.8 but not with azure for reasons unknown
|
||||
# fails-if((azureSkia&&!azureSkiaGL)||(azureSkiaGL&&Android)) == linear-gradient-1b.html linear-gradient-1b.html
|
||||
fails-if((azureSkia&&!azureSkiaGL)||(azureSkiaGL&&Android)) skip-if(stylo) == linear-gradient-1b.html linear-gradient-1b.html # Too random.
|
||||
|
||||
== zero-dimensions.html zero-dimensions.html
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
# http://dev.w3.org/csswg/css-display
|
||||
|
||||
fails == display-contents-acid.html display-contents-acid.html
|
||||
# fuzzy-if(Android,8,604) == display-contents-acid-dyn-1.html display-contents-acid-dyn-1.html
|
||||
fails fuzzy-if(Android,8,604) == display-contents-acid-dyn-1.html display-contents-acid-dyn-1.html
|
||||
fails == display-contents-acid-dyn-2.html display-contents-acid-dyn-2.html # bug 1337700
|
||||
fails == display-contents-acid-dyn-3.html display-contents-acid-dyn-3.html
|
||||
skip-if(stylo) == display-contents-generated-content.html display-contents-generated-content.html # Bug 1341083
|
||||
|
@ -18,7 +18,7 @@ skip-if(stylo) == display-contents-style-inheritance-1-dom-mutations.html displa
|
|||
== display-contents-visibility-hidden-2.html display-contents-visibility-hidden-2.html
|
||||
== display-contents-495385-2d.html display-contents-495385-2d.html
|
||||
fails == display-contents-xbl.xhtml display-contents-xbl.xhtml
|
||||
# fuzzy-if(Android,7,1186) pref(dom.webcomponents.enabled,true) == display-contents-shadow-dom-1.html display-contents-shadow-dom-1.html
|
||||
fuzzy-if(Android,7,1186) skip-if(stylo) pref(dom.webcomponents.enabled,true) == display-contents-shadow-dom-1.html display-contents-shadow-dom-1.html # Bug 1293844
|
||||
== display-contents-xbl-2.xul display-contents-xbl-2.xul
|
||||
asserts(2) == display-contents-xbl-3.xul display-contents-xbl-3.xul
|
||||
skip-if(stylo) == display-contents-xbl-4.xul display-contents-xbl-4.xul # Too intermittent.
|
||||
|
|
|
@ -36,9 +36,9 @@ fails == grid-abspos-items-015.html grid-abspos-items-015.html
|
|||
fails == grid-order-abspos-items-001.html grid-order-abspos-items-001.html
|
||||
fails == grid-order-placement-auto-001.html grid-order-placement-auto-001.html
|
||||
fails == grid-order-placement-definite-001.html grid-order-placement-definite-001.html
|
||||
# skip-if(Android) == grid-placement-definite-implicit-001.html grid-placement-definite-implicit-001.html
|
||||
fails skip-if(Android) == grid-placement-definite-implicit-001.html grid-placement-definite-implicit-001.html
|
||||
fails == grid-placement-definite-implicit-002.html grid-placement-definite-implicit-002.html
|
||||
# skip-if(Android) fuzzy-if(winWidget,1,32) == grid-placement-auto-implicit-001.html grid-placement-auto-implicit-001.html
|
||||
fails skip-if(Android) fuzzy-if(winWidget,1,32) == grid-placement-auto-implicit-001.html grid-placement-auto-implicit-001.html
|
||||
fails == grid-placement-abspos-implicit-001.html grid-placement-abspos-implicit-001.html
|
||||
fails == rtl-grid-placement-definite-001.html rtl-grid-placement-definite-001.html
|
||||
fails == rtl-grid-placement-auto-row-sparse-001.html rtl-grid-placement-auto-row-sparse-001.html
|
||||
|
@ -132,21 +132,21 @@ random-if(http.oscpu!="Linux\u0020i686") == grid-item-mixed-baseline-003.html gr
|
|||
fails == grid-item-mixed-baseline-004.html grid-item-mixed-baseline-004.html
|
||||
fails == grid-align-content-001.html grid-align-content-001.html
|
||||
fails == grid-justify-content-001.html grid-justify-content-001.html
|
||||
# skip-if(Android&&isDebugBuild) == grid-justify-content-002.html grid-justify-content-002.html
|
||||
# skip-if(Android&&isDebugBuild) == grid-justify-content-003.html grid-justify-content-003.html
|
||||
fails skip-if(Android&&isDebugBuild) == grid-justify-content-002.html grid-justify-content-002.html
|
||||
fails skip-if(Android&&isDebugBuild) == grid-justify-content-003.html grid-justify-content-003.html
|
||||
fails == grid-container-baselines-001.html grid-container-baselines-001.html
|
||||
fails == grid-container-baselines-002.html grid-container-baselines-002.html
|
||||
fails == grid-container-baselines-003.html grid-container-baselines-003.html
|
||||
== grid-container-baselines-004.html grid-container-baselines-004.html
|
||||
# skip-if(Android&&isDebugBuild) == grid-column-gap-001.html grid-column-gap-001.html
|
||||
fails skip-if(Android&&isDebugBuild) == grid-column-gap-001.html grid-column-gap-001.html
|
||||
fails == grid-column-gap-002.html grid-column-gap-002.html
|
||||
fails == grid-column-gap-003.html grid-column-gap-003.html
|
||||
fails == grid-column-gap-004.html grid-column-gap-004.html
|
||||
fails == grid-row-gap-001.html grid-row-gap-001.html
|
||||
fails == grid-percent-grid-gap-001.html grid-percent-grid-gap-001.html
|
||||
# skip-if(Android&&isDebugBuild) == grid-row-gap-002.html grid-row-gap-002.html
|
||||
# skip-if(Android&&isDebugBuild) == grid-row-gap-003.html grid-row-gap-003.html
|
||||
# skip-if(Android&&isDebugBuild) == grid-row-gap-004.html grid-row-gap-004.html
|
||||
fails skip-if(Android&&isDebugBuild) == grid-row-gap-002.html grid-row-gap-002.html
|
||||
fails skip-if(Android&&isDebugBuild) == grid-row-gap-003.html grid-row-gap-003.html
|
||||
fails skip-if(Android&&isDebugBuild) == grid-row-gap-004.html grid-row-gap-004.html
|
||||
fails == grid-row-gap-005.html grid-row-gap-005.html
|
||||
fails == grid-container-overflow-001.html grid-container-overflow-001.html
|
||||
fails == grid-item-margin-left-auto-001.html grid-item-margin-left-auto-001.html
|
||||
|
@ -230,11 +230,11 @@ fails == grid-fragmentation-dyn1-016.html grid-fragmentation-dyn1-016.html
|
|||
fails == grid-fragmentation-dyn5-016.html grid-fragmentation-dyn5-016.html
|
||||
fails == grid-fragmentation-dyn3-017.html grid-fragmentation-dyn3-017.html
|
||||
fails == grid-fragmentation-dyn2-018.html grid-fragmentation-dyn2-018.html
|
||||
# fails == grid-fragmentation-dyn1-019.html grid-fragmentation-dyn1-019.html # bug 1341104
|
||||
# fails == grid-fragmentation-dyn2-019.html grid-fragmentation-dyn2-019.html # bug 1341104
|
||||
# fails == grid-fragmentation-dyn3-019.html grid-fragmentation-dyn3-019.html # bug 1341104
|
||||
# fails == grid-fragmentation-dyn4-019.html grid-fragmentation-dyn4-019.html # bug 1341104
|
||||
# fails == grid-fragmentation-dyn5-019.html grid-fragmentation-dyn5-019.html # bug 1341104
|
||||
fails skip-if(stylo) == grid-fragmentation-dyn1-019.html grid-fragmentation-dyn1-019.html # bug 1341104
|
||||
fails skip-if(stylo) == grid-fragmentation-dyn2-019.html grid-fragmentation-dyn2-019.html # bug 1341104
|
||||
fails skip-if(stylo) == grid-fragmentation-dyn3-019.html grid-fragmentation-dyn3-019.html # bug 1341104
|
||||
fails skip-if(stylo) == grid-fragmentation-dyn4-019.html grid-fragmentation-dyn4-019.html # bug 1341104
|
||||
fails skip-if(stylo) == grid-fragmentation-dyn5-019.html grid-fragmentation-dyn5-019.html # bug 1341104
|
||||
fails == grid-fragmentation-dyn1-020.html grid-fragmentation-dyn1-020.html
|
||||
fails == grid-fragmentation-dyn2-020.html grid-fragmentation-dyn2-020.html
|
||||
skip == grid-fragmentation-dyn1-021.html grid-fragmentation-dyn1-021.html
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
# caret colour and the text colour or just the text colour).
|
||||
|
||||
fails == placeholder-simple.html placeholder-simple.html
|
||||
# needs-focus == placeholder-focus.html placeholder-focus.html
|
||||
fails needs-focus == placeholder-focus.html placeholder-focus.html
|
||||
fails needs-focus == placeholder-blur.html placeholder-blur.html
|
||||
fails == placeholder-value.html placeholder-value.html
|
||||
fails == placeholder-empty-string.html placeholder-empty-string.html
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
# caret colour and the text colour or just the text colour).
|
||||
|
||||
fails == placeholder-simple.html placeholder-simple.html
|
||||
# needs-focus == placeholder-focus.html placeholder-focus.html
|
||||
fails needs-focus == placeholder-focus.html placeholder-focus.html
|
||||
fails needs-focus == placeholder-blur.html placeholder-blur.html
|
||||
fails == placeholder-value.html placeholder-value.html
|
||||
fails == placeholder-empty-string.html placeholder-empty-string.html
|
||||
|
|
|
@ -24,7 +24,7 @@ fails == parent-style-1.html parent-style-1.html
|
|||
== quote-1e.html quote-1e.html
|
||||
== quote-1f.html quote-1f.html
|
||||
fails == dynamic-1.html dynamic-1.html
|
||||
# random-if(d2d) == dynamic-2.html dynamic-2.html
|
||||
fails random-if(d2d) == dynamic-2.html dynamic-2.html
|
||||
== dynamic-3a.html dynamic-3a.html
|
||||
== dynamic-3b.html dynamic-3b.html
|
||||
== 23605-1.html 23605-1.html
|
||||
|
|
|
@ -51,7 +51,7 @@ fails == localized-family-names-003.html localized-family-names-003.html
|
|||
fails == localized-family-names-004.html localized-family-names-004.html
|
||||
|
||||
# family names with escaped spaces shouldn't match the names without the spaces
|
||||
# fails-if(http.oscpu=="Linux\u0020x86_64") == familyname-escapedidents.html familyname-escapedidents.html
|
||||
== familyname-escapedidents.html familyname-escapedidents.html
|
||||
|
||||
# weight mapping tests
|
||||
fails HTTP(..) == normalmedium.html normalmedium.html
|
||||
|
@ -117,12 +117,12 @@ fails == italic-oblique-9.html italic-oblique-9.html
|
|||
# Bug 1212731 - initial implementation caused startup regression and
|
||||
# regression with full-width digits display in UI elements. Disable
|
||||
# tests until these problems are corrected.
|
||||
# random-if(!OSX) == system-generic-fallback-1.html system-generic-fallback-1.html
|
||||
# random-if(!OSX||OSX<1008) == system-generic-fallback-2.html system-generic-fallback-2.html
|
||||
# random-if(!OSX||OSX<1008) == system-generic-fallback-3.html system-generic-fallback-3.html
|
||||
# random-if(!OSX||OSX<1008) == system-generic-fallback-4.html system-generic-fallback-4.html
|
||||
# random-if(!OSX) == system-generic-fallback-ko.html system-generic-fallback-ko.html
|
||||
# random-if(!OSX) == system-generic-fallback-zh-tw.html system-generic-fallback-zh-tw.html
|
||||
# random-if(!OSX) == system-generic-fallback-zh-cn.html system-generic-fallback-zh-cn.html
|
||||
# random-if(!OSX) == system-generic-fallback-zh-tw.html system-generic-fallback-zh-tw.html
|
||||
random-if(!OSX) == system-generic-fallback-1.html system-generic-fallback-1.html
|
||||
random-if(!OSX||OSX<1008) == system-generic-fallback-2.html system-generic-fallback-2.html
|
||||
random-if(!OSX||OSX<1008) == system-generic-fallback-3.html system-generic-fallback-3.html
|
||||
random-if(!OSX||OSX<1008) == system-generic-fallback-4.html system-generic-fallback-4.html
|
||||
random-if(!OSX) == system-generic-fallback-ko.html system-generic-fallback-ko.html
|
||||
random-if(!OSX) == system-generic-fallback-zh-tw.html system-generic-fallback-zh-tw.html
|
||||
random-if(!OSX) == system-generic-fallback-zh-cn.html system-generic-fallback-zh-cn.html
|
||||
random-if(!OSX) == system-generic-fallback-zh-tw.html system-generic-fallback-zh-tw.html
|
||||
|
||||
|
|
|
@ -3,8 +3,8 @@ default-preferences pref(dom.forms.number,true)
|
|||
|
||||
# sanity checks:
|
||||
# not valid on Android where type=number looks like type=text
|
||||
# skip-if(Android) == not-other-type-unthemed-1.html not-other-type-unthemed-1.html
|
||||
# skip-if(Android) == not-other-type-unthemed-1.html not-other-type-unthemed-1.html
|
||||
skip-if(stylo) == not-other-type-unthemed-1.html not-other-type-unthemed-1.html # Bug 1341973
|
||||
skip-if(stylo) == not-other-type-unthemed-1.html not-other-type-unthemed-1.html # Bug 1341973
|
||||
# only valid on Android where type=number looks the same as type=text
|
||||
skip-if(!Android) == number-same-as-text-unthemed.html number-same-as-text-unthemed.html
|
||||
|
||||
|
@ -19,7 +19,7 @@ fails == to-number-from-other-type-unthemed-1.html to-number-from-other-type-unt
|
|||
== from-number-to-other-type-unthemed-1.html from-number-to-other-type-unthemed-1.html
|
||||
|
||||
# dynamic value changes:
|
||||
# fuzzy-if(skiaContent,2,13) == show-value.html show-value.html
|
||||
fuzzy-if(skiaContent,2,13) skip-if(stylo) == show-value.html show-value.html # Bug 1341973
|
||||
|
||||
# disabled
|
||||
== number-disabled.html number-disabled.html
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# DO NOT EDIT! This is a auto-generated temporary list for Stylo testing
|
||||
fails == legend.html legend.html
|
||||
# fuzzy-if(skiaContent,1,7) pref(dom.webcomponents.enabled,true) == shadow-dom.html shadow-dom.html
|
||||
fails pref(dom.webcomponents.enabled,true) == shadow-dom.html shadow-dom.html
|
||||
== 1273433.html 1273433.html
|
||||
|
|
|
@ -19,9 +19,9 @@ fails == placeholder-4.html placeholder-4.html
|
|||
fails == placeholder-5.html placeholder-5.html
|
||||
fails == placeholder-6.html placeholder-6.html
|
||||
fails == placeholder-6-textarea.html placeholder-6-textarea.html
|
||||
# needs-focus == placeholder-7.html placeholder-7.html
|
||||
# needs-focus == placeholder-8.html placeholder-8.html
|
||||
# needs-focus == placeholder-9.html placeholder-9.html
|
||||
fails needs-focus == placeholder-7.html placeholder-7.html
|
||||
fails needs-focus == placeholder-8.html placeholder-8.html
|
||||
fails needs-focus == placeholder-9.html placeholder-9.html
|
||||
fails needs-focus == placeholder-10.html placeholder-10.html
|
||||
fails == placeholder-11.html placeholder-11.html
|
||||
fails == placeholder-12.html placeholder-12.html
|
||||
|
@ -29,8 +29,8 @@ fails == placeholder-13.html placeholder-13.html
|
|||
fails == placeholder-14.html placeholder-14.html
|
||||
fails == placeholder-18.html placeholder-18.html
|
||||
random-if(winWidget) == placeholder-19.xul placeholder-19.xul
|
||||
# needs-focus == placeholder-20.html placeholder-20.html
|
||||
# needs-focus == placeholder-21.html placeholder-21.html
|
||||
fails needs-focus == placeholder-20.html placeholder-20.html
|
||||
fails needs-focus == placeholder-21.html placeholder-21.html
|
||||
fails needs-focus == placeholder-22.html placeholder-22.html
|
||||
fails == placeholder-rtl.html placeholder-rtl.html # Bug 1340696
|
||||
fails pref(dom.placeholder.show_on_focus,false) needs-focus == placeholder-focus-pref.html placeholder-focus-pref.html
|
||||
|
|
|
@ -9,4 +9,4 @@ fails HTTP(../..) == vertical-centering.html vertical-centering.html # Bug 12902
|
|||
fails == 997709-2.html 997709-2.html
|
||||
fails needs-focus == focusring-1.html focusring-1.html
|
||||
fails needs-focus == focusring-2.html focusring-2.html
|
||||
# needs-focus == focusring-3.html focusring-3.html
|
||||
fails needs-focus == focusring-3.html focusring-3.html
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
skip-if(cocoaWidget||Android) == accesskey-1.xul accesskey-1.xul
|
||||
skip-if(cocoaWidget||Android) == accesskey-2.xul accesskey-2.xul
|
||||
# accesskey-3 fails because of defects in XUL bidi support
|
||||
# fails-if(!cocoaWidget) skip-if(cocoaWidget||Android) == accesskey-3.xul accesskey-3.xul
|
||||
# skip-if(cocoaWidget||Android) == accesskey-3.xul accesskey-3.xul
|
||||
skip-if(cocoaWidget||Android) == accesskey-3.xul accesskey-3.xul
|
||||
skip-if(cocoaWidget||Android) == accesskey-3.xul accesskey-3.xul
|
||||
skip-if(cocoaWidget||Android) == accesskey-4.xul accesskey-4.xul
|
||||
skip-if(cocoaWidget||Android) == accesskey-4.xul accesskey-4.xul
|
||||
skip-if(Android) == align-baseline-1.xul align-baseline-1.xul
|
||||
|
|
|
@ -68,7 +68,7 @@ skip-if(gtkWidget) random-if(d2d) == resizer-bottomstart-rtl.xul resizer-bottoms
|
|||
|
||||
# Windows-only, depends on native scrollbar metrics
|
||||
skip-if(!winWidget) == scroll-thumb-minimum-size-notheme.html scroll-thumb-minimum-size-notheme.html
|
||||
# skip-if(!winWidget) == scroll-thumb-minimum-size-theme.html scroll-thumb-minimum-size-theme.html
|
||||
skip-if(!winWidget) == scroll-thumb-minimum-size-theme.html scroll-thumb-minimum-size-theme.html
|
||||
|
||||
== border-radius.html border-radius.html
|
||||
|
||||
|
|
|
@ -2,17 +2,17 @@
|
|||
# For more pagination tests, see layout/reftests/w3c-css/submitted/css21/pagination/
|
||||
# and layout/reftests/w3c-css/submitted/multicol3/
|
||||
# Pagination tests
|
||||
# asserts(3) == abspos-breaking-000.xhtml abspos-breaking-000.xhtml
|
||||
fails == abspos-breaking-000.xhtml abspos-breaking-000.xhtml
|
||||
fails == abspos-breaking-001.xhtml abspos-breaking-001.xhtml
|
||||
fails == abspos-breaking-002.xhtml abspos-breaking-002.xhtml
|
||||
fails == abspos-breaking-003.html abspos-breaking-003.html
|
||||
fails == abspos-breaking-004.html abspos-breaking-004.html
|
||||
fails == abspos-breaking-005.html abspos-breaking-005.html
|
||||
fails == abspos-breaking-006.html abspos-breaking-006.html
|
||||
fails pref(layout.css.box-decoration-break.enabled,true) == abspos-breaking-007.html abspos-breaking-007.html
|
||||
fails pref(layout.css.box-decoration-break.enabled,true) == abspos-breaking-008.html abspos-breaking-008.html
|
||||
fails pref(layout.css.box-decoration-break.enabled,true) == abspos-breaking-009.html abspos-breaking-009.html
|
||||
fails pref(layout.css.box-decoration-break.enabled,true) == abspos-breaking-010.html abspos-breaking-010.html
|
||||
== abspos-breaking-003.html abspos-breaking-003.html
|
||||
== abspos-breaking-004.html abspos-breaking-004.html
|
||||
== abspos-breaking-005.html abspos-breaking-005.html
|
||||
== abspos-breaking-006.html abspos-breaking-006.html
|
||||
pref(layout.css.box-decoration-break.enabled,true) == abspos-breaking-007.html abspos-breaking-007.html
|
||||
pref(layout.css.box-decoration-break.enabled,true) == abspos-breaking-008.html abspos-breaking-008.html
|
||||
pref(layout.css.box-decoration-break.enabled,true) == abspos-breaking-009.html abspos-breaking-009.html
|
||||
pref(layout.css.box-decoration-break.enabled,true) == abspos-breaking-010.html abspos-breaking-010.html
|
||||
== abspos-breaking-011.html abspos-breaking-011.html
|
||||
== abspos-overflow-01.xhtml abspos-overflow-01.xhtml
|
||||
== abspos-overflow-01-cols.xhtml abspos-overflow-01-cols.xhtml
|
||||
|
@ -46,7 +46,7 @@ fails == float-continuations-000.html float-continuations-000.html
|
|||
fails == resize-reflow-000.html resize-reflow-000.html
|
||||
fails == resize-reflow-001.html resize-reflow-001.html
|
||||
== table-page-break-before-auto-1.html table-page-break-before-auto-1.html
|
||||
#== table-page-break-before-auto-2.html table-page-break-before-auto-2-ref.html bug bug
|
||||
fails == table-page-break-before-auto-2.html table-page-break-before-auto-2-ref.html
|
||||
== table-page-break-before-always-1.html table-page-break-before-always-1.html
|
||||
== table-page-break-before-left-1.html table-page-break-before-left-1.html
|
||||
== table-page-break-before-right-1.html table-page-break-before-right-1.html
|
||||
|
|
|
@ -33,4 +33,4 @@ fails == 820496-1.html 820496-1.html
|
|||
fails == 960822.html 960822.html
|
||||
fails == 966419-1.html 966419-1.html
|
||||
fails == 966419-2.html 966419-2.html
|
||||
# asserts(3) HTTP(..) fails 1108104.html 1108104-ref.html
|
||||
fails HTTP(..) == 1108104.html 1108104-ref.html
|
||||
|
|
|
@ -46,8 +46,8 @@ fails HTTP(..) == filter-2.xhtml filter-2.xhtml
|
|||
|
||||
# test that xulRuntime.OS works
|
||||
== data:text/html,<body>Linux data:text/html,<body>Linux
|
||||
# fails-if(xulRuntime.OS!="WINNT") == data:text/html,<body>Win data:text/html,<body>Win
|
||||
# fails-if(xulRuntime.OS!="Darwin") == data:text/html,<body>Mac data:text/html,<body>Mac
|
||||
== data:text/html,<body>Win data:text/html,<body>Win
|
||||
== data:text/html,<body>Mac data:text/html,<body>Mac
|
||||
|
||||
# test parsing of asserts() expressions
|
||||
asserts(0) load about:blank
|
||||
|
@ -98,8 +98,8 @@ pref(dom.meta-viewport.enabled,true) skip-if(!browserIsRemote||layersOMTC) == te
|
|||
|
||||
# IPC Position-fixed frames/layers test
|
||||
# Fixed layers are temporarily disabled (bug 656167).
|
||||
#pref(dom.meta-viewport.enabled,true) skip-if(!browserIsRemote) == test-pos-fixed.html test-pos-fixed.html
|
||||
#pref(dom.meta-viewport.enabled,true) skip-if(!browserIsRemote) == test-bg-attachment-fixed.html test-bg-attachment-fixed.html
|
||||
pref(dom.meta-viewport.enabled,true) skip-if(!browserIsRemote) == test-pos-fixed.html test-pos-fixed.html
|
||||
pref(dom.meta-viewport.enabled,true) skip-if(!browserIsRemote) == test-bg-attachment-fixed.html test-bg-attachment-fixed.html
|
||||
pref(dom.meta-viewport.enabled,true) skip-if(!browserIsRemote) == test-pos-fixed-transform.html test-pos-fixed-transform.html
|
||||
|
||||
# reftest syntax: require-or
|
||||
|
|
|
@ -257,7 +257,7 @@ fails == overflow-on-outer-svg-03b.xhtml overflow-on-outer-svg-03b.xhtml
|
|||
pref(svg.paint-order.enabled,true) == paint-order-01.svg paint-order-01.svg
|
||||
pref(svg.paint-order.enabled,true) == paint-order-02.svg paint-order-02.svg
|
||||
pref(svg.paint-order.enabled,true) == paint-order-03.svg paint-order-03.svg
|
||||
#fuzzy(23,60) fails-if(d2d) == path-01.svg path-01.svg
|
||||
fuzzy(23,60) fails-if(d2d) == path-01.svg path-01.svg
|
||||
== path-02.svg path-02.svg
|
||||
== path-03.svg path-03.svg
|
||||
== path-04.svg path-04.svg
|
||||
|
@ -426,13 +426,13 @@ skip-if(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-layer-mas
|
|||
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(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-multiply-alpha.svg blend-multiply-alpha.svg
|
||||
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(Android) pref(layout.css.mix-blend-mode.enabled,true) == blend-saturation.svg blend-saturation.svg
|
||||
#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
|
||||
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
|
||||
|
|
|
@ -290,12 +290,12 @@ random-if(Android) == object--auto-auto--0-pct.html object--auto-auto--0-pct.htm
|
|||
random-if(Android) == object--auto-auto--0-px.html object--auto-auto--0-px.html
|
||||
random-if(Android) == object--auto-auto--pct-0.html object--auto-auto--pct-0.html
|
||||
# The following four commented out tests fail post bug 428023:
|
||||
#== object--auto-auto--pct-pct.html object--auto-auto--pct-pct.html
|
||||
#== object--auto-auto--pct-px.html object--auto-auto--pct-px.html
|
||||
== object--auto-auto--pct-pct.html object--auto-auto--pct-pct.html
|
||||
== object--auto-auto--pct-px.html object--auto-auto--pct-px.html
|
||||
random-if(Android) == object--auto-auto--px-0.html object--auto-auto--px-0.html
|
||||
#== object--auto-auto--px-pct.html object--auto-auto--px-pct.html
|
||||
== object--auto-auto--px-pct.html object--auto-auto--px-pct.html
|
||||
random-if(Android) == object--auto-auto--px-px.html object--auto-auto--px-px.html
|
||||
#== object--pct-pct--0-0.html object--pct-pct--0-0.html
|
||||
== object--pct-pct--0-0.html object--pct-pct--0-0.html
|
||||
|
||||
|
||||
# Assorted tests to check that dynamic changes work correctly
|
||||
|
|
|
@ -316,7 +316,7 @@ fails == auto-hyphenation-pl-1.html auto-hyphenation-pl-1.html
|
|||
== auto-hyphenation-transformed-1.html auto-hyphenation-transformed-1.html
|
||||
|
||||
# osx-font-smoothing - with and without subpixel AA, only under OSX
|
||||
# fails-if(!cocoaWidget||OSX==1006||OSX==1007) == osx-font-smoothing.html osx-font-smoothing.html
|
||||
== osx-font-smoothing.html osx-font-smoothing.html
|
||||
== osx-font-smoothing-2.html osx-font-smoothing-2.html
|
||||
== osx-font-smoothing-2.html osx-font-smoothing-2.html
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ fails == clip-path-strokeBox-1a.html clip-path-strokeBox-1a.html
|
|||
fails == clip-path-strokeBox-1b.html clip-path-strokeBox-1b.html
|
||||
fails == clip-path-viewBox-1a.html clip-path-viewBox-1a.html
|
||||
fails == clip-path-viewBox-1b.html clip-path-viewBox-1b.html
|
||||
# fuzzy(64,370) == clip-path-viewBox-1c.html clip-path-viewBox-1c.html
|
||||
fails == clip-path-viewBox-1c.html clip-path-viewBox-1c.html
|
||||
== clip-path-geometryBox-2.html clip-path-geometryBox-2.html
|
||||
|
||||
fails == clip-path-localRef-1.html clip-path-localRef-1.html
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
# Frequent Windows 7 load failed: timed out waiting for test to complete (waiting for onload scripts to complete), bug 1167155 and friends
|
||||
# Even though the whole reftest-stylo.list here is skipped, it doesn't actually work because reftests match the last
|
||||
# **-if, which means even though we tried to skip this list,the fuzzy-if still matched forcing us to run the test.
|
||||
== s71-abs-pos-non-replaced-vlr-003.xht s71-abs-pos-non-replaced-vlr-003.xht
|
||||
== s71-abs-pos-non-replaced-vlr-005.xht s71-abs-pos-non-replaced-vlr-005.xht
|
||||
== s71-abs-pos-non-replaced-vlr-007.xht s71-abs-pos-non-replaced-vlr-007.xht
|
||||
fails == s71-abs-pos-non-replaced-vlr-003.xht s71-abs-pos-non-replaced-vlr-003.xht
|
||||
fails == s71-abs-pos-non-replaced-vlr-005.xht s71-abs-pos-non-replaced-vlr-005.xht
|
||||
fails == s71-abs-pos-non-replaced-vlr-007.xht s71-abs-pos-non-replaced-vlr-007.xht
|
||||
fails == s71-abs-pos-non-replaced-vlr-009.xht s71-abs-pos-non-replaced-vlr-009.xht
|
||||
fails == s71-abs-pos-non-replaced-vlr-011.xht s71-abs-pos-non-replaced-vlr-011.xht
|
||||
fails == s71-abs-pos-non-replaced-vlr-013.xht s71-abs-pos-non-replaced-vlr-013.xht
|
||||
|
|
|
@ -70,7 +70,7 @@ fails == ua-style-sheet-textarea-1.html ua-style-sheet-textarea-1.html
|
|||
fails == ua-style-sheet-button-1.html ua-style-sheet-button-1.html
|
||||
fails == ua-style-sheet-button-1.html ua-style-sheet-button-1.html
|
||||
fails == ua-style-sheet-input-color-1.html ua-style-sheet-input-color-1.html
|
||||
# fuzzy-if(gtkWidget,1,15) == ua-style-sheet-input-number-1.html ua-style-sheet-input-number-1.html
|
||||
fuzzy-if(gtkWidget,1,15) skip-if(stylo) == ua-style-sheet-input-number-1.html ua-style-sheet-input-number-1.html # Bug 1341973
|
||||
|
||||
HTTP(..) == 1127488-align-default-horizontal-tb-ltr.html 1127488-align-default-horizontal-tb-ltr.html
|
||||
HTTP(..) == 1127488-align-start-horizontal-tb-ltr.html 1127488-align-start-horizontal-tb-ltr.html
|
||||
|
@ -188,7 +188,9 @@ fails == 1302389-scrolled-rect-2d.html 1302389-scrolled-rect-2d.html
|
|||
# Suite of tests from Gérard Talbot in bug 1079151
|
||||
# Frequent Windows 7 load failed: timed out waiting for test to complete (waiting for onload scripts to complete), bug 1167155 and friends
|
||||
# Too many intermittents
|
||||
# skip-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) include abspos/reftest-stylo.list
|
||||
# Can't use skip-if(stylo) here, because any conditions used in the manifest we
|
||||
# include will override it!
|
||||
# skip-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) include abspos/reftest-stylo.list # Loads fail
|
||||
|
||||
# Tests for tables with vertical writing modes
|
||||
include tables/reftest-stylo.list
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
== test013.xul test013.xul
|
||||
== test014.xul test014.xul
|
||||
# Disabled due to compartments for now.
|
||||
#== test015.xul test015.xul
|
||||
== test015.xul test015.xul
|
||||
== test016.xul test016.xul
|
||||
== test017.xul test017.xul
|
||||
== test018.xul test018.xul
|
||||
|
|
|
@ -105,14 +105,14 @@ SERVO_BINDING_FUNC(Servo_ParseProperty,
|
|||
const nsACString* base_url, ThreadSafeURIHolder* base,
|
||||
ThreadSafeURIHolder* referrer,
|
||||
ThreadSafePrincipalHolder* principal)
|
||||
SERVO_BINDING_FUNC(Servo_GetComputedKeyframeValues, void,
|
||||
RawGeckoKeyframeListBorrowed keyframes,
|
||||
ServoComputedValuesBorrowed style,
|
||||
ServoComputedValuesBorrowedOrNull parent_style,
|
||||
RawGeckoPresContextBorrowed pres_context,
|
||||
RawGeckoComputedKeyframeValuesListBorrowedMut result)
|
||||
|
||||
// AnimationValues handling
|
||||
SERVO_BINDING_FUNC(Servo_AnimationValues_Populate, void,
|
||||
RawGeckoAnimationValueListBorrowedMut,
|
||||
RawServoDeclarationBlockBorrowed,
|
||||
ServoComputedValuesBorrowed,
|
||||
ServoComputedValuesBorrowedOrNull,
|
||||
RawGeckoPresContextBorrowed)
|
||||
SERVO_BINDING_FUNC(Servo_AnimationValues_Interpolate,
|
||||
RawServoAnimationValueStrong,
|
||||
RawServoAnimationValueBorrowed from,
|
||||
|
@ -130,6 +130,9 @@ SERVO_BINDING_FUNC(Servo_AnimationValue_GetOpacity, float,
|
|||
SERVO_BINDING_FUNC(Servo_AnimationValue_GetTransform, void,
|
||||
RawServoAnimationValueBorrowed value,
|
||||
RefPtr<nsCSSValueSharedList>* list)
|
||||
SERVO_BINDING_FUNC(Servo_AnimationValue_DeepEqual, bool,
|
||||
RawServoAnimationValueBorrowed,
|
||||
RawServoAnimationValueBorrowed)
|
||||
|
||||
// Style attribute
|
||||
SERVO_BINDING_FUNC(Servo_ParseStyleAttribute, RawServoDeclarationBlockStrong,
|
||||
|
|
|
@ -27,6 +27,7 @@ class StyleChildrenIterator;
|
|||
} // namespace dom
|
||||
struct Keyframe;
|
||||
struct PropertyStyleAnimationValuePair;
|
||||
using ComputedKeyframeValues = nsTArray<PropertyStyleAnimationValuePair>;
|
||||
} // namespace mozilla
|
||||
|
||||
class nsCSSValue;
|
||||
|
@ -42,6 +43,7 @@ typedef mozilla::dom::Element RawGeckoElement;
|
|||
typedef nsIDocument RawGeckoDocument;
|
||||
typedef nsPresContext RawGeckoPresContext;
|
||||
typedef nsTArray<mozilla::Keyframe> RawGeckoKeyframeList;
|
||||
typedef nsTArray<mozilla::ComputedKeyframeValues> RawGeckoComputedKeyframeValuesList;
|
||||
typedef nsTArray<mozilla::PropertyStyleAnimationValuePair> RawGeckoAnimationValueList;
|
||||
typedef nsTArray<const RawServoAnimationValue*> RawServoAnimationValueBorrowedList;
|
||||
|
||||
|
@ -116,6 +118,8 @@ DECL_BORROWED_REF_TYPE_FOR(RawGeckoPresContext)
|
|||
DECL_BORROWED_MUT_REF_TYPE_FOR(RawGeckoAnimationValueList)
|
||||
DECL_BORROWED_REF_TYPE_FOR(RawServoAnimationValueBorrowedList)
|
||||
DECL_BORROWED_MUT_REF_TYPE_FOR(RawGeckoKeyframeList)
|
||||
DECL_BORROWED_REF_TYPE_FOR(RawGeckoKeyframeList)
|
||||
DECL_BORROWED_MUT_REF_TYPE_FOR(RawGeckoComputedKeyframeValuesList)
|
||||
|
||||
#undef DECL_ARC_REF_TYPE_FOR
|
||||
#undef DECL_OWNED_REF_TYPE_FOR
|
||||
|
|
|
@ -576,11 +576,7 @@ struct AnimationValue
|
|||
StyleAnimationValue mGecko;
|
||||
RefPtr<RawServoAnimationValue> mServo;
|
||||
|
||||
bool operator==(const AnimationValue& aOther) const
|
||||
{
|
||||
// FIXME: Bug 1337229: add a deep == impl for RawServoAnimationValue.
|
||||
return mGecko == aOther.mGecko && mServo == aOther.mServo;
|
||||
}
|
||||
inline bool operator==(const AnimationValue& aOther) const;
|
||||
|
||||
bool IsNull() const { return mGecko.IsNull() && !mServo; }
|
||||
|
||||
|
|
|
@ -11,6 +11,16 @@
|
|||
|
||||
namespace mozilla {
|
||||
|
||||
bool
|
||||
AnimationValue::operator==(const AnimationValue& aOther) const
|
||||
{
|
||||
// mGecko and mServo are mutual exclusive, one of them must be null
|
||||
if (mServo) {
|
||||
return Servo_AnimationValue_DeepEqual(mServo, aOther.mServo);
|
||||
}
|
||||
return mGecko == aOther.mGecko;
|
||||
}
|
||||
|
||||
float
|
||||
AnimationValue::GetOpacity() const
|
||||
{
|
||||
|
|
|
@ -179,11 +179,51 @@ nsStyleContext::FinishConstruction(bool aSkipParentDisplayBasedStyleFixup)
|
|||
#undef eStyleStruct_LastItem
|
||||
}
|
||||
|
||||
void
|
||||
nsStyleContext::EnsureStructsForServo(const nsStyleContext* aOldContext)
|
||||
{
|
||||
MOZ_ASSERT(aOldContext);
|
||||
MOZ_ASSERT(mSource.IsServoComputedValues() &&
|
||||
aOldContext->mSource.IsServoComputedValues());
|
||||
|
||||
// NOTE(emilio): We could do better here. We only call Style##name_() because
|
||||
// we need to run FinishStyle, but otherwise this is only a bitwise or.
|
||||
//
|
||||
// We could reduce the FFI traffic we do only doing it for structs that have
|
||||
// non-trivial FinishStyle.
|
||||
#define STYLE_STRUCT(name_, checkdata_cb) \
|
||||
if (aOldContext->mBits & NS_STYLE_INHERIT_BIT(name_)) { \
|
||||
mozilla::Unused << Style##name_(); \
|
||||
}
|
||||
|
||||
#include "nsStyleStructList.h"
|
||||
|
||||
#undef STYLE_STRUCT
|
||||
|
||||
#ifdef DEBUG
|
||||
auto oldMask = aOldContext->mBits & NS_STYLE_INHERIT_MASK;
|
||||
auto newMask = mBits & NS_STYLE_INHERIT_MASK;
|
||||
MOZ_ASSERT((oldMask & newMask) == oldMask,
|
||||
"Should have at least as many structs computed as the "
|
||||
"old context!");
|
||||
#endif
|
||||
}
|
||||
|
||||
nsStyleContext::~nsStyleContext()
|
||||
{
|
||||
NS_ASSERTION((nullptr == mChild) && (nullptr == mEmptyChild), "destructing context with children");
|
||||
MOZ_ASSERT_IF(mSource.IsServoComputedValues(), !mCachedResetData);
|
||||
|
||||
#ifdef DEBUG
|
||||
if (mSource.IsServoComputedValues()) {
|
||||
MOZ_ASSERT(!mCachedResetData,
|
||||
"Servo shouldn't cache reset structs in nsStyleContext");
|
||||
for (const auto* data : mCachedInheritedData.mStyleStructs) {
|
||||
MOZ_ASSERT(!data,
|
||||
"Servo shouldn't cache inherit structs in nsStyleContext");
|
||||
}
|
||||
}
|
||||
|
||||
if (sExpensiveStyleStructAssertionsEnabled) {
|
||||
// Assert that the style structs we are about to destroy are not referenced
|
||||
// anywhere else in the style context tree. These checks are expensive,
|
||||
|
@ -586,6 +626,8 @@ nsStyleContext::CreateEmptyStyleData(const nsStyleStructID& aSID)
|
|||
void
|
||||
nsStyleContext::SetStyle(nsStyleStructID aSID, void* aStruct)
|
||||
{
|
||||
MOZ_ASSERT(!mSource.IsServoComputedValues(),
|
||||
"Servo shouldn't cache style structs in the style context!");
|
||||
// This method should only be called from nsRuleNode! It is not a public
|
||||
// method!
|
||||
|
||||
|
|
|
@ -384,6 +384,14 @@ public:
|
|||
#include "nsStyleStructList.h"
|
||||
#undef STYLE_STRUCT
|
||||
|
||||
/**
|
||||
* Ensures that this context's computed struct list is at least the old
|
||||
* context's.
|
||||
*
|
||||
* aOldContext must not be null.
|
||||
*/
|
||||
void EnsureStructsForServo(const nsStyleContext* aOldContext);
|
||||
|
||||
/**
|
||||
* Compute the style changes needed during restyling when this style
|
||||
* context is being replaced by aNewContext. (This is nonsymmetric since
|
||||
|
@ -601,119 +609,119 @@ private:
|
|||
#define STYLE_STRUCT_INHERITED(name_, checkdata_cb_) \
|
||||
template<bool aComputeData> \
|
||||
const nsStyle##name_ * DoGetStyle##name_() { \
|
||||
const nsStyle##name_ * cachedData = \
|
||||
static_cast<nsStyle##name_*>( \
|
||||
mCachedInheritedData.mStyleStructs[eStyleStruct_##name_]); \
|
||||
if (cachedData) /* Have it cached already, yay */ \
|
||||
return cachedData; \
|
||||
if (!aComputeData) { \
|
||||
/* We always cache inherited structs on the context when we */ \
|
||||
/* compute them. */ \
|
||||
if (mSource.IsGeckoRuleNode()) { \
|
||||
const nsStyle##name_ * cachedData = \
|
||||
static_cast<nsStyle##name_*>( \
|
||||
mCachedInheritedData.mStyleStructs[eStyleStruct_##name_]); \
|
||||
if (cachedData) /* Have it cached already, yay */ \
|
||||
return cachedData; \
|
||||
if (!aComputeData) { \
|
||||
/* We always cache inherited structs on the context when we */\
|
||||
/* compute them. */ \
|
||||
return nullptr; \
|
||||
} \
|
||||
/* Have the rulenode deal */ \
|
||||
AUTO_CHECK_DEPENDENCY(eStyleStruct_##name_); \
|
||||
const nsStyle##name_ * newData = \
|
||||
mSource.AsGeckoRuleNode()-> \
|
||||
GetStyle##name_<aComputeData>(this, mBits); \
|
||||
/* always cache inherited data on the style context; the rule */\
|
||||
/* node set the bit in mBits for us if needed. */ \
|
||||
mCachedInheritedData.mStyleStructs[eStyleStruct_##name_] = \
|
||||
const_cast<nsStyle##name_ *>(newData); \
|
||||
return newData; \
|
||||
} \
|
||||
/** \
|
||||
* Always forward to the parent to grab the inherited style struct\
|
||||
* we're a text node. \
|
||||
* \
|
||||
* This causes the parent element's style context to cache any \
|
||||
* inherited structs we request for a text node, which means we \
|
||||
* don't have to compute change hints for the text node, as \
|
||||
* handling the change on the parent element is sufficient. \
|
||||
* \
|
||||
* Note that adding the inherit bit is ok, because the struct \
|
||||
* pointer returned by the parent and the child is owned by \
|
||||
* Servo. This is fine if the pointers are the same (as it \
|
||||
* should, read below), because both style context sources will \
|
||||
* hold it. \
|
||||
* \
|
||||
* In the case of a mishandled frame, we could end up with the \
|
||||
* pointer to and old parent style, but that's fine too, since \
|
||||
* the parent style context will remain alive until we reframe, \
|
||||
* in which case we'll discard both style contexts. Also, we \
|
||||
* hold a strong reference to the parent style context, which \
|
||||
* makes it a non-issue. \
|
||||
* \
|
||||
* Also, note that the assertion below should be true, except \
|
||||
* for those frames we still don't handle correctly, like \
|
||||
* anonymous table wrappers, in which case the pointers will \
|
||||
* differ. \
|
||||
* \
|
||||
* That means we're not going to restyle correctly text frames \
|
||||
* of anonymous table wrappers, for example. It's kind of \
|
||||
* embarrassing, but I think it's not worth it to add more \
|
||||
* logic here unconditionally, given that's going to be fixed. \
|
||||
* \
|
||||
* TODO(emilio): Convert to a strong assertion once we support \
|
||||
* all kinds of random frames. In fact, this can be a great \
|
||||
* assertion to debug them. \
|
||||
*/ \
|
||||
if (mPseudoTag == nsCSSAnonBoxes::mozText) { \
|
||||
MOZ_ASSERT(mParent); \
|
||||
const nsStyle##name_* data = \
|
||||
mParent->DoGetStyle##name_<aComputeData>(); \
|
||||
NS_WARNING_ASSERTION(!data || \
|
||||
data == Servo_GetStyle##name_(mSource.AsServoComputedValues()), \
|
||||
"bad data"); \
|
||||
return data; \
|
||||
} \
|
||||
\
|
||||
const bool needToCompute = !(mBits & NS_STYLE_INHERIT_BIT(name_));\
|
||||
if (!aComputeData && needToCompute) { \
|
||||
return nullptr; \
|
||||
} \
|
||||
/* Have the rulenode deal */ \
|
||||
AUTO_CHECK_DEPENDENCY(eStyleStruct_##name_); \
|
||||
const nsStyle##name_ * newData; \
|
||||
if (mSource.IsGeckoRuleNode()) { \
|
||||
newData = mSource.AsGeckoRuleNode()-> \
|
||||
GetStyle##name_<aComputeData>(this, mBits); \
|
||||
} else { \
|
||||
/** \
|
||||
* Reach the parent to grab the inherited style struct if \
|
||||
* we're a text node. \
|
||||
* \
|
||||
* This causes the parent element's style context to cache any \
|
||||
* inherited structs we request for a text node, which means we \
|
||||
* don't have to compute change hints for the text node, as \
|
||||
* handling the change on the parent element is sufficient. \
|
||||
* \
|
||||
* Note that adding the inherit bit is ok, because the struct \
|
||||
* pointer returned by the parent and the child is owned by \
|
||||
* Servo. This is fine if the pointers are the same (as it \
|
||||
* should, read below), because both style context sources will \
|
||||
* hold it. \
|
||||
* \
|
||||
* In the case of a mishandled frame, we could end up with the \
|
||||
* pointer to and old parent style, but that's fine too, since \
|
||||
* the parent style context will remain alive until we reframe, \
|
||||
* in which case we'll discard both style contexts. Also, we \
|
||||
* hold a strong reference to the parent style context, which \
|
||||
* makes it a non-issue. \
|
||||
* \
|
||||
* Also, note that the assertion below should be true, except \
|
||||
* for those frames we still don't handle correctly, like \
|
||||
* anonymous table wrappers, in which case the pointers will \
|
||||
* differ. \
|
||||
* \
|
||||
* That means we're not going to restyle correctly text frames \
|
||||
* of anonymous table wrappers, for example. It's kind of \
|
||||
* embarrassing, but I think it's not worth it to add more \
|
||||
* logic here unconditionally, given that's going to be fixed. \
|
||||
* \
|
||||
* TODO(emilio): Convert to a strong assertion once we support \
|
||||
* all kinds of random frames. In fact, this can be a great \
|
||||
* assertion to debug them. \
|
||||
*/ \
|
||||
if (mPseudoTag == nsCSSAnonBoxes::mozText) { \
|
||||
MOZ_ASSERT(mParent); \
|
||||
newData = mParent->DoGetStyle##name_<true>(); \
|
||||
NS_WARNING_ASSERTION( \
|
||||
newData == Servo_GetStyle##name_(mSource.AsServoComputedValues()), \
|
||||
"bad newData"); \
|
||||
} else { \
|
||||
newData = \
|
||||
Servo_GetStyle##name_(mSource.AsServoComputedValues()); \
|
||||
} \
|
||||
/* perform any remaining main thread work on the struct */ \
|
||||
const_cast<nsStyle##name_*>(newData)->FinishStyle(PresContext());\
|
||||
\
|
||||
const nsStyle##name_* data = \
|
||||
Servo_GetStyle##name_(mSource.AsServoComputedValues()); \
|
||||
/* perform any remaining main thread work on the struct */ \
|
||||
if (needToCompute) { \
|
||||
const_cast<nsStyle##name_*>(data)->FinishStyle(PresContext()); \
|
||||
/* the Servo-backed StyleContextSource owns the struct */ \
|
||||
AddStyleBit(NS_STYLE_INHERIT_BIT(name_)); \
|
||||
} \
|
||||
/* always cache inherited data on the style context; the rule */ \
|
||||
/* node set the bit in mBits for us if needed. */ \
|
||||
mCachedInheritedData.mStyleStructs[eStyleStruct_##name_] = \
|
||||
const_cast<nsStyle##name_ *>(newData); \
|
||||
return newData; \
|
||||
return data; \
|
||||
}
|
||||
|
||||
#define STYLE_STRUCT_RESET(name_, checkdata_cb_) \
|
||||
template<bool aComputeData> \
|
||||
const nsStyle##name_ * DoGetStyle##name_() { \
|
||||
if (mCachedResetData) { \
|
||||
const nsStyle##name_ * cachedData = \
|
||||
static_cast<nsStyle##name_*>( \
|
||||
mCachedResetData->mStyleStructs[eStyleStruct_##name_]); \
|
||||
if (cachedData) /* Have it cached already, yay */ \
|
||||
return cachedData; \
|
||||
} \
|
||||
/* Have the rulenode deal */ \
|
||||
AUTO_CHECK_DEPENDENCY(eStyleStruct_##name_); \
|
||||
const nsStyle##name_ * newData; \
|
||||
if (mSource.IsGeckoRuleNode()) { \
|
||||
newData = mSource.AsGeckoRuleNode()-> \
|
||||
if (mCachedResetData) { \
|
||||
const nsStyle##name_ * cachedData = \
|
||||
static_cast<nsStyle##name_*>( \
|
||||
mCachedResetData->mStyleStructs[eStyleStruct_##name_]); \
|
||||
if (cachedData) /* Have it cached already, yay */ \
|
||||
return cachedData; \
|
||||
} \
|
||||
/* Have the rulenode deal */ \
|
||||
AUTO_CHECK_DEPENDENCY(eStyleStruct_##name_); \
|
||||
return mSource.AsGeckoRuleNode()-> \
|
||||
GetStyle##name_<aComputeData>(this); \
|
||||
} else { \
|
||||
newData = \
|
||||
Servo_GetStyle##name_(mSource.AsServoComputedValues()); \
|
||||
/* perform any remaining main thread work on the struct */ \
|
||||
const_cast<nsStyle##name_*>(newData)->FinishStyle(PresContext());\
|
||||
/* The Servo-backed StyleContextSource owns the struct. \
|
||||
* \
|
||||
* XXXbholley: Unconditionally caching reset structs here \
|
||||
* defeats the memory optimization where we lazily allocate \
|
||||
* mCachedResetData, so that we can avoid performing an FFI \
|
||||
* call each time we want to get the style structs. We should \
|
||||
* measure the tradeoffs at some point. If the FFI overhead is \
|
||||
* low and the memory win significant, we should consider \
|
||||
* _always_ grabbing the struct over FFI, and potentially \
|
||||
* giving mCachedInheritedData the same treatment. \
|
||||
* \
|
||||
* Note that there is a similar comment in StyleData(). \
|
||||
*/ \
|
||||
AddStyleBit(NS_STYLE_INHERIT_BIT(name_)); \
|
||||
SetStyle(eStyleStruct_##name_, \
|
||||
const_cast<nsStyle##name_*>(newData)); \
|
||||
} \
|
||||
return newData; \
|
||||
const bool needToCompute = !(mBits & NS_STYLE_INHERIT_BIT(name_));\
|
||||
if (!aComputeData && needToCompute) { \
|
||||
return nullptr; \
|
||||
} \
|
||||
const nsStyle##name_* data = \
|
||||
Servo_GetStyle##name_(mSource.AsServoComputedValues()); \
|
||||
/* perform any remaining main thread work on the struct */ \
|
||||
if (needToCompute) { \
|
||||
const_cast<nsStyle##name_*>(data)->FinishStyle(PresContext()); \
|
||||
/* the Servo-backed StyleContextSource owns the struct */ \
|
||||
AddStyleBit(NS_STYLE_INHERIT_BIT(name_)); \
|
||||
} \
|
||||
return data; \
|
||||
}
|
||||
#include "nsStyleStructList.h"
|
||||
#undef STYLE_STRUCT_RESET
|
||||
|
|
|
@ -314,13 +314,8 @@ Any line which doesn't follow the format above would be ignored like comment.
|
|||
* test_initial_computation.html `counter-increment` [4]
|
||||
* test_initial_storage.html `counter-increment` [4]
|
||||
* test_value_storage.html `counter-increment` [30]
|
||||
* clip property
|
||||
* test_compute_data_with_start_struct.html `clip` [2]
|
||||
* test_inherit_computation.html `clip` [2]
|
||||
* test_inherit_storage.html `clip` [2]
|
||||
* test_initial_computation.html `'clip'` [4]
|
||||
* test_initial_storage.html `clip` [4]
|
||||
* test_value_storage.html `on 'clip'` [12]
|
||||
* clip property: servo/servo#15729
|
||||
* test_value_storage.html `should be idempotent for 'clip` [4]
|
||||
* font-feature-settings property
|
||||
* test_compute_data_with_start_struct.html `font-feature-settings` [2]
|
||||
* test_inherit_computation.html `font-feature-settings` [8]
|
||||
|
@ -401,7 +396,7 @@ Any line which doesn't follow the format above would be ignored like comment.
|
|||
* ... `mask-repeat` [24]
|
||||
* lack glue for function values of content property bug 1296477
|
||||
* test_rule_insertion.html `decimal counter` [3]
|
||||
* test_value_storage.html `'content` [41]
|
||||
* test_value_storage.html `'content` [40]
|
||||
* SVG-in-OpenType values not supported servo/servo#15211
|
||||
* test_value_storage.html `context-` [2]
|
||||
* writing-mode: sideways-{lr,rl} and SVG values servo/servo#15213
|
||||
|
@ -436,6 +431,8 @@ Any line which doesn't follow the format above would be ignored like comment.
|
|||
* test_property_syntax_errors.html `transform-origin'` [50]
|
||||
* ... `perspective-origin'` [30]
|
||||
* test_property_syntax_errors.html `'text-overflow'`: servo/servo#15491 [8]
|
||||
* -moz-alt-content parsing is wrong: servo/servo#15726
|
||||
* test_property_syntax_errors.html `-moz-alt-content` [4]
|
||||
* Incorrect serialization
|
||||
* border-radius and -moz-outline-radius shorthand servo/servo#15169
|
||||
* test_priority_preservation.html `border-radius` [4]
|
||||
|
@ -489,7 +486,6 @@ Any line which doesn't follow the format above would be ignored like comment.
|
|||
* rounding issue
|
||||
* test_value_storage.html `33.5833px` [2]
|
||||
* ... `0.766667px` [2]
|
||||
* ... `75.5667px` [2]
|
||||
* ... `105.333px` [2]
|
||||
* test_viewport_units.html: viewport units support [12]
|
||||
* test_value_storage.html `: var(--a)`: extra whitespace is added for shorthand with variables servo/servo#15295 [*]
|
||||
|
@ -517,7 +513,7 @@ Any line which doesn't follow the format above would be ignored like comment.
|
|||
* ... ` 2 ` [26]
|
||||
* ... `: 5 ` [84]
|
||||
* ... `border-spacing: ` [6]
|
||||
* ... `rect(1, ` [1]
|
||||
* ... `rect(1, ` [2]
|
||||
* test_pseudoelement_parsing.html: support parsing some pseudo-classes on some pseudo-elements [5]
|
||||
* Unit should be preserved after parsing servo/servo#15346
|
||||
* test_units_length.html [5]
|
||||
|
|
|
@ -52,14 +52,14 @@ class ReftestFormatter(TbplFormatter):
|
|||
if "reftest_screenshots" in extra:
|
||||
screenshots = extra["reftest_screenshots"]
|
||||
image_1 = screenshots[0]["screenshot"]
|
||||
image_2 = screenshots[2]["screenshot"]
|
||||
|
||||
if len(screenshots) == 3:
|
||||
image_2 = screenshots[2]["screenshot"]
|
||||
output_text += ("\nREFTEST IMAGE 1 (TEST): data:image/png;base64,%s\n"
|
||||
"REFTEST IMAGE 2 (REFERENCE): data:image/png;base64,%s") % (
|
||||
image_1, image_2)
|
||||
elif len(screenshots) == 1:
|
||||
output_text += "\nREFTEST IMAGE: data:image/png;base64,%(image1)s" % image_1
|
||||
output_text += "\nREFTEST IMAGE: data:image/png;base64,%s" % image_1
|
||||
|
||||
output_text += "\nREFTEST TEST-END | %s" % test
|
||||
return "%s\n" % output_text
|
||||
|
|
|
@ -1762,7 +1762,12 @@ function RecordResult(testRunTime, errorMsg, scriptResults)
|
|||
message += (", max difference: " + extra.max_difference +
|
||||
", number of differing pixels: " + differences);
|
||||
} else {
|
||||
extra.image1 = gCanvas1.toDataURL();
|
||||
var image1 = gCanvas1.toDataURL();
|
||||
extra.reftest_screenshots = [
|
||||
{url:gURLs[0].identifier[0],
|
||||
screenshot: image1.slice(image1.indexOf(",") + 1)}
|
||||
];
|
||||
extra.image1 = image1;
|
||||
}
|
||||
}
|
||||
logger.testEnd(gURLs[0].identifier, output.s[0], output.s[1], message, null, extra);
|
||||
|
|
|
@ -13,3 +13,4 @@ Landry Breuil <landry@openbsd.org>
|
|||
Jacek Caban <jacek@codeweavers.com>
|
||||
Paul Hancock <Paul.Hancock.17041993@live.com>
|
||||
Ted Mielczarek <ted@mielczarek.org>
|
||||
Chun-Min Chang <chun.m.chang@gmail.com>
|
||||
|
|
|
@ -5,4 +5,4 @@ Makefile.in build files for the Mozilla build system.
|
|||
|
||||
The cubeb git repository is: git://github.com/kinetiknz/cubeb.git
|
||||
|
||||
The git commit ID used was 8977c13bf0dab9a7716501ae92ca5945fe4e1dae.
|
||||
The git commit ID used was 25b593fa59d0c284ff2de54b10db927d48579f5e.
|
||||
|
|
|
@ -35,18 +35,12 @@
|
|||
#include <vector>
|
||||
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 101000
|
||||
typedef UInt32 AudioFormatFlags;
|
||||
typedef UInt32 AudioFormatFlags;
|
||||
#endif
|
||||
|
||||
#define AU_OUT_BUS 0
|
||||
#define AU_IN_BUS 1
|
||||
|
||||
#define fieldOffset(type, field) ((size_t) &((type *) 0)->field)
|
||||
|
||||
#define PRINT_ERROR_CODE(str, r) do { \
|
||||
LOG("System call failed: %s (rv: %d)", str, (int) r); \
|
||||
} while(0)
|
||||
|
||||
const char * DISPATCH_QUEUE_LABEL = "org.mozilla.cubeb";
|
||||
|
||||
#ifdef ALOGV
|
||||
|
@ -72,7 +66,6 @@ static int audiounit_setup_stream(cubeb_stream *stm);
|
|||
static int audiounit_create_unit(AudioUnit * unit, bool is_input,
|
||||
const cubeb_stream_params * /* stream_params */,
|
||||
AudioDeviceID device);
|
||||
static cubeb_channel_layout audiounit_get_channel_layout(bool preferred);
|
||||
|
||||
extern cubeb_ops const audiounit_ops;
|
||||
|
||||
|
@ -88,6 +81,8 @@ struct cubeb {
|
|||
std::vector<AudioObjectID> devtype_device_array;
|
||||
// The queue is asynchronously deallocated once all references to it are released
|
||||
dispatch_queue_t serial_queue = dispatch_queue_create(DISPATCH_QUEUE_LABEL, DISPATCH_QUEUE_SERIAL);
|
||||
// Current used channel layout
|
||||
cubeb_channel_layout layout;
|
||||
};
|
||||
|
||||
struct auto_array_wrapper {
|
||||
|
@ -100,6 +95,53 @@ struct auto_array_wrapper {
|
|||
virtual ~auto_array_wrapper() {}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct auto_array_wrapper_impl : public auto_array_wrapper {
|
||||
explicit auto_array_wrapper_impl(uint32_t size)
|
||||
: ar(size)
|
||||
{}
|
||||
|
||||
void push(void * elements, size_t length) override {
|
||||
auto_lock l(lock);
|
||||
ar.push(static_cast<T *>(elements), length);
|
||||
}
|
||||
|
||||
size_t length() override {
|
||||
auto_lock l(lock);
|
||||
return ar.length();
|
||||
}
|
||||
|
||||
void push_silence(size_t length) override {
|
||||
auto_lock l(lock);
|
||||
ar.push_silence(length);
|
||||
}
|
||||
|
||||
bool pop(size_t length) override {
|
||||
auto_lock l(lock);
|
||||
return ar.pop(nullptr, length);
|
||||
}
|
||||
|
||||
// XXX: Taking the lock here is pointless.
|
||||
void * data() override {
|
||||
auto_lock l(lock);
|
||||
return ar.data();
|
||||
}
|
||||
|
||||
void clear() override {
|
||||
auto_lock l(lock);
|
||||
ar.clear();
|
||||
}
|
||||
|
||||
~auto_array_wrapper_impl() {
|
||||
auto_lock l(lock);
|
||||
ar.clear();
|
||||
}
|
||||
|
||||
private:
|
||||
owned_critical_section lock;
|
||||
auto_array<T> ar;
|
||||
};
|
||||
|
||||
class auto_channel_layout
|
||||
{
|
||||
public:
|
||||
|
@ -148,58 +190,22 @@ private:
|
|||
AudioChannelLayout * layout;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct auto_array_wrapper_impl : public auto_array_wrapper {
|
||||
explicit auto_array_wrapper_impl(uint32_t size)
|
||||
: ar(size)
|
||||
{}
|
||||
|
||||
void push(void * elements, size_t length) override {
|
||||
auto_lock l(lock);
|
||||
ar.push(static_cast<T *>(elements), length);
|
||||
}
|
||||
|
||||
size_t length() override {
|
||||
auto_lock l(lock);
|
||||
return ar.length();
|
||||
}
|
||||
|
||||
void push_silence(size_t length) override {
|
||||
auto_lock l(lock);
|
||||
ar.push_silence(length);
|
||||
}
|
||||
|
||||
bool pop(size_t length) override {
|
||||
auto_lock l(lock);
|
||||
return ar.pop(nullptr, length);
|
||||
}
|
||||
|
||||
// XXX: Taking the lock here is pointless.
|
||||
void * data() override {
|
||||
auto_lock l(lock);
|
||||
return ar.data();
|
||||
}
|
||||
|
||||
void clear() override {
|
||||
auto_lock l(lock);
|
||||
ar.clear();
|
||||
}
|
||||
|
||||
~auto_array_wrapper_impl() {
|
||||
auto_lock l(lock);
|
||||
ar.clear();
|
||||
}
|
||||
|
||||
private:
|
||||
owned_critical_section lock;
|
||||
auto_array<T> ar;
|
||||
};
|
||||
|
||||
enum io_side {
|
||||
INPUT,
|
||||
OUTPUT,
|
||||
};
|
||||
|
||||
static char const *
|
||||
to_string(io_side side)
|
||||
{
|
||||
switch (side) {
|
||||
case INPUT:
|
||||
return "input";
|
||||
case OUTPUT:
|
||||
return "output";
|
||||
}
|
||||
}
|
||||
|
||||
struct cubeb_stream {
|
||||
explicit cubeb_stream(cubeb * context);
|
||||
|
||||
|
@ -378,7 +384,7 @@ audiounit_render_input(cubeb_stream * stm,
|
|||
&input_buffer_list);
|
||||
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitRender", r);
|
||||
LOG("AudioUnitRender rv=%d", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -616,7 +622,7 @@ audiounit_get_output_device_id(AudioDeviceID * device_id)
|
|||
&size,
|
||||
device_id);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("output_device_id", r);
|
||||
LOG("output_device_id rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -801,7 +807,7 @@ audiounit_install_device_changed_callback(cubeb_stream * stm)
|
|||
r = audiounit_add_listener(stm, output_dev_id, kAudioDevicePropertyDataSource,
|
||||
kAudioDevicePropertyScopeOutput, &audiounit_property_listener_callback);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioObjectAddPropertyListener/output/kAudioDevicePropertyDataSource", r);
|
||||
LOG("AudioObjectAddPropertyListener/output/kAudioDevicePropertyDataSource rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -812,7 +818,7 @@ audiounit_install_device_changed_callback(cubeb_stream * stm)
|
|||
r = audiounit_add_listener(stm, kAudioObjectSystemObject, kAudioHardwarePropertyDefaultOutputDevice,
|
||||
kAudioObjectPropertyScopeGlobal, &audiounit_property_listener_callback);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioObjectAddPropertyListener/output/kAudioHardwarePropertyDefaultOutputDevice", r);
|
||||
LOG("AudioObjectAddPropertyListener/output/kAudioHardwarePropertyDefaultOutputDevice rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -828,7 +834,7 @@ audiounit_install_device_changed_callback(cubeb_stream * stm)
|
|||
r = audiounit_add_listener(stm, input_dev_id, kAudioDevicePropertyDataSource,
|
||||
kAudioDevicePropertyScopeInput, &audiounit_property_listener_callback);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioObjectAddPropertyListener/input/kAudioDevicePropertyDataSource", r);
|
||||
LOG("AudioObjectAddPropertyListener/input/kAudioDevicePropertyDataSource rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -836,7 +842,7 @@ audiounit_install_device_changed_callback(cubeb_stream * stm)
|
|||
r = audiounit_add_listener(stm, kAudioObjectSystemObject, kAudioHardwarePropertyDefaultInputDevice,
|
||||
kAudioObjectPropertyScopeGlobal, &audiounit_property_listener_callback);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioObjectAddPropertyListener/input/kAudioHardwarePropertyDefaultInputDevice", r);
|
||||
LOG("AudioObjectAddPropertyListener/input/kAudioHardwarePropertyDefaultInputDevice rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -846,7 +852,7 @@ audiounit_install_device_changed_callback(cubeb_stream * stm)
|
|||
r = audiounit_add_listener(stm, dev, kAudioDevicePropertyDeviceIsAlive,
|
||||
kAudioObjectPropertyScopeGlobal, &audiounit_property_listener_callback);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioObjectAddPropertyListener/input/kAudioDevicePropertyDeviceIsAlive", r);
|
||||
LOG("AudioObjectAddPropertyListener/input/kAudioDevicePropertyDeviceIsAlive rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -904,7 +910,7 @@ audiounit_uninstall_device_changed_callback(cubeb_stream * stm)
|
|||
r = audiounit_remove_listener(stm, dev, kAudioDevicePropertyDeviceIsAlive,
|
||||
kAudioObjectPropertyScopeGlobal, &audiounit_property_listener_callback);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioObjectRemovePropertyListener/input/kAudioDevicePropertyDeviceIsAlive", r);
|
||||
LOG("AudioObjectRemovePropertyListener/input/kAudioDevicePropertyDeviceIsAlive rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -939,7 +945,7 @@ audiounit_get_acceptable_latency_range(AudioValueRange * latency_range)
|
|||
&size,
|
||||
latency_range);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioObjectGetPropertyData/buffer size range", r);
|
||||
LOG("AudioObjectGetPropertyData/buffer size range rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1002,7 +1008,7 @@ audiounit_get_max_channel_count(cubeb * ctx, uint32_t * max_channels)
|
|||
&size,
|
||||
&stream_format);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioObjectPropertyAddress/StreamFormat", r);
|
||||
LOG("AudioObjectPropertyAddress/StreamFormat rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1071,17 +1077,111 @@ audiounit_get_preferred_sample_rate(cubeb * /* ctx */, uint32_t * rate)
|
|||
return CUBEB_OK;
|
||||
}
|
||||
|
||||
static cubeb_channel_layout
|
||||
audiounit_convert_channel_layout(AudioChannelLayout * layout)
|
||||
{
|
||||
if (layout->mChannelLayoutTag != kAudioChannelLayoutTag_UseChannelDescriptions) {
|
||||
// kAudioChannelLayoutTag_UseChannelBitmap
|
||||
// kAudioChannelLayoutTag_Mono
|
||||
// kAudioChannelLayoutTag_Stereo
|
||||
// ....
|
||||
LOG("Only handle UseChannelDescriptions for now.\n");
|
||||
return CUBEB_LAYOUT_UNDEFINED;
|
||||
}
|
||||
|
||||
cubeb_channel_map cm;
|
||||
cm.channels = layout->mNumberChannelDescriptions;
|
||||
for (UInt32 i = 0; i < layout->mNumberChannelDescriptions; ++i) {
|
||||
cm.map[i] = channel_label_to_cubeb_channel(layout->mChannelDescriptions[i].mChannelLabel);
|
||||
}
|
||||
|
||||
return cubeb_channel_map_to_layout(&cm);
|
||||
}
|
||||
|
||||
static cubeb_channel_layout
|
||||
audiounit_get_current_channel_layout(AudioUnit output_unit)
|
||||
{
|
||||
OSStatus rv = noErr;
|
||||
UInt32 size = 0;
|
||||
rv = AudioUnitGetPropertyInfo(output_unit,
|
||||
kAudioUnitProperty_AudioChannelLayout,
|
||||
kAudioUnitScope_Output,
|
||||
AU_OUT_BUS,
|
||||
&size,
|
||||
nullptr);
|
||||
if (rv != noErr) {
|
||||
LOG("AudioUnitGetPropertyInfo/kAudioUnitProperty_AudioChannelLayout rv=%d", rv);
|
||||
return CUBEB_LAYOUT_UNDEFINED;
|
||||
}
|
||||
assert(size > 0);
|
||||
|
||||
auto_channel_layout layout(size);
|
||||
rv = AudioUnitGetProperty(output_unit,
|
||||
kAudioUnitProperty_AudioChannelLayout,
|
||||
kAudioUnitScope_Output,
|
||||
AU_OUT_BUS,
|
||||
layout.get(),
|
||||
&size);
|
||||
if (rv != noErr) {
|
||||
LOG("AudioUnitGetProperty/kAudioUnitProperty_AudioChannelLayout rv=%d", rv);
|
||||
return CUBEB_LAYOUT_UNDEFINED;
|
||||
}
|
||||
|
||||
return audiounit_convert_channel_layout(layout.get());
|
||||
}
|
||||
|
||||
static cubeb_channel_layout
|
||||
audiounit_get_preferred_channel_layout()
|
||||
{
|
||||
OSStatus rv = noErr;
|
||||
UInt32 size = 0;
|
||||
AudioDeviceID id;
|
||||
|
||||
if (audiounit_get_output_device_id(&id) != CUBEB_OK) {
|
||||
return CUBEB_LAYOUT_UNDEFINED;
|
||||
}
|
||||
|
||||
AudioObjectPropertyAddress adr = { kAudioDevicePropertyPreferredChannelLayout,
|
||||
kAudioDevicePropertyScopeOutput,
|
||||
kAudioObjectPropertyElementMaster };
|
||||
rv = AudioObjectGetPropertyDataSize(id, &adr, 0, NULL, &size);
|
||||
if (rv != noErr) {
|
||||
return CUBEB_LAYOUT_UNDEFINED;
|
||||
}
|
||||
assert(size > 0);
|
||||
|
||||
auto_channel_layout layout(size);
|
||||
rv = AudioObjectGetPropertyData(id, &adr, 0, NULL, &size, layout.get());
|
||||
if (rv != noErr) {
|
||||
return CUBEB_LAYOUT_UNDEFINED;
|
||||
}
|
||||
|
||||
return audiounit_convert_channel_layout(layout.get());
|
||||
}
|
||||
|
||||
static int
|
||||
audiounit_get_preferred_channel_layout(cubeb * /* ctx */, cubeb_channel_layout * layout)
|
||||
audiounit_get_preferred_channel_layout(cubeb * ctx, cubeb_channel_layout * layout)
|
||||
{
|
||||
// The preferred layout is only returned when the connected sound device
|
||||
// (e.g. ASUS Xonar U7), has preferred layout setting.
|
||||
// For default output on Mac, there is no preferred channel layout,
|
||||
// so it might return UNDEFINED.
|
||||
// In that case, we should get the channel configuration directly.
|
||||
*layout = audiounit_get_channel_layout(true);
|
||||
*layout = audiounit_get_preferred_channel_layout();
|
||||
|
||||
// If the preferred channel layout is UNDEFINED, then we try to access the
|
||||
// current applied channel layout.
|
||||
if (*layout == CUBEB_LAYOUT_UNDEFINED) {
|
||||
*layout = audiounit_get_channel_layout(false);
|
||||
// If we already have at least one cubeb stream, then the current channel
|
||||
// layout must be updated. We can return it directly.
|
||||
if (ctx->active_streams) {
|
||||
return ctx->layout;
|
||||
}
|
||||
|
||||
// If there is no existed stream, then we create a default ouput unit and
|
||||
// use it to get the current used channel layout.
|
||||
AudioUnit output_unit;
|
||||
audiounit_create_unit(&output_unit, false, nullptr, 0);
|
||||
*layout = audiounit_get_current_channel_layout(output_unit);
|
||||
}
|
||||
|
||||
if (*layout == CUBEB_LAYOUT_UNDEFINED) {
|
||||
|
@ -1155,10 +1255,14 @@ audio_stream_desc_init(AudioStreamBasicDescription * ss,
|
|||
}
|
||||
|
||||
static int
|
||||
audiounit_layout_init(AudioUnit * unit,
|
||||
io_side side,
|
||||
const cubeb_stream_params * stream_params)
|
||||
audiounit_set_channel_layout(AudioUnit unit,
|
||||
io_side side,
|
||||
const cubeb_stream_params * stream_params)
|
||||
{
|
||||
if (side != OUTPUT) {
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
assert(stream_params->layout != CUBEB_LAYOUT_UNDEFINED);
|
||||
assert(stream_params->channels == CUBEB_CHANNEL_LAYOUT_MAPS[stream_params->layout].channels);
|
||||
|
||||
|
@ -1199,7 +1303,7 @@ audiounit_layout_init(AudioUnit * unit,
|
|||
// For those layouts that can't be matched to coreaudio's predefined layout,
|
||||
// we use customized layout.
|
||||
if (layout.get()->mChannelLayoutTag == kAudioChannelLayoutTag_Unknown) {
|
||||
size_t size = fieldOffset(AudioChannelLayout, mChannelDescriptions[stream_params->channels]);
|
||||
size_t size = offsetof(AudioChannelLayout, mChannelDescriptions[stream_params->channels]);
|
||||
layout.reset(size);
|
||||
layout.get()->mChannelLayoutTag = kAudioChannelLayoutTag_UseChannelDescriptions;
|
||||
layout.get()->mNumberChannelDescriptions = stream_params->channels;
|
||||
|
@ -1210,24 +1314,38 @@ audiounit_layout_init(AudioUnit * unit,
|
|||
}
|
||||
}
|
||||
|
||||
r = AudioUnitSetProperty(*unit,
|
||||
r = AudioUnitSetProperty(unit,
|
||||
kAudioUnitProperty_AudioChannelLayout,
|
||||
side == INPUT ? kAudioUnitScope_Output : kAudioUnitScope_Input,
|
||||
side == INPUT ? AU_IN_BUS : AU_OUT_BUS,
|
||||
kAudioUnitScope_Input,
|
||||
AU_OUT_BUS,
|
||||
layout.get(),
|
||||
layout.size());
|
||||
if (r != noErr) {
|
||||
if (side == INPUT) {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/input/kAudioUnitProperty_AudioChannelLayout", r);
|
||||
} else {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/output/kAudioUnitProperty_AudioChannelLayout", r);
|
||||
}
|
||||
LOG("AudioUnitSetProperty/%s/kAudioUnitProperty_AudioChannelLayout rv=%d", to_string(side), r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
return CUBEB_OK;
|
||||
}
|
||||
|
||||
void
|
||||
audiounit_layout_init(cubeb_stream * stm, io_side side)
|
||||
{
|
||||
// We currently don't support the input layout setting.
|
||||
if (side == INPUT) {
|
||||
return;
|
||||
}
|
||||
|
||||
audiounit_set_channel_layout(stm->output_unit, OUTPUT, &stm->output_stream_params);
|
||||
|
||||
// Update the current used channel layout for the cubeb context.
|
||||
// Notice that this channel layout may be different from the layout we set above,
|
||||
// because OSX doesn't return error when the output device can NOT provide
|
||||
// our desired layout. Thus, we update the layout evertime when the cubeb_stream
|
||||
// is created and use it when we need to mix audio data.
|
||||
stm->context->layout = audiounit_get_current_channel_layout(stm->output_unit);
|
||||
}
|
||||
|
||||
static int
|
||||
audiounit_create_unit(AudioUnit * unit,
|
||||
bool is_input,
|
||||
|
@ -1267,7 +1385,7 @@ audiounit_create_unit(AudioUnit * unit,
|
|||
|
||||
rv = AudioComponentInstanceNew(comp, unit);
|
||||
if (rv != noErr) {
|
||||
PRINT_ERROR_CODE("AudioComponentInstanceNew", rv);
|
||||
LOG("AudioComponentInstanceNew rv=%d", rv);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1277,7 +1395,7 @@ audiounit_create_unit(AudioUnit * unit,
|
|||
is_input ? kAudioUnitScope_Input : kAudioUnitScope_Output,
|
||||
is_input ? AU_IN_BUS : AU_OUT_BUS, &enable, sizeof(UInt32));
|
||||
if (rv != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/kAudioOutputUnitProperty_EnableIO", rv);
|
||||
LOG("AudioUnitSetProperty/kAudioOutputUnitProperty_EnableIO rv=%d", rv);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1286,7 +1404,7 @@ audiounit_create_unit(AudioUnit * unit,
|
|||
is_input ? kAudioUnitScope_Output : kAudioUnitScope_Input,
|
||||
is_input ? AU_OUT_BUS : AU_IN_BUS, &enable, sizeof(UInt32));
|
||||
if (rv != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/kAudioOutputUnitProperty_EnableIO", rv);
|
||||
LOG("AudioUnitSetProperty/kAudioOutputUnitProperty_EnableIO rv=%d", rv);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1301,7 +1419,7 @@ audiounit_create_unit(AudioUnit * unit,
|
|||
is_input ? AU_IN_BUS : AU_OUT_BUS,
|
||||
&devid, sizeof(AudioDeviceID));
|
||||
if (rv != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/kAudioOutputUnitProperty_CurrentDevice", rv);
|
||||
LOG("AudioUnitSetProperty/kAudioOutputUnitProperty_CurrentDevice rv=%d", rv);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -1346,7 +1464,7 @@ audiounit_clamp_latency(cubeb_stream * stm, uint32_t latency_frames)
|
|||
&output_buffer_size,
|
||||
&size);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitGetProperty/output/kAudioDevicePropertyBufferFrameSize", r);
|
||||
LOG("AudioUnitGetProperty/output/kAudioDevicePropertyBufferFrameSize rv=%d", r);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1363,7 +1481,7 @@ audiounit_clamp_latency(cubeb_stream * stm, uint32_t latency_frames)
|
|||
&input_buffer_size,
|
||||
&size);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitGetProperty/input/kAudioDevicePropertyBufferFrameSize", r);
|
||||
LOG("AudioUnitGetProperty/input/kAudioDevicePropertyBufferFrameSize rv=%d", r);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1398,16 +1516,16 @@ audiounit_clamp_latency(cubeb_stream * stm, uint32_t latency_frames)
|
|||
static void
|
||||
buffer_size_changed_callback(void * inClientData,
|
||||
AudioUnit inUnit,
|
||||
AudioUnitPropertyID inPropertyID,
|
||||
AudioUnitScope inScope,
|
||||
AudioUnitElement inElement)
|
||||
AudioUnitPropertyID inPropertyID,
|
||||
AudioUnitScope inScope,
|
||||
AudioUnitElement inElement)
|
||||
{
|
||||
cubeb_stream * stm = (cubeb_stream *)inClientData;
|
||||
|
||||
AudioUnit au = inUnit;
|
||||
AudioUnitScope au_scope = kAudioUnitScope_Input;
|
||||
AudioUnitElement au_element = inElement;
|
||||
const char * au_type = "output";
|
||||
char const * au_type = "output";
|
||||
|
||||
if (au == stm->input_unit) {
|
||||
au_scope = kAudioUnitScope_Output;
|
||||
|
@ -1446,13 +1564,11 @@ audiounit_set_buffer_size(cubeb_stream * stm, uint32_t new_size_frames, io_side
|
|||
AudioUnit au = stm->output_unit;
|
||||
AudioUnitScope au_scope = kAudioUnitScope_Input;
|
||||
AudioUnitElement au_element = AU_OUT_BUS;
|
||||
const char * au_type = "output";
|
||||
|
||||
if (side == INPUT) {
|
||||
au = stm->input_unit;
|
||||
au_scope = kAudioUnitScope_Output;
|
||||
au_element = AU_IN_BUS;
|
||||
au_type = "input";
|
||||
}
|
||||
|
||||
uint32_t buffer_frames = 0;
|
||||
|
@ -1464,16 +1580,12 @@ audiounit_set_buffer_size(cubeb_stream * stm, uint32_t new_size_frames, io_side
|
|||
&buffer_frames,
|
||||
&size);
|
||||
if (r != noErr) {
|
||||
if (side == INPUT) {
|
||||
PRINT_ERROR_CODE("AudioUnitGetProperty/input/kAudioDevicePropertyBufferFrameSize", r);
|
||||
} else {
|
||||
PRINT_ERROR_CODE("AudioUnitGetProperty/output/kAudioDevicePropertyBufferFrameSize", r);
|
||||
}
|
||||
LOG("AudioUnitGetProperty/%s/kAudioDevicePropertyBufferFrameSize rv=%d", to_string(side), r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
if (new_size_frames == buffer_frames) {
|
||||
LOG("(%p) No need to update %s buffer size already %u frames", stm, au_type, buffer_frames);
|
||||
LOG("(%p) No need to update %s buffer size already %u frames", stm, to_string(side), buffer_frames);
|
||||
return CUBEB_OK;
|
||||
}
|
||||
|
||||
|
@ -1482,11 +1594,7 @@ audiounit_set_buffer_size(cubeb_stream * stm, uint32_t new_size_frames, io_side
|
|||
buffer_size_changed_callback,
|
||||
stm);
|
||||
if (r != noErr) {
|
||||
if (side == INPUT) {
|
||||
PRINT_ERROR_CODE("AudioUnitAddPropertyListener/input/kAudioDevicePropertyBufferFrameSize", r);
|
||||
} else {
|
||||
PRINT_ERROR_CODE("AudioUnitAddPropertyListener/output/kAudioDevicePropertyBufferFrameSize", r);
|
||||
}
|
||||
LOG("AudioUnitAddPropertyListener/%s/kAudioDevicePropertyBufferFrameSize rv=%d", to_string(side), r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1499,22 +1607,14 @@ audiounit_set_buffer_size(cubeb_stream * stm, uint32_t new_size_frames, io_side
|
|||
&new_size_frames,
|
||||
sizeof(new_size_frames));
|
||||
if (r != noErr) {
|
||||
if (side == INPUT) {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/input/kAudioDevicePropertyBufferFrameSize", r);
|
||||
} else {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/output/kAudioDevicePropertyBufferFrameSize", r);
|
||||
}
|
||||
LOG("AudioUnitSetProperty/%s/kAudioDevicePropertyBufferFrameSize rv=%d", to_string(side), r);
|
||||
|
||||
r = AudioUnitRemovePropertyListenerWithUserData(au,
|
||||
kAudioDevicePropertyBufferFrameSize,
|
||||
buffer_size_changed_callback,
|
||||
stm);
|
||||
if (r != noErr) {
|
||||
if (side == INPUT) {
|
||||
PRINT_ERROR_CODE("AudioUnitAddPropertyListener/input/kAudioDevicePropertyBufferFrameSize", r);
|
||||
} else {
|
||||
PRINT_ERROR_CODE("AudioUnitAddPropertyListener/output/kAudioDevicePropertyBufferFrameSize", r);
|
||||
}
|
||||
LOG("AudioUnitAddPropertyListener/%s/kAudioDevicePropertyBufferFrameSize rv=%d", to_string(side), r);
|
||||
}
|
||||
|
||||
return CUBEB_ERROR;
|
||||
|
@ -1536,11 +1636,7 @@ audiounit_set_buffer_size(cubeb_stream * stm, uint32_t new_size_frames, io_side
|
|||
buffer_size_changed_callback,
|
||||
stm);
|
||||
if (r != noErr) {
|
||||
if (side == INPUT) {
|
||||
PRINT_ERROR_CODE("AudioUnitAddPropertyListener/input/kAudioDevicePropertyBufferFrameSize", r);
|
||||
} else {
|
||||
PRINT_ERROR_CODE("AudioUnitAddPropertyListener/output/kAudioDevicePropertyBufferFrameSize", r);
|
||||
}
|
||||
LOG("AudioUnitAddPropertyListener/%s/kAudioDevicePropertyBufferFrameSize rv=%d", to_string(side), r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1549,7 +1645,7 @@ audiounit_set_buffer_size(cubeb_stream * stm, uint32_t new_size_frames, io_side
|
|||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
LOG("(%p) %s buffer size changed to %u frames.", stm, au_type, new_size_frames);
|
||||
LOG("(%p) %s buffer size changed to %u frames.", stm, to_string(side), new_size_frames);
|
||||
return CUBEB_OK;
|
||||
}
|
||||
|
||||
|
@ -1574,7 +1670,7 @@ audiounit_configure_input(cubeb_stream * stm)
|
|||
&input_hw_desc,
|
||||
&size);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitGetProperty/input/kAudioUnitProperty_StreamFormat", r);
|
||||
LOG("AudioUnitGetProperty/input/kAudioUnitProperty_StreamFormat rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
stm->input_hw_rate = input_hw_desc.mSampleRate;
|
||||
|
@ -1607,7 +1703,7 @@ audiounit_configure_input(cubeb_stream * stm)
|
|||
&src_desc,
|
||||
sizeof(AudioStreamBasicDescription));
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/input/kAudioUnitProperty_StreamFormat", r);
|
||||
LOG("AudioUnitSetProperty/input/kAudioUnitProperty_StreamFormat rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1619,7 +1715,7 @@ audiounit_configure_input(cubeb_stream * stm)
|
|||
&stm->input_buffer_frames,
|
||||
sizeof(UInt32));
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/input/kAudioUnitProperty_MaximumFramesPerSlice", r);
|
||||
LOG("AudioUnitSetProperty/input/kAudioUnitProperty_MaximumFramesPerSlice rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1644,7 +1740,7 @@ audiounit_configure_input(cubeb_stream * stm)
|
|||
&aurcbs_in,
|
||||
sizeof(aurcbs_in));
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/input/kAudioOutputUnitProperty_SetInputCallback", r);
|
||||
LOG("AudioUnitSetProperty/input/kAudioOutputUnitProperty_SetInputCallback rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
LOG("(%p) Input audiounit init successfully.", stm);
|
||||
|
@ -1681,7 +1777,7 @@ audiounit_configure_output(cubeb_stream * stm)
|
|||
&output_hw_desc,
|
||||
&size);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitGetProperty/output/kAudioUnitProperty_StreamFormat", r);
|
||||
LOG("AudioUnitGetProperty/output/kAudioUnitProperty_StreamFormat rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
stm->output_hw_rate = output_hw_desc.mSampleRate;
|
||||
|
@ -1694,7 +1790,7 @@ audiounit_configure_output(cubeb_stream * stm)
|
|||
&stm->output_desc,
|
||||
sizeof(AudioStreamBasicDescription));
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/output/kAudioUnitProperty_StreamFormat", r);
|
||||
LOG("AudioUnitSetProperty/output/kAudioUnitProperty_StreamFormat rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1712,7 +1808,7 @@ audiounit_configure_output(cubeb_stream * stm)
|
|||
&stm->latency_frames,
|
||||
sizeof(UInt32));
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/output/kAudioUnitProperty_MaximumFramesPerSlice", r);
|
||||
LOG("AudioUnitSetProperty/output/kAudioUnitProperty_MaximumFramesPerSlice rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1726,11 +1822,11 @@ audiounit_configure_output(cubeb_stream * stm)
|
|||
&aurcbs_out,
|
||||
sizeof(aurcbs_out));
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitSetProperty/output/kAudioUnitProperty_SetRenderCallback", r);
|
||||
LOG("AudioUnitSetProperty/output/kAudioUnitProperty_SetRenderCallback rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
audiounit_layout_init(&stm->output_unit, OUTPUT, &stm->output_stream_params);
|
||||
audiounit_layout_init(stm, OUTPUT);
|
||||
|
||||
LOG("(%p) Output audiounit init successfully.", stm);
|
||||
return CUBEB_OK;
|
||||
|
@ -1872,7 +1968,7 @@ audiounit_setup_stream(cubeb_stream * stm)
|
|||
if (stm->input_unit != NULL) {
|
||||
r = AudioUnitInitialize(stm->input_unit);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitInitialize/input", r);
|
||||
LOG("AudioUnitInitialize/input rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -1880,7 +1976,7 @@ audiounit_setup_stream(cubeb_stream * stm)
|
|||
if (stm->output_unit != NULL) {
|
||||
r = AudioUnitInitialize(stm->output_unit);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitInitialize/output", r);
|
||||
LOG("AudioUnitInitialize/output rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -2122,7 +2218,7 @@ audiounit_stream_get_latency(cubeb_stream * stm, uint32_t * latency)
|
|||
&unit_latency_sec,
|
||||
&size);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitGetProperty/kAudioUnitProperty_Latency", r);
|
||||
LOG("AudioUnitGetProperty/kAudioUnitProperty_Latency rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -2134,7 +2230,7 @@ audiounit_stream_get_latency(cubeb_stream * stm, uint32_t * latency)
|
|||
&size,
|
||||
&device_latency_frames);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitGetPropertyData/latency_frames", r);
|
||||
LOG("AudioUnitGetPropertyData/latency_frames rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -2146,7 +2242,7 @@ audiounit_stream_get_latency(cubeb_stream * stm, uint32_t * latency)
|
|||
&size,
|
||||
&device_safety_offset);
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitGetPropertyData/safety_offset", r);
|
||||
LOG("AudioUnitGetPropertyData/safety_offset rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
|
@ -2173,7 +2269,7 @@ int audiounit_stream_set_volume(cubeb_stream * stm, float volume)
|
|||
0, volume, 0);
|
||||
|
||||
if (r != noErr) {
|
||||
PRINT_ERROR_CODE("AudioUnitSetParameter/kHALOutputParam_Volume", r);
|
||||
LOG("AudioUnitSetParameter/kHALOutputParam_Volume rv=%d", r);
|
||||
return CUBEB_ERROR;
|
||||
}
|
||||
return CUBEB_OK;
|
||||
|
@ -2529,7 +2625,7 @@ audiounit_create_device_from_hwdev(AudioObjectID devid, cubeb_device_type type)
|
|||
ret->latency_lo = latency + range.mMinimum;
|
||||
ret->latency_hi = latency + range.mMaximum;
|
||||
} else {
|
||||
ret->latency_lo = 10 * ret->default_rate / 1000; /* Default to 10ms */
|
||||
ret->latency_lo = 10 * ret->default_rate / 1000; /* Default to 10ms */
|
||||
ret->latency_hi = 100 * ret->default_rate / 1000; /* Default to 100ms */
|
||||
}
|
||||
|
||||
|
@ -2722,69 +2818,6 @@ int audiounit_register_device_collection_changed(cubeb * context,
|
|||
return (ret == noErr) ? CUBEB_OK : CUBEB_ERROR;
|
||||
}
|
||||
|
||||
static cubeb_channel_layout
|
||||
audiounit_get_channel_layout(bool preferred)
|
||||
{
|
||||
OSStatus rv = noErr;
|
||||
|
||||
// Get the default ouput unit
|
||||
AudioUnit output_unit;
|
||||
audiounit_create_unit(&output_unit, false, nullptr, 0);
|
||||
|
||||
// Get the channel layout
|
||||
UInt32 size = 0;
|
||||
rv = AudioUnitGetPropertyInfo(output_unit,
|
||||
preferred ? kAudioDevicePropertyPreferredChannelLayout :
|
||||
kAudioUnitProperty_AudioChannelLayout,
|
||||
kAudioUnitScope_Output,
|
||||
AU_OUT_BUS,
|
||||
&size,
|
||||
nullptr);
|
||||
if (rv != noErr) {
|
||||
if (preferred) {
|
||||
PRINT_ERROR_CODE("AudioUnitGetPropertyInfo/kAudioDevicePropertyPreferredChannelLayout", rv);
|
||||
} else {
|
||||
PRINT_ERROR_CODE("AudioUnitGetPropertyInfo/kAudioUnitProperty_AudioChannelLayout", rv);
|
||||
}
|
||||
return CUBEB_LAYOUT_UNDEFINED;
|
||||
}
|
||||
assert(size > 0);
|
||||
|
||||
auto_channel_layout layout(size);
|
||||
rv = AudioUnitGetProperty(output_unit,
|
||||
preferred ? kAudioDevicePropertyPreferredChannelLayout :
|
||||
kAudioUnitProperty_AudioChannelLayout,
|
||||
kAudioUnitScope_Output,
|
||||
AU_OUT_BUS,
|
||||
layout.get(),
|
||||
&size);
|
||||
if (rv != noErr) {
|
||||
if (preferred) {
|
||||
PRINT_ERROR_CODE("AudioUnitGetProperty/kAudioDevicePropertyPreferredChannelLayout", rv);
|
||||
} else {
|
||||
PRINT_ERROR_CODE("AudioUnitGetProperty/kAudioUnitProperty_AudioChannelLayout", rv);
|
||||
}
|
||||
return CUBEB_LAYOUT_UNDEFINED;
|
||||
}
|
||||
|
||||
if (layout.get()->mChannelLayoutTag != kAudioChannelLayoutTag_UseChannelDescriptions) {
|
||||
// kAudioChannelLayoutTag_UseChannelBitmap
|
||||
// kAudioChannelLayoutTag_Mono
|
||||
// kAudioChannelLayoutTag_Stereo
|
||||
// ....
|
||||
LOG("Only handle UseChannelDescriptions for now.\n");
|
||||
return CUBEB_LAYOUT_UNDEFINED;
|
||||
}
|
||||
|
||||
cubeb_channel_map cm;
|
||||
cm.channels = layout.get()->mNumberChannelDescriptions;
|
||||
for (UInt32 i = 0; i < layout.get()->mNumberChannelDescriptions; ++i) {
|
||||
cm.map[i] = channel_label_to_cubeb_channel(layout.get()->mChannelDescriptions[i].mChannelLabel);
|
||||
}
|
||||
|
||||
return cubeb_channel_map_to_layout(&cm);
|
||||
}
|
||||
|
||||
cubeb_ops const audiounit_ops = {
|
||||
/*.init =*/ audiounit_init,
|
||||
/*.get_backend_id =*/ audiounit_get_backend_id,
|
||||
|
|
|
@ -857,6 +857,11 @@ wasapi_stream_render_loop(LPVOID stream)
|
|||
LOG("Unable to use mmcss to bump the render thread priority: %lx", GetLastError());
|
||||
}
|
||||
|
||||
// This has already been nulled out, simply exit.
|
||||
if (!emergency_bailout) {
|
||||
is_playing = false;
|
||||
}
|
||||
|
||||
/* WaitForMultipleObjects timeout can trigger in cases where we don't want to
|
||||
treat it as a timeout, such as across a system sleep/wake cycle. Trigger
|
||||
the timeout error handling only when the timeout_limit is reached, which is
|
||||
|
@ -1166,12 +1171,16 @@ bool stop_and_join_render_thread(cubeb_stream * stm)
|
|||
/* Something weird happened, leak the thread and continue the shutdown
|
||||
* process. */
|
||||
*(stm->emergency_bailout) = true;
|
||||
// We give the ownership to the rendering thread.
|
||||
stm->emergency_bailout = nullptr;
|
||||
LOG("Destroy WaitForSingleObject on thread timed out,"
|
||||
" leaking the thread: %lx", GetLastError());
|
||||
rv = false;
|
||||
}
|
||||
if (r == WAIT_FAILED) {
|
||||
*(stm->emergency_bailout) = true;
|
||||
// We give the ownership to the rendering thread.
|
||||
stm->emergency_bailout = nullptr;
|
||||
LOG("Destroy WaitForSingleObject on thread failed: %lx", GetLastError());
|
||||
rv = false;
|
||||
}
|
||||
|
@ -1599,8 +1608,15 @@ int setup_wasapi_stream(cubeb_stream * stm)
|
|||
// This delays the input side slightly, but allow to not glitch when no input
|
||||
// is available when calling into the resampler to call the callback: the input
|
||||
// refill event will be set shortly after to compensate for this lack of data.
|
||||
// In debug, four buffers are used, to avoid tripping up assertions down the line.
|
||||
#if !defined(NDEBUG)
|
||||
const int silent_buffer_count = 2;
|
||||
#else
|
||||
const int silent_buffer_count = 4;
|
||||
#endif
|
||||
stm->linear_input_buffer.push_silence(stm->input_buffer_frame_count *
|
||||
stm->input_stream_params.channels * 2);
|
||||
stm->input_stream_params.channels *
|
||||
silent_buffer_count);
|
||||
|
||||
if (rv != CUBEB_OK) {
|
||||
LOG("Failure to open the input side.");
|
||||
|
@ -1821,9 +1837,6 @@ void wasapi_stream_destroy(cubeb_stream * stm)
|
|||
if (stop_and_join_render_thread(stm)) {
|
||||
delete stm->emergency_bailout.load();
|
||||
stm->emergency_bailout = nullptr;
|
||||
} else {
|
||||
// If we're leaking, it must be that this is true.
|
||||
XASSERT(*(stm->emergency_bailout));
|
||||
}
|
||||
|
||||
unregister_notification_client(stm);
|
||||
|
@ -1885,11 +1898,11 @@ int stream_start_one_side(cubeb_stream * stm, StreamDirection dir)
|
|||
|
||||
int wasapi_stream_start(cubeb_stream * stm)
|
||||
{
|
||||
auto_lock lock(stm->stream_reset_lock);
|
||||
|
||||
XASSERT(stm && !stm->thread && !stm->shutdown_event);
|
||||
XASSERT(stm->output_client || stm->input_client);
|
||||
|
||||
auto_lock lock(stm->stream_reset_lock);
|
||||
|
||||
stm->emergency_bailout = new std::atomic<bool>(false);
|
||||
|
||||
if (stm->output_client) {
|
||||
|
@ -1951,6 +1964,7 @@ int wasapi_stream_stop(cubeb_stream * stm)
|
|||
}
|
||||
|
||||
if (stop_and_join_render_thread(stm)) {
|
||||
// This is null if we've given the pointer to the other thread
|
||||
if (stm->emergency_bailout.load()) {
|
||||
delete stm->emergency_bailout.load();
|
||||
stm->emergency_bailout = nullptr;
|
||||
|
|
|
@ -258,9 +258,6 @@
|
|||
],
|
||||
}],
|
||||
['(build_for_test==0) and (build_for_standalone==0)', {
|
||||
'defines' : [
|
||||
'MOZILLA_INTERNAL_API',
|
||||
],
|
||||
'sources': [
|
||||
'./src/peerconnection/MediaStreamList.cpp',
|
||||
'./src/peerconnection/MediaStreamList.h',
|
||||
|
@ -274,9 +271,7 @@
|
|||
],
|
||||
'defines' : [
|
||||
'NO_CHROMIUM_LOGGING',
|
||||
'USE_FAKE_MEDIA_STREAMS',
|
||||
'USE_FAKE_PCOBSERVER',
|
||||
'MOZILLA_EXTERNAL_LINKAGE',
|
||||
],
|
||||
}],
|
||||
['build_for_standalone==0', {
|
||||
|
@ -290,10 +285,7 @@
|
|||
'./test'
|
||||
],
|
||||
'defines' : [
|
||||
'MOZILLA_INTERNAL_API',
|
||||
'MOZILLA_EXTERNAL_LINKAGE',
|
||||
'NO_CHROMIUM_LOGGING',
|
||||
'USE_FAKE_MEDIA_STREAMS',
|
||||
'USE_FAKE_PCOBSERVER',
|
||||
],
|
||||
}],
|
||||
|
|
|
@ -12,13 +12,9 @@
|
|||
#include "webrtc/base/logging.h"
|
||||
|
||||
#include "nscore.h"
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
#include "nsString.h"
|
||||
#include "nsXULAppAPI.h"
|
||||
#include "mozilla/Preferences.h"
|
||||
#else
|
||||
#include "nsStringAPI.h"
|
||||
#endif
|
||||
|
||||
#include "nsIFile.h"
|
||||
#include "nsDirectoryServiceUtils.h"
|
||||
|
@ -63,7 +59,6 @@ static WebRtcTraceCallback gWebRtcCallback;
|
|||
// For LOG()
|
||||
static mozilla::StaticAutoPtr<LogSinkImpl> sSink;
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
void GetWebRtcLogPrefs(uint32_t *aTraceMask, nsACString* aLogFile, nsACString *aAECLogDir, bool *aMultiLog)
|
||||
{
|
||||
*aMultiLog = mozilla::Preferences::GetBool("media.webrtc.debug.multi_log");
|
||||
|
@ -72,7 +67,6 @@ void GetWebRtcLogPrefs(uint32_t *aTraceMask, nsACString* aLogFile, nsACString *a
|
|||
mozilla::Preferences::GetCString("media.webrtc.debug.aec_log_dir", aAECLogDir);
|
||||
webrtc::Trace::set_aec_debug_size(mozilla::Preferences::GetUint("media.webrtc.debug.aec_dump_max_size"));
|
||||
}
|
||||
#endif
|
||||
|
||||
mozilla::LogLevel
|
||||
CheckOverrides(uint32_t *aTraceMask, nsACString *aLogFile, bool *aMultiLog)
|
||||
|
@ -213,9 +207,7 @@ void StartWebRtcLog(uint32_t log_level)
|
|||
nsAutoCString log_file;
|
||||
nsAutoCString aec_log_dir;
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
GetWebRtcLogPrefs(&trace_mask, &log_file, &aec_log_dir, &multi_log);
|
||||
#endif
|
||||
mozilla::LogLevel level = CheckOverrides(&trace_mask, &log_file, &multi_log);
|
||||
|
||||
if (trace_mask == 0) {
|
||||
|
@ -238,9 +230,7 @@ void EnableWebRtcLog()
|
|||
nsAutoCString log_file;
|
||||
nsAutoCString aec_log_dir;
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
GetWebRtcLogPrefs(&trace_mask, &log_file, &aec_log_dir, &multi_log);
|
||||
#endif
|
||||
mozilla::LogLevel level = CheckOverrides(&trace_mask, &log_file, &multi_log);
|
||||
ConfigWebRtcLog(level, trace_mask, log_file, aec_log_dir, multi_log);
|
||||
return;
|
||||
|
@ -295,9 +285,7 @@ void StartAecLog()
|
|||
nsAutoCString log_file;
|
||||
nsAutoCString aec_log_dir;
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
GetWebRtcLogPrefs(&trace_mask, &log_file, &aec_log_dir, &multi_log);
|
||||
#endif
|
||||
CheckOverrides(&trace_mask, &log_file, &multi_log);
|
||||
ConfigAecLog(aec_log_dir);
|
||||
|
||||
|
|
|
@ -22,11 +22,9 @@ VideoCodecStatistics::VideoCodecStatistics(int channel,
|
|||
mDecoderDiscardedPackets(0),
|
||||
mRegisteredEncode(false),
|
||||
mRegisteredDecode(false),
|
||||
mReceiveState(kReceiveStateInitial)
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
, mRecoveredBeforeLoss(0)
|
||||
, mRecoveredLosses(0)
|
||||
#endif
|
||||
mReceiveState(kReceiveStateInitial),
|
||||
mRecoveredBeforeLoss(0),
|
||||
mRecoveredLosses(0)
|
||||
{
|
||||
MOZ_ASSERT(mPtrViECodec);
|
||||
}
|
||||
|
@ -92,7 +90,6 @@ void VideoCodecStatistics::ReceiveStateChange(const int aChannel,
|
|||
VideoReceiveState aState)
|
||||
{
|
||||
CSFLogDebug(logTag,"New state for %d: %d (was %d)", aChannel, aState, mReceiveState);
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
if (mFirstDecodeTime.IsNull()) {
|
||||
mFirstDecodeTime = TimeStamp::Now();
|
||||
}
|
||||
|
@ -134,14 +131,11 @@ void VideoCodecStatistics::ReceiveStateChange(const int aChannel,
|
|||
break;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
mReceiveState = aState;
|
||||
}
|
||||
|
||||
void VideoCodecStatistics::EndOfCallStats()
|
||||
{
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
if (!mFirstDecodeTime.IsNull()) {
|
||||
TimeDuration callDelta = TimeStamp::Now() - mFirstDecodeTime;
|
||||
if (callDelta.ToSeconds() != 0) {
|
||||
|
@ -159,7 +153,6 @@ void VideoCodecStatistics::EndOfCallStats()
|
|||
static_cast<uint32_t>(percent*10));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void VideoCodecStatistics::SentFrame()
|
||||
|
|
|
@ -97,13 +97,11 @@ private:
|
|||
bool mRegisteredDecode;
|
||||
|
||||
webrtc::VideoReceiveState mReceiveState;
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
TimeStamp mFirstDecodeTime;
|
||||
TimeStamp mReceiveFailureTime;
|
||||
TimeDuration mTotalLossTime;
|
||||
uint32_t mRecoveredBeforeLoss;
|
||||
uint32_t mRecoveredLosses;
|
||||
#endif
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include "mozilla/Unused.h"
|
||||
|
||||
#if defined(MOZ_WIDGET_ANDROID) && defined(MOZILLA_INTERNAL_API)
|
||||
#if defined(MOZ_WIDGET_ANDROID)
|
||||
#include "AndroidJNIWrapper.h"
|
||||
#include "VideoEngine.h"
|
||||
#endif
|
||||
|
@ -846,7 +846,6 @@ WebrtcVideoConduit::GetRTCPSenderReport(DOMHighResTimeStamp* timestamp,
|
|||
MediaConduitErrorCode
|
||||
WebrtcVideoConduit::InitMain()
|
||||
{
|
||||
#if defined(MOZILLA_INTERNAL_API)
|
||||
// already know we must be on MainThread barring unit test weirdness
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
|
@ -916,8 +915,7 @@ WebrtcVideoConduit::InitMain()
|
|||
CSFLogError(logTag, "%s: could not set Android objects", __FUNCTION__);
|
||||
return kMediaConduitSessionNotInited;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif //MOZ_WIDGET_ANDROID
|
||||
return kMediaConduitNoError;
|
||||
}
|
||||
|
||||
|
@ -1191,10 +1189,8 @@ WebrtcVideoConduit::CreateDecoder(webrtc::VideoDecoder::DecoderType aType)
|
|||
} else if (aType == webrtc::VideoDecoder::kVp8) {
|
||||
bool enabled = false;
|
||||
// attempt to get a decoder
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
enabled = mozilla::Preferences::GetBool(
|
||||
"media.navigator.hardware.vp8_decode.acceleration_enabled", false);
|
||||
#endif
|
||||
if (enabled) {
|
||||
nsCOMPtr<nsIGfxInfo> gfxInfo = do_GetService("@mozilla.org/gfx/info;1");
|
||||
if (gfxInfo) {
|
||||
|
@ -1246,10 +1242,8 @@ WebrtcVideoConduit::CreateEncoder(webrtc::VideoEncoder::EncoderType aType,
|
|||
} else if (aType == webrtc::VideoEncoder::kVp8) {
|
||||
bool enabled = false;
|
||||
// attempt to get a encoder
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
enabled = mozilla::Preferences::GetBool(
|
||||
"media.navigator.hardware.vp8_encode.acceleration_enabled", false);
|
||||
#endif
|
||||
if (enabled) {
|
||||
nsCOMPtr<nsIGfxInfo> gfxInfo = do_GetService("@mozilla.org/gfx/info;1");
|
||||
if (gfxInfo) {
|
||||
|
|
|
@ -31,19 +31,8 @@ namespace mozilla {
|
|||
#undef LOG
|
||||
#endif
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
extern mozilla::LogModule* GetGMPLog();
|
||||
#else
|
||||
// For CPP unit tests
|
||||
PRLogModuleInfo*
|
||||
GetGMPLog()
|
||||
{
|
||||
static PRLogModuleInfo *sLog;
|
||||
if (!sLog)
|
||||
sLog = PR_NewLogModule("GMP");
|
||||
return sLog;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
|
||||
#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
|
||||
|
||||
|
@ -90,12 +79,10 @@ WebrtcGmpVideoEncoder::WebrtcGmpVideoEncoder()
|
|||
, mCallback(nullptr)
|
||||
, mCachedPluginId(0)
|
||||
{
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
if (mPCHandle.empty()) {
|
||||
mPCHandle = WebrtcGmpPCHandleSetter::GetCurrentHandle();
|
||||
}
|
||||
MOZ_ASSERT(!mPCHandle.empty());
|
||||
#endif
|
||||
}
|
||||
|
||||
WebrtcGmpVideoEncoder::~WebrtcGmpVideoEncoder()
|
||||
|
@ -657,12 +644,10 @@ WebrtcGmpVideoDecoder::WebrtcGmpVideoDecoder() :
|
|||
mCachedPluginId(0),
|
||||
mDecoderStatus(GMPNoErr)
|
||||
{
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
if (mPCHandle.empty()) {
|
||||
mPCHandle = WebrtcGmpPCHandleSetter::GetCurrentHandle();
|
||||
}
|
||||
MOZ_ASSERT(!mPCHandle.empty());
|
||||
#endif
|
||||
}
|
||||
|
||||
WebrtcGmpVideoDecoder::~WebrtcGmpVideoDecoder()
|
||||
|
|
|
@ -1454,11 +1454,6 @@ void MediaPipelineTransmit::AttachToTrack(const std::string& track_id) {
|
|||
} else {
|
||||
MOZ_ASSERT(false, "Unknown track type");
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_INTERNAL_API
|
||||
// this enables the unit tests that can't fiddle with principals and the like
|
||||
listener_->SetEnabled(true);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -2089,10 +2084,8 @@ public:
|
|||
: GenericReceiveListener(source, track_id),
|
||||
width_(0),
|
||||
height_(0),
|
||||
#if defined(MOZILLA_INTERNAL_API)
|
||||
image_container_(),
|
||||
image_(),
|
||||
#endif
|
||||
monitor_("Video PipelineListener")
|
||||
{
|
||||
image_container_ =
|
||||
|
@ -2152,16 +2145,11 @@ public:
|
|||
int64_t render_time,
|
||||
const RefPtr<layers::Image>& video_image)
|
||||
{
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
ReentrantMonitorAutoEnter enter(monitor_);
|
||||
|
||||
if (buffer) {
|
||||
// Create a video frame using |buffer|.
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
RefPtr<PlanarYCbCrImage> yuvImage = new GrallocImage();
|
||||
#else
|
||||
RefPtr<PlanarYCbCrImage> yuvImage = image_container_->CreatePlanarYCbCrImage();
|
||||
#endif // MOZ_WIDGET_GONK
|
||||
uint8_t* frame = const_cast<uint8_t*>(static_cast<const uint8_t*> (buffer));
|
||||
|
||||
PlanarYCbCrData yuvData;
|
||||
|
@ -2184,23 +2172,13 @@ public:
|
|||
|
||||
image_ = yuvImage;
|
||||
}
|
||||
#ifdef WEBRTC_GONK
|
||||
else {
|
||||
// Decoder produced video frame that can be appended to the track directly.
|
||||
MOZ_ASSERT(video_image);
|
||||
image_ = video_image;
|
||||
}
|
||||
#endif // WEBRTC_GONK
|
||||
#endif // MOZILLA_INTERNAL_API
|
||||
}
|
||||
|
||||
private:
|
||||
int width_;
|
||||
int height_;
|
||||
#if defined(MOZILLA_INTERNAL_API)
|
||||
RefPtr<layers::ImageContainer> image_container_;
|
||||
RefPtr<layers::Image> image_;
|
||||
#endif
|
||||
mozilla::ReentrantMonitor monitor_; // Monitor for processing WebRTC frames.
|
||||
// Protects image_ against:
|
||||
// - Writing from the GIPS thread
|
||||
|
@ -2296,9 +2274,7 @@ nsresult MediaPipelineReceiveVideo::Init() {
|
|||
description_ += track_id_;
|
||||
description_ += "]";
|
||||
|
||||
#if defined(MOZILLA_INTERNAL_API)
|
||||
listener_->AddSelf();
|
||||
#endif
|
||||
|
||||
// Always happens before we can DetachMedia()
|
||||
static_cast<VideoSessionConduit *>(conduit_.get())->
|
||||
|
|
|
@ -25,9 +25,7 @@
|
|||
#include "mozilla/Preferences.h"
|
||||
#include "MediaEngine.h"
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
#include "mozilla/Preferences.h"
|
||||
#endif
|
||||
|
||||
#include "WebrtcGmpVideoCodec.h"
|
||||
|
||||
|
|
|
@ -5,9 +5,7 @@
|
|||
#include "CSFLog.h"
|
||||
#include "base/basictypes.h"
|
||||
#include "MediaStreamList.h"
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
#include "mozilla/dom/MediaStreamListBinding.h"
|
||||
#endif
|
||||
#include "nsIScriptGlobalObject.h"
|
||||
#include "PeerConnectionImpl.h"
|
||||
#include "PeerConnectionMedia.h"
|
||||
|
@ -26,17 +24,7 @@ MediaStreamList::~MediaStreamList()
|
|||
{
|
||||
}
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(MediaStreamList)
|
||||
#else
|
||||
NS_IMPL_CYCLE_COLLECTION_CLASS(MediaStreamList)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(MediaStreamList)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(MediaStreamList)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(MediaStreamList)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRACE_END
|
||||
#endif
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTING_ADDREF(MediaStreamList)
|
||||
NS_IMPL_CYCLE_COLLECTING_RELEASE(MediaStreamList)
|
||||
|
@ -48,11 +36,7 @@ NS_INTERFACE_MAP_END
|
|||
JSObject*
|
||||
MediaStreamList::WrapObject(JSContext* cx, JS::Handle<JSObject*> aGivenProto)
|
||||
{
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
return MediaStreamListBinding::Wrap(cx, this, aGivenProto);
|
||||
#else
|
||||
return nullptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
nsISupports*
|
||||
|
|
|
@ -44,7 +44,6 @@ public:
|
|||
|
||||
void Init()
|
||||
{
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
nsCOMPtr<nsIObserverService> observerService =
|
||||
services::GetObserverService();
|
||||
if (!observerService)
|
||||
|
@ -61,7 +60,6 @@ public:
|
|||
false);
|
||||
MOZ_ALWAYS_SUCCEEDS(rv);
|
||||
(void) rv;
|
||||
#endif
|
||||
}
|
||||
|
||||
NS_IMETHOD Observe(nsISupports* aSubject, const char* aTopic,
|
||||
|
@ -70,7 +68,6 @@ public:
|
|||
CSFLogDebug(logTag, "Shutting down PeerConnectionCtx");
|
||||
PeerConnectionCtx::Destroy();
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
nsCOMPtr<nsIObserverService> observerService =
|
||||
services::GetObserverService();
|
||||
if (!observerService)
|
||||
|
@ -82,7 +79,6 @@ public:
|
|||
rv = observerService->RemoveObserver(this,
|
||||
NS_XPCOM_SHUTDOWN_OBSERVER_ID);
|
||||
MOZ_ALWAYS_SUCCEEDS(rv);
|
||||
#endif
|
||||
|
||||
// Make sure we're not deleted while still inside ::Observe()
|
||||
RefPtr<PeerConnectionCtxObserver> kungFuDeathGrip(this);
|
||||
|
@ -108,14 +104,12 @@ public:
|
|||
private:
|
||||
virtual ~PeerConnectionCtxObserver()
|
||||
{
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
nsCOMPtr<nsIObserverService> observerService =
|
||||
services::GetObserverService();
|
||||
if (observerService) {
|
||||
observerService->RemoveObserver(this, NS_IOSERVICE_OFFLINE_STATUS_TOPIC);
|
||||
observerService->RemoveObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -24,9 +24,7 @@
|
|||
#include "signaling/src/jsep/JsepTransport.h"
|
||||
|
||||
#include "MediaSegment.h"
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
#include "MediaStreamGraph.h"
|
||||
#endif
|
||||
|
||||
#include "MediaStreamGraphImpl.h"
|
||||
|
||||
|
|
|
@ -326,6 +326,9 @@
|
|||
'-Wimplicit-fallthrough',
|
||||
'-Wthread-safety',
|
||||
],
|
||||
'cflags_mozilla': [
|
||||
'-Wthread-safety',
|
||||
],
|
||||
}],
|
||||
],
|
||||
}],
|
||||
|
|
|
@ -13,9 +13,7 @@
|
|||
#include <android/log.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
#include "OpenSLESProvider.h"
|
||||
#endif
|
||||
|
||||
#include "webrtc/base/arraysize.h"
|
||||
#include "webrtc/base/checks.h"
|
||||
|
@ -305,15 +303,9 @@ bool OpenSLESPlayer::CreateEngine() {
|
|||
const SLEngineOption option[] = {
|
||||
{SL_ENGINEOPTION_THREADSAFE, static_cast<SLuint32>(SL_BOOLEAN_TRUE)}};
|
||||
|
||||
#ifndef MOZILLA_INTERNAL_API
|
||||
RETURN_ON_ERROR(slCreateEngine_(&engine_object_, 1, option, 0, NULL, NULL),
|
||||
false);
|
||||
RETURN_ON_ERROR((*engine_object_)->Realize(engine_object_, SL_BOOLEAN_FALSE), false);
|
||||
#else
|
||||
RETURN_ON_ERROR(mozilla_get_sles_engine(&engine_object_, 1, option),
|
||||
false);
|
||||
RETURN_ON_ERROR(mozilla_realize_sles_engine(engine_object_), false);
|
||||
#endif
|
||||
RETURN_ON_ERROR(
|
||||
(*engine_object_)->GetInterface(engine_object_, SL_IID_ENGINE_, &engine_),
|
||||
false);
|
||||
|
@ -327,11 +319,7 @@ void OpenSLESPlayer::DestroyEngine() {
|
|||
if (!engine_object_)
|
||||
return;
|
||||
engine_ = nullptr;
|
||||
#ifndef MOZILLA_INTERNAL_API
|
||||
(*engine_object_)->Destroy(engine_object_);
|
||||
#else
|
||||
mozilla_destroy_sles_engine(&engine_object_);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool OpenSLESPlayer::CreateMix() {
|
||||
|
|
|
@ -21,9 +21,7 @@
|
|||
#include <libkern/OSAtomic.h> // OSAtomicCompareAndSwap()
|
||||
#include <mach/mach.h> // mach_task_self()
|
||||
#include <sys/sysctl.h> // sysctlbyname()
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
#include <OSXRunLoopSingleton.h>
|
||||
#endif
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
|
@ -303,19 +301,7 @@ int32_t AudioDeviceMac::Init() {
|
|||
AudioObjectPropertyAddress propertyAddress = {
|
||||
kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal,
|
||||
kAudioObjectPropertyElementMaster};
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
mozilla_set_coreaudio_notification_runloop_if_needed();
|
||||
#else
|
||||
CFRunLoopRef runLoop = NULL;
|
||||
UInt32 size = sizeof(CFRunLoopRef);
|
||||
WEBRTC_CA_RETURN_ON_ERR(AudioObjectSetPropertyData(
|
||||
kAudioObjectSystemObject, &propertyAddress, 0, NULL, size, &runLoop));
|
||||
|
||||
// Listen for any device changes.
|
||||
propertyAddress.mSelector = kAudioHardwarePropertyDevices;
|
||||
WEBRTC_CA_LOG_ERR(AudioObjectAddPropertyListener(
|
||||
kAudioObjectSystemObject, &propertyAddress, &objectListenerProc, this));
|
||||
#endif
|
||||
|
||||
// Determine if this is a MacBook Pro
|
||||
_macBookPro = false;
|
||||
|
|
|
@ -54,6 +54,13 @@ public class SuggestedSiteLoader implements IconLoader {
|
|||
private IconResponse buildIcon(final Context context, final String siteURL, final int targetSize) {
|
||||
final SuggestedSites suggestedSites = BrowserDB.from(context).getSuggestedSites();
|
||||
|
||||
if (suggestedSites == null) {
|
||||
// See longer explanation in SuggestedSitePreparer: suggested sites aren't always loaded.
|
||||
// If they aren't, SuggestedSitePreparer won't suggest any bundled icons so we should
|
||||
// never try to load them anyway, but we should double check here to be completely safe.
|
||||
return null;
|
||||
}
|
||||
|
||||
final String iconLocation = suggestedSites.getImageUrlForUrl(siteURL);
|
||||
final String backgroundColorString = suggestedSites.getBackgroundColorForUrl(siteURL);
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ import android.database.Cursor;
|
|||
|
||||
import org.mozilla.gecko.db.BrowserContract;
|
||||
import org.mozilla.gecko.db.BrowserDB;
|
||||
import org.mozilla.gecko.db.SuggestedSites;
|
||||
import org.mozilla.gecko.icons.IconDescriptor;
|
||||
import org.mozilla.gecko.icons.IconRequest;
|
||||
import org.mozilla.gecko.icons.loader.SuggestedSiteLoader;
|
||||
|
@ -25,8 +26,19 @@ public class SuggestedSitePreparer implements Preparer {
|
|||
// sites is low, and a HashSet containing them is therefore likely to be exceedingly small.
|
||||
// Hence we opt to iterate over the list once, and do an immediate lookup every time a favicon
|
||||
// is requested:
|
||||
private void initialise(final Context context) {
|
||||
final Cursor cursor = BrowserDB.from(context).getSuggestedSites().get(Integer.MAX_VALUE);
|
||||
// Loading can fail if suggested sites haven't been initialised yet, only proceed if we return true.
|
||||
private boolean initialise(final Context context) {
|
||||
final SuggestedSites suggestedSites = BrowserDB.from(context).getSuggestedSites();
|
||||
|
||||
// suggestedSites may not have been initialised yet if BrowserApp isn't running yet. Suggested
|
||||
// Sites are initialised in BrowserApp.onCreate(), but we might need to load icons when running
|
||||
// custom tabs, as geckoview, etc. (But we don't care as much about the bundled icons in those
|
||||
// scenarios.)
|
||||
if (suggestedSites == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final Cursor cursor = suggestedSites.get(Integer.MAX_VALUE);
|
||||
try {
|
||||
final int urlColumnIndex = cursor.getColumnIndexOrThrow(BrowserContract.Bookmarks.URL);
|
||||
|
||||
|
@ -37,6 +49,8 @@ public class SuggestedSitePreparer implements Preparer {
|
|||
} finally {
|
||||
cursor.close();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -46,9 +60,13 @@ public class SuggestedSitePreparer implements Preparer {
|
|||
}
|
||||
|
||||
if (!initialised) {
|
||||
initialise(request.getContext());
|
||||
initialised = initialise(request.getContext());
|
||||
|
||||
initialised = true;
|
||||
if (!initialised) {
|
||||
// Early return: if we were unable to load suggested sites metdata, we won't be able
|
||||
// to provide sites (but we'll still try again next time).
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
final String siteURL = request.getPageUrl();
|
||||
|
|
|
@ -5541,6 +5541,7 @@ pref("dom.mozBrowserFramesEnabled", false);
|
|||
pref("layout.css.color-adjust.enabled", true);
|
||||
|
||||
pref("dom.audiochannel.audioCompeting", false);
|
||||
pref("dom.audiochannel.audioCompeting.allAgents", false);
|
||||
|
||||
// Default media volume
|
||||
pref("media.default_volume", "1.0");
|
||||
|
|
|
@ -436,11 +436,7 @@ nsChannelClassifier::StartInternal()
|
|||
}
|
||||
|
||||
// Add an observer for shutdown
|
||||
nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
|
||||
if (!observerService)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
observerService->AddObserver(this, "profile-change-net-teardown", false);
|
||||
AddShutdownObserver();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -817,10 +813,29 @@ nsChannelClassifier::OnClassifyComplete(nsresult aErrorCode,
|
|||
}
|
||||
|
||||
mChannel = nullptr;
|
||||
RemoveShutdownObserver();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
nsChannelClassifier::AddShutdownObserver()
|
||||
{
|
||||
nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
|
||||
if (observerService) {
|
||||
observerService->AddObserver(this, "profile-change-net-teardown", false);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsChannelClassifier::RemoveShutdownObserver()
|
||||
{
|
||||
nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
|
||||
if (observerService) {
|
||||
observerService->RemoveObserver(this, "profile-change-net-teardown");
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// nsIObserver implementation
|
||||
NS_IMETHODIMP
|
||||
|
@ -836,6 +851,8 @@ nsChannelClassifier::Observe(nsISupports *aSubject, const char *aTopic,
|
|||
mChannel->Cancel(NS_ERROR_ABORT);
|
||||
mChannel->Resume();
|
||||
}
|
||||
|
||||
RemoveShutdownObserver();
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
|
|
@ -60,6 +60,8 @@ private:
|
|||
bool *result);
|
||||
|
||||
bool AddonMayLoad(nsIChannel *aChannel, nsIURI *aUri);
|
||||
void AddShutdownObserver();
|
||||
void RemoveShutdownObserver();
|
||||
public:
|
||||
// If we are blocking content, update the corresponding flag in the respective
|
||||
// docshell and call nsISecurityEventSink::onSecurityChange.
|
||||
|
|
|
@ -1157,4 +1157,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
|
|||
|
||||
static const int32_t kUnknownId = -1;
|
||||
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1496331215141000);
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1496419758871000);
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
00f.net: did not receive HSTS header
|
||||
020wifi.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
0p.no: did not receive HSTS header
|
||||
0x.sk: could not connect to host
|
||||
0x0a.net: could not connect to host
|
||||
0x1337.eu: could not connect to host
|
||||
0x44.net: did not receive HSTS header
|
||||
|
@ -61,6 +62,7 @@
|
|||
56ct.com: could not connect to host
|
||||
60ych.net: did not receive HSTS header
|
||||
6120.eu: did not receive HSTS header
|
||||
646.io: could not connect to host
|
||||
7kovrikov.ru: did not receive HSTS header
|
||||
808.lv: did not receive HSTS header
|
||||
83i.net: could not connect to host
|
||||
|
@ -159,7 +161,7 @@ ajmahal.com: could not connect to host
|
|||
akclinics.org: did not receive HSTS header
|
||||
akombakom.net: did not receive HSTS header
|
||||
akselimedia.fi: did not receive HSTS header
|
||||
akutun.cl: could not connect to host
|
||||
akutun.cl: did not receive HSTS header
|
||||
al-shami.net: could not connect to host
|
||||
aladdin.ie: did not receive HSTS header
|
||||
alainwolf.net: could not connect to host
|
||||
|
@ -168,7 +170,7 @@ alanrickmanflipstable.com: could not connect to host
|
|||
alariel.de: did not receive HSTS header
|
||||
alarmsystemreviews.com: did not receive HSTS header
|
||||
albertopimienta.com: did not receive HSTS header
|
||||
albion2.org: could not connect to host
|
||||
albion2.org: did not receive HSTS header
|
||||
alcazaar.com: could not connect to host
|
||||
alecvannoten.be: did not receive HSTS header
|
||||
alenan.org: could not connect to host
|
||||
|
@ -177,6 +179,7 @@ alethearose.com: did not receive HSTS header
|
|||
alexandre.sh: did not receive HSTS header
|
||||
alexisabarca.com: did not receive HSTS header
|
||||
alexsergeyev.com: could not connect to host
|
||||
alexvetter.de: did not receive HSTS header
|
||||
alfa24.pro: could not connect to host
|
||||
alittlebitcheeky.com: did not receive HSTS header
|
||||
aljaspod.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
|
@ -311,9 +314,6 @@ askfit.cz: did not receive HSTS header
|
|||
asm-x.com: could not connect to host
|
||||
asmui.ga: could not connect to host
|
||||
asmui.ml: could not connect to host
|
||||
asr.li: could not connect to host
|
||||
asr.rocks: could not connect to host
|
||||
asr.solar: could not connect to host
|
||||
asrob.eu: did not receive HSTS header
|
||||
ass.org.au: did not receive HSTS header
|
||||
assdecoeur.org: could not connect to host
|
||||
|
@ -366,6 +366,8 @@ auxiliumincrementum.co.uk: could not connect to host
|
|||
av.de: did not receive HSTS header
|
||||
avec-ou-sans-ordonnance.fr: could not connect to host
|
||||
avenelequinehospital.com.au: did not receive HSTS header
|
||||
avepol.cz: did not receive HSTS header
|
||||
avepol.eu: did not receive HSTS header
|
||||
aviacao.pt: did not receive HSTS header
|
||||
avinet.com: max-age too low: 0
|
||||
avqueen.cn: did not receive HSTS header
|
||||
|
@ -385,6 +387,7 @@ babelfisch.eu: could not connect to host
|
|||
baby-click.de: did not receive HSTS header
|
||||
babybic.hu: did not receive HSTS header
|
||||
babyhouse.xyz: could not connect to host
|
||||
babymasaze.cz: did not receive HSTS header
|
||||
babysaying.me: max-age too low: 6000
|
||||
bacchanallia.com: could not connect to host
|
||||
back-bone.nl: did not receive HSTS header
|
||||
|
@ -395,6 +398,7 @@ badlink.org: could not connect to host
|
|||
baff.lu: did not receive HSTS header
|
||||
baiduaccount.com: could not connect to host
|
||||
baiyangliu.com: could not connect to host
|
||||
bajic.ch: could not connect to host
|
||||
bakingstone.com: could not connect to host
|
||||
bakkerdesignandbuild.com: did not receive HSTS header
|
||||
balcan-underground.net: could not connect to host
|
||||
|
@ -456,7 +460,6 @@ betcafearena.ro: did not receive HSTS header
|
|||
betnet.fr: could not connect to host
|
||||
betplanning.it: did not receive HSTS header
|
||||
bets.de: did not receive HSTS header
|
||||
bettercrypto.org: could not connect to host
|
||||
bettween.com: could not connect to host
|
||||
betz.ro: did not receive HSTS header
|
||||
bevapehappy.com: did not receive HSTS header
|
||||
|
@ -472,6 +475,7 @@ bi.search.yahoo.com: did not receive HSTS header
|
|||
bidon.ca: did not receive HSTS header
|
||||
bieberium.de: could not connect to host
|
||||
bienenblog.cc: could not connect to host
|
||||
biergaizi.info: could not connect to host
|
||||
big-black.de: did not receive HSTS header
|
||||
bigbrownpromotions.com.au: did not receive HSTS header
|
||||
bigdinosaur.org: could not connect to host
|
||||
|
@ -494,7 +498,6 @@ bitf.ly: could not connect to host
|
|||
bitfactory.ws: could not connect to host
|
||||
bitfarm-archiv.com: did not receive HSTS header
|
||||
bitfarm-archiv.de: did not receive HSTS header
|
||||
bitgo.com: max-age too low: 0
|
||||
bitheus.com: could not connect to host
|
||||
bithosting.io: did not receive HSTS header
|
||||
bitnet.io: did not receive HSTS header
|
||||
|
@ -507,7 +510,6 @@ bizcms.com: did not receive HSTS header
|
|||
bizon.sk: did not receive HSTS header
|
||||
black-armada.com.pl: could not connect to host
|
||||
black-armada.pl: could not connect to host
|
||||
black-octopus.ru: could not connect to host
|
||||
blackburn.link: could not connect to host
|
||||
blacklane.com: did not receive HSTS header
|
||||
blackly.uk: max-age too low: 0
|
||||
|
@ -532,7 +534,7 @@ blueliv.com: did not receive HSTS header
|
|||
bluescloud.xyz: could not connect to host
|
||||
bluetenmeer.com: did not receive HSTS header
|
||||
blupig.net: did not receive HSTS header
|
||||
bluserv.net: did not receive HSTS header
|
||||
bluserv.net: could not connect to host
|
||||
bm-trading.nl: did not receive HSTS header
|
||||
bngsecure.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
bnhlibrary.com: could not connect to host
|
||||
|
@ -544,6 +546,7 @@ bodyweightsolution.com: could not connect to host
|
|||
boensou.com: did not receive HSTS header
|
||||
bogosity.se: could not connect to host
|
||||
bohan.life: could not connect to host
|
||||
boilesen.com: could not connect to host
|
||||
bonapp.restaurant: could not connect to host
|
||||
bonfi.net: did not receive HSTS header
|
||||
bonigo.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
|
@ -631,7 +634,6 @@ bysymphony.com: max-age too low: 0
|
|||
byte.wtf: did not receive HSTS header
|
||||
bytepark.de: did not receive HSTS header
|
||||
bytesund.biz: could not connect to host
|
||||
c0rn3j.com: could not connect to host
|
||||
c1yd3i.me: could not connect to host
|
||||
c3b.info: could not connect to host
|
||||
cabarave.com: could not connect to host
|
||||
|
@ -666,8 +668,7 @@ capturethepen.co.uk: could not connect to host
|
|||
car-navi.ph: did not receive HSTS header
|
||||
carano-service.de: did not receive HSTS header
|
||||
caraudio69.cz: could not connect to host
|
||||
carck.co.uk: did not receive HSTS header
|
||||
cardloan-manual.net: could not connect to host
|
||||
carck.co.uk: could not connect to host
|
||||
cardoni.net: did not receive HSTS header
|
||||
cardstream.com: did not receive HSTS header
|
||||
cardurl.com: did not receive HSTS header
|
||||
|
@ -678,6 +679,7 @@ carlandfaith.com: did not receive HSTS header
|
|||
carlolly.co.uk: could not connect to host
|
||||
carlosalves.info: could not connect to host
|
||||
carsforbackpackers.com: could not connect to host
|
||||
casc.cz: did not receive HSTS header
|
||||
casedi.org: max-age too low: 0
|
||||
cashlink.io: did not receive HSTS header
|
||||
cashmojo.com: max-age too low: 0
|
||||
|
@ -826,7 +828,6 @@ cmsbattle.com: could not connect to host
|
|||
cmscafe.ru: did not receive HSTS header
|
||||
cn.search.yahoo.com: did not receive HSTS header
|
||||
cni-certing.it: max-age too low: 0
|
||||
cnwage.com: could not connect to host
|
||||
co50.com: did not receive HSTS header
|
||||
cocaine-import.agency: could not connect to host
|
||||
cocktailfuture.fr: could not connect to host
|
||||
|
@ -840,6 +841,7 @@ codeforce.io: could not connect to host
|
|||
codelayer.ca: could not connect to host
|
||||
codemonkeyrawks.net: did not receive HSTS header
|
||||
codepoet.de: could not connect to host
|
||||
codepult.com: could not connect to host
|
||||
codepx.com: did not receive HSTS header
|
||||
codewiththepros.org: could not connect to host
|
||||
codiva.io: max-age too low: 2592000
|
||||
|
@ -868,6 +870,7 @@ completeid.com: max-age too low: 86400
|
|||
completionist.audio: could not connect to host
|
||||
compraneta.com: could not connect to host
|
||||
compucorner.com.mx: could not connect to host
|
||||
computeremergency.com.au: did not receive HSTS header
|
||||
computersystems.guru: did not receive HSTS header
|
||||
concord-group.co.jp: did not receive HSTS header
|
||||
condesaelectronics.com: max-age too low: 0
|
||||
|
@ -951,7 +954,6 @@ csohack.tk: could not connect to host
|
|||
csokolade.hu: could not connect to host
|
||||
cspbuilder.info: could not connect to host
|
||||
cspvalidator.org: did not receive HSTS header
|
||||
csru.net: could not connect to host
|
||||
csvape.com: did not receive HSTS header
|
||||
ct-status.org: could not connect to host
|
||||
ct.search.yahoo.com: did not receive HSTS header
|
||||
|
@ -965,6 +967,7 @@ cuntflaps.me: did not receive HSTS header
|
|||
cuongquach.com: did not receive HSTS header
|
||||
cupidmentor.com: did not receive HSTS header
|
||||
curroapp.com: could not connect to host
|
||||
curveweb.co.uk: did not receive HSTS header
|
||||
custe.rs: could not connect to host
|
||||
cuvva.insure: did not receive HSTS header
|
||||
cyanogenmod.xxx: could not connect to host
|
||||
|
@ -984,7 +987,6 @@ daku.gdn: did not receive HSTS header
|
|||
dalingk.co: could not connect to host
|
||||
damedrogy.cz: could not connect to host
|
||||
damianuv-blog.cz: did not receive HSTS header
|
||||
dango.in: did not receive HSTS header
|
||||
daniel-steuer.de: could not connect to host
|
||||
danielcowie.me: could not connect to host
|
||||
danieldk.eu: did not receive HSTS header
|
||||
|
@ -1069,6 +1071,7 @@ dennisdoes.net: could not connect to host
|
|||
dentaldomain.org: did not receive HSTS header
|
||||
dentaldomain.ph: could not connect to host
|
||||
depeche-mode.moscow: max-age too low: 7200
|
||||
depicus.com: could not connect to host
|
||||
depijl-mz.nl: did not receive HSTS header
|
||||
depixion.agency: could not connect to host
|
||||
dequehablamos.es: could not connect to host
|
||||
|
@ -1084,10 +1087,10 @@ detector.exposed: could not connect to host
|
|||
devcu.net: did not receive HSTS header
|
||||
deviltracks.net: could not connect to host
|
||||
devincrow.me: could not connect to host
|
||||
devopsconnected.com: could not connect to host
|
||||
devtub.com: did not receive HSTS header
|
||||
devuan.org: did not receive HSTS header
|
||||
dewin.io: could not connect to host
|
||||
dfl.mn: could not connect to host
|
||||
dhpcs.com: did not receive HSTS header
|
||||
dhpiggott.net: did not receive HSTS header
|
||||
diablotine.rocks: could not connect to host
|
||||
|
@ -1179,12 +1182,14 @@ drtroyhendrickson.com: could not connect to host
|
|||
drumbandesperanto.nl: could not connect to host
|
||||
ds-christiansen.de: did not receive HSTS header
|
||||
dshiv.io: could not connect to host
|
||||
dubrovskiy.net: could not connect to host
|
||||
dt27.org: could not connect to host
|
||||
dubrovskiy.net: did not receive HSTS header
|
||||
dubrovskiy.pro: could not connect to host
|
||||
duesee.org: could not connect to host
|
||||
dullsir.com: did not receive HSTS header
|
||||
duria.de: max-age too low: 3600
|
||||
dustri.org: did not receive HSTS header
|
||||
dutchessuganda.com: did not receive HSTS header
|
||||
dutchrank.com: could not connect to host
|
||||
dwhd.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
dworzak.ch: could not connect to host
|
||||
|
@ -1201,7 +1206,6 @@ e-sa.com: did not receive HSTS header
|
|||
e3amn2l.com: could not connect to host
|
||||
earlybirdsnacks.com: could not connect to host
|
||||
earthrise16.com: could not connect to host
|
||||
easez.net: could not connect to host
|
||||
easychiller.org: could not connect to host
|
||||
easyhaul.com: did not receive HSTS header
|
||||
eatlowcarb.de: did not receive HSTS header
|
||||
|
@ -1216,6 +1220,7 @@ ecake.in: could not connect to host
|
|||
ecdn.cz: could not connect to host
|
||||
ecfs.link: could not connect to host
|
||||
ecg.fr: could not connect to host
|
||||
echipstore.com: did not receive HSTS header
|
||||
echosystem.fr: did not receive HSTS header
|
||||
ecole-en-danger.fr: could not connect to host
|
||||
ecole-maternelle-saint-joseph.be: could not connect to host
|
||||
|
@ -1349,6 +1354,7 @@ eucl3d.com: did not receive HSTS header
|
|||
eulerpi.io: could not connect to host
|
||||
eupho.me: could not connect to host
|
||||
euroshop24.net: could not connect to host
|
||||
evafojtova.cz: did not receive HSTS header
|
||||
evantage.org: could not connect to host
|
||||
evdenevenakliyatankara.pw: did not receive HSTS header
|
||||
everybooks.com: max-age too low: 60
|
||||
|
@ -1384,6 +1390,7 @@ factorygw.com: did not receive HSTS header
|
|||
fadilus.com: did not receive HSTS header
|
||||
faesser.com: did not receive HSTS header
|
||||
fail4free.de: did not receive HSTS header
|
||||
failforward.org: could not connect to host
|
||||
fairlyoddtreasures.com: did not receive HSTS header
|
||||
faizan.net: did not receive HSTS header
|
||||
faizan.xyz: could not connect to host
|
||||
|
@ -1393,21 +1400,19 @@ falconfrag.com: could not connect to host
|
|||
falkena.net: max-age too low: 5184000
|
||||
falkp.no: did not receive HSTS header
|
||||
fallenangelspirits.uk: could not connect to host
|
||||
famcloud.de: could not connect to host
|
||||
familie-sprink.de: could not connect to host
|
||||
familie-zimmermann.at: could not connect to host
|
||||
familjenm.se: could not connect to host
|
||||
fantopia.club: could not connect to host
|
||||
fanyl.cn: could not connect to host
|
||||
farhadexchange.com: did not receive HSTS header
|
||||
fashioncare.cz: did not receive HSTS header
|
||||
fasset.jp: could not connect to host
|
||||
fastconfirm.com: could not connect to host
|
||||
fastograph.com: could not connect to host
|
||||
fastopen.ml: could not connect to host
|
||||
fatgeekflix.net: could not connect to host
|
||||
fatherhood.gov: did not receive HSTS header
|
||||
fatlossguide.xyz: could not connect to host
|
||||
fatox.de: could not connect to host
|
||||
fayolle.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
fbox.li: could not connect to host
|
||||
fdj.im: could not connect to host
|
||||
|
@ -1428,7 +1433,6 @@ fexmen.com: could not connect to host
|
|||
ffmradio.de: did not receive HSTS header
|
||||
fhdhelp.de: could not connect to host
|
||||
fhdhilft.de: could not connect to host
|
||||
fifieldtech.com: could not connect to host
|
||||
fiftyshadesofluca.ml: could not connect to host
|
||||
fig.co: did not receive HSTS header
|
||||
fightr.co: could not connect to host
|
||||
|
@ -1482,6 +1486,8 @@ flyaces.com: did not receive HSTS header
|
|||
fm83.nl: could not connect to host
|
||||
fndout.com: did not receive HSTS header
|
||||
fnvsecurity.com: could not connect to host
|
||||
fojtova.cz: did not receive HSTS header
|
||||
fojtovi.cz: did not receive HSTS header
|
||||
fonetiq.io: could not connect to host
|
||||
food4health.guide: could not connect to host
|
||||
foodievenues.com: could not connect to host
|
||||
|
@ -1511,11 +1517,10 @@ foxtrot.pw: could not connect to host
|
|||
fr33d0m.link: could not connect to host
|
||||
francevpn.xyz: could not connect to host
|
||||
frangor.info: did not receive HSTS header
|
||||
frankwei.xyz: could not connect to host
|
||||
frankwei.xyz: did not receive HSTS header
|
||||
franta.biz: did not receive HSTS header
|
||||
franta.email: did not receive HSTS header
|
||||
franzt.de: could not connect to host
|
||||
franzt.ovh: could not connect to host
|
||||
frasys.io: max-age too low: 7776000
|
||||
fredvoyage.fr: did not receive HSTS header
|
||||
freeflow.tv: could not connect to host
|
||||
|
@ -1534,6 +1539,7 @@ frforms.com: did not receive HSTS header
|
|||
friendica.ch: could not connect to host
|
||||
frizo.com: did not receive HSTS header
|
||||
froggstack.de: could not connect to host
|
||||
frontisme.nl: could not connect to host
|
||||
frontmin.com: did not receive HSTS header
|
||||
frost-ci.xyz: could not connect to host
|
||||
frosty-gaming.xyz: did not receive HSTS header
|
||||
|
@ -1600,6 +1606,7 @@ garciamartin.me: could not connect to host
|
|||
garden-life.org: could not connect to host
|
||||
gatapro.net: could not connect to host
|
||||
gatilagata.com.br: could not connect to host
|
||||
gatorsa.es: did not receive HSTS header
|
||||
gdpventure.com: max-age too low: 0
|
||||
gedankenbude.info: could not connect to host
|
||||
geekcast.co.uk: did not receive HSTS header
|
||||
|
@ -1752,11 +1759,10 @@ guava.studio: did not receive HSTS header
|
|||
guilde-vindicta.fr: did not receive HSTS header
|
||||
gulenet.com: could not connect to host
|
||||
gunnarhafdal.com: did not receive HSTS header
|
||||
guoqiang.info: did not receive HSTS header
|
||||
gurochan.ch: could not connect to host
|
||||
gurom.lv: could not connect to host
|
||||
gurusupe.com: could not connect to host
|
||||
guso.gq: could not connect to host
|
||||
guso.site: could not connect to host
|
||||
guso.tech: could not connect to host
|
||||
gussi.is: did not receive HSTS header
|
||||
gvt2.com: could not connect to host (error ignored - included regardless)
|
||||
gvt3.com: could not connect to host (error ignored - included regardless)
|
||||
|
@ -1871,7 +1877,6 @@ hittipps.com: did not receive HSTS header
|
|||
hlyue.com: did not receive HSTS header
|
||||
hmm.nyc: could not connect to host
|
||||
hn.search.yahoo.com: did not receive HSTS header
|
||||
hochhaus.us: could not connect to host
|
||||
hodne.io: could not connect to host
|
||||
hoerbuecher-und-hoerspiele.de: could not connect to host
|
||||
hogar123.es: could not connect to host
|
||||
|
@ -1905,13 +1910,13 @@ howtocuremysciatica.com: could not connect to host
|
|||
hr-intranet.com: did not receive HSTS header
|
||||
hsandbox.tech: max-age too low: 2592000
|
||||
hsir.me: could not connect to host
|
||||
hsr.gov: could not connect to host
|
||||
hsts.date: could not connect to host
|
||||
html-lab.tk: could not connect to host
|
||||
http418.xyz: could not connect to host
|
||||
httpstatuscode418.xyz: could not connect to host
|
||||
hu.search.yahoo.com: did not receive HSTS header
|
||||
huarongdao.com: max-age too low: 1
|
||||
huffduffer.com: could not connect to host
|
||||
hugocollignon.fr: could not connect to host
|
||||
hugosleep.com.au: did not receive HSTS header
|
||||
humblefinances.com: could not connect to host
|
||||
|
@ -1937,6 +1942,7 @@ icewoman.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERR
|
|||
icfl.com.br: could not connect to host
|
||||
ichnichtskaufmann.de: could not connect to host
|
||||
ichoosebtec.com: could not connect to host
|
||||
icloud.net: could not connect to host
|
||||
icpc2016.in.th: could not connect to host
|
||||
icreative.nl: did not receive HSTS header
|
||||
ictual.com: max-age too low: 0
|
||||
|
@ -1960,6 +1966,7 @@ ies.id.lv: could not connect to host
|
|||
ifad.org: did not receive HSTS header
|
||||
ifleurs.com: could not connect to host
|
||||
ifx.ee: could not connect to host
|
||||
ignace72.eu: could not connect to host
|
||||
ignatisd.gr: did not receive HSTS header
|
||||
igule.net: could not connect to host
|
||||
ihrlotto.de: could not connect to host
|
||||
|
@ -1977,7 +1984,6 @@ ilona.graphics: max-age too low: 3600
|
|||
iluvscotland.co.uk: did not receive HSTS header
|
||||
imakepoems.net: could not connect to host
|
||||
ime.moe: could not connect to host
|
||||
imguoguo.com: did not receive HSTS header
|
||||
imim.pw: did not receive HSTS header
|
||||
immersionwealth.com: could not connect to host
|
||||
immoprotect.ca: did not receive HSTS header
|
||||
|
@ -2038,6 +2044,7 @@ interserved.com: did not receive HSTS header
|
|||
intex.es: max-age too low: 0
|
||||
intim-uslugi-kazan.net: could not connect to host
|
||||
intimtoy.com.ua: could not connect to host
|
||||
intranetsec.fr: could not connect to host
|
||||
intrp.net: did not receive HSTS header
|
||||
inverselink-user-content.com: could not connect to host
|
||||
inverselink.com: could not connect to host
|
||||
|
@ -2074,6 +2081,8 @@ isslshop.com: could not connect to host
|
|||
istaspirtslietas.lv: did not receive HSTS header
|
||||
it-go.net: did not receive HSTS header
|
||||
itechgeek.com: max-age too low: 0
|
||||
ithakama.com: did not receive HSTS header
|
||||
ithakama.cz: did not receive HSTS header
|
||||
itos.asia: did not receive HSTS header
|
||||
itos.pl: did not receive HSTS header
|
||||
itriskltd.com: could not connect to host
|
||||
|
@ -2083,6 +2092,7 @@ itsamurai.ru: max-age too low: 2592000
|
|||
itsecurityassurance.pw: could not connect to host
|
||||
itsg-faq.de: could not connect to host
|
||||
itshost.ru: could not connect to host
|
||||
ivancacic.com: did not receive HSTS header
|
||||
ivi-fertility.com: max-age too low: 0
|
||||
ivi.es: max-age too low: 0
|
||||
ivk.website: could not connect to host
|
||||
|
@ -2097,7 +2107,6 @@ jacobparry.ca: did not receive HSTS header
|
|||
jagido.de: did not receive HSTS header
|
||||
jahliveradio.com: could not connect to host
|
||||
jakenbake.com: did not receive HSTS header
|
||||
jakubtopic.cz: could not connect to host
|
||||
james.je: could not connect to host
|
||||
jamesandpame.la: could not connect to host
|
||||
jamesbradach.com: did not receive HSTS header
|
||||
|
@ -2217,12 +2226,12 @@ jznet.org: max-age too low: 86400
|
|||
k-dev.de: could not connect to host
|
||||
ka-clan.com: could not connect to host
|
||||
kabuabc.com: did not receive HSTS header
|
||||
kabus.org: could not connect to host
|
||||
kadioglumakina.com.tr: did not receive HSTS header
|
||||
kaela.design: could not connect to host
|
||||
kahopoon.net: could not connect to host
|
||||
kaisers.de: did not receive HSTS header
|
||||
kalami.nl: did not receive HSTS header
|
||||
kaleidomarketing.com: could not connect to host
|
||||
kamikano.com: could not connect to host
|
||||
kaneo-gmbh.de: did not receive HSTS header
|
||||
kaplatz.is: could not connect to host
|
||||
|
@ -2319,12 +2328,14 @@ kostuumstore.nl: did not receive HSTS header
|
|||
kostya.net: could not connect to host
|
||||
kotonehoko.net: could not connect to host
|
||||
kotovstyle.ru: could not connect to host
|
||||
kourpe.online: could not connect to host
|
||||
kr.search.yahoo.com: did not receive HSTS header
|
||||
kramsj.uk: could not connect to host
|
||||
krayx.com: could not connect to host
|
||||
kreavis.com: did not receive HSTS header
|
||||
kredite.sale: could not connect to host
|
||||
kriegt.es: could not connect to host
|
||||
kristikala.nl: could not connect to host
|
||||
kroetenfuchs.de: could not connect to host
|
||||
kropkait.pl: could not connect to host
|
||||
krouzkyliduska.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
|
@ -2337,6 +2348,7 @@ kswriter.com: could not connect to host
|
|||
kucom.it: did not receive HSTS header
|
||||
kueulangtahunanak.net: could not connect to host
|
||||
kummerlaender.eu: did not receive HSTS header
|
||||
kuoruan.com: could not connect to host
|
||||
kupelne-ptacek.sk: did not receive HSTS header
|
||||
kuppingercole.com: did not receive HSTS header
|
||||
kura.io: could not connect to host
|
||||
|
@ -2393,7 +2405,6 @@ leadership9.com: could not connect to host
|
|||
leardev.de: did not receive HSTS header
|
||||
learnfrenchfluently.com: did not receive HSTS header
|
||||
learningorder.com: could not connect to host
|
||||
lebal.se: could not connect to host
|
||||
lechiennoir.net: did not receive HSTS header
|
||||
ledgerscope.net: could not connect to host
|
||||
leermotorrijden.nl: max-age too low: 300
|
||||
|
@ -2513,6 +2524,7 @@ lovelyblogacademy.com: did not receive HSTS header
|
|||
lovelycorral.com: did not receive HSTS header
|
||||
loveto.at: could not connect to host
|
||||
lowhangingfruitgrabber.com: could not connect to host
|
||||
lowsec.space: could not connect to host
|
||||
lpak.nl: could not connect to host
|
||||
lrhsclubs.com: could not connect to host
|
||||
lrhstsa.com: could not connect to host
|
||||
|
@ -2567,7 +2579,6 @@ madebymagnitude.com: did not receive HSTS header
|
|||
maderwin.com: could not connect to host
|
||||
mae-berlinistanbul.com: could not connect to host
|
||||
mafamane.com: could not connect to host
|
||||
maff.scot: did not receive HSTS header
|
||||
mafiareturns.com: max-age too low: 2592000
|
||||
magenx.com: did not receive HSTS header
|
||||
mahamed91.pw: could not connect to host
|
||||
|
@ -2601,6 +2612,7 @@ marcuskoh.com: did not receive HSTS header
|
|||
mariannematthew.com: could not connect to host
|
||||
marie-curie.fr: could not connect to host
|
||||
marie-elisabeth.dk: did not receive HSTS header
|
||||
marie.club: did not receive HSTS header
|
||||
mario.party: did not receive HSTS header
|
||||
markaconnor.com: could not connect to host
|
||||
markayapilandirma.com: could not connect to host
|
||||
|
@ -2618,13 +2630,14 @@ martineve.com: did not receive HSTS header
|
|||
martinsfamilyappliance.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
marumagic.com: did not receive HSTS header
|
||||
masjidtawheed.net: did not receive HSTS header
|
||||
massoni.pl: could not connect to host
|
||||
masterapi.ninja: did not receive HSTS header
|
||||
masteringtheterminal.com: did not receive HSTS header
|
||||
matatall.com: did not receive HSTS header
|
||||
matchneedle.com: could not connect to host
|
||||
maternalsafety.org: did not receive HSTS header
|
||||
matrip.de: could not connect to host
|
||||
matrix.ac: could not connect to host
|
||||
matrix.ac: did not receive HSTS header
|
||||
matrixcheats.net: could not connect to host
|
||||
matsuz.com: could not connect to host
|
||||
mattberryman.com: did not receive HSTS header
|
||||
|
@ -2697,6 +2710,7 @@ metin2blog.de: did not receive HSTS header
|
|||
metis.pw: could not connect to host
|
||||
meuemail.pro: could not connect to host
|
||||
mexbt.com: could not connect to host
|
||||
meyercloud.de: could not connect to host
|
||||
mfcatalin.com: could not connect to host
|
||||
mfiles.pl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
mh-bloemen.co.jp: could not connect to host
|
||||
|
@ -2756,6 +2770,7 @@ miyoshi-kikaku.com: did not receive HSTS header
|
|||
mizd.at: could not connect to host
|
||||
mizi.name: could not connect to host
|
||||
mkes.com: did not receive HSTS header
|
||||
mlcdn.co: could not connect to host
|
||||
mlpepilepsy.org: could not connect to host
|
||||
mmgazhomeloans.com: did not receive HSTS header
|
||||
mnemotiv.com: could not connect to host
|
||||
|
@ -2813,6 +2828,7 @@ mrettich.org: did not receive HSTS header
|
|||
mrnonz.com: max-age too low: 0
|
||||
mrpopat.in: did not receive HSTS header
|
||||
mrs-shop.com: did not receive HSTS header
|
||||
ms-alternativ.de: could not connect to host
|
||||
msc-seereisen.net: could not connect to host
|
||||
msno.no: did not receive HSTS header
|
||||
mszaki.com: did not receive HSTS header
|
||||
|
@ -2890,6 +2906,7 @@ nanogeneinc.com: could not connect to host
|
|||
nanto.eu: could not connect to host
|
||||
narada.com.ua: could not connect to host
|
||||
narindal.ch: did not receive HSTS header
|
||||
nashira.cz: did not receive HSTS header
|
||||
natalia-fadeeva.ru: could not connect to host
|
||||
natalia.io: could not connect to host
|
||||
natalt.org: did not receive HSTS header
|
||||
|
@ -2909,6 +2926,7 @@ ncpc.gov: could not connect to host
|
|||
nct.org.uk: max-age too low: 1
|
||||
nctx.co.uk: did not receive HSTS header
|
||||
near.st: did not receive HSTS header
|
||||
neel.ch: 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 121" data: no]
|
||||
neftaly.com: did not receive HSTS header
|
||||
neilgreen.net: did not receive HSTS header
|
||||
|
@ -2929,6 +2947,7 @@ networx-online.de: could not connect to host
|
|||
netzbit.de: could not connect to host
|
||||
netzpolitik.org: did not receive HSTS header
|
||||
netztest.at: did not receive HSTS header
|
||||
netzzwerg4u.de: did not receive HSTS header
|
||||
neueonlinecasino2016.com: could not connect to host
|
||||
neuralgic.net: could not connect to host
|
||||
neutralox.com: did not receive HSTS header
|
||||
|
@ -2964,7 +2983,6 @@ 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 121" data: no]
|
||||
nikomo.fi: could not connect to host
|
||||
ninchisho-online.com: did not receive HSTS header
|
||||
ninhs.org: could not connect to host
|
||||
nippler.org: did not receive HSTS header
|
||||
nippombashi.net: did not receive HSTS header
|
||||
nipponcareers.com: did not receive HSTS header
|
||||
|
@ -2973,6 +2991,7 @@ nkinka.de: did not receive HSTS header
|
|||
nlegall.fr: did not receive HSTS header
|
||||
nmctest.net: could not connect to host
|
||||
nnya.cat: could not connect to host
|
||||
no-ip.cz: did not receive HSTS header
|
||||
no17sifangjie.cc: could not connect to host
|
||||
nocallaghan.com: could not connect to host
|
||||
noclegi-online.pl: did not receive HSTS header
|
||||
|
@ -2985,7 +3004,7 @@ noima.com: did not receive HSTS header
|
|||
nolatepayments.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
nolberg.net: did not receive HSTS header
|
||||
nolte.work: could not connect to host
|
||||
nomorebytes.de: did not receive HSTS header
|
||||
nomorebytes.de: could not connect to host
|
||||
noobunbox.net: did not receive HSTS header
|
||||
nope.website: could not connect to host
|
||||
nopex.no: could not connect to host
|
||||
|
@ -3048,6 +3067,7 @@ nzquakes.maori.nz: did not receive HSTS header
|
|||
o0o.one: did not receive HSTS header
|
||||
oasis.mobi: did not receive HSTS header
|
||||
oasisim.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
obscuredfiles.com: could not connect to host
|
||||
obsydian.org: could not connect to host
|
||||
occentus.net: did not receive HSTS header
|
||||
ochaken.cf: could not connect to host
|
||||
|
@ -3215,6 +3235,7 @@ patientinsight.net: could not connect to host
|
|||
patt.us: did not receive HSTS header
|
||||
patterson.mp: could not connect to host
|
||||
paulyang.cn: did not receive HSTS header
|
||||
pavelfojt.cz: did not receive HSTS header
|
||||
paxwinkel.nl: did not receive HSTS header
|
||||
pay.gigahost.dk: did not receive HSTS header
|
||||
payfreez.com: could not connect to host
|
||||
|
@ -3232,7 +3253,7 @@ peakapp.nl: could not connect to host
|
|||
peissen.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
pekkapikkarainen.fi: did not receive HSTS header
|
||||
pekkarik.ru: could not connect to host
|
||||
penguinclientsystem.com: did not receive HSTS header
|
||||
penguinclientsystem.com: could not connect to host
|
||||
pensacolawinterfest.org: could not connect to host
|
||||
pentano.net: could not connect to host
|
||||
pepperhead.com: did not receive HSTS header
|
||||
|
@ -3250,7 +3271,7 @@ perthdevicelab.com: did not receive HSTS header
|
|||
pet-nsk.ru: could not connect to host
|
||||
petchart.net: could not connect to host
|
||||
petplum.com: did not receive HSTS header
|
||||
petrachuk.ru: did not receive HSTS header
|
||||
petrachuk.ru: could not connect to host
|
||||
petravdbos.nl: did not receive HSTS header
|
||||
petrolplus.ru: did not receive HSTS header
|
||||
petsittersservices.com: could not connect to host
|
||||
|
@ -3325,11 +3346,13 @@ poiema.com.sg: did not receive HSTS header
|
|||
pol.in.th: could not connect to host
|
||||
pole.net.nz: could not connect to host
|
||||
poleartschool.com: could not connect to host
|
||||
poles4pilots.com: did not receive HSTS header
|
||||
policeiwitness.sg: could not connect to host
|
||||
polimat.org: could not connect to host
|
||||
politically-incorrect.xyz: could not connect to host
|
||||
politologos.org: did not receive HSTS header
|
||||
polycoise.com: could not connect to host
|
||||
polymathematician.com: could not connect to host
|
||||
polypho.nyc: could not connect to host
|
||||
pompompoes.com: could not connect to host
|
||||
pontualcomp.com: max-age too low: 2592000
|
||||
|
@ -3368,8 +3391,6 @@ prnt.li: did not receive HSTS header
|
|||
pro-zone.com: could not connect to host
|
||||
prodpad.com: did not receive HSTS header
|
||||
professionalboundaries.com: did not receive HSTS header
|
||||
profi-durchgangsmelder.de: did not receive HSTS header
|
||||
profpay.com: could not connect to host
|
||||
profundr.com: could not connect to host
|
||||
progblog.net: could not connect to host
|
||||
progg.no: could not connect to host
|
||||
|
@ -3447,7 +3468,6 @@ raajheshkannaa.com: could not connect to host
|
|||
radicaleducation.net: could not connect to host
|
||||
rafaelcz.de: could not connect to host
|
||||
railgun.com.cn: could not connect to host
|
||||
railjob.cn: could not connect to host
|
||||
rainbowbarracuda.com: could not connect to host
|
||||
ramonj.nl: could not connect to host
|
||||
randomcage.com: did not receive HSTS header
|
||||
|
@ -3574,7 +3594,6 @@ rodosto.com: did not receive HSTS header
|
|||
roeper.party: could not connect to host
|
||||
roesemann.email: could not connect to host
|
||||
roguelikecenter.fr: did not receive HSTS header
|
||||
rolandreed.cn: could not connect to host
|
||||
romans-place.me.uk: did not receive HSTS header
|
||||
romulusapp.com: could not connect to host
|
||||
ronvandordt.info: could not connect to host
|
||||
|
@ -3614,6 +3633,8 @@ runementors.com: could not connect to host
|
|||
runtondev.com: did not receive HSTS header
|
||||
ruqu.nl: could not connect to host
|
||||
rusadmin.biz: did not receive HSTS header
|
||||
ruska-modra.cz: did not receive HSTS header
|
||||
ruskamodra.cz: did not receive HSTS header
|
||||
rusl.me: could not connect to host
|
||||
russmarshall.com: could not connect to host
|
||||
ruxit.com: did not receive HSTS header
|
||||
|
@ -3726,6 +3747,7 @@ securiviera.ch: did not receive HSTS header
|
|||
sedrubal.de: could not connect to host
|
||||
seedbox.fr: did not receive HSTS header
|
||||
seedboxers.net: did not receive HSTS header
|
||||
seeks.ru: could not connect to host
|
||||
seele.ca: could not connect to host
|
||||
segulink.com: could not connect to host
|
||||
sehenderson.com: did not receive HSTS header
|
||||
|
@ -3923,7 +3945,6 @@ souyar.net: could not connect to host
|
|||
souyar.us: could not connect to host
|
||||
sovereignshare.com: could not connect to host
|
||||
sown.dyndns.org: could not connect to host
|
||||
sowncloud.de: did not receive HSTS header
|
||||
spacehq.org: max-age too low: 0
|
||||
spaggel.nl: could not connect to host
|
||||
sparelib.com: max-age too low: 3650
|
||||
|
@ -3981,6 +4002,7 @@ standardssuck.org: did not receive HSTS header
|
|||
standingmist.com: did not receive HSTS header
|
||||
stargatepartners.com: did not receive HSTS header
|
||||
starmusic.ga: did not receive HSTS header
|
||||
starttraffic.com: did not receive HSTS header
|
||||
state-sponsored-actors.net: could not connect to host
|
||||
statementinsertsforless.com: did not receive HSTS header
|
||||
stateofexception.io: could not connect to host
|
||||
|
@ -4006,7 +4028,7 @@ stillblackhat.id: could not connect to host
|
|||
stirlingpoon.com: did not receive HSTS header
|
||||
stirlingpoon.net: did not receive HSTS header
|
||||
stirlingpoon.xyz: could not connect to host
|
||||
stkbn.com: did not receive HSTS header
|
||||
stkbn.com: could not connect to host
|
||||
stmbgr.com: could not connect to host
|
||||
stn.me.uk: did not receive HSTS header
|
||||
stocktrade.de: could not connect to host
|
||||
|
@ -4032,6 +4054,7 @@ strivephysmed.com: did not receive HSTS header
|
|||
stroeercrm.de: could not connect to host
|
||||
strom.family: could not connect to host
|
||||
strongest-privacy.com: could not connect to host
|
||||
structurally.net: could not connect to host
|
||||
stuartbaxter.co: could not connect to host
|
||||
student-scientist.org: did not receive HSTS header
|
||||
student.andover.edu: did not receive HSTS header
|
||||
|
@ -4058,7 +4081,6 @@ suksit.com: could not connect to host
|
|||
sumoatm.com: did not receive HSTS header
|
||||
sumoscout.de: did not receive HSTS header
|
||||
suncountrymarine.com: did not receive HSTS header
|
||||
sunflyer.cn: did not receive HSTS header
|
||||
sunnyfruit.ru: did not receive HSTS header
|
||||
sunshinepress.org: could not connect to host
|
||||
supcro.com: could not connect to host
|
||||
|
@ -4099,12 +4121,15 @@ syntheticmotoroil.org: did not receive HSTS header
|
|||
syriatalk.biz: could not connect to host
|
||||
syriatalk.org: could not connect to host
|
||||
sysadmin.xyz: did not receive HSTS header
|
||||
sysmike.de: could not connect to host
|
||||
syso.name: could not connect to host
|
||||
szaszm.tk: max-age too low: 0
|
||||
t-shirts4less.nl: could not connect to host
|
||||
t-tz.com: could not connect to host
|
||||
ta-65.com: could not connect to host
|
||||
ta65.com: could not connect to host
|
||||
taabe.xyz: did not receive HSTS header
|
||||
taboragroup.com: could not connect to host
|
||||
tacomafia.net: did not receive HSTS header
|
||||
tadigitalstore.com: could not connect to host
|
||||
tafoma.com: did not receive HSTS header
|
||||
|
@ -4183,6 +4208,7 @@ tf2stadium.com: did not receive HSTS header
|
|||
tfcoms-sp-tracker-client.azurewebsites.net: could not connect to host
|
||||
tfl.lu: did not receive HSTS header
|
||||
tgr.re: could not connect to host
|
||||
thagki9.com: could not connect to host
|
||||
thai.land: could not connect to host
|
||||
thaianthro.com: did not receive HSTS header
|
||||
thaihostcool.com: max-age too low: 0
|
||||
|
@ -4229,12 +4255,11 @@ therewill.be: could not connect to host
|
|||
theseed.io: could not connect to host
|
||||
thestack.xyz: could not connect to host
|
||||
thestagchorleywood.co.uk: did not receive HSTS header
|
||||
thetechnical.me: could not connect to host
|
||||
thetomharling.com: max-age too low: 86400
|
||||
thetradinghall.com: could not connect to host
|
||||
theurbanyoga.com: did not receive HSTS header
|
||||
thevintagenews.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
thewebfellas.com: did not receive HSTS header
|
||||
theyosh.nl: could not connect to host
|
||||
thezonders.com: did not receive HSTS header
|
||||
thierfreund.de: could not connect to host
|
||||
thingies.site: could not connect to host
|
||||
|
@ -4285,6 +4310,7 @@ titanleaf.com: could not connect to host
|
|||
titouan.co: did not receive HSTS header
|
||||
tittelbach.at: did not receive HSTS header
|
||||
titties.ml: could not connect to host
|
||||
tjc.wiki: could not connect to host
|
||||
tkarstens.de: did not receive HSTS header
|
||||
tkn.tokyo: could not connect to host
|
||||
tlo.hosting: could not connect to host
|
||||
|
@ -4318,7 +4344,6 @@ tommsy.com: did not receive HSTS header
|
|||
tommyads.com: could not connect to host
|
||||
tonburi.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 121" data: no]
|
||||
tonyfantjr.com: could not connect to host
|
||||
tonyw.xyz: could not connect to host
|
||||
toomanypillows.com: could not connect to host
|
||||
toool.org: did not receive HSTS header
|
||||
top-stage.net: could not connect to host
|
||||
|
@ -4342,6 +4367,7 @@ tradingcentre.com.au: did not receive HSTS header
|
|||
tradinghope.com: could not connect to host
|
||||
traindb.nl: did not receive HSTS header
|
||||
trainut.com: could not connect to host
|
||||
transitownplaza.com: could not connect to host
|
||||
translate.googleapis.com: did not receive HSTS header (error ignored - included regardless)
|
||||
transportal.sk: did not receive HSTS header
|
||||
travelinsurance.co.nz: did not receive HSTS header
|
||||
|
@ -4373,6 +4399,7 @@ tuingereedschappen.net: could not connect to host
|
|||
tunai.id: could not connect to host
|
||||
tunebitfm.de: could not connect to host
|
||||
turnik-67.ru: could not connect to host
|
||||
turniker.ru: could not connect to host
|
||||
turtlementors.com: could not connect to host
|
||||
tuturulianda.com: did not receive HSTS header
|
||||
tuvalie.com: could not connect to host
|
||||
|
@ -4435,6 +4462,7 @@ unfiltered.nyc: did not receive HSTS header
|
|||
unfuddle.cn: could not connect to host
|
||||
uni-games.com: could not connect to host
|
||||
unicooo.com: could not connect to host
|
||||
uniform-agri.com: did not receive HSTS header
|
||||
unison.com: did not receive HSTS header
|
||||
unisyssecurity.com: did not receive HSTS header
|
||||
unitedcyberdevelopment.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
|
@ -4528,11 +4556,13 @@ viktorsvantesson.net: did not receive HSTS header
|
|||
vincentkooijman.at: did not receive HSTS header
|
||||
vincentkooijman.nl: did not receive HSTS header
|
||||
vincentpancol.com: could not connect to host
|
||||
vinicius.sl: did not receive HSTS header
|
||||
vintageheartcoffee.com: did not receive HSTS header
|
||||
vio.no: did not receive HSTS header
|
||||
viperdns.com: could not connect to host
|
||||
vipi.es: could not connect to host
|
||||
vipmusic.ga: could not connect to host
|
||||
virginiacrimeanalysisnetwork.org: did not receive HSTS header
|
||||
visiontree-beta.eu: could not connect to host
|
||||
visitbroadstairs.com: could not connect to host
|
||||
vissanum.com: did not receive HSTS header
|
||||
|
@ -4541,12 +4571,12 @@ vitagenda.nl: could not connect to host
|
|||
vitalorange.com: did not receive HSTS header
|
||||
vitapingu.de: could not connect to host
|
||||
viva-french.com: did not receive HSTS header
|
||||
vivocloud.com: did not receive HSTS header
|
||||
vlastimilburian.cz: did not receive HSTS header
|
||||
vlora.city: could not connect to host
|
||||
vm0.eu: did not receive HSTS header
|
||||
vmrdev.com: could not connect to host
|
||||
voceinveste.com: did not receive HSTS header
|
||||
vodpay.com: could not connect to host
|
||||
vodpay.net: could not connect to host
|
||||
vodpay.org: could not connect to host
|
||||
voicesuk.co.uk: did not receive HSTS header
|
||||
|
@ -4716,7 +4746,7 @@ wufu.org: did not receive HSTS header
|
|||
wuhengmin.com: did not receive HSTS header
|
||||
wurzelzwerg.net: could not connect to host
|
||||
wusx.club: could not connect to host
|
||||
www.apollo-auto.com: could not connect to host
|
||||
www.apollo-auto.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
www.braintreepayments.com: did not receive HSTS header
|
||||
www.calyxinstitute.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
www.cueup.com: could not connect to host
|
||||
|
@ -4756,6 +4786,7 @@ xenesisziarovky.sk: could not connect to host
|
|||
xett.com: did not receive HSTS header
|
||||
xf-liam.com: did not receive HSTS header
|
||||
xfive.de: did not receive HSTS header
|
||||
xia100.xyz: did not receive HSTS header
|
||||
xiaody.me: could not connect to host
|
||||
xiaolvmu.me: could not connect to host
|
||||
xiaoxiao.im: could not connect to host
|
||||
|
@ -4769,13 +4800,12 @@ xn--4dbjwf8c.cf: could not connect to host
|
|||
xn--4dbjwf8c.ga: could not connect to host
|
||||
xn--4dbjwf8c.gq: could not connect to host
|
||||
xn--4dbjwf8c.tk: could not connect to host
|
||||
xn--79q87uvkclvgd56ahq5a.net: could not connect to host
|
||||
xn--79q87uvkclvgd56ahq5a.net: did not receive HSTS header
|
||||
xn--7rvz7ku3ppnr.jp: did not receive HSTS header
|
||||
xn--80aaihqncaejjobbu6v.xn--p1ai: max-age too low: 6000
|
||||
xn--9pr52k0p5a.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--jp-6l5cs1yf3ivjsglphyv.net: could not connect to host
|
||||
xn--lgb3a8bcpn.cf: could not connect to host
|
||||
xn--lgb3a8bcpn.ga: could not connect to host
|
||||
xn--lgb3a8bcpn.gq: could not connect to host
|
||||
|
@ -4787,7 +4817,7 @@ xn--werner-schffer-fib.de: could not connect to host
|
|||
xn--yoamomisuasbcn-ynb.com: could not connect to host
|
||||
xnode.org: did not receive HSTS header
|
||||
xobox.me: could not connect to host
|
||||
xoffy.com: did not receive HSTS header
|
||||
xoffy.com: could not connect to host
|
||||
xombra.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
xpi.fr: could not connect to host
|
||||
xsmobile.de: could not connect to host
|
||||
|
@ -4820,7 +4850,7 @@ yenniferallulli.moda: could not connect to host
|
|||
yenniferallulli.nl: could not connect to host
|
||||
yestees.com: did not receive HSTS header
|
||||
yetcore.io: could not connect to host
|
||||
yhaupenthal.org: could not connect to host
|
||||
yhaupenthal.org: did not receive HSTS header
|
||||
yingyj.com: could not connect to host
|
||||
yippie.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
yjsoft.me: did not receive HSTS header
|
||||
|
@ -4892,13 +4922,16 @@ zoneminder.com: did not receive HSTS header
|
|||
zoo24.de: did not receive HSTS header
|
||||
zoomingin.net: max-age too low: 5184000
|
||||
zoommailing.com: did not receive HSTS header
|
||||
zorasvobodova.cz: did not receive HSTS header
|
||||
zortium.report: could not connect to host
|
||||
zoznamrealit.sk: did not receive HSTS header
|
||||
zqhong.com: could not connect to host
|
||||
ztan.tk: could not connect to host
|
||||
ztcaoll222.cn: did not receive HSTS header
|
||||
zten.org: could not connect to host
|
||||
zulu7.com: could not connect to host
|
||||
zvncloud.com: did not receive HSTS header
|
||||
zwollemagazine.nl: did not receive HSTS header
|
||||
zwy.me: did not receive HSTS header
|
||||
zyf.pw: could not connect to host
|
||||
zymbit.com: could not connect to host
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -629,6 +629,13 @@ dependencies = [
|
|||
"time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dom_struct"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"quote 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "domobject_derive"
|
||||
version = "0.0.1"
|
||||
|
@ -2204,6 +2211,7 @@ dependencies = [
|
|||
"cssparser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"deny_public_fields 0.0.1",
|
||||
"devtools_traits 0.0.1",
|
||||
"dom_struct 0.0.1",
|
||||
"domobject_derive 0.0.1",
|
||||
"encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -2971,7 +2979,6 @@ dependencies = [
|
|||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -3065,7 +3072,6 @@ dependencies = [
|
|||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"idna 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
[package]
|
||||
name = "dom_struct"
|
||||
version = "0.0.1"
|
||||
authors = ["The Servo Project Developers"]
|
||||
license = "MPL-2.0"
|
||||
publish = false
|
||||
|
||||
[lib]
|
||||
path = "lib.rs"
|
||||
proc-macro = true
|
||||
|
||||
[dependencies]
|
||||
quote = "0.3"
|
|
@ -0,0 +1,28 @@
|
|||
/* 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/. */
|
||||
|
||||
#![feature(proc_macro)]
|
||||
|
||||
extern crate proc_macro;
|
||||
#[macro_use] extern crate quote;
|
||||
|
||||
use proc_macro::TokenStream;
|
||||
|
||||
#[proc_macro_attribute]
|
||||
pub fn dom_struct(args: TokenStream, input: TokenStream) -> TokenStream {
|
||||
if !args.to_string().is_empty() {
|
||||
panic!("#[dom_struct] takes no arguments");
|
||||
}
|
||||
expand_string(&input.to_string()).parse().unwrap()
|
||||
}
|
||||
|
||||
fn expand_string(input: &str) -> String {
|
||||
let mut tokens = quote! {
|
||||
#[derive(DenyPublicFields, DomObject, HeapSizeOf, JSTraceable)]
|
||||
#[must_root]
|
||||
#[repr(C)]
|
||||
};
|
||||
tokens.append(input);
|
||||
tokens.to_string()
|
||||
}
|
|
@ -12,7 +12,7 @@ path = "lib.rs"
|
|||
[dependencies]
|
||||
brotli = "1.0.6"
|
||||
content-blocker = "0.2.3"
|
||||
cookie = {version = "0.2.5", features = ["serialize-rustc"]}
|
||||
cookie = "0.2.5"
|
||||
devtools_traits = {path = "../devtools_traits"}
|
||||
flate2 = "0.2.0"
|
||||
hyper = "0.9.9"
|
||||
|
@ -38,7 +38,7 @@ servo_url = {path = "../url"}
|
|||
threadpool = "1.0"
|
||||
time = "0.1.17"
|
||||
unicase = "1.4.0"
|
||||
url = {version = "1.2", features = ["heap_size", "rustc-serialize"]}
|
||||
url = {version = "1.2", features = ["heap_size"]}
|
||||
uuid = {version = "0.4", features = ["v4"]}
|
||||
websocket = "0.17"
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ name = "net_traits"
|
|||
path = "lib.rs"
|
||||
|
||||
[dependencies]
|
||||
cookie = {version = "0.2.5", features = ["serialize-rustc"]}
|
||||
cookie = "0.2.5"
|
||||
heapsize = "0.3.0"
|
||||
heapsize_derive = "0.1"
|
||||
hyper = "0.9.9"
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче