Merge mozilla-central to inbound r=merge

This commit is contained in:
Dorel Luca 2018-01-18 11:48:00 +02:00
Родитель b022aa1432 a066bff27d
Коммит 4027f91f3e
27 изменённых файлов: 307 добавлений и 75 удалений

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

@ -34,11 +34,23 @@ var gEMEHandler = {
}
return true;
},
getLearnMoreLink(msgId) {
let text = gNavigatorBundle.getString("emeNotifications." + msgId + ".learnMoreLabel");
getEMEDisabledFragment(msgId) {
let mainMessage = gNavigatorBundle.getString("emeNotifications.drmContentDisabled.message");
let [prefix, suffix] = mainMessage.split(/%(?:\$\d)?S/).map(s => document.createTextNode(s));
let text = gNavigatorBundle.getString("emeNotifications.drmContentDisabled.learnMoreLabel");
let baseURL = Services.urlFormatter.formatURLPref("app.support.baseURL");
return "<label class='text-link' href='" + baseURL + "drm-content'>" +
text + "</label>";
let link = document.createElement("label");
link.className = "text-link";
link.setAttribute("href", baseURL + "drm-content");
link.textContent = text;
let fragment = document.createDocumentFragment();
[prefix, link, suffix].forEach(n => fragment.appendChild(n));
return fragment;
},
getMessageWithBrandName(notificationId) {
let msgId = "emeNotifications." + notificationId + ".message";
return gNavigatorBundle.getFormattedString(msgId, [this._brandShortName]);
},
receiveMessage({target: browser, data: data}) {
let parsedData;
@ -56,7 +68,8 @@ var gEMEHandler = {
let notificationId;
let buttonCallback;
let params = [];
// Notification message can be either a string or a DOM fragment.
let notificationMessage;
switch (status) {
case "available":
case "cdm-created":
@ -71,17 +84,17 @@ var gEMEHandler = {
case "cdm-disabled":
notificationId = "drmContentDisabled";
buttonCallback = gEMEHandler.ensureEMEEnabled.bind(gEMEHandler, browser, keySystem);
params = [this.getLearnMoreLink(notificationId)];
notificationMessage = this.getEMEDisabledFragment();
break;
case "cdm-insufficient-version":
notificationId = "drmContentCDMInsufficientVersion";
params = [this._brandShortName];
notificationMessage = this.getMessageWithBrandName(notificationId);
break;
case "cdm-not-installed":
notificationId = "drmContentCDMInstalling";
params = [this._brandShortName];
notificationMessage = this.getMessageWithBrandName(notificationId);
break;
case "cdm-not-supported":
@ -93,44 +106,27 @@ var gEMEHandler = {
return;
}
this.showNotificationBar(browser, notificationId, keySystem, params, buttonCallback);
},
showNotificationBar(browser, notificationId, keySystem, labelParams, callback) {
// Now actually create the notification
let box = gBrowser.getNotificationBox(browser);
if (box.getNotificationWithValue(notificationId)) {
return;
}
let msgPrefix = "emeNotifications." + notificationId + ".";
let msgId = msgPrefix + "message";
let message = labelParams.length ?
gNavigatorBundle.getFormattedString(msgId, labelParams) :
gNavigatorBundle.getString(msgId);
let buttons = [];
if (callback) {
if (buttonCallback) {
let msgPrefix = "emeNotifications." + notificationId + ".";
let btnLabelId = msgPrefix + "button.label";
let btnAccessKeyId = msgPrefix + "button.accesskey";
buttons.push({
label: gNavigatorBundle.getString(btnLabelId),
accessKey: gNavigatorBundle.getString(btnAccessKeyId),
callback
callback: buttonCallback,
});
}
let iconURL = "chrome://browser/skin/drm-icon.svg";
// Do a little dance to get rich content into the notification:
let fragment = document.createDocumentFragment();
let descriptionContainer = document.createElement("description");
// eslint-disable-next-line no-unsanitized/property
descriptionContainer.innerHTML = message;
while (descriptionContainer.childNodes.length) {
fragment.appendChild(descriptionContainer.childNodes[0]);
}
box.appendNotification(fragment, notificationId, iconURL, box.PRIORITY_WARNING_MEDIUM,
box.appendNotification(notificationMessage, notificationId, iconURL, box.PRIORITY_WARNING_MEDIUM,
buttons);
},
showPopupNotificationForSuccess(browser, keySystem) {

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

@ -1507,6 +1507,7 @@ stubPackets.set("console.log('foobar', 'test')", {
"groupName": "",
"level": "log",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924471,
@ -1533,6 +1534,7 @@ stubPackets.set("console.log(undefined)", {
"groupName": "",
"level": "log",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924479,
@ -1557,6 +1559,7 @@ stubPackets.set("console.warn('danger, will robinson!')", {
"groupName": "",
"level": "warn",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924487,
@ -1583,6 +1586,7 @@ stubPackets.set("console.log(NaN)", {
"groupName": "",
"level": "log",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924495,
@ -1609,6 +1613,7 @@ stubPackets.set("console.log(null)", {
"groupName": "",
"level": "log",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924501,
@ -1633,6 +1638,7 @@ stubPackets.set("console.log('鼬')", {
"groupName": "",
"level": "log",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924506,
@ -1655,6 +1661,7 @@ stubPackets.set("console.clear()", {
"groupName": "",
"level": "clear",
"lineNumber": 1,
"prefix": "",
"private": false,
"timeStamp": 1502884924512,
"timer": null,
@ -1682,6 +1689,7 @@ stubPackets.set("console.count('bar')", {
"groupName": "",
"level": "count",
"lineNumber": 1,
"prefix": "",
"private": false,
"timeStamp": 1502884924515,
"timer": null,
@ -1729,6 +1737,7 @@ stubPackets.set("console.assert(false, {message: 'foobar'})", {
"groupName": "",
"level": "assert",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924521,
@ -1761,6 +1770,7 @@ stubPackets.set("console.log('hello \nfrom \rthe \"string world!')", {
"groupName": "",
"level": "log",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924528,
@ -1785,6 +1795,7 @@ stubPackets.set("console.log('úṇĩçödê țĕșť')", {
"groupName": "",
"level": "log",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924586,
@ -1821,6 +1832,7 @@ stubPackets.set("console.dirxml(window)", {
"groupName": "",
"level": "dirxml",
"lineNumber": 1,
"prefix": "",
"private": false,
"timeStamp": 1502884924596,
"timer": null,
@ -1863,6 +1875,7 @@ stubPackets.set("console.log('myarray', ['red', 'green', 'blue'])", {
"groupName": "",
"level": "log",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924604,
@ -1897,6 +1910,7 @@ stubPackets.set("console.log('myregex', /a.b.c/)", {
"groupName": "",
"level": "log",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924610,
@ -1938,6 +1952,7 @@ stubPackets.set("console.table(['red', 'green', 'blue']);", {
"groupName": "",
"level": "table",
"lineNumber": 1,
"prefix": "",
"private": false,
"timeStamp": 1502884924612,
"timer": null,
@ -1998,6 +2013,7 @@ stubPackets.set("console.log('myobject', {red: 'redValue', green: 'greenValue',
"groupName": "",
"level": "log",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924614,
@ -2022,6 +2038,7 @@ stubPackets.set("console.debug('debug message');", {
"groupName": "",
"level": "debug",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924621,
@ -2046,6 +2063,7 @@ stubPackets.set("console.info('info message');", {
"groupName": "",
"level": "info",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924625,
@ -2070,6 +2088,7 @@ stubPackets.set("console.error('error message');", {
"groupName": "",
"level": "error",
"lineNumber": 1,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924628,
@ -2125,6 +2144,7 @@ stubPackets.set("console.log('mymap')", {
"groupName": "",
"level": "log",
"lineNumber": 5,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924631,
@ -2166,6 +2186,7 @@ stubPackets.set("console.log('myset')", {
"groupName": "",
"level": "log",
"lineNumber": 2,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924746,
@ -2188,6 +2209,7 @@ stubPackets.set("console.trace()", {
"groupName": "",
"level": "trace",
"lineNumber": 3,
"prefix": "",
"private": false,
"timeStamp": 1502884924752,
"timer": null,
@ -2232,6 +2254,7 @@ stubPackets.set("console.time('bar')", {
"groupName": "",
"level": "time",
"lineNumber": 2,
"prefix": "",
"private": false,
"timeStamp": 1502884924757,
"timer": {
@ -2258,6 +2281,7 @@ stubPackets.set("timerAlreadyExists", {
"groupName": "",
"level": "time",
"lineNumber": 3,
"prefix": "",
"private": false,
"timeStamp": 1502884924758,
"timer": {
@ -2285,6 +2309,7 @@ stubPackets.set("console.timeEnd('bar')", {
"groupName": "",
"level": "timeEnd",
"lineNumber": 4,
"prefix": "",
"private": false,
"timeStamp": 1502884924759,
"timer": {
@ -2312,6 +2337,7 @@ stubPackets.set("timerDoesntExist", {
"groupName": "",
"level": "timeEnd",
"lineNumber": 5,
"prefix": "",
"private": false,
"timeStamp": 1502884924759,
"timer": {
@ -2339,6 +2365,7 @@ stubPackets.set("console.table('bar')", {
"groupName": "",
"level": "table",
"lineNumber": 2,
"prefix": "",
"private": false,
"timeStamp": 1502884924801,
"timer": null,
@ -2380,6 +2407,7 @@ stubPackets.set("console.table(['a', 'b', 'c'])", {
"groupName": "",
"level": "table",
"lineNumber": 2,
"prefix": "",
"private": false,
"timeStamp": 1502884924859,
"timer": null,
@ -2404,6 +2432,7 @@ stubPackets.set("console.group('bar')", {
"groupName": "bar",
"level": "group",
"lineNumber": 2,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924863,
@ -2426,6 +2455,7 @@ stubPackets.set("console.groupEnd('bar')", {
"groupName": "bar",
"level": "groupEnd",
"lineNumber": 3,
"prefix": "",
"private": false,
"timeStamp": 1502884924864,
"timer": null,
@ -2450,6 +2480,7 @@ stubPackets.set("console.groupCollapsed('foo')", {
"groupName": "foo",
"level": "groupCollapsed",
"lineNumber": 2,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924870,
@ -2472,6 +2503,7 @@ stubPackets.set("console.groupEnd('foo')", {
"groupName": "foo",
"level": "groupEnd",
"lineNumber": 3,
"prefix": "",
"private": false,
"timeStamp": 1502884924871,
"timer": null,
@ -2494,6 +2526,7 @@ stubPackets.set("console.group()", {
"groupName": "",
"level": "group",
"lineNumber": 2,
"prefix": "",
"private": false,
"styles": [],
"timeStamp": 1502884924878,
@ -2516,6 +2549,7 @@ stubPackets.set("console.groupEnd()", {
"groupName": "",
"level": "groupEnd",
"lineNumber": 3,
"prefix": "",
"private": false,
"timeStamp": 1502884924879,
"timer": null,
@ -2541,6 +2575,7 @@ stubPackets.set("console.log(%cfoobar)", {
"groupName": "",
"level": "log",
"lineNumber": 2,
"prefix": "",
"private": false,
"styles": [
"color:blue;font-size:1.3em;background:url('http://example.com/test');position:absolute;top:10px",
@ -2569,6 +2604,7 @@ stubPackets.set("console.group(%cfoo%cbar)", {
"groupName": "foo bar",
"level": "group",
"lineNumber": 2,
"prefix": "",
"private": false,
"styles": [
"color:blue;font-size:1.3em;background:url('http://example.com/test');position:absolute;top:10px",
@ -2594,6 +2630,7 @@ stubPackets.set("console.groupEnd(%cfoo%cbar)", {
"groupName": "foo bar",
"level": "groupEnd",
"lineNumber": 6,
"prefix": "",
"private": false,
"timeStamp": 1502884924887,
"timer": null,
@ -2619,6 +2656,7 @@ stubPackets.set("console.groupCollapsed(%cfoo%cbaz)", {
"groupName": "foo baz",
"level": "groupCollapsed",
"lineNumber": 2,
"prefix": "",
"private": false,
"styles": [
"color:blue;font-size:1.3em;background:url('http://example.com/test');position:absolute;top:10px",
@ -2644,6 +2682,7 @@ stubPackets.set("console.groupEnd(%cfoo%cbaz)", {
"groupName": "foo baz",
"level": "groupEnd",
"lineNumber": 6,
"prefix": "",
"private": false,
"timeStamp": 1502884924893,
"timer": null,
@ -2709,6 +2748,7 @@ stubPackets.set("console.dir({C, M, Y, K})", {
"groupName": "",
"level": "dir",
"lineNumber": 1,
"prefix": "",
"private": false,
"timeStamp": 1502884924899,
"timer": null,
@ -2736,6 +2776,7 @@ stubPackets.set("console.count | default: 1", {
"groupName": "",
"level": "count",
"lineNumber": 2,
"prefix": "",
"private": false,
"timeStamp": 1511365913333,
"timer": null,
@ -2763,6 +2804,7 @@ stubPackets.set("console.count | default: 2", {
"groupName": "",
"level": "count",
"lineNumber": 3,
"prefix": "",
"private": false,
"timeStamp": 1511365913334,
"timer": null,
@ -2790,6 +2832,7 @@ stubPackets.set("console.count | test counter: 1", {
"groupName": "",
"level": "count",
"lineNumber": 4,
"prefix": "",
"private": false,
"timeStamp": 1511365913334,
"timer": null,
@ -2817,6 +2860,7 @@ stubPackets.set("console.count | test counter: 2", {
"groupName": "",
"level": "count",
"lineNumber": 5,
"prefix": "",
"private": false,
"timeStamp": 1511365913334,
"timer": null,
@ -2844,6 +2888,7 @@ stubPackets.set("console.count | default: 3", {
"groupName": "",
"level": "count",
"lineNumber": 6,
"prefix": "",
"private": false,
"timeStamp": 1511365913334,
"timer": null,
@ -2866,6 +2911,7 @@ stubPackets.set("console.count | clear", {
"groupName": "",
"level": "clear",
"lineNumber": 7,
"prefix": "",
"private": false,
"timeStamp": 1511365913334,
"timer": null,
@ -2893,6 +2939,7 @@ stubPackets.set("console.count | default: 4", {
"groupName": "",
"level": "count",
"lineNumber": 8,
"prefix": "",
"private": false,
"timeStamp": 1511365913335,
"timer": null,
@ -2920,6 +2967,7 @@ stubPackets.set("console.count | test counter: 3", {
"groupName": "",
"level": "count",
"lineNumber": 9,
"prefix": "",
"private": false,
"timeStamp": 1511365913335,
"timer": null,

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

@ -17,6 +17,8 @@
#include "mozilla/dom/UnionTypes.h"
#include "mozilla/dom/WindowBinding.h" // For IdleRequestCallback/Options
#include "nsThreadUtils.h"
#include "mozJSComponentLoader.h"
#include "GeckoProfiler.h"
namespace mozilla {
namespace dom {
@ -372,6 +374,53 @@ ChromeUtils::IdleDispatch(const GlobalObject& aGlobal,
}
}
/* static */ void
ChromeUtils::Import(const GlobalObject& aGlobal,
const nsAString& aResourceURI,
const Optional<JS::Handle<JSObject*>>& aTargetObj,
JS::MutableHandle<JSObject*> aRetval,
ErrorResult& aRv)
{
RefPtr<mozJSComponentLoader> moduleloader = mozJSComponentLoader::Get();
MOZ_ASSERT(moduleloader);
NS_ConvertUTF16toUTF8 registryLocation(aResourceURI);
AUTO_PROFILER_LABEL_DYNAMIC_NSCSTRING(
"ChromeUtils::Import", OTHER, registryLocation);
JSContext* cx = aGlobal.Context();
JS::Rooted<JS::Value> targetObj(cx);
uint8_t optionalArgc;
if (aTargetObj.WasPassed()) {
targetObj.setObjectOrNull(aTargetObj.Value());
optionalArgc = 1;
} else {
targetObj.setUndefined();
optionalArgc = 0;
}
JS::Rooted<JS::Value> retval(cx);
nsresult rv = moduleloader->Import(registryLocation, targetObj, cx,
optionalArgc, &retval);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return;
}
// Import() on the component loader can return NS_OK while leaving an
// exception on the JSContext. Check for that case.
if (JS_IsExceptionPending(cx)) {
aRv.NoteJSContextException(cx);
return;
}
// Now we better have an object.
MOZ_ASSERT(retval.isObject());
aRetval.set(&retval.toObject());
}
/* static */ void
ChromeUtils::OriginAttributesToSuffix(dom::GlobalObject& aGlobal,
const dom::OriginAttributesDictionary& aAttrs,

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

@ -154,6 +154,12 @@ public:
ErrorResult& aRv);
static void ClearRecentJSDevError(GlobalObject& aGlobal);
static void Import(const GlobalObject& aGlobal,
const nsAString& aResourceURI,
const Optional<JS::Handle<JSObject*>>& aTargetObj,
JS::MutableHandle<JSObject*> aRetval,
ErrorResult& aRv);
};
} // namespace dom

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

@ -444,6 +444,7 @@ LOCAL_INCLUDES += [
'/dom/xul',
'/gfx/2d',
'/image',
'/js/xpconnect/loader',
'/js/xpconnect/src',
'/js/xpconnect/wrappers',
'/layout/base',

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

@ -1537,6 +1537,7 @@ Console::PopulateConsoleNotificationInTheTargetScope(JSContext* aCx,
event.mConsoleID = mConsoleID;
event.mLevel = aData->mMethodString;
event.mFilename = frame.mFilename;
event.mPrefix = mPrefix;
nsCOMPtr<nsIURI> filenameURI;
nsAutoCString pass;
@ -2602,8 +2603,8 @@ Console::MaybeExecuteDumpFunction(JSContext* aCx,
message.Append(aMethodName);
message.AppendLiteral(": ");
if (!mDumpPrefix.IsEmpty()) {
message.Append(mDumpPrefix);
if (!mPrefix.IsEmpty()) {
message.Append(mPrefix);
message.AppendLiteral(": ");
}
@ -2640,8 +2641,8 @@ Console::MaybeExecuteDumpFunctionForTrace(JSContext* aCx, nsIStackFrame* aStack)
nsAutoString message;
message.AssignLiteral("console.trace:\n");
if (!mDumpPrefix.IsEmpty()) {
message.Append(mDumpPrefix);
if (!mPrefix.IsEmpty()) {
message.Append(mPrefix);
message.AppendLiteral(": ");
}

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

@ -444,7 +444,7 @@ private:
nsString mPassedInnerID;
RefPtr<ConsoleInstanceDumpCallback> mDumpFunction;
bool mDumpToStdout;
nsString mDumpPrefix;
nsString mPrefix;
bool mChromeInstance;
ConsoleLogLevel mMaxLogLevel;

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

@ -79,7 +79,7 @@ ConsoleInstance::ConsoleInstance(const ConsoleInstanceOptions& aOptions)
mConsole->mDumpToStdout = true;
}
mConsole->mDumpPrefix = aOptions.mPrefix;
mConsole->mPrefix = aOptions.mPrefix;
// Let's inform that this is a custom instance.
mConsole->mChromeInstance = true;

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

@ -38,6 +38,7 @@ consoleListener.prototype = {
is(obj.ID, "jsm", "ID and InnerID are correctly set.");
is(obj.arguments[0], "Hello world!", "Message matches");
is(obj.consoleID, "", "No consoleID for console API");
is(obj.prefix, "", "prefix is empty by default");
// We want to see 2 messages from this innerID, the first is generated
// by console.log, the second one from createInstance().log();
@ -46,11 +47,13 @@ consoleListener.prototype = {
is(obj.ID, "jsm", "ID and InnerID are correctly set.");
is(obj.arguments[0], "Hello world!", "Message matches");
is(obj.consoleID, "wow", "consoleID is set by consoleInstance");
is(obj.prefix, "_PREFIX_", "prefix is set by consoleInstance");
++this.count;
} else if (obj.innerID == "LEVEL") {
// Nothing special... just we don't want to see 'invisible' messages.
is(obj.ID, "jsm", "ID and InnerID are correctly set.");
is(obj.arguments[0], "Hello world!", "Message matches");
is(obj.prefix, "", "prefix is empty by default");
++this.count;
}

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

@ -234,6 +234,33 @@ partial namespace ChromeUtils {
[Throws]
void idleDispatch(IdleRequestCallback callback,
optional IdleRequestOptions options);
/**
* Synchronously loads and evaluates the js file located at
* 'aResourceURI' with a new, fully privileged global object.
*
* If 'aTargetObj' is specified and null, this method just returns
* the module's global object. Otherwise (if 'aTargetObj' is not
* specified, or 'aTargetObj' is != null) looks for a property
* 'EXPORTED_SYMBOLS' on the new global object. 'EXPORTED_SYMBOLS'
* is expected to be an array of strings identifying properties on
* the global object. These properties will be installed as
* properties on 'targetObj', or, if 'aTargetObj' is not specified,
* on the caller's global object. If 'EXPORTED_SYMBOLS' is not
* found, an error is thrown.
*
* @param aResourceURI A resource:// URI string to load the module from.
* @param aTargetObj the object to install the exported properties on or null.
* @returns the module code's global object.
*
* The implementation maintains a hash of aResourceURI->global obj.
* Subsequent invocations of import with 'aResourceURI' pointing to
* the same file will not cause the module to be re-evaluated, but
* the symbols in EXPORTED_SYMBOLS will be exported into the
* specified target object and the global object returned as above.
*/
[Throws]
object import(DOMString aResourceURI, optional object? aTargetObj);
};
/**

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

@ -78,6 +78,7 @@ dictionary ConsoleEvent {
DOMString groupName = "";
any timer = null;
any counter = null;
DOMString prefix = "";
};
// Event for profile operations

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

@ -754,6 +754,12 @@ GLContext::InitWithPrefixImpl(const char* prefix, bool trygl)
MarkUnsupported(GLFeature::depth_texture);
}
#endif
const auto versionStr = (const char*)fGetString(LOCAL_GL_VERSION);
if (strstr(versionStr, "Mesa")) {
// DrawElementsInstanced hangs the driver.
MarkUnsupported(GLFeature::robust_buffer_access_behavior);
}
}
if (IsExtensionSupported(GLContext::ARB_pixel_buffer_object)) {

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

@ -13,11 +13,31 @@
#include "mozilla/layers/IpcResourceUpdateQueue.h"
#include "mozilla/layers/SharedSurfacesChild.h"
#include "nsDisplayListInvalidation.h"
#include "nsIFrame.h"
#include "WebRenderCanvasRenderer.h"
namespace mozilla {
namespace layers {
/* static */ bool
WebRenderUserData::SupportsAsyncUpdate(nsIFrame* aFrame)
{
if (!aFrame ||
!aFrame->HasProperty(nsIFrame::WebRenderUserDataProperty())) {
return false;
}
RefPtr<WebRenderUserData> data;
nsIFrame::WebRenderUserDataTable* userDataTable =
aFrame->GetProperty(nsIFrame::WebRenderUserDataProperty());
userDataTable->Get(static_cast<uint32_t>(DisplayItemType::TYPE_VIDEO), getter_AddRefs(data));
if (data && data->AsImageData()) {
return data->AsImageData()->IsAsync();
}
return false;
}
WebRenderUserData::WebRenderUserData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem)
: mWRManager(aWRManager)
, mFrame(aItem->Frame())
@ -57,7 +77,7 @@ WebRenderImageData::WebRenderImageData(WebRenderLayerManager* aWRManager, nsDisp
WebRenderImageData::~WebRenderImageData()
{
ClearCachedResources();
DoClearCachedResources();
}
void
@ -76,6 +96,12 @@ WebRenderImageData::ClearImageKey()
void
WebRenderImageData::ClearCachedResources()
{
DoClearCachedResources();
}
void
WebRenderImageData::DoClearCachedResources()
{
ClearImageKey();
@ -259,6 +285,14 @@ WebRenderFallbackData::~WebRenderFallbackData()
{
}
void
WebRenderFallbackData::ClearCachedResources()
{
WebRenderImageData::ClearCachedResources();
mBasicLayerManager = nullptr;
mInvalid = true;
}
nsDisplayItemGeometry*
WebRenderFallbackData::GetGeometry()
{
@ -296,11 +330,17 @@ WebRenderCanvasData::WebRenderCanvasData(WebRenderLayerManager* aWRManager, nsDi
WebRenderCanvasData::~WebRenderCanvasData()
{
ClearCachedResources();
DoClearCachedResources();
}
void
WebRenderCanvasData::ClearCachedResources()
{
DoClearCachedResources();
}
void
WebRenderCanvasData::DoClearCachedResources()
{
if (mCanvasRenderer) {
mCanvasRenderer->ClearCachedResources();

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

@ -13,6 +13,7 @@
#include "mozilla/layers/AnimationInfo.h"
class nsDisplayItemGeometry;
class nsIFrame;
namespace mozilla {
namespace wr {
@ -35,6 +36,8 @@ class WebRenderUserData
public:
typedef nsTHashtable<nsRefPtrHashKey<WebRenderUserData> > WebRenderUserDataRefTable;
static bool SupportsAsyncUpdate(nsIFrame* aFrame);
NS_INLINE_DECL_REFCOUNTING(WebRenderUserData)
WebRenderUserData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem);
@ -101,9 +104,16 @@ public:
void CreateImageClientIfNeeded();
void ClearCachedResources() override;
bool IsAsync()
{
return mPipelineId.isSome();
}
protected:
void ClearImageKey();
void CreateExternalImageIfNeeded();
void DoClearCachedResources();
wr::MaybeExternalImageId mExternalImageId;
Maybe<wr::ImageKey> mKey;
@ -122,6 +132,7 @@ public:
virtual WebRenderFallbackData* AsFallbackData() override { return this; }
virtual UserDataType GetType() override { return UserDataType::eFallback; }
static UserDataType Type() { return UserDataType::eFallback; }
void ClearCachedResources() override;
nsDisplayItemGeometry* GetGeometry() override;
void SetGeometry(nsAutoPtr<nsDisplayItemGeometry> aGeometry);
nsRect GetBounds() { return mBounds; }
@ -168,6 +179,8 @@ public:
WebRenderCanvasRendererAsync* CreateCanvasRenderer();
void ClearCachedResources() override;
protected:
void DoClearCachedResources();
UniquePtr<WebRenderCanvasRendererAsync> mCanvasRenderer;
};

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

@ -2015,7 +2015,7 @@ gfxFont::DrawMissingGlyph(const TextRunDrawParams& aRunParams,
// of the drawTarget's transform, we need to undo
// this before drawing the hexbox. (Bug 983985)
gfxContextMatrixAutoSaveRestore matrixRestore;
if (aFontParams.needsOblique && !textDrawer) {
if (aFontParams.needsOblique && !aFontParams.isVerticalFont && !textDrawer) {
matrixRestore.SetContext(aRunParams.context);
gfx::Matrix mat =
aRunParams.context->CurrentMatrix().

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

@ -968,6 +968,8 @@ xpc::GlobalProperties::Parse(JSContext* cx, JS::HandleObject obj)
messageChannel = true;
} else if (!strcmp(name.ptr(), "InspectorUtils")) {
inspectorUtils = true;
} else if (!strcmp(name.ptr(), "ChromeUtils")) {
ChromeUtils = true;
} else {
JS_ReportErrorUTF8(cx, "Unknown property name: %s", name.ptr());
return false;
@ -1057,6 +1059,9 @@ xpc::GlobalProperties::Define(JSContext* cx, JS::HandleObject obj)
!dom::InspectorUtilsBinding::GetConstructorObject(cx))
return false;
if (ChromeUtils && !dom::ChromeUtilsBinding::GetConstructorObject(cx))
return false;
return true;
}

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

@ -2698,6 +2698,7 @@ struct GlobalProperties {
bool caches : 1;
bool fileReader: 1;
bool messageChannel: 1;
bool ChromeUtils : 1;
bool inspectorUtils : 1;
private:
bool Define(JSContext* cx, JS::HandleObject obj);

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

@ -7223,6 +7223,13 @@ nsIFrame::InvalidateLayer(DisplayItemType aDisplayItemKey,
nsIFrame* displayRoot = nsLayoutUtils::GetDisplayRootFrame(this);
InvalidateRenderingObservers(displayRoot, this);
// Check if frame supports WebRender's async update
if ((aFlags & UPDATE_IS_ASYNC) &&
WebRenderUserData::SupportsAsyncUpdate(this)) {
// WebRender does not use layer, then return nullptr.
return nullptr;
}
// If the layer is being updated asynchronously, and it's being forwarded
// to a compositor, then we don't need to invalidate.
if ((aFlags & UPDATE_IS_ASYNC) && layer && layer->SupportsAsyncUpdate()) {

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

@ -986,6 +986,13 @@ nsInlineFrame::UpdateStyleOfOwnedAnonBoxesForIBSplit(
}
nsIFrame* nextInline = blockFrame->GetProperty(nsIFrame::IBSplitSibling());
// This check is here due to bug 1431232. Please remove it once
// that bug is fixed.
if (MOZ_UNLIKELY(!nextInline)) {
break;
}
MOZ_ASSERT(nextInline, "There is always a trailing inline in an IB split");
for (nsIFrame* cont = nextInline; cont; cont = cont->GetNextContinuation()) {

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

@ -1228,6 +1228,7 @@ class PackageFrontend(MachCommandBase):
import shutil
from taskgraph.generator import load_graph_config, Kind
from taskgraph.parameters import Parameters
from taskgraph.util.taskcluster import (
get_artifact_url,
list_artifacts,
@ -1351,7 +1352,7 @@ class PackageFrontend(MachCommandBase):
def tasks(kind_name):
root_path = mozpath.join(self.topsrcdir, 'taskcluster', 'ci')
graph_config = load_graph_config(root_path)
tasks = Kind.load(root_path, graph_config, kind_name).load_tasks(params, {})
tasks = Kind.load(root_path, graph_config, kind_name).load_tasks(Parameters(**params), {})
return {
task.task['metadata']['name']: task
for task in tasks

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

@ -423,25 +423,28 @@ class Talos(TestingMixin, MercurialScript, BlobUploadMixin, TooltoolMixin,
else:
self.info("Not downloading pageset because the no-download option was specified")
# if running speedometer locally, need to copy speedometer source into talos/tests
if self.config.get('run_local') and 'speedometer' in self.suite:
self.get_speedometer_source()
# if running webkit tests locally, need to copy webkit source into talos/tests
if self.config.get('run_local') and ('speedometer' in self.suite or
'stylebench' in self.suite or
'motionmark' in self.suite):
self.get_webkit_source()
def get_speedometer_source(self):
# in production the build system auto copies speedometer source into place;
def get_webkit_source(self):
# in production the build system auto copies webkit source into place;
# but when run locally we need to do this manually, so that talos can find it
src = os.path.join(self.repo_path, 'third_party', 'webkit',
'PerformanceTests', 'Speedometer')
'PerformanceTests')
dest = os.path.join(self.talos_path, 'talos', 'tests', 'webkit',
'PerformanceTests', 'Speedometer')
if not os.path.exists(dest):
self.info("Copying speedometer source from %s to %s" % (src, dest))
try:
shutil.copytree(src, dest)
except:
self.critical("Error copying speedometer source from %s to %s" % (src, dest))
else:
self.info("Speedometer source already found at %s" % dest)
'PerformanceTests')
if os.path.exists(dest):
shutil.rmtree(dest)
self.info("Copying webkit benchmarks from %s to %s" % (src, dest))
try:
shutil.copytree(src, dest)
except:
self.critical("Error copying webkit benchmarks from %s to %s" % (src, dest))
def setup_mitmproxy(self):
"""Some talos tests require the use of mitmproxy to playback the pages,

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

@ -84,7 +84,7 @@
"talos_options": ["--disable-stylo"]
},
"speedometer-e10s": {
"tests": ["speedometer"]
"tests": ["speedometer", "stylebench"]
},
"speedometer-stylo-disabled-e10s": {
"talos_options": ["--disable-stylo"],

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

@ -843,6 +843,21 @@ class speedometer(PageloaderTest):
unit = 'score'
@register_test()
class stylebench(PageloaderTest):
"""
StyleBench benchmark used by many browser vendors (from webkit)
"""
tpmanifest = '${talos}/tests/stylebench/stylebench.manifest'
tpcycles = 1
tppagecycles = 5
tpmozafterpaint = False
tpchrome = False
format_pagename = False
lower_is_better = False
unit = 'score'
@register_test()
class perf_reftest(PageloaderTest):
"""

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

@ -0,0 +1 @@
% http://localhost/tests/webkit/PerformanceTests/StyleBench/index.html?gecko

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

@ -1,4 +1,4 @@
<!DOCTYPE html>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
@ -14,6 +14,9 @@
addEventListener('load', () => {
if (!window.location.protocol.startsWith('http'))
showSection('local-message', false);
if (location.search("?gecko"))
startTest();
});
</script>
</head>

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

@ -1259,24 +1259,22 @@
},
"GPU_PROCESS_LAUNCH_TIME_MS_2" : {
"record_in_processes": ["main", "content"],
"alert_emails": ["danderson@mozilla.com"],
"expires_in_version": "never",
"alert_emails": ["gfx-telemetry-alerts@mozilla.com","msreckovic@mozilla.com"],
"expires_in_version": "66",
"bug_numbers": [1297790, 1317796],
"kind": "exponential",
"high": 64000,
"n_buckets": 100,
"releaseChannelCollection": "opt-out",
"description": "GPU process launch time in milliseconds"
},
"GPU_PROCESS_INITIALIZATION_TIME_MS" : {
"record_in_processes": ["main", "content", "gpu"],
"alert_emails": ["danderson@mozilla.com"],
"expires_in_version": "never",
"alert_emails": ["gfx-telemetry-alerts@mozilla.com","msreckovic@mozilla.com"],
"expires_in_version": "66",
"bug_numbers": [1324095],
"kind": "exponential",
"high": 64000,
"n_buckets": 100,
"releaseChannelCollection": "opt-out",
"description": "GPU process initialization (excluding XPCOM and fork time) time in milliseconds"
},
"GPU_PROCESS_CRASH_FALLBACKS": {
@ -12260,7 +12258,7 @@
"D3D11_SYNC_HANDLE_FAILURE": {
"record_in_processes": ["main", "content", "gpu"],
"alert_emails": ["gfx-telemetry-alerts@mozilla.com","bschouten@mozilla.com","danderson@mozilla.com","msreckovic@mozilla.com","ashughes@mozilla.com"],
"expires_in_version": "60",
"expires_in_version": "66",
"releaseChannelCollection": "opt-out",
"kind": "count",
"description": "Number of times the D3D11 compositor failed to get a texture sync handle."
@ -12445,7 +12443,7 @@
},
"PLUGIN_DRAWING_MODEL": {
"record_in_processes": ["main", "content"],
"alert_emails": ["danderson@mozilla.com"],
"alert_emails": ["gfx-telemetry-alerts@mozilla.com","msreckovic@mozilla.com"],
"expires_in_version": "never",
"kind": "enumerated",
"bug_numbers": [1229961],
@ -12624,7 +12622,7 @@
},
"MEDIA_DECODER_BACKEND_USED": {
"record_in_processes": ["main", "content", "gpu"],
"alert_emails": ["danderson@mozilla.com"],
"alert_emails": ["gfx-telemetry-alerts@mozilla.com","msreckovic@mozilla.com"],
"bug_numbers": [1259695],
"expires_in_version": "never",
"kind": "enumerated",
@ -13018,9 +13016,9 @@
},
"CONTENT_PAINT_TIME": {
"record_in_processes": ["main", "content"],
"alert_emails": ["danderson@mozilla.com","gfx-telemetry-alerts@mozilla.com"],
"alert_emails": ["mwoodrow@mozilla.com","gfx-telemetry-alerts@mozilla.com"],
"bug_numbers": [1309442],
"expires_in_version": "60",
"expires_in_version": "66",
"kind": "exponential",
"high": 1000,
"n_buckets": 50,
@ -13028,9 +13026,9 @@
},
"CONTENT_LARGE_PAINT_PHASE_WEIGHT": {
"record_in_processes": ["main", "content"],
"alert_emails": ["danderson@mozilla.com","gfx-telemetry-alerts@mozilla.com"],
"alert_emails": ["mwoodrow@mozilla.com","gfx-telemetry-alerts@mozilla.com"],
"bug_numbers": [1309442],
"expires_in_version": "60",
"expires_in_version": "66",
"keyed": true,
"kind": "linear",
"high": 100,
@ -13841,8 +13839,8 @@
},
"GFX_OMTP_PAINT_WAIT_TIME": {
"record_in_processes": ["content"],
"alert_emails": ["gfx-telemetry-alerts@mozilla.com","danderson@mozilla.com"],
"expires_in_version": "61",
"alert_emails": ["gfx-telemetry-alerts@mozilla.com","rhunt@mozilla.com"],
"expires_in_version": "66",
"kind": "exponential",
"high": 200,
"n_buckets": 50,

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

@ -1091,10 +1091,10 @@ gfx.omtp:
for a paint for more than 200us, versus the total number of paints.
keyed: false
kind: uint
expires: "61"
expires: "66"
notification_emails:
- gfx-telemetry-alerts@mozilla.com
- danderson@mozilla.com
- rhunt@mozilla.com
record_in_processes:
- 'content'