Merge mozilla-central to fx-team

This commit is contained in:
Carsten "Tomcat" Book 2016-06-10 15:42:51 +02:00
commit 48d4127667
339 changed files with 6434 additions and 3563 deletions

View File

@ -1903,7 +1903,7 @@ HyperTextAccessible::RemoveChild(Accessible* aAccessible)
if (count > 0)
mOffsets.RemoveElementsAt(childIndex, count);
return Accessible::RemoveChild(aAccessible);
return AccessibleWrap::RemoveChild(aAccessible);
}
bool
@ -1913,7 +1913,7 @@ HyperTextAccessible::InsertChildAt(uint32_t aIndex, Accessible* aChild)
if (count > 0 ) {
mOffsets.RemoveElementsAt(aIndex, count);
}
return Accessible::InsertChildAt(aIndex, aChild);
return AccessibleWrap::InsertChildAt(aIndex, aChild);
}
Relation

View File

@ -41,6 +41,8 @@ public:
void SetTopLevel() { mTopLevel = true; }
bool IsTopLevel() const { return mTopLevel; }
bool IsShutdown() const { return mShutdown; }
/*
* Called when a message from a document in a child process notifies the main
* process it is firing an event.

View File

@ -1185,7 +1185,6 @@ ProxyAccessible::OuterDocOfRemoteBrowser() const
return nullptr;
DocAccessible* chromeDoc = GetExistingDocAccessible(frame->OwnerDoc());
NS_ASSERTION(chromeDoc, "accessible tab in not accessible chromeDocument");
return chromeDoc ? chromeDoc->GetAccessible(frame) : nullptr;
}

View File

@ -52,20 +52,6 @@ public: // construction, destruction
virtual nsresult HandleAccEvent(AccEvent* aEvent) override;
/**
* Ignored means that the accessible might still have children, but is not
* displayed to the user. it also has no native accessible object represented
* for it.
*/
bool IsIgnored();
/**
* Returns this accessible's all children, adhering to "flat" accessibles by
* not returning their children.
*/
void GetUnignoredChildren(nsTArray<Accessible*>* aChildrenArray);
Accessible* GetUnignoredParent() const;
protected:
/**

View File

@ -156,52 +156,6 @@ AccessibleWrap::RemoveChild(Accessible* aAccessible)
return removed;
}
// if we for some reason have no native accessible, we should be skipped over (and traversed)
// when fetching all unignored children, etc. when counting unignored children, we will not be counted.
bool
AccessibleWrap::IsIgnored()
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_RETURN;
mozAccessible* nativeObject = GetNativeObject();
return (!nativeObject) || [nativeObject accessibilityIsIgnored];
NS_OBJC_END_TRY_ABORT_BLOCK_RETURN(false);
}
void
AccessibleWrap::GetUnignoredChildren(nsTArray<Accessible*>* aChildrenArray)
{
// we're flat; there are no children.
if (nsAccUtils::MustPrune(this))
return;
uint32_t childCount = ChildCount();
for (uint32_t childIdx = 0; childIdx < childCount; childIdx++) {
AccessibleWrap* childAcc =
static_cast<AccessibleWrap*>(GetChildAt(childIdx));
// If element is ignored, then add its children as substitutes.
if (childAcc->IsIgnored()) {
childAcc->GetUnignoredChildren(aChildrenArray);
continue;
}
aChildrenArray->AppendElement(childAcc);
}
}
Accessible*
AccessibleWrap::GetUnignoredParent() const
{
// Go up the chain to find a parent that is not ignored.
AccessibleWrap* parentWrap = static_cast<AccessibleWrap*>(Parent());
while (parentWrap && parentWrap->IsIgnored())
parentWrap = static_cast<AccessibleWrap*>(parentWrap->Parent());
return parentWrap;
}
////////////////////////////////////////////////////////////////////////////////
// AccessibleWrap protected

View File

@ -8,6 +8,7 @@
#include "Platform.h"
#include "ProxyAccessible.h"
#include "DocAccessibleParent.h"
#include "mozTableAccessible.h"
#include "nsAppShell.h"
@ -54,15 +55,57 @@ ProxyCreated(ProxyAccessible* aProxy, uint32_t)
uintptr_t accWrap = reinterpret_cast<uintptr_t>(aProxy) | IS_PROXY;
mozAccessible* mozWrapper = [[type alloc] initWithAccessible:accWrap];
aProxy->SetWrapper(reinterpret_cast<uintptr_t>(mozWrapper));
mozAccessible* nativeParent = nullptr;
if (aProxy->IsDoc() && aProxy->AsDoc()->IsTopLevel()) {
// If proxy is top level, the parent we need to invalidate the children of
// will be a non-remote accessible.
Accessible* outerDoc = aProxy->OuterDocOfRemoteBrowser();
if (outerDoc) {
nativeParent = GetNativeFromGeckoAccessible(outerDoc);
}
} else {
// Non-top level proxies need proxy parents' children invalidated.
ProxyAccessible* parent = aProxy->Parent();
nativeParent = GetNativeFromProxy(parent);
NS_ASSERTION(parent, "a non-top-level proxy is missing a parent?");
}
if (nativeParent) {
[nativeParent invalidateChildren];
}
}
void
ProxyDestroyed(ProxyAccessible* aProxy)
{
mozAccessible* nativeParent = nil;
if (aProxy->IsDoc() && aProxy->AsDoc()->IsTopLevel()) {
// Invalidate native parent in parent process's children on proxy destruction
Accessible* outerDoc = aProxy->OuterDocOfRemoteBrowser();
if (outerDoc) {
nativeParent = GetNativeFromGeckoAccessible(outerDoc);
}
} else {
if (!aProxy->Document()->IsShutdown()) {
// Only do if the document has not been shut down, else parent will return
// garbage since we don't shut down children from top down.
ProxyAccessible* parent = aProxy->Parent();
// Invalidate proxy parent's children.
if (parent) {
nativeParent = GetNativeFromProxy(parent);
}
}
}
mozAccessible* wrapper = GetNativeFromProxy(aProxy);
[wrapper expire];
[wrapper release];
aProxy->SetWrapper(0);
if (nativeParent) {
[nativeParent invalidateChildren];
}
}
void

View File

@ -42,13 +42,6 @@ GetNativeFromProxy(const ProxyAccessible* aProxy)
return reinterpret_cast<mozAccessible*>(aProxy->GetWrapper());
}
ProxyAccessible* GetProxyUnignoredParent(const ProxyAccessible* aProxy);
void GetProxyUnignoredChildren(const ProxyAccessible* aProxy,
nsTArray<ProxyAccessible*>* aChildrenArray);
BOOL IsProxyIgnored(const ProxyAccessible* aProxy);
} // a11y
} // mozilla

View File

@ -19,6 +19,7 @@
#include "TableAccessible.h"
#include "TableCellAccessible.h"
#include "mozilla/a11y/PDocAccessible.h"
#include "OuterDocAccessible.h"
#include "mozilla/Services.h"
#include "nsRect.h"
@ -48,76 +49,6 @@ using namespace mozilla::a11y;
// - NSAccessibilityMathPrescriptsAttribute @"AXMathPrescripts"
// - NSAccessibilityMathPostscriptsAttribute @"AXMathPostscripts"
// returns the passed in object if it is not ignored. if it's ignored, will return
// the first unignored ancestor.
static inline id
GetClosestInterestingAccessible(id anObject)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
// this object is not ignored, so let's return it.
if (![anObject accessibilityIsIgnored])
return GetObjectOrRepresentedView(anObject);
// find the closest ancestor that is not ignored.
id unignoredObject = anObject;
while ((unignoredObject = [unignoredObject accessibilityAttributeValue:NSAccessibilityParentAttribute])) {
if (![unignoredObject accessibilityIsIgnored])
// object is not ignored, so let's stop the search.
break;
}
// if it's a mozAccessible, we need to take care to maybe return the view we
// represent, to the AT.
if ([unignoredObject respondsToSelector:@selector(hasRepresentedView)])
return GetObjectOrRepresentedView(unignoredObject);
return unignoredObject;
NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
}
ProxyAccessible*
a11y::GetProxyUnignoredParent(const ProxyAccessible* aProxy)
{
ProxyAccessible* parent = aProxy->Parent();
while (parent && IsProxyIgnored(aProxy))
parent = parent->Parent();
return parent;
}
void
a11y::GetProxyUnignoredChildren(const ProxyAccessible* aProxy,
nsTArray<ProxyAccessible*>* aChildrenArray)
{
if (aProxy->MustPruneChildren())
return;
uint32_t childCount = aProxy->ChildrenCount();
for (size_t childIdx = 0; childIdx < childCount; childIdx++) {
ProxyAccessible* childProxy = aProxy->ChildAt(childIdx);
// If element is ignored, then add its children as substitutes.
if (IsProxyIgnored(childProxy)) {
GetProxyUnignoredChildren(childProxy, aChildrenArray);
continue;
}
aChildrenArray->AppendElement(childProxy);
}
}
BOOL
a11y::IsProxyIgnored(const ProxyAccessible* aProxy)
{
mozAccessible* nativeObject = GetNativeFromProxy(aProxy);
if (!nativeObject)
return true;
return [nativeObject accessibilityIsIgnored];
}
// convert an array of Gecko accessibles to an NSArray of native accessibles
static inline NSMutableArray*
ConvertToNSArray(nsTArray<Accessible*>& aArray)
@ -569,10 +500,10 @@ ConvertToNSArray(nsTArray<ProxyAccessible*>& aArray)
}
if (nativeChild)
return GetClosestInterestingAccessible(nativeChild);
return nativeChild;
// if we didn't find anything, return ourself (or the first unignored ancestor).
return GetClosestInterestingAccessible(self);
// if we didn't find anything, return ourself or child view.
return GetObjectOrRepresentedView(self);
}
- (NSArray*)accessibilityActionNames
@ -610,10 +541,10 @@ ConvertToNSArray(nsTArray<ProxyAccessible*>& aArray)
}
if (focusedChild)
return GetClosestInterestingAccessible(focusedChild);
return GetObjectOrRepresentedView(focusedChild);
// return ourself if we can't get a native focused child.
return GetClosestInterestingAccessible(self);
return GetObjectOrRepresentedView(self);
}
#pragma mark -
@ -624,35 +555,32 @@ ConvertToNSArray(nsTArray<ProxyAccessible*>& aArray)
id nativeParent = nil;
if (AccessibleWrap* accWrap = [self getGeckoAccessible]) {
Accessible* accessibleParent = accWrap->GetUnignoredParent();
Accessible* accessibleParent = accWrap->Parent();
if (accessibleParent)
nativeParent = GetNativeFromGeckoAccessible(accessibleParent);
if (nativeParent)
return GetClosestInterestingAccessible(nativeParent);
// GetUnignoredParent() returns null when there is no unignored accessible all the way up to
// the root accessible. so we'll have to return whatever native accessible is above our root accessible
// (which might be the owning NSWindow in the application, for example).
//
// get the native root accessible, and tell it to return its first parent unignored accessible.
return GetObjectOrRepresentedView(nativeParent);
// Return native of root accessible if we have no direct parent
nativeParent = GetNativeFromGeckoAccessible(accWrap->RootAccessible());
} else if (ProxyAccessible* proxy = [self getProxyAccessible]) {
// Go up the chain to find a parent that is not ignored.
ProxyAccessible* accessibleParent = GetProxyUnignoredParent(proxy);
if (accessibleParent)
nativeParent = GetNativeFromProxy(accessibleParent);
if (ProxyAccessible* proxyParent = proxy->Parent()) {
nativeParent = GetNativeFromProxy(proxyParent);
}
if (nativeParent)
return GetClosestInterestingAccessible(nativeParent);
return GetObjectOrRepresentedView(nativeParent);
Accessible* outerDoc = proxy->OuterDocOfRemoteBrowser();
nativeParent = outerDoc ?
GetNativeFromGeckoAccessible(outerDoc->RootAccessible()) : nil;
GetNativeFromGeckoAccessible(outerDoc) : nil;
} else {
return nil;
}
NSAssert1 (nativeParent, @"!!! we can't find a parent for %@", self);
return GetClosestInterestingAccessible(nativeParent);
return GetObjectOrRepresentedView(nativeParent);
NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
}
@ -682,25 +610,35 @@ ConvertToNSArray(nsTArray<ProxyAccessible*>& aArray)
return mChildren;
// get the array of children.
mChildren = [[NSMutableArray alloc] init];
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (accWrap) {
AutoTArray<Accessible*, 10> childrenArray;
accWrap->GetUnignoredChildren(&childrenArray);
mChildren = ConvertToNSArray(childrenArray);
} else if (ProxyAccessible* proxy = [self getProxyAccessible]) {
AutoTArray<ProxyAccessible*, 10> childrenArray;
GetProxyUnignoredChildren(proxy, &childrenArray);
mChildren = ConvertToNSArray(childrenArray);
}
uint32_t childCount = accWrap->ChildCount();
for (uint32_t childIdx = 0; childIdx < childCount; childIdx++) {
mozAccessible* nativeChild = GetNativeFromGeckoAccessible(accWrap->GetChildAt(childIdx));
if (nativeChild)
[mChildren addObject:nativeChild];
}
// children from child if this is an outerdoc
OuterDocAccessible* docOwner = accWrap->AsOuterDoc();
if (docOwner) {
if (ProxyAccessible* proxyDoc = docOwner->RemoteChildDoc()) {
mozAccessible* nativeRemoteChild = GetNativeFromProxy(proxyDoc);
[mChildren insertObject:nativeRemoteChild atIndex:0];
NSAssert1 (nativeRemoteChild, @"%@ found a child remote doc missing a native\n", self);
}
}
} else if (ProxyAccessible* proxy = [self getProxyAccessible]) {
uint32_t childCount = proxy->ChildrenCount();
for (uint32_t childIdx = 0; childIdx < childCount; childIdx++) {
mozAccessible* nativeChild = GetNativeFromProxy(proxy->ChildAt(childIdx));
if (nativeChild)
[mChildren addObject:nativeChild];
}
#ifdef DEBUG_hakan
// make sure we're not returning any ignored accessibles.
NSEnumerator *e = [mChildren objectEnumerator];
mozAccessible *m = nil;
while ((m = [e nextObject])) {
NSAssert1(![m accessibilityIsIgnored], @"we should never return an ignored accessible! (%@)", m);
}
#endif
return mChildren;
@ -1148,7 +1086,6 @@ struct RoleDescrComparator
#ifdef DEBUG_hakan
NSLog (@"%@ received focus!", self);
#endif
NSAssert1(![self accessibilityIsIgnored], @"trying to set focus to ignored element! (%@)", self);
NSAccessibilityPostNotification(GetObjectOrRepresentedView(self),
NSAccessibilityFocusedUIElementChangedNotification);
@ -1198,7 +1135,7 @@ struct RoleDescrComparator
mozAccessible *curNative = GetNativeFromGeckoAccessible(aAccessible);
if (curNative)
[mChildren addObject:GetObjectOrRepresentedView(curNative)];
[mChildren addObject:curNative];
}
- (void)expire
@ -1229,7 +1166,6 @@ struct RoleDescrComparator
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
NSAssert(![self accessibilityIsIgnored], @"can't sanity check children of an ignored accessible!");
NSEnumerator *iter = [children objectEnumerator];
mozAccessible *curObj = nil;
@ -1282,8 +1218,7 @@ struct RoleDescrComparator
if (!children)
return;
if (![self accessibilityIsIgnored])
[self sanityCheckChildren];
[self sanityCheckChildren];
NSEnumerator *iter = [children objectEnumerator];
mozAccessible *object = nil;

View File

@ -1290,11 +1290,21 @@ pref("media.gmp.decoder.h264", 2);
// decode H.264.
pref("media.gmp.trial-create.enabled", true);
// Note: when media.gmp-*.visible is true, provided we're running on a
// supported platform/OS version, the corresponding CDM appears in the
// plugins list, Firefox will download the GMP/CDM if enabled, and our
// UI to re-enable EME prompts the user to re-enable EME if it's disabled
// and script requests EME. If *.visible is false, we won't show the UI
// to enable the CDM if its disabled; it's as if the keysystem is completely
// unsupported.
#ifdef MOZ_ADOBE_EME
pref("media.gmp-eme-adobe.visible", true);
pref("media.gmp-eme-adobe.enabled", true);
#endif
#ifdef MOZ_WIDEVINE_EME
pref("media.gmp-widevinecdm.visible", true);
pref("media.gmp-widevinecdm.enabled", true);
#endif

View File

@ -31,6 +31,20 @@ var gEMEHandler = {
}
browser.reload();
},
isKeySystemVisible: function(keySystem) {
if (!keySystem) {
return false;
}
if (keySystem.startsWith("com.adobe") &&
Services.prefs.getPrefType("media.gmp-eme-adobe.visible")) {
return Services.prefs.getBoolPref("media.gmp-eme-adobe.visible");
}
if (keySystem == "com.widevine.alpha" &&
Services.prefs.getPrefType("media.gmp-widevinecdm.visible")) {
return Services.prefs.getBoolPref("media.gmp-widevinecdm.visible");
}
return true;
},
getLearnMoreLink: function(msgId) {
let text = gNavigatorBundle.getString("emeNotifications." + msgId + ".learnMoreLabel");
let baseURL = Services.urlFormatter.formatURLPref("app.support.baseURL");
@ -46,8 +60,8 @@ var gEMEHandler = {
return;
}
let {status: status, keySystem: keySystem} = parsedData;
// Don't need to show if disabled
if (!this.uiEnabled) {
// Don't need to show if disabled or keysystem not visible.
if (!this.uiEnabled || !this.isKeySystemVisible(keySystem)) {
return;
}

View File

@ -4121,7 +4121,7 @@ function updateUserContextUIIndicator()
}
let label = document.getElementById("userContext-label");
label.value = ContextualIdentityService.getUserContextLabel(userContextId);
label.setAttribute('value', ContextualIdentityService.getUserContextLabel(userContextId));
label.style.color = identity.color;
let indicator = document.getElementById("userContext-indicator");
@ -5540,6 +5540,12 @@ function handleLinkClick(event, href, linkNode) {
referrerURI: referrerURI,
referrerPolicy: referrerPolicy,
noReferrer: BrowserUtils.linkHasNoReferrer(linkNode) };
// The new tab/window must use the same userContextId
if (doc.nodePrincipal.originAttributes.userContextId) {
params.userContextId = doc.nodePrincipal.originAttributes.userContextId;
}
openLinkIn(href, where, params);
event.preventDefault();
return true;

View File

@ -454,7 +454,8 @@ var ClickEventHandler = {
let json = { button: event.button, shiftKey: event.shiftKey,
ctrlKey: event.ctrlKey, metaKey: event.metaKey,
altKey: event.altKey, href: null, title: null,
bookmark: false, referrerPolicy: referrerPolicy };
bookmark: false, referrerPolicy: referrerPolicy,
originAttributes: principal ? principal.originAttributes : {} };
if (href) {
try {

View File

@ -955,8 +955,17 @@ nsContextMenu.prototype = {
referrerURI: gContextMenuContentData.documentURIObject,
referrerPolicy: gContextMenuContentData.referrerPolicy,
noReferrer: this.linkHasNoReferrer };
for (let p in extra)
for (let p in extra) {
params[p] = extra[p];
}
// If we want to change userContextId, we must be sure that we don't
// propagate the referrer.
if ("userContextId" in params &&
params.userContextId != this.principal.originAttributes.userContextId) {
params.noReferrer = true;
}
return params;
},
@ -998,10 +1007,6 @@ nsContextMenu.prototype = {
userContextId: parseInt(event.target.getAttribute('usercontextid'))
};
if (params.userContextId != this.principal.originAttributes.userContextId) {
params.noReferrer = true;
}
openLinkIn(this.linkURL, "tab", this._openLinkInParameters(params));
},

View File

@ -2617,8 +2617,7 @@
modifiedAttrs.push("soundplaying");
}
if (aOtherTab.hasAttribute("usercontextid")) {
aOurTab.setAttribute("usercontextid", aOtherTab.getAttribute("usercontextid"));
ContextualIdentityService.setTabStyle(aOurTab);
aOurTab.setUserContextId(aOtherTab.getAttribute("usercontextid"));
modifiedAttrs.push("usercontextid");
}
@ -6425,12 +6424,18 @@
<body>
<![CDATA[
if (aUserContextId) {
this.linkedBrowser.setAttribute("usercontextid", aUserContextId);
if (this.linkedBrowser) {
this.linkedBrowser.setAttribute("usercontextid", aUserContextId);
}
this.setAttribute("usercontextid", aUserContextId);
} else {
this.linkedBrowser.removeAttribute("usercontextid");
if (this.linkedBrowser) {
this.linkedBrowser.removeAttribute("usercontextid");
}
this.removeAttribute("usercontextid");
}
ContextualIdentityService.setTabStyle(this);
]]>
</body>
</method>

View File

@ -355,3 +355,53 @@ add_task(function* test_event_order() {
});
});
// This test checks select elements with a large number of options to ensure that
// the popup appears within the browser area.
add_task(function* test_large_popup() {
const pageUrl = "data:text/html," + escape(PAGECONTENT_SMALL);
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, pageUrl);
yield ContentTask.spawn(tab.linkedBrowser, null, function*() {
let doc = content.document;
let select = doc.getElementById("one");
for (var i = 0; i < 180; i++) {
select.add(new content.Option("Test" + i));
}
select.focus();
});
let selectPopup = document.getElementById("ContentSelectDropdown").menupopup;
let browserRect = tab.linkedBrowser.getBoundingClientRect();
let positions = [
"margin-top: 300px;",
"position: fixed; bottom: 100px;",
"width: 100%; height: 9999px;"
];
let position;
while (true) {
yield openSelectPopup(selectPopup, false);
let rect = selectPopup.getBoundingClientRect();
ok(rect.top >= browserRect.top, "Popup top position in within browser area");
ok(rect.bottom <= browserRect.bottom, "Popup bottom position in within browser area");
yield hideSelectPopup(selectPopup, false);
position = positions.shift();
if (!position) {
break;
}
let contentPainted = BrowserTestUtils.contentPainted(tab.linkedBrowser);
yield ContentTask.spawn(tab.linkedBrowser, position, function*(position) {
let select = content.document.getElementById("one");
select.setAttribute("style", position);
});
yield contentPainted;
}
yield BrowserTestUtils.removeTab(tab);
});

View File

@ -6,12 +6,21 @@ support-files =
head.js
[browser_referrer_middle_click.js]
[browser_referrer_middle_click_in_container.js]
[browser_referrer_open_link_in_private.js]
skip-if = os == 'linux' # Bug 1145199
[browser_referrer_open_link_in_tab.js]
skip-if = os == 'linux' # Bug 1144816
[browser_referrer_open_link_in_tab_in_container.js]
skip-if = os == 'linux' # Bug 1144816
[browser_referrer_open_link_in_window.js]
skip-if = os == 'linux' # Bug 1145199
[browser_referrer_open_link_in_window_in_container.js]
skip-if = os == 'linux' # Bug 1145199
[browser_referrer_simple_click.js]
[browser_referrer_open_link_in_container_tab.js]
skip-if = os == 'linux' # Bug 1144816
[browser_referrer_open_link_in_container_tab2.js]
skip-if = os == 'linux' # Bug 1144816
[browser_referrer_open_link_in_container_tab3.js]
skip-if = os == 'linux' # Bug 1144816

View File

@ -0,0 +1,20 @@
// Tests referrer on middle-click navigation.
// Middle-clicks on the link, which opens it in a new tab, same container.
function startMiddleClickTestCase(aTestNumber) {
info("browser_referrer_middle_click: " +
getReferrerTestDescription(aTestNumber));
someTabLoaded(gTestWindow).then(function(aNewTab) {
gTestWindow.gBrowser.selectedTab = aNewTab;
checkReferrerAndStartNextTest(aTestNumber, null, aNewTab,
startMiddleClickTestCase,
{ userContextId: 3 });
});
clickTheLink(gTestWindow, "testlink", {button: 1});
}
function test() {
requestLongerTimeout(10); // slowwww shutdown on e10s
startReferrerTest(startMiddleClickTestCase, { userContextId: 3 });
}

View File

@ -23,18 +23,27 @@ function startNewTabTestCase(aTestNumber) {
});
let menu = gTestWindow.document.getElementById("context-openlinkinusercontext-menu");
let menupopup = menu.menupopup;
menu.addEventListener("popupshown", function onPopupShown() {
menu.removeEventListener("popupshown", onPopupShown);
is(menupopup.nodeType, Node.ELEMENT_NODE, "We have a menupopup.");
ok(menupopup.firstChild, "We have a first container entry.");
let firstContext = menupopup.firstChild;
is(firstContext.nodeType, Node.ELEMENT_NODE, "We have a first container entry.");
ok(firstContext.hasAttribute("usercontextid"), "We have a usercontextid value.");
aContextMenu.addEventListener("popuphidden", function onPopupHidden() {
aContextMenu.removeEventListener("popuphidden", onPopupHidden);
firstContext.doCommand();
});
aContextMenu.hidePopup();
});
menupopup.showPopup();
is(menupopup.nodeType, Node.ELEMENT_NODE, "We have a menupopup.");
ok(menupopup.firstChild, "We have a first container entry.");
let firstContext = menupopup.firstChild;
is(firstContext.nodeType, Node.ELEMENT_NODE, "We have a first container entry.");
ok(firstContext.hasAttribute('usercontextid'), "We have a usercontextid value.");
firstContext.doCommand();
aContextMenu.hidePopup();
});
}

View File

@ -0,0 +1,52 @@
// Tests referrer on context menu navigation - open link in new container tab.
// Selects "open link in new container tab" from the context menu.
// The test runs from a container ID 1.
// Output: we have the correct referrer policy applied.
function startNewTabTestCase(aTestNumber) {
info("browser_referrer_open_link_in_container_tab: " +
getReferrerTestDescription(aTestNumber));
contextMenuOpened(gTestWindow, "testlink").then(function(aContextMenu) {
someTabLoaded(gTestWindow).then(function(aNewTab) {
gTestWindow.gBrowser.selectedTab = aNewTab;
checkReferrerAndStartNextTest(aTestNumber, null, aNewTab,
startNewTabTestCase, { userContextId: 1 });
});
let menu = gTestWindow.document.getElementById("context-openlinkinusercontext-menu");
let menupopup = menu.menupopup;
menu.addEventListener("popupshown", function onPopupShown() {
menu.removeEventListener("popupshown", onPopupShown);
is(menupopup.nodeType, Node.ELEMENT_NODE, "We have a menupopup.");
ok(menupopup.firstChild, "We have a first container entry.");
let firstContext = menupopup.firstChild;
is(firstContext.nodeType, Node.ELEMENT_NODE, "We have a first container entry.");
ok(firstContext.hasAttribute("usercontextid"), "We have a usercontextid value.");
is("1", firstContext.getAttribute("usercontextid"), "We have the right usercontextid value.");
aContextMenu.addEventListener("popuphidden", function onPopupHidden() {
aContextMenu.removeEventListener("popuphidden", onPopupHidden);
firstContext.doCommand();
});
aContextMenu.hidePopup();
});
menupopup.showPopup();
});
}
function test() {
waitForExplicitFinish();
SpecialPowers.pushPrefEnv(
{set: [["privacy.userContext.enabled", true]]},
function() {
requestLongerTimeout(10); // slowwww shutdown on e10s
startReferrerTest(startNewTabTestCase, { userContextId: 1 });
});
}

View File

@ -0,0 +1,63 @@
// Tests referrer on context menu navigation - open link in new container tab.
// Selects "open link in new container tab" from the context menu.
// The test runs from a container ID 2.
// Output: we have no referrer.
function getReferrerTest(aTestNumber) {
let test = _referrerTests[aTestNumber];
if (test) {
// We want all the referrer tests to fail!
test.result = "";
}
return test;
}
function startNewTabTestCase(aTestNumber) {
info("browser_referrer_open_link_in_container_tab: " +
getReferrerTestDescription(aTestNumber));
contextMenuOpened(gTestWindow, "testlink").then(function(aContextMenu) {
someTabLoaded(gTestWindow).then(function(aNewTab) {
gTestWindow.gBrowser.selectedTab = aNewTab;
checkReferrerAndStartNextTest(aTestNumber, null, aNewTab,
startNewTabTestCase, { userContextId: 2 });
});
let menu = gTestWindow.document.getElementById("context-openlinkinusercontext-menu");
let menupopup = menu.menupopup;
menu.addEventListener("popupshown", function onPopupShown() {
menu.removeEventListener("popupshown", onPopupShown);
is(menupopup.nodeType, Node.ELEMENT_NODE, "We have a menupopup.");
ok(menupopup.firstChild, "We have a first container entry.");
let firstContext = menupopup.firstChild;
is(firstContext.nodeType, Node.ELEMENT_NODE, "We have a first container entry.");
ok(firstContext.hasAttribute("usercontextid"), "We have a usercontextid value.");
is("1", firstContext.getAttribute("usercontextid"), "We have the right usercontextid value.");
aContextMenu.addEventListener("popuphidden", function onPopupHidden() {
aContextMenu.removeEventListener("popuphidden", onPopupHidden);
firstContext.doCommand();
});
aContextMenu.hidePopup();
});
menupopup.showPopup();
});
}
function test() {
waitForExplicitFinish();
SpecialPowers.pushPrefEnv(
{set: [["privacy.userContext.enabled", true]]},
function() {
requestLongerTimeout(10); // slowwww shutdown on e10s
startReferrerTest(startNewTabTestCase, { userContextId: 2 });
});
}

View File

@ -0,0 +1,34 @@
// Tests referrer on context menu navigation - open link in new tab.
// Selects "open link in new tab" from the context menu.
// This test starts from a container tab. We don't want to propagate the
// referrer.
function getReferrerTest(aTestNumber) {
let test = _referrerTests[aTestNumber];
if (test) {
// We want all the referrer tests to fail!
test.result = "";
}
return test;
}
function startNewTabTestCase(aTestNumber) {
info("browser_referrer_open_link_in_tab: " +
getReferrerTestDescription(aTestNumber));
contextMenuOpened(gTestWindow, "testlink").then(function(aContextMenu) {
someTabLoaded(gTestWindow).then(function(aNewTab) {
gTestWindow.gBrowser.selectedTab = aNewTab;
checkReferrerAndStartNextTest(aTestNumber, null, aNewTab,
startNewTabTestCase,
{ userContextId: 4 });
});
doContextMenuCommand(gTestWindow, aContextMenu, "context-openlinkintab");
});
}
function test() {
requestLongerTimeout(10); // slowwww shutdown on e10s
startReferrerTest(startNewTabTestCase, { userContextId: 4 });
}

View File

@ -0,0 +1,26 @@
// Tests referrer on context menu navigation - open link in new window.
// Selects "open link in new window" from the context menu.
// This test runs from a container tab. The new tab/window will be loaded in
// the same container.
function startNewWindowTestCase(aTestNumber) {
info("browser_referrer_open_link_in_window: " +
getReferrerTestDescription(aTestNumber));
contextMenuOpened(gTestWindow, "testlink").then(function(aContextMenu) {
newWindowOpened().then(function(aNewWindow) {
someTabLoaded(aNewWindow).then(function() {
checkReferrerAndStartNextTest(aTestNumber, aNewWindow, null,
startNewWindowTestCase,
{ userContextId: 1 });
});
});
doContextMenuCommand(gTestWindow, aContextMenu, "context-openlink");
});
}
function test() {
requestLongerTimeout(10); // slowwww shutdown on e10s
startReferrerTest(startNewWindowTestCase, { userContextId: 1 });
}

View File

@ -195,7 +195,7 @@ function doContextMenuCommand(aWindow, aMenu, aItemId) {
* @return {Promise}
* @resolves When the source url for this test case is loaded.
*/
function referrerTestCaseLoaded(aTestNumber) {
function referrerTestCaseLoaded(aTestNumber, aParams) {
let test = getReferrerTest(aTestNumber);
let server = rounds == 0 ? REFERRER_POLICYSERVER_URL :
REFERRER_POLICYSERVER_URL_ATTRIBUTE;
@ -204,7 +204,7 @@ function referrerTestCaseLoaded(aTestNumber) {
"&policy=" + escape(test.policy || "") +
"&rel=" + escape(test.rel || "");
var browser = gTestWindow.gBrowser;
browser.selectedTab = browser.addTab(url);
browser.selectedTab = browser.addTab(url, aParams);
return BrowserTestUtils.browserLoaded(browser.selectedBrowser);
}
@ -216,7 +216,7 @@ function referrerTestCaseLoaded(aTestNumber) {
* @param aStartTestCase The callback to start the next test, aTestNumber + 1.
*/
function checkReferrerAndStartNextTest(aTestNumber, aNewWindow, aNewTab,
aStartTestCase) {
aStartTestCase, aParams = {}) {
referrerResultExtracted(aNewWindow || gTestWindow).then(function(result) {
// Compare the actual result against the expected one.
let test = getReferrerTest(aTestNumber);
@ -232,13 +232,13 @@ function checkReferrerAndStartNextTest(aTestNumber, aNewWindow, aNewTab,
// Move on to the next test. Or finish if we're done.
var nextTestNumber = aTestNumber + 1;
if (getReferrerTest(nextTestNumber)) {
referrerTestCaseLoaded(nextTestNumber).then(function() {
referrerTestCaseLoaded(nextTestNumber, aParams).then(function() {
aStartTestCase(nextTestNumber);
});
} else if (rounds == 0) {
nextTestNumber = 0;
rounds = 1;
referrerTestCaseLoaded(nextTestNumber).then(function() {
referrerTestCaseLoaded(nextTestNumber, aParams).then(function() {
aStartTestCase(nextTestNumber);
});
} else {
@ -253,7 +253,7 @@ function checkReferrerAndStartNextTest(aTestNumber, aNewWindow, aNewTab,
* the test number - 0, 1, 2... Needs to trigger the navigation from the source
* page, and call checkReferrerAndStartNextTest() when the target is loaded.
*/
function startReferrerTest(aStartTestCase) {
function startReferrerTest(aStartTestCase, params = {}) {
waitForExplicitFinish();
// Open the window where we'll load the source URLs.
@ -264,7 +264,7 @@ function startReferrerTest(aStartTestCase) {
// Load and start the first test.
delayedStartupFinished(gTestWindow).then(function() {
referrerTestCaseLoaded(0).then(function() {
referrerTestCaseLoaded(0, params).then(function() {
aStartTestCase(0);
});
});

View File

@ -19,4 +19,5 @@ tags = openwindow
[browser_serviceworkers.js]
[browser_broadcastchannel.js]
[browser_blobUrl.js]
[browser_middleClick.js]
[browser_imageCache.js]

View File

@ -0,0 +1,41 @@
"use strict";
const BASE_ORIGIN = "http://example.com";
const URI = BASE_ORIGIN +
"/browser/browser/components/contextualidentity/test/browser/empty_file.html";
add_task(function* () {
info("Opening a new container tab...");
let tab = gBrowser.addTab(URI, { userContextId: 1 });
gBrowser.selectedTab = tab;
let browser = gBrowser.getBrowserForTab(tab);
yield BrowserTestUtils.browserLoaded(browser);
info("Create a HTMLAnchorElement...");
let position = yield ContentTask.spawn(browser, URI,
function(URI) {
let anchor = content.document.createElement("a");
anchor.setAttribute('id', 'clickMe');
anchor.setAttribute("href", URI);
anchor.appendChild(content.document.createTextNode("click me!"));
content.document.body.appendChild(anchor);
}
);
info("Synthesize a mouse click and wait for a new tab...");
let newTab = yield new Promise((resolve, reject) => {
gBrowser.tabContainer.addEventListener("TabOpen", function onTabOpen(openEvent) {
gBrowser.tabContainer.removeEventListener("TabOpen", onTabOpen);
resolve(openEvent.target);
})
BrowserTestUtils.synthesizeMouseAtCenter("#clickMe", { button: 1 }, browser);
});
is(newTab.getAttribute("usercontextid"), 1, "Correct UserContextId?");
yield BrowserTestUtils.removeTab(tab);
yield BrowserTestUtils.removeTab(newTab);
});

View File

@ -18,4 +18,7 @@ export MOZ_PACKAGE_JSSHELL=1
# Need this to prevent name conflicts with the normal nightly build packages
export MOZ_PKG_SPECIAL=asan
#upload symbols
MOZ_AUTOMATION_UPLOAD_SYMBOLS=1
. "$topsrcdir/build/mozconfig.common.override"

View File

@ -83,6 +83,11 @@ var ContentClick = {
noReferrer: json.noReferrer,
allowMixedContent: json.allowMixedContent };
// The new tab/window must use the same userContextId.
if (json.originAttributes.userContextId) {
params.userContextId = json.originAttributes.userContextId;
}
window.openLinkIn(json.href, where, params);
}
};

View File

@ -15,7 +15,7 @@ def yasm_version(yasm):
yasm, '--version',
onerror=lambda: die('Failed to get yasm version.')
).splitlines()[0].split()[1]
return version
return Version(version)
# Until we move all the yasm consumers out of old-configure.
# bug 1257904

View File

@ -52,12 +52,11 @@
fun:_cairo_xlib_surface_finish
...
}
# The three following leaks are deep in Gtk+3, and it doesn't seem we're doing
# anything wrong on our end with the container objects. Those suppressions
# are purposefully verbose so as to avoid them catching actual leaks due to
# The following leak is deep in Gtk+3, and it doesn't seem we're doing
# anything wrong on our end with the container objects. This suppression
# is purposefully verbose so as to avoid catching actual leaks due to
# Gecko code.
# Note: valgrind doesn't support more than 24 elements in a suppression stack,
# which explains why the second has an ellipsis above g_slice_alloc.
# Note: valgrind doesn't support more than 24 elements in a suppression stack.
{
Bug 1187649
Memcheck:Leak
@ -85,36 +84,11 @@
fun:_ZN13nsLookAndFeel4InitEv
...
}
# set_color() in gtkstyle.c of GTK version 3.4.4 only can leak GdkRGBA
# allocations when the theme has transparent colors:
# https://git.gnome.org/browse/gtk+/tree/gtk/deprecated/gtkstyle.c?h=3.4.4#n676
{
Bug 1187649
Memcheck:Leak
match-leak-kinds: definite
...
fun:g_slice_alloc
fun:g_slice_copy
fun:boxed_proxy_lcopy_value
fun:gtk_style_context_get_valist
fun:gtk_style_context_get
fun:set_color
fun:gtk_style_update_from_context
fun:gtk_style_constructed
fun:g_object_newv
fun:g_object_new_valist
fun:g_object_new
fun:_gtk_style_new_for_path
fun:gtk_style_new
fun:gtk_widget_get_default_style
fun:gtk_widget_init
fun:g_type_create_instance
fun:g_object_constructor
fun:g_object_newv
fun:g_object_new
fun:gtk_accel_label_new
fun:_ZN13nsLookAndFeel4InitEv
...
}
{
Bug 1187649
Bug 1250704
Memcheck:Leak
match-leak-kinds: definite
fun:malloc
@ -130,8 +104,6 @@
fun:g_object_newv
fun:g_object_new_valist
fun:g_object_new
fun:gtk_widget_get_style
fun:_ZN13nsIconChannel4InitEP6nsIURI
...
}
{

View File

@ -211,8 +211,8 @@
#include "nsIWebBrowserFind.h"
#include "nsIWidget.h"
#include "mozilla/dom/EncodingUtils.h"
#include "mozilla/dom/PerformanceNavigation.h"
#include "mozilla/dom/ScriptSettings.h"
#include "nsPerformance.h"
#ifdef MOZ_TOOLKIT_SEARCH
#include "nsIBrowserSearchService.h"

View File

@ -0,0 +1,17 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Test marquee attribute event handlers in iframe sandbox</title>
</head>
<body>
<!-- Note that the width here is slightly longer than the contents, to make
sure we bounce and finish very quickly. -->
<marquee loop="2" width="145" behavior="alternate" truespeed scrolldelay="1"
onstart="parent.postMessage(window.name + ' marquee onstart', '*');"
onbounce="parent.postMessage(window.name + ' marquee onbounce', '*');"
onfinish="parent.postMessage(window.name + ' marquee onfinish', '*');">
Will bounce and finish
</marquee>
</body>
</html>

View File

@ -1,5 +1,6 @@
[DEFAULT]
support-files =
file_marquee_event_handlers.html
file_other_auxiliary_navigation_by_location.html
file_our_auxiliary_navigation_by_location.html
file_parent_navigation_by_location.html
@ -8,6 +9,7 @@ support-files =
file_top_navigation_by_location_exotic.html
[test_child_navigation_by_location.html]
[test_marquee_event_handlers.html]
[test_other_auxiliary_navigation_by_location.html]
tags = openwindow
skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #bug 948948, NS_ERROR_FAILURE from nsWindowWatcher::GetPrompt

View File

@ -0,0 +1,95 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1277475
html5 sandboxed iframe should not run marquee attribute event handlers without allow-scripts
-->
<head>
<meta charset="utf-8">
<title>Test for Bug 1277475 - html5 sandboxed iframe should not run marquee attribute event handlers without allow-scripts</title>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1277475">Mozilla Bug 1277475</a>
<p id="display"></p>
<div id="content">Tests for Bug 1277475</div>
<iframe id="if1" name="if1" src="file_marquee_event_handlers.html"
sandbox="allow-same-origin allow-forms allow-top-navigation allow-pointer-lock allow-orientation-lock allow-popups allow-modals allow-popups-to-escape-sandbox">
</iframe>
<iframe id="if2" name="if2" src="file_marquee_event_handlers.html"
sandbox="allow-scripts"></iframe>
<script>
SimpleTest.waitForExplicitFinish();
var expectedMessages = new Set();
var numberOfMessagesExpected = 4;
var unexpectedMessages = new Set();
window.onmessage = function (event) {
info(event.data + " message received");
if (event.data.startsWith("if2") || event.data == "if1 chaser") {
expectedMessages.add(event.data);
if (expectedMessages.size == numberOfMessagesExpected) {
checkRecievedMessages();
}
} else {
unexpectedMessages.add(event.data);
}
}
function checkRecievedMessages() {
// Check the expected messages explicitly as a cross-check.
ok(expectedMessages.has("if1 chaser"),
"if1 chaser message should have been received");
ok(expectedMessages.has("if2 marquee onstart"),
"if2 marquee onstart should have run in iframe sandbox with allow-scripts");
ok(expectedMessages.has("if2 marquee onbounce"),
"if2 marquee onbounce should have run in iframe sandbox with allow-scripts");
ok(expectedMessages.has("if2 marquee onfinish"),
"if2 marquee onfinish should have run in iframe sandbox with allow-scripts");
unexpectedMessages.forEach(
(v) => {
ok(false, v + " should NOT have run in iframe sandbox without allow-scripts")
}
);
SimpleTest.finish();
}
// If things are working properly the attribute event handlers won't run on
// the marquee in if1, so add our own capturing listeners on its window, so we
// know when they have fired. (These will run as we are not sandboxed.)
var if1FiredEvents = new Set();
var if1NumberOfEventsExpected = 3;
var if1Win = document.getElementById("if1").contentWindow;
if1Win.addEventListener("start", () => { checkMarqueeEvent("start"); }, true);
if1Win.addEventListener("bounce", () => { checkMarqueeEvent("bounce"); }, true);
if1Win.addEventListener("finish", () => { checkMarqueeEvent("finish"); }, true);
function checkMarqueeEvent(eventType) {
info("if1 event " + eventType + " fired");
if1FiredEvents.add(eventType);
if (if1FiredEvents.size == if1NumberOfEventsExpected) {
// Only send the chasing message after a tick of the event loop to allow
// event handlers on the marquee to process.
SimpleTest.executeSoon(sendChasingMessage);
}
}
function sendChasingMessage() {
// Add our own message listener to if1's window and echo back a chasing
// message to make sure that any messages from incorrectly run marquee
// attribute event handlers should have arrived before it.
if1Win.addEventListener("message",
(e) => { if1Win.parent.postMessage(e.data, "*"); });
if1Win.postMessage("if1 chaser", "*");
info("if1 chaser message sent");
}
</script>
</body>
</html>

View File

@ -5,10 +5,12 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "gfxPrefs.h"
#include "mozilla/dom/Event.h"
#include "mozilla/EventForwards.h"
#include "mozilla/TextEventDispatcher.h"
#include "mozilla/TextEvents.h"
#include "mozilla/TextInputProcessor.h"
#include "nsContentUtils.h"
#include "nsIDocShell.h"
#include "nsIWidget.h"
#include "nsPIDOMWindow.h"

View File

@ -110,7 +110,6 @@ EXPORTS += [
'nsNameSpaceManager.h',
'nsNodeInfoManager.h',
'nsNodeUtils.h',
'nsPerformance.h',
'nsPIDOMWindow.h',
'nsPIDOMWindowInlines.h',
'nsPIWindowRoot.h',
@ -190,12 +189,6 @@ EXPORTS.mozilla.dom += [
'NodeInfo.h',
'NodeInfoInlines.h',
'NodeIterator.h',
'PerformanceEntry.h',
'PerformanceMark.h',
'PerformanceMeasure.h',
'PerformanceObserver.h',
'PerformanceObserverEntryList.h',
'PerformanceResourceTiming.h',
'ProcessGlobal.h',
'ResponsiveImageSelector.h',
'SameProcessMessageQueue.h',
@ -302,7 +295,6 @@ UNIFIED_SOURCES += [
'nsNodeInfoManager.cpp',
'nsNodeUtils.cpp',
'nsOpenURIInFrameParams.cpp',
'nsPerformance.cpp',
'nsPlainTextSerializer.cpp',
'nsPropertyTable.cpp',
'nsQueryContentEventResult.cpp',
@ -331,12 +323,6 @@ UNIFIED_SOURCES += [
'nsXMLContentSerializer.cpp',
'nsXMLHttpRequest.cpp',
'nsXMLNameSpaceMap.cpp',
'PerformanceEntry.cpp',
'PerformanceMark.cpp',
'PerformanceMeasure.cpp',
'PerformanceObserver.cpp',
'PerformanceObserverEntryList.cpp',
'PerformanceResourceTiming.cpp',
'PostMessageEvent.cpp',
'ProcessGlobal.cpp',
'ResponsiveImageSelector.cpp',

View File

@ -7238,6 +7238,36 @@ nsContentUtils::CallOnAllRemoteChildren(nsPIDOMWindowOuter* aWindow,
}
}
struct UIStateChangeInfo {
UIStateChangeType mShowAccelerators;
UIStateChangeType mShowFocusRings;
UIStateChangeInfo(UIStateChangeType aShowAccelerators,
UIStateChangeType aShowFocusRings)
: mShowAccelerators(aShowAccelerators),
mShowFocusRings(aShowFocusRings)
{}
};
bool
SetKeyboardIndicatorsChild(TabParent* aParent, void* aArg)
{
UIStateChangeInfo* stateInfo = static_cast<UIStateChangeInfo*>(aArg);
Unused << aParent->SendSetKeyboardIndicators(stateInfo->mShowAccelerators,
stateInfo->mShowFocusRings);
return false;
}
void
nsContentUtils::SetKeyboardIndicatorsOnRemoteChildren(nsPIDOMWindowOuter* aWindow,
UIStateChangeType aShowAccelerators,
UIStateChangeType aShowFocusRings)
{
UIStateChangeInfo stateInfo(aShowAccelerators, aShowFocusRings);
CallOnAllRemoteChildren(aWindow, SetKeyboardIndicatorsChild,
(void *)&stateInfo);
}
void
nsContentUtils::TransferablesToIPCTransferables(nsISupportsArray* aTransferables,
nsTArray<IPCDataTransfer>& aIPC,

View File

@ -34,6 +34,7 @@
#include "mozilla/Logging.h"
#include "mozilla/NotNull.h"
#include "nsIContentPolicy.h"
#include "nsPIDOMWindow.h"
#if defined(XP_WIN)
// Undefine LoadImage to prevent naming conflict with Windows.
@ -2392,6 +2393,15 @@ public:
CallOnRemoteChildFunction aCallback,
void* aArg);
/*
* Call nsPIDOMWindow::SetKeyboardIndicators all all remote children. This is
* in here rather than nsGlobalWindow because TabParent indirectly includes
* Windows headers which aren't allowed there.
*/
static void SetKeyboardIndicatorsOnRemoteChildren(nsPIDOMWindowOuter* aWindow,
UIStateChangeType aShowAccelerators,
UIStateChangeType aShowFocusRings);
/**
* Given an nsIFile, attempts to read it into aString.
*

View File

@ -5,12 +5,12 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsDOMNavigationTiming.h"
#include "nsPerformance.h"
#include "nsCOMPtr.h"
#include "nsContentUtils.h"
#include "nsIScriptSecurityManager.h"
#include "prtime.h"
#include "nsIURI.h"
#include "mozilla/dom/PerformanceNavigation.h"
#include "mozilla/TimeStamp.h"
nsDOMNavigationTiming::nsDOMNavigationTiming()

View File

@ -17,17 +17,6 @@ typedef unsigned long long DOMTimeMilliSec;
typedef double DOMHighResTimeStamp;
typedef unsigned short nsDOMPerformanceNavigationType;
namespace mozilla {
namespace dom {
namespace PerformanceNavigation {
static const nsDOMPerformanceNavigationType TYPE_NAVIGATE = 0;
static const nsDOMPerformanceNavigationType TYPE_RELOAD = 1;
static const nsDOMPerformanceNavigationType TYPE_BACK_FORWARD = 2;
static const nsDOMPerformanceNavigationType TYPE_RESERVED = 255;
} // namespace PerformanceNavigation
} // namespace dom
} // namespace mozilla
class nsDOMNavigationTiming final
{
public:

View File

@ -8481,7 +8481,7 @@ nsDocument::IsScriptEnabled()
{
// If this document is sandboxed without 'allow-scripts'
// script is not enabled
if (mSandboxFlags & SANDBOXED_SCRIPTS) {
if (HasScriptsBlockedBySandbox()) {
return false;
}
@ -13223,6 +13223,12 @@ nsIDocument::SetPageUseCounter(UseCounter aUseCounter)
contentParent->SetChildDocumentUseCounter(aUseCounter);
}
bool
nsIDocument::HasScriptsBlockedBySandbox()
{
return mSandboxFlags & SANDBOXED_SCRIPTS;
}
static bool
MightBeAboutOrChromeScheme(nsIURI* aURI)
{

View File

@ -22,6 +22,7 @@
#include "nsIHTMLDocument.h"
#include "nsIDocShell.h"
#include "nsIDocShellTreeOwner.h"
#include "nsIFormControl.h"
#include "nsLayoutUtils.h"
#include "nsIPresShell.h"
#include "nsFrameTraversal.h"
@ -46,6 +47,7 @@
#include "mozilla/ContentEvents.h"
#include "mozilla/dom/Element.h"
#include "mozilla/dom/HTMLInputElement.h"
#include "mozilla/EventDispatcher.h"
#include "mozilla/EventStateManager.h"
#include "mozilla/EventStates.h"

View File

@ -3437,11 +3437,26 @@ nsFrameLoader::GetNewTabContext(MutableTabContext* aTabContext,
bool isPrivate = parentContext->UsePrivateBrowsing();
attrs.SyncAttributesWithPrivateBrowsing(isPrivate);
UIStateChangeType showAccelerators = UIStateChangeType_NoChange;
UIStateChangeType showFocusRings = UIStateChangeType_NoChange;
nsIDocument* doc = mOwnerContent->OwnerDoc();
if (doc) {
nsCOMPtr<nsPIWindowRoot> root = nsContentUtils::GetWindowRoot(doc);
if (root) {
showAccelerators =
root->ShowAccelerators() ? UIStateChangeType_Set : UIStateChangeType_Clear;
showFocusRings =
root->ShowFocusRings() ? UIStateChangeType_Set : UIStateChangeType_Clear;
}
}
bool tabContextUpdated =
aTabContext->SetTabContext(OwnerIsMozBrowserFrame(),
mIsPrerendered,
ownApp,
containingApp,
showAccelerators,
showFocusRings,
attrs,
signedPkgOrigin,
presentationURLStr);

View File

@ -50,6 +50,7 @@
#include "nsXULAppAPI.h"
#include "nsQueryObject.h"
#include <algorithm>
#include "chrome/common/ipc_channel.h" // for IPC::Channel::kMaximumMessageSize
#ifdef MOZ_CRASHREPORTER
#include "nsExceptionHandler.h"
@ -703,13 +704,13 @@ nsFrameMessageManager::SendRpcMessage(const nsAString& aMessageName,
aRetval, false);
}
static void
RecordMessageSize(size_t aDataLength, const nsAString& aMessageName)
static bool
AllowMessage(size_t aDataLength, const nsAString& aMessageName)
{
static const size_t kMinTelemetryMessageSize = 8192;
if (aDataLength < kMinTelemetryMessageSize) {
return;
return true;
}
NS_ConvertUTF16toUTF8 messageName(aMessageName);
@ -717,6 +718,19 @@ RecordMessageSize(size_t aDataLength, const nsAString& aMessageName)
Telemetry::Accumulate(Telemetry::MESSAGE_MANAGER_MESSAGE_SIZE2, messageName,
aDataLength);
// A message includes more than structured clone data, so subtract
// 20KB to make it more likely that a message within this bound won't
// result in an overly large IPC message.
static const size_t kMaxMessageSize = IPC::Channel::kMaximumMessageSize - 20 * 1024;
if (aDataLength < kMaxMessageSize) {
return true;
}
Telemetry::Accumulate(Telemetry::REJECTED_MESSAGE_MANAGER_MESSAGE,
messageName);
return false;
}
nsresult
@ -746,7 +760,9 @@ nsFrameMessageManager::SendMessage(const nsAString& aMessageName,
return NS_ERROR_DOM_DATA_CLONE_ERR;
}
RecordMessageSize(data.DataLength(), aMessageName);
if (!AllowMessage(data.DataLength(), aMessageName)) {
return NS_ERROR_FAILURE;
}
JS::Rooted<JSObject*> objects(aCx);
if (aArgc >= 3 && aObjects.isObject()) {
@ -828,7 +844,9 @@ nsFrameMessageManager::DispatchAsyncMessage(const nsAString& aMessageName,
return NS_ERROR_DOM_DATA_CLONE_ERR;
}
RecordMessageSize(data.DataLength(), aMessageName);
if (!AllowMessage(data.DataLength(), aMessageName)) {
return NS_ERROR_FAILURE;
}
JS::Rooted<JSObject*> objects(aCx);
if (aArgc >= 3 && aObjects.isObject()) {

View File

@ -15,10 +15,10 @@
#include "nsContentSecurityManager.h"
#include "nsScreen.h"
#include "nsHistory.h"
#include "nsPerformance.h"
#include "nsDOMNavigationTiming.h"
#include "nsIDOMStorageManager.h"
#include "mozilla/dom/DOMStorage.h"
#include "mozilla/dom/Performance.h"
#include "mozilla/dom/StorageEvent.h"
#include "mozilla/dom/StorageEventBinding.h"
#include "mozilla/IntegerPrintfMacros.h"
@ -1206,13 +1206,6 @@ nsGlobalWindow::nsGlobalWindow(nsGlobalWindow *aOuterWindow)
mCleanMessageManager(false),
mNeedsFocus(true),
mHasFocus(false),
#if defined(XP_MACOSX)
mShowAccelerators(false),
mShowFocusRings(false),
#else
mShowAccelerators(true),
mShowFocusRings(true),
#endif
mShowFocusRingForContent(false),
mFocusByKeyOccurred(false),
mHasGamepad(false),
@ -1267,8 +1260,6 @@ nsGlobalWindow::nsGlobalWindow(nsGlobalWindow *aOuterWindow)
Preferences::AddStrongObserver(mObserver, "intl.accept_languages");
}
InitializeShowFocusRings();
} else {
// |this| is an outer window. Outer windows start out frozen and
// remain frozen until they get an inner window, so freeze this
@ -2820,10 +2811,10 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
currentInner->AsInner()->CreatePerformanceObjectIfNeeded();
if (currentInner->mPerformance) {
newInnerWindow->mPerformance =
new nsPerformance(newInnerWindow->AsInner(),
currentInner->mPerformance->GetDOMTiming(),
currentInner->mPerformance->GetChannel(),
currentInner->mPerformance->GetParentPerformance());
Performance::CreateForMainThread(newInnerWindow->AsInner(),
currentInner->mPerformance->GetDOMTiming(),
currentInner->mPerformance->GetChannel(),
currentInner->mPerformance->GetParentPerformance());
}
}
@ -3841,7 +3832,7 @@ nsGlobalWindow::GetHistory(ErrorResult& aError)
return mHistory;
}
nsPerformance*
Performance*
nsPIDOMWindowInner::GetPerformance()
{
MOZ_ASSERT(IsInnerWindow());
@ -3849,7 +3840,7 @@ nsPIDOMWindowInner::GetPerformance()
return mPerformance;
}
nsPerformance*
Performance*
nsGlobalWindow::GetPerformance()
{
return AsInner()->GetPerformance();
@ -3874,7 +3865,7 @@ nsPIDOMWindowInner::CreatePerformanceObjectIfNeeded()
if (timing) {
// If we are dealing with an iframe, we will need the parent's performance
// object (so we can add the iframe as a resource of that page).
nsPerformance* parentPerformance = nullptr;
Performance* parentPerformance = nullptr;
nsCOMPtr<nsPIDOMWindowOuter> parentWindow = GetScriptableParentOrNull();
if (parentWindow) {
nsPIDOMWindowInner* parentInnerWindow = nullptr;
@ -3886,7 +3877,8 @@ nsPIDOMWindowInner::CreatePerformanceObjectIfNeeded()
}
}
mPerformance =
new nsPerformance(this, timing, timedChannel, parentPerformance);
Performance::CreateForMainThread(this, timing, timedChannel,
parentPerformance);
}
}
@ -10037,63 +10029,51 @@ nsGlobalWindow::GetFocusMethod()
return mFocusMethod;
}
void
nsGlobalWindow::InitializeShowFocusRings()
{
MOZ_ASSERT(IsInnerWindow());
// Initialize the focus ring state from the parent window. For root windows,
// there is no need to do this as SetKeyboardIndicators will propogate any
// non-default value to child windows.
nsPIDOMWindowOuter* root = GetPrivateRoot();
if (root && GetOuterWindow() != root) {
bool showAccelerators = false, showFocusRings = false;
root->GetKeyboardIndicators(&showAccelerators, &showFocusRings);
mShowFocusRings = showFocusRings;
}
}
bool
nsGlobalWindow::ShouldShowFocusRing()
{
FORWARD_TO_INNER(ShouldShowFocusRing, (), false);
return mShowFocusRings || mShowFocusRingForContent || mFocusByKeyOccurred;
if (mShowFocusRingForContent || mFocusByKeyOccurred) {
return true;
}
nsCOMPtr<nsPIWindowRoot> root = GetTopWindowRoot();
return root ? root->ShowFocusRings() : false;
}
void
nsGlobalWindow::SetKeyboardIndicators(UIStateChangeType aShowAccelerators,
UIStateChangeType aShowFocusRings)
{
FORWARD_TO_INNER_VOID(SetKeyboardIndicators, (aShowAccelerators, aShowFocusRings));
MOZ_ASSERT(IsOuterWindow());
nsPIDOMWindowOuter* piWin = GetPrivateRoot();
if (!piWin) {
return;
}
MOZ_ASSERT(piWin == AsOuter());
bool oldShouldShowFocusRing = ShouldShowFocusRing();
// only change the flags that have been modified
if (aShowAccelerators != UIStateChangeType_NoChange)
mShowAccelerators = aShowAccelerators == UIStateChangeType_Set;
if (aShowFocusRings != UIStateChangeType_NoChange)
mShowFocusRings = aShowFocusRings == UIStateChangeType_Set;
// propagate the indicators to child windows
nsCOMPtr<nsIDocShell> docShell = GetDocShell();
if (docShell) {
int32_t childCount = 0;
docShell->GetChildCount(&childCount);
for (int32_t i = 0; i < childCount; ++i) {
nsCOMPtr<nsIDocShellTreeItem> childShell;
docShell->GetChildAt(i, getter_AddRefs(childShell));
if (!childShell) {
continue;
}
if (nsCOMPtr<nsPIDOMWindowOuter> childWindow = childShell->GetWindow()) {
childWindow->SetKeyboardIndicators(aShowAccelerators, aShowFocusRings);
}
}
nsCOMPtr<nsPIWindowRoot> windowRoot = do_QueryInterface(mChromeEventHandler);
if (!windowRoot) {
return;
}
if (aShowAccelerators != UIStateChangeType_NoChange) {
windowRoot->SetShowAccelerators(aShowAccelerators == UIStateChangeType_Set);
}
if (aShowFocusRings != UIStateChangeType_NoChange) {
windowRoot->SetShowFocusRings(aShowFocusRings == UIStateChangeType_Set);
}
nsContentUtils::SetKeyboardIndicatorsOnRemoteChildren(GetOuterWindow(),
aShowAccelerators,
aShowFocusRings);
bool newShouldShowFocusRing = ShouldShowFocusRing();
if (mHasFocus && mFocusedNode &&
oldShouldShowFocusRing != newShouldShowFocusRing &&
@ -10107,16 +10087,6 @@ nsGlobalWindow::SetKeyboardIndicators(UIStateChangeType aShowAccelerators,
}
}
void
nsGlobalWindow::GetKeyboardIndicators(bool* aShowAccelerators,
bool* aShowFocusRings)
{
FORWARD_TO_INNER_VOID(GetKeyboardIndicators, (aShowAccelerators, aShowFocusRings));
*aShowAccelerators = mShowAccelerators;
*aShowFocusRings = mShowFocusRings;
}
bool
nsGlobalWindow::TakeFocus(bool aFocus, uint32_t aFocusMethod)
{

View File

@ -1257,7 +1257,8 @@ public:
already_AddRefed<nsWindowRoot> GetWindowRootOuter();
already_AddRefed<nsWindowRoot> GetWindowRoot(mozilla::ErrorResult& aError);
nsPerformance* GetPerformance();
mozilla::dom::Performance* GetPerformance();
protected:
// Web IDL helpers
@ -1607,8 +1608,6 @@ public:
virtual void SetKeyboardIndicators(UIStateChangeType aShowAccelerators,
UIStateChangeType aShowFocusRings) override;
virtual void GetKeyboardIndicators(bool* aShowAccelerators,
bool* aShowFocusRings) override;
// Inner windows only.
void UpdateCanvasFocus(bool aFocusChanged, nsIContent* aNewContent);
@ -1759,12 +1758,6 @@ protected:
bool mNeedsFocus : 1;
bool mHasFocus : 1;
// whether to show keyboard accelerators
bool mShowAccelerators : 1;
// whether to show focus rings
bool mShowFocusRings : 1;
// when true, show focus rings for the current focused content only.
// This will be reset when another element is focused
bool mShowFocusRingForContent : 1;

View File

@ -2758,6 +2758,8 @@ public:
return mUserHasInteracted;
}
bool HasScriptsBlockedBySandbox();
void ReportHasScrollLinkedEffect();
bool HasScrollLinkedEffect() const
{

View File

@ -27,6 +27,7 @@
#include "nsGlobalWindow.h"
#include "mozilla/dom/BindingUtils.h"
#include "mozilla/dom/Date.h"
#include "mozilla/dom/Element.h"
#include "mozilla/dom/ScriptSettings.h"

View File

@ -31,7 +31,6 @@ class nsIDocument;
class nsIIdleObserver;
class nsIScriptTimeoutHandler;
class nsIURI;
class nsPerformance;
class nsPIDOMWindowInner;
class nsPIDOMWindowOuter;
class nsPIWindowRoot;
@ -44,6 +43,7 @@ namespace mozilla {
namespace dom {
class AudioContext;
class Element;
class Performance;
class ServiceWorkerRegistrationMainThread;
} // namespace dom
namespace gfx {
@ -67,7 +67,8 @@ enum UIStateChangeType
{
UIStateChangeType_NoChange,
UIStateChangeType_Set,
UIStateChangeType_Clear
UIStateChangeType_Clear,
UIStateChangeType_Invalid // used for serialization only
};
enum class FullscreenReason
@ -410,12 +411,6 @@ public:
virtual void SetKeyboardIndicators(UIStateChangeType aShowAccelerators,
UIStateChangeType aShowFocusRings) = 0;
/**
* Get the keyboard indicator state for accelerators and focus rings.
*/
virtual void GetKeyboardIndicators(bool* aShowAccelerators,
bool* aShowFocusRings) = 0;
/**
* Indicates that the page in the window has been hidden. This is used to
* reset the focus state.
@ -616,7 +611,7 @@ protected:
nsIDocShell* MOZ_NON_OWNING_REF mDocShell; // Weak Reference
// mPerformance is only used on inner windows.
RefPtr<nsPerformance> mPerformance;
RefPtr<mozilla::dom::Performance> mPerformance;
typedef nsRefPtrHashtable<nsStringHashKey,
mozilla::dom::ServiceWorkerRegistrationMainThread>
@ -746,7 +741,7 @@ public:
GetServiceWorkerRegistration(const nsAString& aScope);
void InvalidateServiceWorkerRegistration(const nsAString& aScope);
nsPerformance* GetPerformance();
mozilla::dom::Performance* GetPerformance();
bool HasMutationListeners(uint32_t aMutationEventType) const
{

View File

@ -54,6 +54,11 @@ public:
// Enumerate all stored browsers that for which the weak reference is valid.
virtual void EnumerateBrowsers(BrowserEnumerator aEnumFunc, void* aArg) = 0;
virtual bool ShowAccelerators() = 0;
virtual bool ShowFocusRings() = 0;
virtual void SetShowAccelerators(bool aEnable) = 0;
virtual void SetShowFocusRings(bool aEnable) = 0;
};
NS_DEFINE_STATIC_IID_ACCESSOR(nsPIWindowRoot, NS_IWINDOWROOT_IID)

File diff suppressed because it is too large Load Diff

View File

@ -1,491 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef nsPerformance_h___
#define nsPerformance_h___
#include "nsCOMPtr.h"
#include "nsAutoPtr.h"
#include "mozilla/Attributes.h"
#include "nsWrapperCache.h"
#include "nsDOMNavigationTiming.h"
#include "nsContentUtils.h"
#include "nsPIDOMWindow.h"
#include "js/TypeDecls.h"
#include "js/RootingAPI.h"
#include "mozilla/dom/BindingDeclarations.h"
#include "mozilla/DOMEventTargetHelper.h"
class nsITimedChannel;
class nsPerformance;
class nsIHttpChannel;
namespace mozilla {
class ErrorResult;
namespace dom {
class PerformanceEntry;
class PerformanceObserver;
} // namespace dom
} // namespace mozilla
// Script "performance.timing" object
class nsPerformanceTiming final : public nsWrapperCache
{
public:
typedef mozilla::TimeStamp TimeStamp;
/**
* @param aPerformance
* The performance object (the JS parent).
* This will allow access to "window.performance.timing" attribute for
* the navigation timing (can't be null).
* @param aChannel
* An nsITimedChannel used to gather all the networking timings by both
* the navigation timing and the resource timing (can't be null).
* @param aHttpChannel
* An nsIHttpChannel (the resource's http channel).
* This will be used by the resource timing cross-domain check
* algorithm.
* Argument is null for the navigation timing (navigation timing uses
* another algorithm for the cross-domain redirects).
* @param aZeroTime
* The offset that will be added to the timestamp of each event. This
* argument should be equal to performance.navigationStart for
* navigation timing and "0" for the resource timing.
*/
nsPerformanceTiming(nsPerformance* aPerformance,
nsITimedChannel* aChannel,
nsIHttpChannel* aHttpChannel,
DOMHighResTimeStamp aZeroTime);
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(nsPerformanceTiming)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(nsPerformanceTiming)
nsDOMNavigationTiming* GetDOMTiming() const;
nsPerformance* GetParentObject() const
{
return mPerformance;
}
/**
* @param aStamp
* The TimeStamp recorded for a specific event. This TimeStamp can
* be null.
* @return the duration of an event with a given TimeStamp, relative to the
* navigationStart TimeStamp (the moment the user landed on the
* page), if the given TimeStamp is valid. Otherwise, it will return
* the FetchStart timing value.
*/
inline DOMHighResTimeStamp TimeStampToDOMHighResOrFetchStart(TimeStamp aStamp)
{
return (!aStamp.IsNull())
? TimeStampToDOMHighRes(aStamp)
: FetchStartHighRes();
}
/**
* The nsITimedChannel records an absolute timestamp for each event.
* The nsDOMNavigationTiming will record the moment when the user landed on
* the page. This is a window.performance unique timestamp, so it can be used
* for all the events (navigation timing and resource timing events).
*
* The algorithm operates in 2 steps:
* 1. The first step is to subtract the two timestamps: the argument (the
* envet's timesramp) and the navigation start timestamp. This will result in
* a relative timestamp of the event (relative to the navigation start -
* window.performance.timing.navigationStart).
* 2. The second step is to add any required offset (the mZeroTime). For now,
* this offset value is either 0 (for the resource timing), or equal to
* "performance.navigationStart" (for navigation timing).
* For the resource timing, mZeroTime is set to 0, causing the result to be a
* relative time.
* For the navigation timing, mZeroTime is set to "performance.navigationStart"
* causing the result be an absolute time.
*
* @param aStamp
* The TimeStamp recorded for a specific event. This TimeStamp can't
* be null.
* @return number of milliseconds value as one of:
* - relative to the navigation start time, time the user has landed on the
* page
* - an absolute wall clock time since the unix epoch
*/
inline DOMHighResTimeStamp TimeStampToDOMHighRes(TimeStamp aStamp) const
{
MOZ_ASSERT(!aStamp.IsNull());
mozilla::TimeDuration duration =
aStamp - GetDOMTiming()->GetNavigationStartTimeStamp();
return duration.ToMilliseconds() + mZeroTime;
}
virtual JSObject* WrapObject(JSContext *cx, JS::Handle<JSObject*> aGivenProto) override;
// PerformanceNavigation WebIDL methods
DOMTimeMilliSec NavigationStart() const {
if (!nsContentUtils::IsPerformanceTimingEnabled()) {
return 0;
}
return GetDOMTiming()->GetNavigationStart();
}
DOMTimeMilliSec UnloadEventStart() {
if (!nsContentUtils::IsPerformanceTimingEnabled()) {
return 0;
}
return GetDOMTiming()->GetUnloadEventStart();
}
DOMTimeMilliSec UnloadEventEnd() {
if (!nsContentUtils::IsPerformanceTimingEnabled()) {
return 0;
}
return GetDOMTiming()->GetUnloadEventEnd();
}
uint16_t GetRedirectCount() const;
// Checks if the resource is either same origin as the page that started
// the load, or if the response contains the Timing-Allow-Origin header
// with a value of * or matching the domain of the loading Principal
bool CheckAllowedOrigin(nsIHttpChannel* aResourceChannel, nsITimedChannel* aChannel);
// Cached result of CheckAllowedOrigin. If false, security sensitive
// attributes of the resourceTiming object will be set to 0
bool TimingAllowed() const;
// If this is false the values of redirectStart/End will be 0
// This is false if no redirects occured, or if any of the responses failed
// the timing-allow-origin check in HttpBaseChannel::TimingAllowCheck
bool ShouldReportCrossOriginRedirect() const;
// High resolution (used by resource timing)
DOMHighResTimeStamp FetchStartHighRes();
DOMHighResTimeStamp RedirectStartHighRes();
DOMHighResTimeStamp RedirectEndHighRes();
DOMHighResTimeStamp DomainLookupStartHighRes();
DOMHighResTimeStamp DomainLookupEndHighRes();
DOMHighResTimeStamp ConnectStartHighRes();
DOMHighResTimeStamp ConnectEndHighRes();
DOMHighResTimeStamp RequestStartHighRes();
DOMHighResTimeStamp ResponseStartHighRes();
DOMHighResTimeStamp ResponseEndHighRes();
// Low resolution (used by navigation timing)
DOMTimeMilliSec FetchStart();
DOMTimeMilliSec RedirectStart();
DOMTimeMilliSec RedirectEnd();
DOMTimeMilliSec DomainLookupStart();
DOMTimeMilliSec DomainLookupEnd();
DOMTimeMilliSec ConnectStart();
DOMTimeMilliSec ConnectEnd();
DOMTimeMilliSec RequestStart();
DOMTimeMilliSec ResponseStart();
DOMTimeMilliSec ResponseEnd();
DOMTimeMilliSec DomLoading() {
if (!nsContentUtils::IsPerformanceTimingEnabled()) {
return 0;
}
return GetDOMTiming()->GetDomLoading();
}
DOMTimeMilliSec DomInteractive() const {
if (!nsContentUtils::IsPerformanceTimingEnabled()) {
return 0;
}
return GetDOMTiming()->GetDomInteractive();
}
DOMTimeMilliSec DomContentLoadedEventStart() const {
if (!nsContentUtils::IsPerformanceTimingEnabled()) {
return 0;
}
return GetDOMTiming()->GetDomContentLoadedEventStart();
}
DOMTimeMilliSec DomContentLoadedEventEnd() const {
if (!nsContentUtils::IsPerformanceTimingEnabled()) {
return 0;
}
return GetDOMTiming()->GetDomContentLoadedEventEnd();
}
DOMTimeMilliSec DomComplete() const {
if (!nsContentUtils::IsPerformanceTimingEnabled()) {
return 0;
}
return GetDOMTiming()->GetDomComplete();
}
DOMTimeMilliSec LoadEventStart() const {
if (!nsContentUtils::IsPerformanceTimingEnabled()) {
return 0;
}
return GetDOMTiming()->GetLoadEventStart();
}
DOMTimeMilliSec LoadEventEnd() const {
if (!nsContentUtils::IsPerformanceTimingEnabled()) {
return 0;
}
return GetDOMTiming()->GetLoadEventEnd();
}
private:
~nsPerformanceTiming();
bool IsInitialized() const;
void InitializeTimingInfo(nsITimedChannel* aChannel);
RefPtr<nsPerformance> mPerformance;
DOMHighResTimeStamp mFetchStart;
// This is an offset that will be added to each timing ([ms] resolution).
// There are only 2 possible values: (1) logicaly equal to navigationStart
// TimeStamp (results are absolute timstamps - wallclock); (2) "0" (results
// are relative to the navigation start).
DOMHighResTimeStamp mZeroTime;
TimeStamp mAsyncOpen;
TimeStamp mRedirectStart;
TimeStamp mRedirectEnd;
TimeStamp mDomainLookupStart;
TimeStamp mDomainLookupEnd;
TimeStamp mConnectStart;
TimeStamp mConnectEnd;
TimeStamp mRequestStart;
TimeStamp mResponseStart;
TimeStamp mCacheReadStart;
TimeStamp mResponseEnd;
TimeStamp mCacheReadEnd;
uint16_t mRedirectCount;
bool mTimingAllowed;
bool mAllRedirectsSameOrigin;
bool mInitialized;
// If the resourceTiming object should have non-zero redirectStart and
// redirectEnd attributes. It is false if there were no redirects, or if
// any of the responses didn't pass the timing-allow-check
bool mReportCrossOriginRedirect;
};
// Script "performance.navigation" object
class nsPerformanceNavigation final : public nsWrapperCache
{
public:
explicit nsPerformanceNavigation(nsPerformance* aPerformance);
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(nsPerformanceNavigation)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(nsPerformanceNavigation)
nsDOMNavigationTiming* GetDOMTiming() const;
nsPerformanceTiming* GetPerformanceTiming() const;
nsPerformance* GetParentObject() const
{
return mPerformance;
}
virtual JSObject* WrapObject(JSContext *cx, JS::Handle<JSObject*> aGivenProto) override;
// PerformanceNavigation WebIDL methods
uint16_t Type() const {
return GetDOMTiming()->GetType();
}
uint16_t RedirectCount() const {
return GetPerformanceTiming()->GetRedirectCount();
}
private:
~nsPerformanceNavigation();
RefPtr<nsPerformance> mPerformance;
};
// Base class for main-thread and worker Performance API
class PerformanceBase : public mozilla::DOMEventTargetHelper
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(PerformanceBase,
DOMEventTargetHelper)
PerformanceBase();
explicit PerformanceBase(nsPIDOMWindowInner* aWindow);
typedef mozilla::dom::PerformanceEntry PerformanceEntry;
typedef mozilla::dom::PerformanceObserver PerformanceObserver;
void GetEntries(nsTArray<RefPtr<PerformanceEntry>>& aRetval);
void GetEntriesByType(const nsAString& aEntryType,
nsTArray<RefPtr<PerformanceEntry>>& aRetval);
void GetEntriesByName(const nsAString& aName,
const mozilla::dom::Optional<nsAString>& aEntryType,
nsTArray<RefPtr<PerformanceEntry>>& aRetval);
void ClearResourceTimings();
virtual DOMHighResTimeStamp Now() const = 0;
void Mark(const nsAString& aName, mozilla::ErrorResult& aRv);
void ClearMarks(const mozilla::dom::Optional<nsAString>& aName);
void Measure(const nsAString& aName,
const mozilla::dom::Optional<nsAString>& aStartMark,
const mozilla::dom::Optional<nsAString>& aEndMark,
mozilla::ErrorResult& aRv);
void ClearMeasures(const mozilla::dom::Optional<nsAString>& aName);
void SetResourceTimingBufferSize(uint64_t aMaxSize);
void AddObserver(PerformanceObserver* aObserver);
void RemoveObserver(PerformanceObserver* aObserver);
void NotifyObservers();
void CancelNotificationObservers();
protected:
virtual ~PerformanceBase();
virtual void InsertUserEntry(PerformanceEntry* aEntry);
void InsertResourceEntry(PerformanceEntry* aEntry);
void ClearUserEntries(const mozilla::dom::Optional<nsAString>& aEntryName,
const nsAString& aEntryType);
DOMHighResTimeStamp ResolveTimestampFromName(const nsAString& aName,
mozilla::ErrorResult& aRv);
virtual nsISupports* GetAsISupports() = 0;
virtual void DispatchBufferFullEvent() = 0;
virtual mozilla::TimeStamp CreationTimeStamp() const = 0;
virtual DOMHighResTimeStamp CreationTime() const = 0;
virtual bool IsPerformanceTimingAttribute(const nsAString& aName) = 0;
virtual DOMHighResTimeStamp
GetPerformanceTimingFromString(const nsAString& aTimingName) = 0;
bool IsResourceEntryLimitReached() const
{
return mResourceEntries.Length() >= mResourceTimingBufferSize;
}
void LogEntry(PerformanceEntry* aEntry, const nsACString& aOwner) const;
void TimingNotification(PerformanceEntry* aEntry, const nsACString& aOwner, uint64_t epoch);
void RunNotificationObserversTask();
void QueueEntry(PerformanceEntry* aEntry);
DOMHighResTimeStamp RoundTime(double aTime) const;
nsTObserverArray<PerformanceObserver*> mObservers;
private:
nsTArray<RefPtr<PerformanceEntry>> mUserEntries;
nsTArray<RefPtr<PerformanceEntry>> mResourceEntries;
uint64_t mResourceTimingBufferSize;
static const uint64_t kDefaultResourceTimingBufferSize = 150;
bool mPendingNotificationObserversTask;
};
// Script "performance" object
class nsPerformance final : public PerformanceBase
{
public:
nsPerformance(nsPIDOMWindowInner* aWindow,
nsDOMNavigationTiming* aDOMTiming,
nsITimedChannel* aChannel,
nsPerformance* aParentPerformance);
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(nsPerformance,
PerformanceBase)
static bool IsEnabled(JSContext* aCx, JSObject* aGlobal);
static bool IsObserverEnabled(JSContext* aCx, JSObject* aGlobal);
nsDOMNavigationTiming* GetDOMTiming() const
{
return mDOMTiming;
}
nsITimedChannel* GetChannel() const
{
return mChannel;
}
nsPerformance* GetParentPerformance() const
{
return mParentPerformance;
}
JSObject* WrapObject(JSContext *cx,
JS::Handle<JSObject*> aGivenProto) override;
// Performance WebIDL methods
DOMHighResTimeStamp Now() const override;
nsPerformanceTiming* Timing();
nsPerformanceNavigation* Navigation();
void AddEntry(nsIHttpChannel* channel,
nsITimedChannel* timedChannel);
using PerformanceBase::GetEntries;
using PerformanceBase::GetEntriesByType;
using PerformanceBase::GetEntriesByName;
using PerformanceBase::ClearResourceTimings;
using PerformanceBase::Mark;
using PerformanceBase::ClearMarks;
using PerformanceBase::Measure;
using PerformanceBase::ClearMeasures;
using PerformanceBase::SetResourceTimingBufferSize;
void GetMozMemory(JSContext *aCx, JS::MutableHandle<JSObject*> aObj);
IMPL_EVENT_HANDLER(resourcetimingbufferfull)
mozilla::TimeStamp CreationTimeStamp() const override;
DOMHighResTimeStamp CreationTime() const override;
protected:
~nsPerformance();
nsISupports* GetAsISupports() override
{
return this;
}
void InsertUserEntry(PerformanceEntry* aEntry) override;
bool IsPerformanceTimingAttribute(const nsAString& aName) override;
DOMHighResTimeStamp
GetPerformanceTimingFromString(const nsAString& aTimingName) override;
void DispatchBufferFullEvent() override;
RefPtr<nsDOMNavigationTiming> mDOMTiming;
nsCOMPtr<nsITimedChannel> mChannel;
RefPtr<nsPerformanceTiming> mTiming;
RefPtr<nsPerformanceNavigation> mNavigation;
RefPtr<nsPerformance> mParentPerformance;
JS::Heap<JSObject*> mMozMemory;
};
inline nsDOMNavigationTiming*
nsPerformanceNavigation::GetDOMTiming() const
{
return mPerformance->GetDOMTiming();
}
inline nsPerformanceTiming*
nsPerformanceNavigation::GetPerformanceTiming() const
{
return mPerformance->Timing();
}
inline nsDOMNavigationTiming*
nsPerformanceTiming::GetDOMTiming() const
{
return mPerformance->GetDOMTiming();
}
#endif /* nsPerformance_h___ */

View File

@ -6,6 +6,7 @@
#include "mozilla/dom/Event.h" // for nsIDOMEvent::InternalDOMEvent()
#include "mozilla/dom/ScreenBinding.h"
#include "nsContentUtils.h"
#include "nsScreen.h"
#include "nsIDocument.h"
#include "nsIDocShell.h"

View File

@ -1046,7 +1046,7 @@ nsScriptLoader::StartLoad(nsScriptLoadRequest *aRequest, const nsAString &aType,
MOZ_ASSERT(aRequest->IsLoading());
// If this document is sandboxed without 'allow-scripts', abort.
if (mDocument->GetSandboxFlags() & SANDBOXED_SCRIPTS) {
if (mDocument->HasScriptsBlockedBySandbox()) {
return NS_OK;
}
@ -1488,7 +1488,7 @@ nsScriptLoader::ProcessScriptElement(nsIScriptElement *aElement)
// inline script
// Is this document sandboxed without 'allow-scripts'?
if (mDocument->GetSandboxFlags() & SANDBOXED_SCRIPTS) {
if (mDocument->HasScriptsBlockedBySandbox()) {
return false;
}

View File

@ -13,6 +13,8 @@
#include "nsIChannelEventSink.h"
#include "nsIAsyncVerifyRedirectCallback.h"
#include "nsIInterfaceRequestor.h"
#include "nsIStreamListener.h"
#include "nsIURI.h"
#include "nsString.h"
#include "nsWeakReference.h"
#include "nsIDocument.h"

View File

@ -18,6 +18,7 @@
#include "nsPrintfCString.h"
#include "XPCJSMemoryReporter.h"
#include "js/MemoryMetrics.h"
#include "nsQueryObject.h"
#include "nsServiceManagerUtils.h"
using namespace mozilla;

View File

@ -7,6 +7,7 @@
#ifndef nsWindowMemoryReporter_h__
#define nsWindowMemoryReporter_h__
#include "nsGlobalWindow.h"
#include "nsIMemoryReporter.h"
#include "nsIObserver.h"
#include "nsITimer.h"

View File

@ -37,6 +37,15 @@ nsWindowRoot::nsWindowRoot(nsPIDOMWindowOuter* aWindow)
{
mWindow = aWindow;
MOZ_ASSERT(mWindow->IsOuterWindow());
// Keyboard indicators are not shown on Mac by default.
#if defined(XP_MACOSX)
mShowAccelerators = false;
mShowFocusRings = false;
#else
mShowAccelerators = true;
mShowFocusRings = true;
#endif
}
nsWindowRoot::~nsWindowRoot()

View File

@ -72,6 +72,26 @@ public:
virtual void RemoveBrowser(mozilla::dom::TabParent* aBrowser) override;
virtual void EnumerateBrowsers(BrowserEnumerator aEnumFunc, void *aArg) override;
virtual bool ShowAccelerators() override
{
return mShowAccelerators;
}
virtual bool ShowFocusRings() override
{
return mShowFocusRings;
}
virtual void SetShowAccelerators(bool aEnable) override
{
mShowAccelerators = aEnable;
}
virtual void SetShowFocusRings(bool aEnable) override
{
mShowFocusRings = aEnable;
}
protected:
virtual ~nsWindowRoot();
@ -86,6 +106,11 @@ protected:
RefPtr<mozilla::EventListenerManager> mListenerManager; // [Strong]
nsCOMPtr<nsIDOMNode> mPopupNode; // [OWNER]
// True if focus rings and accelerators are enabled for this
// window hierarchy.
bool mShowAccelerators;
bool mShowFocusRings;
nsCOMPtr<mozilla::dom::EventTarget> mParent;
// The TabParents that are currently registered with this top-level window.

View File

@ -995,7 +995,7 @@ nsXMLHttpRequest::GetResponse(JSContext* aCx,
}
bool
nsXMLHttpRequest::IsCrossSiteCORSRequest()
nsXMLHttpRequest::IsCrossSiteCORSRequest() const
{
if (!mChannel) {
return false;
@ -1197,10 +1197,10 @@ nsXMLHttpRequest::SlowAbort()
/*Method that checks if it is safe to expose a header value to the client.
It is used to check what headers are exposed for CORS requests.*/
bool
nsXMLHttpRequest::IsSafeHeader(const nsACString& header, nsIHttpChannel* httpChannel)
nsXMLHttpRequest::IsSafeHeader(const nsACString& aHeader, NotNull<nsIHttpChannel*> aHttpChannel) const
{
// See bug #380418. Hide "Set-Cookie" headers from non-chrome scripts.
if (!IsSystemXHR() && nsContentUtils::IsForbiddenResponseHeader(header)) {
if (!IsSystemXHR() && nsContentUtils::IsForbiddenResponseHeader(aHeader)) {
NS_WARNING("blocked access to response header");
return false;
}
@ -1223,14 +1223,14 @@ nsXMLHttpRequest::IsSafeHeader(const nsACString& header, nsIHttpChannel* httpCha
"last-modified", "pragma"
};
for (uint32_t i = 0; i < ArrayLength(kCrossOriginSafeHeaders); ++i) {
if (header.LowerCaseEqualsASCII(kCrossOriginSafeHeaders[i])) {
if (aHeader.LowerCaseEqualsASCII(kCrossOriginSafeHeaders[i])) {
return true;
}
}
nsAutoCString headerVal;
// The "Access-Control-Expose-Headers" header contains a comma separated
// list of method names.
httpChannel->
aHttpChannel->
GetResponseHeader(NS_LITERAL_CSTRING("Access-Control-Expose-Headers"),
headerVal);
nsCCharSeparatedTokenizer exposeTokens(headerVal, ',');
@ -1243,7 +1243,7 @@ nsXMLHttpRequest::IsSafeHeader(const nsACString& header, nsIHttpChannel* httpCha
if (!NS_IsValidHTTPToken(token)) {
return false;
}
if (header.Equals(token, nsCaseInsensitiveCStringComparator())) {
if (aHeader.Equals(token, nsCaseInsensitiveCStringComparator())) {
isSafe = true;
}
}
@ -1264,7 +1264,8 @@ nsXMLHttpRequest::GetAllResponseHeaders(nsCString& aResponseHeaders)
}
if (nsCOMPtr<nsIHttpChannel> httpChannel = GetCurrentHttpChannel()) {
RefPtr<nsHeaderVisitor> visitor = new nsHeaderVisitor(this, httpChannel);
RefPtr<nsHeaderVisitor> visitor =
new nsHeaderVisitor(*this, WrapNotNull(httpChannel));
if (NS_SUCCEEDED(httpChannel->VisitResponseHeaders(visitor))) {
aResponseHeaders = visitor->Headers();
}
@ -1358,7 +1359,7 @@ nsXMLHttpRequest::GetResponseHeader(const nsACString& header,
}
// Check for dangerous headers
if (!IsSafeHeader(header, httpChannel)) {
if (!IsSafeHeader(header, WrapNotNull(httpChannel))) {
return;
}
@ -1458,7 +1459,7 @@ nsXMLHttpRequest::GetCurrentJARChannel()
}
bool
nsXMLHttpRequest::IsSystemXHR()
nsXMLHttpRequest::IsSystemXHR() const
{
return mIsSystem || nsContentUtils::IsSystemPrincipal(mPrincipal);
}
@ -3648,7 +3649,7 @@ NS_IMPL_ISUPPORTS(nsXMLHttpRequest::nsHeaderVisitor, nsIHttpHeaderVisitor)
NS_IMETHODIMP nsXMLHttpRequest::
nsHeaderVisitor::VisitHeader(const nsACString &header, const nsACString &value)
{
if (mXHR->IsSafeHeader(header, mHttpChannel)) {
if (mXHR.IsSafeHeader(header, mHttpChannel)) {
mHeaders.Append(header);
mHeaders.AppendLiteral(": ");
mHeaders.Append(value);

View File

@ -7,7 +7,6 @@
#ifndef nsXMLHttpRequest_h__
#define nsXMLHttpRequest_h__
#include "mozilla/Attributes.h"
#include "nsIXMLHttpRequest.h"
#include "nsISupportsUtils.h"
#include "nsString.h"
@ -30,8 +29,10 @@
#include "nsIXPConnect.h"
#include "nsIInputStream.h"
#include "mozilla/Assertions.h"
#include "mozilla/Attributes.h"
#include "mozilla/DOMEventTargetHelper.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/NotNull.h"
#include "mozilla/dom/TypedArray.h"
#include "mozilla/dom/XMLHttpRequestBinding.h"
@ -423,7 +424,7 @@ private:
return Send(Nullable<RequestBody>(aBody));
}
bool IsCrossSiteCORSRequest();
bool IsCrossSiteCORSRequest() const;
bool IsDeniedCrossSiteCORSRequest();
// Tell our channel what network interface ID we were told to use.
@ -515,7 +516,8 @@ public:
}
}
void GetAllResponseHeaders(nsCString& aResponseHeaders);
bool IsSafeHeader(const nsACString& aHeaderName, nsIHttpChannel* aHttpChannel);
bool IsSafeHeader(const nsACString& aHeaderName,
mozilla::NotNull<nsIHttpChannel*> aHttpChannel) const;
void OverrideMimeType(const nsAString& aMimeType)
{
// XXX Should we do some validation here?
@ -615,7 +617,7 @@ protected:
already_AddRefed<nsIHttpChannel> GetCurrentHttpChannel();
already_AddRefed<nsIJARChannel> GetCurrentJARChannel();
bool IsSystemXHR();
bool IsSystemXHR() const;
void ChangeStateToDone();
@ -643,15 +645,16 @@ protected:
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIHTTPHEADERVISITOR
nsHeaderVisitor(nsXMLHttpRequest* aXMLHttpRequest, nsIHttpChannel* aHttpChannel)
nsHeaderVisitor(const nsXMLHttpRequest& aXMLHttpRequest,
mozilla::NotNull<nsIHttpChannel*> aHttpChannel)
: mXHR(aXMLHttpRequest), mHttpChannel(aHttpChannel) {}
const nsACString &Headers() { return mHeaders; }
private:
virtual ~nsHeaderVisitor() {}
nsCString mHeaders;
nsXMLHttpRequest* mXHR;
nsCOMPtr<nsIHttpChannel> mHttpChannel;
const nsXMLHttpRequest& mXHR;
mozilla::NotNull<nsCOMPtr<nsIHttpChannel>> mHttpChannel;
};
// The bytes of our response body. Only used for DEFAULT, ARRAYBUFFER and

View File

@ -245,7 +245,6 @@ support-files =
wholeTexty-helper.xml
file_nonascii_blob_url.html
referrerHelper.js
test_performance_user_timing.js
img_referrer_testserver.sjs
file_audioLoop.html
file_webaudioLoop.html
@ -257,8 +256,6 @@ support-files =
referrer_testserver.sjs
script_postmessages_fileList.js
iframe_postMessages.html
test_performance_observer.js
performance_observer.html
test_anonymousContent_style_csp.html^headers^
file_explicit_user_agent.sjs
referrer_change_server.sjs
@ -797,8 +794,6 @@ skip-if = toolkit != 'gonk'
skip-if = toolkit != 'gonk'
[test_orientation_sandbox_no_lock.html]
skip-if = toolkit != 'gonk'
[test_performance_observer.html]
[test_performance_user_timing.html]
[test_plugin_freezing.html]
skip-if = buildapp == 'b2g' || toolkit == 'android' #CLICK_TO_PLAY
[test_pluginAudioNotification.html]

View File

@ -885,25 +885,6 @@ DOMInterfaces = {
'wrapperCache': False
},
'Performance': [{
'nativeType': 'nsPerformance',
},
{
'nativeType': 'mozilla::dom::workers::Performance',
'headerFile': 'mozilla/dom/workers/bindings/Performance.h',
'workers': True,
}],
'PerformanceTiming': {
'nativeType': 'nsPerformanceTiming',
'headerFile': 'nsPerformance.h'
},
'PerformanceNavigation': {
'nativeType': 'nsPerformanceNavigation',
'headerFile': 'nsPerformance.h'
},
'Plugin': {
'headerFile' : 'nsPluginArray.h',
'nativeType': 'nsPluginElement',

View File

@ -1,70 +0,0 @@
<html>
<head>
</head>
<body>
<h1>This example is taken from <a href="https://schema.org/Recipe">https://schema.org/Recipe</a></h1>
<div itemscope itemtype="http://schema.org/Recipe">
<span itemprop="name">Mom's World Famous Banana Bread</span> By <span itemprop="author">John Smith</span>,
<meta itemprop="datePublished" content="2009-05-08">May 8, 2009
<img itemprop="image" src="bananabread.jpg" alt="Banana bread on a plate" />
<span itemprop="description">This classic banana bread recipe comes
from my mom -- the walnuts add a nice texture and flavor to the banana
bread.</span> Prep Time:
<meta itemprop="prepTime" content="PT15M">15 minutes Cook time:
<meta itemprop="cookTime" content="PT1H">1 hour Yield: <span itemprop="recipeYield">1 loaf</span>
<div itemprop="nutrition" itemscope itemtype="http://schema.org/NutritionInformation">
Nutrition facts:
<span itemprop="calories">240 calories</span>,
<span itemprop="fatContent">9 grams fat</span>
</div>
Ingredients: - <span itemprop="recipeIngredient">3 or 4 ripe bananas, smashed</span> - <span itemprop="recipeIngredient">1 egg</span> - <span itemprop="recipeIngredient">3/4 cup of sugar</span> ... Instructions:
<span itemprop="recipeInstructions">
Preheat the oven to 350 degrees. Mix in the ingredients in a bowl. Add
the flour last. Pour the mixture into a loaf pan and bake for one hour.
</span> 140 comments:
<div itemprop="interactionStatistic" itemscope itemtype="http://schema.org/InteractionCounter">
<meta itemprop="interactionType" content="http://schema.org/CommentAction" />
<meta itemprop="userInteractionCount" content="140" />
</div>
From Janel, May 5 -- thank you, great recipe! ...
</div>
<h1>This example is taken from <a href="https://schema.org/Book">https://schema.org/Book</a></h1>
<div itemscope itemtype="http://schema.org/Book">
<img itemprop="image" src="catcher-in-the-rye-book-cover.jpg" alt="cover art: red horse, city in background" />
<span itemprop="name">The Catcher in the Rye</span> -
<link itemprop="bookFormat" href="http://schema.org/Paperback">Mass Market Paperback by <a itemprop="author" href="/author/jd_salinger.html">J.D. Salinger</a>
<div itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">
<span itemprop="ratingValue">4</span> stars -
<span itemprop="reviewCount">3077</span> reviews
</div>
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
Price: <span itemprop="price" content="6.99">$6.99</span>
<meta itemprop="priceCurrency" content="USD" />
<link itemprop="availability" href="http://schema.org/InStock">In Stock
</div>
Product details
<span itemprop="numberOfPages">224</span> pages Publisher: <span itemprop="publisher">Little, Brown, and Company</span> -
<meta itemprop="datePublished" content="1991-05-01">May 1, 1991 Language: <span itemprop="inLanguage">English</span> ISBN-10:
<span itemprop="isbn">0316769487</span> Reviews:
<div itemprop="review" itemscope itemtype="http://schema.org/Review">
<span itemprop="reviewRating">5</span> stars -
<b>"<span itemprop="name">A masterpiece of literature</span>"</b> by
<span itemprop="author">John Doe</span>, Written on
<meta itemprop="datePublished" content="2006-05-04">May 4, 2006
<span itemprop="reviewBody">I really enjoyed this book. It captures the essential
challenge people face as they try make sense of their lives and grow to adulthood.</span>
</div>
<div itemprop="review" itemscope itemtype="http://schema.org/Review">
<span itemprop="reviewRating">4</span> stars -
<b>"<span itemprop="name">A good read.</span>" </b> by <span itemprop="author">Bob Smith</span>, Written on
<meta itemprop="datePublished" content="2006-06-15">June 15, 2006
<span itemprop="reviewBody">Catcher in the Rye is a fun book. It's a good book to read.</span>
</div>
</div>
</body>
</html>

View File

@ -1,18 +0,0 @@
<html>
<head>
</head>
<body>
<h1>This example is taken from <a href="https://html.spec.whatwg.org/multipage/microdata.html">https://html.spec.whatwg.org/multipage/microdata.html</a>, and modified.</h1>
<div itemscope id="amanda" itemref="a b"></div>
<p id="a">Name: <span itemprop="name">Amanda</span></p>
<div id="b" itemprop="band" itemscope itemref="c"></div>
<div id="c">
<p>Band: <span itemprop="name">Jazz Band</span></p>
<p>Size: <span itemprop="size">12</span> players</p>
<span itemprop="cycle" itemscope itemref="b">This is an error.</span>
</div>
</body>
</html>

View File

@ -1,23 +0,0 @@
<html>
<head>
</head>
<body>
<h1>This example is taken from <a href="https://html.spec.whatwg.org/multipage/microdata.html">https://html.spec.whatwg.org/multipage/microdata.html</a></h1>
<figure itemscope itemtype="http://n.whatwg.org/work" itemref="licenses">
<img itemprop="work" src="images/house.jpeg" alt="A white house, boarded up, sits in a forest.">
<figcaption itemprop="title">The house I found.</figcaption>
</figure>
<figure itemscope itemtype="http://n.whatwg.org/work" itemref="licenses">
<img itemprop="work" src="images/mailbox.jpeg" alt="Outside the house is a mailbox. It has a leaflet inside.">
<figcaption itemprop="title">The mailbox.</figcaption>
</figure>
<footer>
<p id="licenses">All images licensed under the <a itemprop="license"
href="http://www.opensource.org/licenses/mit-license.php">MIT
license</a>.</p>
</footer>
</body>
</html>

View File

@ -1,50 +0,0 @@
<html>
<head>
<meta charset=utf-8>
</head>
<body>
<h1>This example is taken from <a href="http://microformats.org/wiki/hcard-examples">http://microformats.org/wiki/hcard-examples</a></h1>
<div class="vcard">
<span class="fn n">
<a class="url" href="http://t37.net">
<span class="given-name">Fréderic</span>
<span class="family-name">de Villamil</span>
</a>
</span>
<span class="nickname">neuro</span>
<a class="email" href="mailto:neuroNOSPAM@t37.net">
<span class="type">pref</span><span>erred email</span>
</a>
<span class="org">Omatis</span>
<span class="adr">
<abbr class="type" title="dom">France</abbr>
<span class="type">home</span> address
<abbr class="type" title="postal">mail</abbr> and
<abbr class="type" title="parcel">shipments</abbr>:
<span class="street-address">12 rue Danton</span>
<span class="locality">Le Kremlin-Bicetre</span>
<span class="postal-code">94270</span>
<span class="country-name">France</span>
</span>
<span class="geo">
<abbr class="latitude" title="48.816667">N 48° 81.6667</abbr>
<abbr class="longitude" title="2.366667">E 2° 36.6667</abbr>
</span>
</div>
<h1>This example is taken from <a href="http://microformats.org/wiki/hCalendar">http://microformats.org/wiki/hCalendar</a></h1>
<div class="vevent">
<a class="url" href="http://conferences.oreillynet.com/pub/w/40/program.html">
http://conferences.oreillynet.com/pub/w/40/program.html
</a>
<span class="summary">Web 2.0 Conference</span>:
<abbr class="dtstart" title="2005-10-05">October 5</abbr>-
<abbr class="dtend" title="2005-10-07">7</abbr>,
at the <span class="location">Argent Hotel, San Francisco, CA</span>
</div>
</body>
</html>

View File

@ -136,10 +136,6 @@ support-files =
file_focus.html
file_http_401_response.sjs
file_http_407_response.sjs
file_microdata.html
file_microdata_bad_itemref.html
file_microdata_itemref.html
file_microformats.html
file_post_request.html
file_wyciwyg.html
file_audio.html

View File

@ -597,7 +597,9 @@ CreateGLWithEGL(const gl::SurfaceCaps& caps, gl::CreateContextFlags flags,
out_failReason->AppendLiteral("\n");
}
out_failReason->AppendLiteral("Error during EGL OpenGL init.");
*out_failureId = "FEATURE_FAILURE_WEBGL_EGL_INIT";
if (out_failureId->IsEmpty()) {
*out_failureId = "FEATURE_FAILURE_WEBGL_EGL_INIT";
}
return nullptr;
}
@ -621,7 +623,9 @@ CreateGLWithANGLE(const gl::SurfaceCaps& caps, gl::CreateContextFlags flags,
out_failReason->AppendLiteral("\n");
}
out_failReason->AppendLiteral("Error during ANGLE OpenGL init.");
*out_failureId = "FEATURE_FAILURE_WEBGL_ANGLE_INIT";
if (out_failureId->IsEmpty()) {
*out_failureId = "FEATURE_FAILURE_WEBGL_ANGLE_INIT";
}
return nullptr;
}
@ -659,7 +663,9 @@ CreateGLWithDefault(const gl::SurfaceCaps& caps, gl::CreateContextFlags flags,
out_failReason->AppendASCII("\n");
}
out_failReason->AppendASCII("Error during native OpenGL init.");
*out_failureId = "FEATURE_FAILURE_WEBGL_DEFAULT_INIT";
if (out_failureId->IsEmpty()) {
*out_failureId = "FEATURE_FAILURE_WEBGL_DEFAULT_INIT";
}
return nullptr;
}

View File

@ -11,6 +11,7 @@
#include "mozilla/dom/Exceptions.h"
#include "mozilla/dom/File.h"
#include "mozilla/dom/FunctionBinding.h"
#include "mozilla/dom/Performance.h"
#include "mozilla/dom/StructuredCloneHolder.h"
#include "mozilla/dom/ToJSValue.h"
#include "mozilla/Maybe.h"
@ -20,7 +21,6 @@
#include "nsGlobalWindow.h"
#include "nsJSUtils.h"
#include "nsNetUtil.h"
#include "nsPerformance.h"
#include "ScriptSettings.h"
#include "WorkerPrivate.h"
#include "WorkerRunnable.h"
@ -1355,7 +1355,7 @@ Console::MethodInternal(JSContext* aCx, MethodName aMethodName,
nsGlobalWindow *win = nsGlobalWindow::Cast(mWindow);
MOZ_ASSERT(win);
RefPtr<nsPerformance> performance = win->GetPerformance();
RefPtr<Performance> performance = win->GetPerformance();
if (!performance) {
return;
}

View File

@ -13,6 +13,7 @@
#include "mozilla/DOMEventTargetHelper.h"
#include "mozilla/EventStateManager.h"
#include "mozilla/InternalMutationEvent.h"
#include "mozilla/dom/Performance.h"
#include "mozilla/MiscEvents.h"
#include "mozilla/MouseEvents.h"
#include "mozilla/Preferences.h"
@ -30,7 +31,6 @@
#include "nsIScrollableFrame.h"
#include "nsJSEnvironment.h"
#include "nsLayoutUtils.h"
#include "nsPerformance.h"
#include "nsPIWindowRoot.h"
#include "WorkerPrivate.h"
@ -1096,7 +1096,8 @@ Event::TimeStamp() const
if (NS_WARN_IF(!win)) {
return 0.0;
}
nsPerformance* perf = win->GetPerformance();
Performance* perf = win->GetPerformance();
if (NS_WARN_IF(!perf)) {
return 0.0;
}

View File

@ -830,7 +830,7 @@ EventListenerManager::SetEventHandler(nsIAtom* aName,
if (doc) {
// Don't allow adding an event listener if the document is sandboxed
// without 'allow-scripts'.
if (doc->GetSandboxFlags() & SANDBOXED_SCRIPTS) {
if (doc->HasScriptsBlockedBySandbox()) {
return NS_ERROR_DOM_SECURITY_ERR;
}

View File

@ -29,7 +29,7 @@ Gamepad::UpdateTimestamp()
{
nsCOMPtr<nsPIDOMWindowInner> newWindow(do_QueryInterface(mParent));
if(newWindow) {
nsPerformance* perf = newWindow->GetPerformance();
Performance* perf = newWindow->GetPerformance();
if (perf) {
mTimestamp = perf->Now();
}

View File

@ -10,12 +10,12 @@
#include "mozilla/ErrorResult.h"
#include "mozilla/dom/GamepadBinding.h"
#include "mozilla/dom/GamepadButton.h"
#include "mozilla/dom/Performance.h"
#include <stdint.h>
#include "nsCOMPtr.h"
#include "nsString.h"
#include "nsTArray.h"
#include "nsWrapperCache.h"
#include "nsPerformance.h"
namespace mozilla {
namespace dom {

View File

@ -2015,7 +2015,10 @@ HTMLInputElement::SetWidth(uint32_t aWidth)
NS_IMETHODIMP
HTMLInputElement::GetValue(nsAString& aValue)
{
GetValueInternal(aValue);
nsresult rv = GetValueInternal(aValue);
if (NS_FAILED(rv)) {
return rv;
}
// Don't return non-sanitized value for types that are experimental on mobile.
if (IsExperimentalMobileType(mType)) {
@ -2032,8 +2035,8 @@ HTMLInputElement::GetValueInternal(nsAString& aValue) const
case VALUE_MODE_VALUE:
if (IsSingleLineTextControl(false)) {
mInputData.mState->GetValue(aValue, true);
} else {
aValue.Assign(mInputData.mValue);
} else if (!aValue.Assign(mInputData.mValue, fallible)) {
return NS_ERROR_OUT_OF_MEMORY;
}
return NS_OK;
@ -2169,6 +2172,15 @@ HTMLInputElement::GetValueAsDecimal() const
: decimalValue;
}
void
HTMLInputElement::GetValue(nsAString& aValue, ErrorResult& aRv)
{
nsresult rv = GetValue(aValue);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
}
}
void
HTMLInputElement::SetValue(const nsAString& aValue, ErrorResult& aRv)
{
@ -6314,13 +6326,23 @@ HTMLInputElement::SaveState()
inputState = new HTMLInputElementState();
nsAutoString value;
GetValue(value);
DebugOnly<nsresult> rv =
nsLinebreakConverter::ConvertStringLineBreaks(
value,
nsLinebreakConverter::eLinebreakPlatform,
nsLinebreakConverter::eLinebreakContent);
NS_ASSERTION(NS_SUCCEEDED(rv), "Converting linebreaks failed!");
nsresult rv = GetValue(value);
if (NS_FAILED(rv)) {
return rv;
}
if (!IsSingleLineTextControl(false)) {
rv = nsLinebreakConverter::ConvertStringLineBreaks(
value,
nsLinebreakConverter::eLinebreakPlatform,
nsLinebreakConverter::eLinebreakContent);
if (NS_FAILED(rv)) {
NS_ERROR("Converting linebreaks failed!");
return rv;
}
}
inputState->SetValue(value);
break;
}

View File

@ -632,7 +632,7 @@ public:
SetHTMLAttr(nsGkAtoms::value, aValue, aRv);
}
// XPCOM GetValue() is OK
void GetValue(nsAString& aValue, ErrorResult& aRv);
void SetValue(const nsAString& aValue, ErrorResult& aRv);
Nullable<Date> GetValueAsDate(ErrorResult& aRv);

View File

@ -1085,7 +1085,11 @@ HTMLTextAreaElement::SaveState()
value,
nsLinebreakConverter::eLinebreakPlatform,
nsLinebreakConverter::eLinebreakContent);
NS_ASSERTION(NS_SUCCEEDED(rv), "Converting linebreaks failed!");
if (NS_FAILED(rv)) {
NS_ERROR("Converting linebreaks failed!");
return rv;
}
nsCOMPtr<nsISupportsString> pState =
do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID);

View File

@ -28,7 +28,7 @@
#include "mozilla/Preferences.h"
#include "mozilla/dom/WakeLock.h"
#include "mozilla/dom/power/PowerManagerService.h"
#include "nsPerformance.h"
#include "mozilla/dom/Performance.h"
#include "mozilla/dom/VideoPlaybackQuality.h"
NS_IMPL_NS_NEW_HTML_ELEMENT(Video)
@ -235,7 +235,7 @@ HTMLVideoElement::GetVideoPlaybackQuality()
if (sVideoStatsEnabled) {
if (nsPIDOMWindowInner* window = OwnerDoc()->GetInnerWindow()) {
nsPerformance* perf = window->GetPerformance();
Performance* perf = window->GetPerformance();
if (perf) {
creationTime = perf->Now();
}

View File

@ -1762,8 +1762,7 @@ ContentParent::ShutDownProcess(ShutDownMethod aMethod)
}
// If Close() fails with an error, we'll end up back in this function, but
// with aMethod = CLOSE_CHANNEL_WITH_ERROR. It's important that we call
// CloseWithError() in this case; see bug 895204.
// with aMethod = CLOSE_CHANNEL_WITH_ERROR.
if (aMethod == CLOSE_CHANNEL && !mCalledClose) {
// Close() can only be called once: It kicks off the destruction
@ -1779,14 +1778,6 @@ ContentParent::ShutDownProcess(ShutDownMethod aMethod)
#endif
}
if (aMethod == CLOSE_CHANNEL_WITH_ERROR && !mCalledCloseWithError) {
MessageChannel* channel = GetIPCChannel();
if (channel) {
mCalledCloseWithError = true;
channel->CloseWithError();
}
}
const ManagedContainer<POfflineCacheUpdateParent>& ocuParents =
ManagedPOfflineCacheUpdateParent();
for (auto iter = ocuParents.ConstIter(); !iter.Done(); iter.Next()) {
@ -2315,7 +2306,6 @@ ContentParent::InitializeMembers()
mMetamorphosed = false;
mSendPermissionUpdates = false;
mCalledClose = false;
mCalledCloseWithError = false;
mCalledKillHard = false;
mCreatedPairedMinidumps = false;
mShutdownPending = false;

View File

@ -1168,10 +1168,9 @@ private:
bool mIsNuwaProcess;
bool mHasGamepadListener;
// These variables track whether we've called Close(), CloseWithError()
// and KillHard() on our channel.
// These variables track whether we've called Close() and KillHard() on our
// channel.
bool mCalledClose;
bool mCalledCloseWithError;
bool mCalledKillHard;
bool mCreatedPairedMinidumps;
bool mShutdownPending;

View File

@ -593,6 +593,9 @@ child:
async ParentActivated(bool aActivated);
async SetKeyboardIndicators(UIStateChangeType showAccelerators,
UIStateChangeType showFocusRings);
/**
* StopIMEStateManagement() is called when the process loses focus and
* should stop managing IME state.

View File

@ -7,6 +7,8 @@
include protocol PBrowser;
include PBrowserOrId;
using UIStateChangeType from "nsPIDOMWindow.h";
namespace mozilla {
namespace dom {
@ -55,6 +57,10 @@ struct FrameIPCTabContext
// This value would be empty if the TabContext isn't created for
// presented content.
nsString presentationURL;
// Keyboard indicator state inherited from the parent.
UIStateChangeType showAccelerators;
UIStateChangeType showFocusRings;
};
// XXXcatalinb: This is only used by ServiceWorkerClients::OpenWindow.

View File

@ -854,6 +854,8 @@ TabChild::Init()
do_QueryInterface(window->GetChromeEventHandler());
docShell->SetChromeEventHandler(chromeHandler);
window->SetKeyboardIndicators(ShowAccelerators(), ShowFocusRings());
// Set prerender flag if necessary.
if (mIsPrerendered) {
docShell->SetIsPrerendered();
@ -1860,6 +1862,16 @@ bool TabChild::RecvParentActivated(const bool& aActivated)
return true;
}
bool TabChild::RecvSetKeyboardIndicators(const UIStateChangeType& aShowAccelerators,
const UIStateChangeType& aShowFocusRings)
{
nsCOMPtr<nsPIDOMWindowOuter> window = do_GetInterface(WebNavigation());
NS_ENSURE_TRUE(window, true);
window->SetKeyboardIndicators(aShowAccelerators, aShowFocusRings);
return true;
}
bool
TabChild::RecvStopIMEStateManagement()
{
@ -2912,7 +2924,6 @@ TabChild::EnableDisableCommands(const nsAString& aAction,
aEnabledCommands, aDisabledCommands);
}
NS_IMETHODIMP
TabChild::GetTabId(uint64_t* aId)
{

View File

@ -669,6 +669,9 @@ protected:
virtual bool RecvParentActivated(const bool& aActivated) override;
virtual bool RecvSetKeyboardIndicators(const UIStateChangeType& aShowAccelerators,
const UIStateChangeType& aShowFocusRings) override;
virtual bool RecvStopIMEStateManagement() override;
virtual bool RecvMenuKeyboardListenerInstalled(

View File

@ -26,6 +26,8 @@ TabContext::TabContext()
, mIsMozBrowserElement(false)
, mContainingAppId(NO_APP_ID)
, mOriginAttributes()
, mShowAccelerators(UIStateChangeType_NoChange)
, mShowFocusRings(UIStateChangeType_NoChange)
{
}
@ -203,11 +205,25 @@ TabContext::PresentationURL() const
return mPresentationURL;
}
UIStateChangeType
TabContext::ShowAccelerators() const
{
return mShowAccelerators;
}
UIStateChangeType
TabContext::ShowFocusRings() const
{
return mShowFocusRings;
}
bool
TabContext::SetTabContext(bool aIsMozBrowserElement,
bool aIsPrerendered,
mozIApplication* aOwnApp,
mozIApplication* aAppFrameOwnerApp,
UIStateChangeType aShowAccelerators,
UIStateChangeType aShowFocusRings,
const DocShellOriginAttributes& aOriginAttributes,
const nsACString& aSignedPkgOriginNoSuffix,
const nsAString& aPresentationURL)
@ -244,6 +260,8 @@ TabContext::SetTabContext(bool aIsMozBrowserElement,
mContainingApp = aAppFrameOwnerApp;
mSignedPkgOriginNoSuffix = aSignedPkgOriginNoSuffix;
mPresentationURL = aPresentationURL;
mShowAccelerators = aShowAccelerators;
mShowFocusRings = aShowFocusRings;
return true;
}
@ -257,7 +275,9 @@ TabContext::AsIPCTabContext() const
mSignedPkgOriginNoSuffix,
mIsMozBrowserElement,
mIsPrerendered,
mPresentationURL));
mPresentationURL,
mShowAccelerators,
mShowFocusRings));
}
static already_AddRefed<mozIApplication>
@ -282,6 +302,8 @@ MaybeInvalidTabContext::MaybeInvalidTabContext(const IPCTabContext& aParams)
nsAutoCString originSuffix;
nsAutoCString signedPkgOriginNoSuffix;
nsAutoString presentationURL;
UIStateChangeType showAccelerators;
UIStateChangeType showFocusRings;
switch(aParams.type()) {
case IPCTabContext::TPopupIPCTabContext: {
@ -344,6 +366,8 @@ MaybeInvalidTabContext::MaybeInvalidTabContext(const IPCTabContext& aParams)
containingAppId = ipcContext.frameOwnerAppId();
signedPkgOriginNoSuffix = ipcContext.signedPkgOriginNoSuffix();
presentationURL = ipcContext.presentationURL();
showAccelerators = ipcContext.showAccelerators();
showFocusRings = ipcContext.showFocusRings();
originSuffix = ipcContext.originSuffix();
originAttributes.PopulateFromSuffix(originSuffix);
break;
@ -392,6 +416,8 @@ MaybeInvalidTabContext::MaybeInvalidTabContext(const IPCTabContext& aParams)
isPrerendered,
ownApp,
containingApp,
showAccelerators,
showFocusRings,
originAttributes,
signedPkgOriginNoSuffix,
presentationURL);

View File

@ -10,6 +10,7 @@
#include "mozIApplication.h"
#include "nsCOMPtr.h"
#include "mozilla/BasePrincipal.h"
#include "nsPIWindowRoot.h"
namespace mozilla {
namespace dom {
@ -136,6 +137,9 @@ public:
*/
const nsAString& PresentationURL() const;
UIStateChangeType ShowAccelerators() const;
UIStateChangeType ShowFocusRings() const;
protected:
friend class MaybeInvalidTabContext;
@ -169,6 +173,8 @@ protected:
bool aIsPrerendered,
mozIApplication* aOwnApp,
mozIApplication* aAppFrameOwnerApp,
UIStateChangeType aShowAccelerators,
UIStateChangeType aShowFocusRings,
const DocShellOriginAttributes& aOriginAttributes,
const nsACString& aSignedPkgOriginNoSuffix,
const nsAString& aPresentationURL);
@ -238,6 +244,12 @@ private:
* The requested presentation URL.
*/
nsString mPresentationURL;
/**
* Keyboard indicator state (focus rings, accelerators).
*/
UIStateChangeType mShowAccelerators;
UIStateChangeType mShowFocusRings;
};
/**
@ -258,6 +270,8 @@ public:
bool aIsPrerendered,
mozIApplication* aOwnApp,
mozIApplication* aAppFrameOwnerApp,
UIStateChangeType aShowAccelerators,
UIStateChangeType aShowFocusRings,
const DocShellOriginAttributes& aOriginAttributes,
const nsACString& aSignedPkgOriginNoSuffix = EmptyCString(),
const nsAString& aPresentationURL = EmptyString())
@ -266,6 +280,8 @@ public:
aIsPrerendered,
aOwnApp,
aAppFrameOwnerApp,
aShowAccelerators,
aShowFocusRings,
aOriginAttributes,
aSignedPkgOriginNoSuffix,
aPresentationURL);

View File

@ -10,6 +10,7 @@
#include "ipc/IPCMessageUtils.h"
#include "mozilla/dom/AudioChannelBinding.h"
#include "nsIDOMEvent.h"
#include "nsPIDOMWindow.h"
#include "nsCOMPtr.h"
#ifdef MOZ_CRASHREPORTER
@ -104,6 +105,13 @@ struct ParamTraits<nsSizeMode>
nsSizeMode_Invalid>
{};
template<>
struct ParamTraits<UIStateChangeType>
: public ContiguousEnumSerializer<UIStateChangeType,
UIStateChangeType_NoChange,
UIStateChangeType_Invalid>
{ };
} // namespace IPC
#endif // TABMESSAGE_UTILS_H

View File

@ -200,7 +200,7 @@ nsresult nsJSThunk::EvaluateScript(nsIChannel *aChannel,
// Sandboxed document check: javascript: URI's are disabled
// in a sandboxed document unless 'allow-scripts' was specified.
nsIDocument* doc = aOriginalInnerWindow->GetExtantDoc();
if (doc && (doc->GetSandboxFlags() & SANDBOXED_SCRIPTS)) {
if (doc && doc->HasScriptsBlockedBySandbox()) {
return NS_ERROR_DOM_RETVAL_UNDEFINED;
}

View File

@ -6,8 +6,13 @@
#include <stdint.h>
#include <algorithm>
#include "nsIStringBundle.h"
#include "nsDebug.h"
#include "nsString.h"
#include "mozilla/Preferences.h"
#include "mozilla/StaticMutex.h"
#include "mozilla/StaticPtr.h"
#include "nsThreadUtils.h"
#include "CubebUtils.h"
#include "nsAutoRef.h"
#include "prdtoa.h"
@ -25,6 +30,9 @@ cubeb* sCubebContext;
double sVolumeScale;
uint32_t sCubebLatency;
bool sCubebLatencyPrefSet;
StaticAutoPtr<char> sBrandName;
const char kBrandBundleURL[] = "chrome://branding/locale/brand.properties";
// Prefered samplerate, in Hz (characteristic of the hardware, mixer, platform,
// and API used).
@ -101,15 +109,45 @@ void InitPreferredSampleRate()
}
}
void InitBrandName()
{
if (sBrandName) {
return;
}
nsXPIDLString brandName;
nsCOMPtr<nsIStringBundleService> stringBundleService =
mozilla::services::GetStringBundleService();
if (stringBundleService) {
nsCOMPtr<nsIStringBundle> brandBundle;
nsresult rv = stringBundleService->CreateBundle(kBrandBundleURL,
getter_AddRefs(brandBundle));
if (NS_SUCCEEDED(rv)) {
rv = brandBundle->GetStringFromName(MOZ_UTF16("brandShortName"),
getter_Copies(brandName));
NS_WARN_IF_FALSE(NS_SUCCEEDED(rv),
"Could not get the program name for a cubeb stream.");
}
}
/* cubeb expects a c-string. */
const char* ascii = NS_LossyConvertUTF16toASCII(brandName).get();
sBrandName = new char[brandName.Length() + 1];
PodCopy(sBrandName.get(), ascii, brandName.Length());
sBrandName[brandName.Length()] = 0;
}
cubeb* GetCubebContextUnlocked()
{
sMutex.AssertCurrentThreadOwns();
if (sCubebContext ||
cubeb_init(&sCubebContext, "CubebUtils") == CUBEB_OK) {
if (sCubebContext) {
return sCubebContext;
}
NS_WARNING("cubeb_init failed");
return nullptr;
NS_WARN_IF_FALSE(sBrandName, "Could not get brandName?");
DebugOnly<int> rv = cubeb_init(&sCubebContext, sBrandName);
NS_WARN_IF_FALSE(rv == CUBEB_OK, "Could not get a cubeb context.");
return sCubebContext;
}
uint32_t GetCubebLatency()
@ -130,6 +168,9 @@ void InitLibrary()
Preferences::RegisterCallback(PrefChanged, PREF_VOLUME_SCALE);
PrefChanged(PREF_CUBEB_LATENCY, nullptr);
Preferences::RegisterCallback(PrefChanged, PREF_CUBEB_LATENCY);
#ifndef MOZ_WIDGET_ANDROID
NS_DispatchToMainThread(NS_NewRunnableFunction(&InitBrandName));
#endif
}
void ShutdownLibrary()
@ -142,6 +183,7 @@ void ShutdownLibrary()
cubeb_destroy(sCubebContext);
sCubebContext = nullptr;
}
sBrandName = nullptr;
}
uint32_t MaxNumberOfChannels()

View File

@ -1555,26 +1555,26 @@ void BaseMediaResource::SetLoadInBackground(bool aLoadInBackground) {
void BaseMediaResource::ModifyLoadFlags(nsLoadFlags aFlags)
{
nsCOMPtr<nsILoadGroup> loadGroup;
DebugOnly<nsresult> rv = mChannel->GetLoadGroup(getter_AddRefs(loadGroup));
NS_ASSERTION(NS_SUCCEEDED(rv), "GetLoadGroup() failed!");
nsresult rv = mChannel->GetLoadGroup(getter_AddRefs(loadGroup));
MOZ_ASSERT(NS_SUCCEEDED(rv), "GetLoadGroup() failed!");
nsresult status;
mChannel->GetStatus(&status);
// Note: if (NS_FAILED(status)), the channel won't be in the load group.
if (loadGroup &&
NS_SUCCEEDED(status)) {
bool inLoadGroup = false;
if (loadGroup) {
rv = loadGroup->RemoveRequest(mChannel, nullptr, status);
NS_ASSERTION(NS_SUCCEEDED(rv), "RemoveRequest() failed!");
if (NS_SUCCEEDED(rv)) {
inLoadGroup = true;
}
}
rv = mChannel->SetLoadFlags(aFlags);
NS_ASSERTION(NS_SUCCEEDED(rv), "SetLoadFlags() failed!");
MOZ_ASSERT(NS_SUCCEEDED(rv), "SetLoadFlags() failed!");
if (loadGroup &&
NS_SUCCEEDED(status)) {
if (inLoadGroup) {
rv = loadGroup->AddRequest(mChannel, nullptr);
NS_ASSERTION(NS_SUCCEEDED(rv), "AddRequest() failed!");
MOZ_ASSERT(NS_SUCCEEDED(rv), "AddRequest() failed!");
}
}

View File

@ -512,10 +512,13 @@ RTCPeerConnection.prototype = {
// This wrapper helps implement legacy callbacks in a manner that produces
// correct line-numbers in errors, provided that methods validate their inputs
// before putting themselves on the pc's operations chain.
//
// It also serves as guard against settling promises past close().
_legacyCatch: function(onSuccess, onError, func) {
_legacyCatchAndCloseGuard: function(onSuccess, onError, func) {
if (!onSuccess) {
return func();
return func().then(v => (this._closed ? new Promise(() => {}) : v),
e => (this._closed ? new Promise(() => {}) : Promise.reject(e)));
}
try {
return func().then(this._wrapLegacyCallback(onSuccess),
@ -711,7 +714,7 @@ RTCPeerConnection.prototype = {
} else {
options = optionsOrOnSuccess;
}
return this._legacyCatch(onSuccess, onError, () => {
return this._legacyCatchAndCloseGuard(onSuccess, onError, () => {
// TODO: Remove error on constraint-like RTCOptions next cycle (1197021).
// Note that webidl bindings make o.mandatory implicit but not o.optional.
function convertLegacyOptions(o) {
@ -778,7 +781,7 @@ RTCPeerConnection.prototype = {
} else {
options = optionsOrOnSuccess;
}
return this._legacyCatch(onSuccess, onError, () => {
return this._legacyCatchAndCloseGuard(onSuccess, onError, () => {
let origin = Cu.getWebIDLCallerPrincipal().origin;
return this._chain(() => {
let p = Promise.all([this.getPermission(), this._certificateReady])
@ -828,7 +831,7 @@ RTCPeerConnection.prototype = {
},
setLocalDescription: function(desc, onSuccess, onError) {
return this._legacyCatch(onSuccess, onError, () => {
return this._legacyCatchAndCloseGuard(onSuccess, onError, () => {
this._localType = desc.type;
let type;
@ -912,7 +915,7 @@ RTCPeerConnection.prototype = {
},
setRemoteDescription: function(desc, onSuccess, onError) {
return this._legacyCatch(onSuccess, onError, () => {
return this._legacyCatchAndCloseGuard(onSuccess, onError, () => {
this._remoteType = desc.type;
let type;
@ -1013,7 +1016,7 @@ RTCPeerConnection.prototype = {
addIceCandidate: function(c, onSuccess, onError) {
return this._legacyCatch(onSuccess, onError, () => {
return this._legacyCatchAndCloseGuard(onSuccess, onError, () => {
if (!c.candidate && !c.sdpMLineIndex) {
throw new this._win.DOMException("Invalid candidate passed to addIceCandidate!",
"InvalidParameterError");
@ -1213,7 +1216,7 @@ RTCPeerConnection.prototype = {
},
getStats: function(selector, onSuccess, onError) {
return this._legacyCatch(onSuccess, onError, () => {
return this._legacyCatchAndCloseGuard(onSuccess, onError, () => {
return this._chain(() => new this._win.Promise((resolve, reject) => {
this._onGetStatsSuccess = resolve;
this._onGetStatsFailure = reject;

View File

@ -278,51 +278,51 @@ MediaKeySystemAccess::GetKeySystemStatus(const nsAString& aKeySystem,
return EnsureMinCDMVersion(mps, aKeySystem, aMinCdmVersion, aOutMessage, aOutCdmVersion);
}
#ifdef MOZ_ADOBE_EME
if (aKeySystem.EqualsLiteral("com.adobe.primetime")) {
if (!Preferences::GetBool("media.gmp-eme-adobe.enabled", false)) {
aOutMessage = NS_LITERAL_CSTRING("Adobe EME disabled");
return MediaKeySystemStatus::Cdm_disabled;
}
if (Preferences::GetBool("media.gmp-eme-adobe.visible", false)) {
if (aKeySystem.EqualsLiteral("com.adobe.primetime")) {
if (!Preferences::GetBool("media.gmp-eme-adobe.enabled", false)) {
aOutMessage = NS_LITERAL_CSTRING("Adobe EME disabled");
return MediaKeySystemStatus::Cdm_disabled;
}
#ifdef XP_WIN
// Win Vista and later only.
if (!IsVistaOrLater()) {
aOutMessage = NS_LITERAL_CSTRING("Minimum Windows version (Vista) not met for Adobe EME");
return MediaKeySystemStatus::Cdm_not_supported;
}
// Win Vista and later only.
if (!IsVistaOrLater()) {
aOutMessage = NS_LITERAL_CSTRING("Minimum Windows version (Vista) not met for Adobe EME");
return MediaKeySystemStatus::Cdm_not_supported;
}
#endif
#ifdef XP_MACOSX
if (!nsCocoaFeatures::OnLionOrLater()) {
aOutMessage = NS_LITERAL_CSTRING("Minimum MacOSX version (10.7) not met for Adobe EME");
return MediaKeySystemStatus::Cdm_not_supported;
if (!nsCocoaFeatures::OnLionOrLater()) {
aOutMessage = NS_LITERAL_CSTRING("Minimum MacOSX version (10.7) not met for Adobe EME");
return MediaKeySystemStatus::Cdm_not_supported;
}
#endif
return EnsureMinCDMVersion(mps, aKeySystem, aMinCdmVersion, aOutMessage, aOutCdmVersion);
}
#endif
return EnsureMinCDMVersion(mps, aKeySystem, aMinCdmVersion, aOutMessage, aOutCdmVersion);
}
#endif
#ifdef MOZ_WIDEVINE_EME
if (aKeySystem.EqualsLiteral("com.widevine.alpha")) {
if (Preferences::GetBool("media.gmp-widevinecdm.visible", false)) {
if (aKeySystem.EqualsLiteral("com.widevine.alpha")) {
#ifdef XP_WIN
// Win Vista and later only.
if (!IsVistaOrLater()) {
aOutMessage = NS_LITERAL_CSTRING("Minimum Windows version (Vista) not met for Widevine EME");
return MediaKeySystemStatus::Cdm_not_supported;
}
// Win Vista and later only.
if (!IsVistaOrLater()) {
aOutMessage = NS_LITERAL_CSTRING("Minimum Windows version (Vista) not met for Widevine EME");
return MediaKeySystemStatus::Cdm_not_supported;
}
#endif
#ifdef XP_MACOSX
if (!nsCocoaFeatures::OnLionOrLater()) {
aOutMessage = NS_LITERAL_CSTRING("Minimum MacOSX version (10.7) not met for Widevine EME");
return MediaKeySystemStatus::Cdm_not_supported;
}
if (!nsCocoaFeatures::OnLionOrLater()) {
aOutMessage = NS_LITERAL_CSTRING("Minimum MacOSX version (10.7) not met for Widevine EME");
return MediaKeySystemStatus::Cdm_not_supported;
}
#endif
if (!Preferences::GetBool("media.gmp-widevinecdm.enabled", false)) {
aOutMessage = NS_LITERAL_CSTRING("Widevine EME disabled");
return MediaKeySystemStatus::Cdm_disabled;
if (!Preferences::GetBool("media.gmp-widevinecdm.enabled", false)) {
aOutMessage = NS_LITERAL_CSTRING("Widevine EME disabled");
return MediaKeySystemStatus::Cdm_disabled;
}
return EnsureMinCDMVersion(mps, aKeySystem, aMinCdmVersion, aOutMessage, aOutCdmVersion);
}
return EnsureMinCDMVersion(mps, aKeySystem, aMinCdmVersion, aOutMessage, aOutCdmVersion);
}
#endif
return MediaKeySystemStatus::Cdm_not_supported;
}

View File

@ -4,9 +4,6 @@
# 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/.
for cdm in CONFIG['MOZ_EME_MODULES']:
DEFINES['MOZ_%s_EME' % cdm.upper()] = True
EXPORTS.mozilla.dom += [
'MediaEncryptedEvent.h',
'MediaKeyError.h',

View File

@ -23,9 +23,7 @@
#include "GMPUtils.h"
#include "prio.h"
#include "base/task.h"
#ifdef MOZ_WIDEVINE_EME
#include "widevine-adapter/WidevineAdapter.h"
#endif
using namespace mozilla::ipc;
using mozilla::dom::CrashReporterChild;
@ -376,17 +374,12 @@ GMPChild::AnswerStartPlugin(const nsString& aAdapter)
return false;
}
#ifdef MOZ_WIDEVINE_EME
bool isWidevine = aAdapter.EqualsLiteral("widevine");
#endif
#if defined(MOZ_GMP_SANDBOX) && defined(XP_MACOSX)
MacSandboxPluginType pluginType = MacSandboxPluginType_GMPlugin_Default;
#ifdef MOZ_WIDEVINE_EME
if (isWidevine) {
pluginType = MacSandboxPluginType_GMPlugin_EME_Widevine;
pluginType = MacSandboxPluginType_GMPlugin_EME_Widevine;
}
#endif
if (!SetMacSandboxInfo(pluginType)) {
NS_WARNING("Failed to set Mac GMP sandbox info");
delete platformAPI;
@ -394,12 +387,7 @@ GMPChild::AnswerStartPlugin(const nsString& aAdapter)
}
#endif
GMPAdapter* adapter = nullptr;
#ifdef MOZ_WIDEVINE_EME
if (isWidevine) {
adapter = new WidevineAdapter();
}
#endif
GMPAdapter* adapter = (isWidevine) ? new WidevineAdapter() : nullptr;
if (!mGMPLoader->Load(libPath.get(),
libPath.Length(),
mNodeId.BeginWriting(),

View File

@ -40,10 +40,8 @@ using CrashReporter::GetIDFromMinidump;
#include "WMFDecoderModule.h"
#endif
#ifdef MOZ_WIDEVINE_EME
#include "mozilla/dom/WidevineCDMManifestBinding.h"
#include "widevine-adapter/WidevineAdapter.h"
#endif
namespace mozilla {
@ -809,7 +807,6 @@ GMPParent::ReadGMPMetaData()
return ReadGMPInfoFile(infoFile);
}
#ifdef MOZ_WIDEVINE_EME
// Maybe this is the Widevine adapted plugin?
nsCOMPtr<nsIFile> manifestFile;
rv = mDirectory->Clone(getter_AddRefs(manifestFile));
@ -818,9 +815,6 @@ GMPParent::ReadGMPMetaData()
}
manifestFile->AppendRelativePath(NS_LITERAL_STRING("manifest.json"));
return ReadChromiumManifestFile(manifestFile);
#else
return GenericPromise::CreateAndReject(rv, __func__);
#endif
}
RefPtr<GenericPromise>
@ -915,7 +909,6 @@ GMPParent::ReadGMPInfoFile(nsIFile* aFile)
return GenericPromise::CreateAndResolve(true, __func__);
}
#ifdef MOZ_WIDEVINE_EME
RefPtr<GenericPromise>
GMPParent::ReadChromiumManifestFile(nsIFile* aFile)
{
@ -968,7 +961,6 @@ GMPParent::ParseChromiumManifest(nsString aJSON)
return GenericPromise::CreateAndResolve(true, __func__);
}
#endif
bool
GMPParent::CanBeSharedCrossNodeIds() const

View File

@ -167,10 +167,8 @@ private:
bool EnsureProcessLoaded();
RefPtr<GenericPromise> ReadGMPMetaData();
RefPtr<GenericPromise> ReadGMPInfoFile(nsIFile* aFile);
#ifdef MOZ_WIDEVINE_EME
RefPtr<GenericPromise> ParseChromiumManifest(nsString aJSON); // Main thread.
RefPtr<GenericPromise> ReadChromiumManifestFile(nsIFile* aFile); // GMP thread.
#endif
#ifdef MOZ_CRASHREPORTER
void WriteExtraDataForMinidump(CrashReporter::AnnotationTable& notes);
void GetCrashID(nsString& aResult);

View File

@ -4,9 +4,6 @@
# 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/.
for cdm in CONFIG['MOZ_EME_MODULES']:
DEFINES['MOZ_%s_EME' % cdm.upper()] = True
XPIDL_MODULE = 'content_geckomediaplugins'
XPIDL_SOURCES += [
@ -120,13 +117,9 @@ UNIFIED_SOURCES += [
DIRS += [
'rlz',
'widevine-adapter',
]
if 'widevine' in CONFIG['MOZ_EME_MODULES']:
DIRS += [
'widevine-adapter',
]
IPDL_SOURCES += [
'GMPTypes.ipdlh',
'PGMP.ipdl',

View File

@ -193,7 +193,7 @@ WidevineDecryptor::DecryptingComplete()
class WidevineBuffer : public cdm::Buffer {
public:
WidevineBuffer(size_t aSize) {
explicit WidevineBuffer(size_t aSize) {
Log("WidevineBuffer(size=" PRIuSIZE ") created", aSize);
mBuffer.SetLength(aSize);
}

View File

@ -46,7 +46,7 @@ class CDMWrapper {
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CDMWrapper)
CDMWrapper(cdm::ContentDecryptionModule_8* aCDM)
explicit CDMWrapper(cdm::ContentDecryptionModule_8* aCDM)
: mCDM(aCDM)
{
MOZ_ASSERT(mCDM);

View File

@ -126,6 +126,14 @@
finish();
}, 60000);
var mustNotSettle = (p, ms, msg) => Promise.race([
p.then(() => ok(false, msg + " must not settle"),
e => ok(false, msg + " must not settle. Got " + e.name)),
wait(ms).then(() => ok(true, msg + " must not settle"))
]);
var silence = mustNotSettle(pc.createOffer(), 1000,
"createOffer immediately followed by close");
try {
pc.close();
} catch (e) {
@ -135,7 +143,7 @@
is(pc.signalingState, "closed", "Final signalingState is 'closed'");
is(pc.iceConnectionState, "closed", "Final iceConnectionState is 'closed'");
finished.then(networkTestFinished);
Promise.all([finished, silence]).then(networkTestFinished);
});
</script>
</pre>

View File

@ -10,6 +10,60 @@
#include "mozilla/Alignment.h"
#include "nsTArray.h"
/**
* E: element type, must be a POD type.
* N: N bytes alignment for the first element, defaults to 32
* S: S bytes of inline storage
*/
template <typename E, int S, int N = 32>
class AlignedAutoTArray : private AutoTArray<E, S + N>
{
static_assert((N & (N-1)) == 0, "N must be power of 2");
typedef AutoTArray<E, S + N> base_type;
public:
typedef E elem_type;
typedef typename base_type::size_type size_type;
typedef typename base_type::index_type index_type;
AlignedAutoTArray() {}
explicit AlignedAutoTArray(size_type capacity) : base_type(capacity + sExtra) {}
elem_type* Elements() { return getAligned(base_type::Elements()); }
const elem_type* Elements() const { return getAligned(base_type::Elements()); }
elem_type& operator[](index_type i) { return Elements()[i];}
const elem_type& operator[](index_type i) const { return Elements()[i]; }
void SetLength(size_type newLen)
{
base_type::SetLength(newLen + sExtra);
}
MOZ_MUST_USE
bool SetLength(size_type newLen, const mozilla::fallible_t&)
{
return base_type::SetLength(newLen + sExtra, mozilla::fallible);
}
size_type Length() const {
return base_type::Length() <= sExtra ? 0 : base_type::Length() - sExtra;
}
using base_type::ShallowSizeOfExcludingThis;
using base_type::ShallowSizeOfIncludingThis;
private:
AlignedAutoTArray(const AlignedAutoTArray& other) = delete;
void operator=(const AlignedAutoTArray& other) = delete;
static const size_type sPadding = N <= MOZ_ALIGNOF(E) ? 0 : N - MOZ_ALIGNOF(E);
static const size_type sExtra = (sPadding + sizeof(E) - 1) / sizeof(E);
template <typename U>
static U* getAligned(U* p)
{
return reinterpret_cast<U*>(((uintptr_t)p + N - 1) & ~(N-1));
}
};
/**
* E: element type, must be a POD type.
* N: N bytes alignment for the first element, defaults to 32
@ -63,4 +117,5 @@ private:
}
};
#endif // AlignedTArray_h__

Some files were not shown because too many files have changed in this diff Show More