зеркало из https://github.com/mozilla/gecko-dev.git
Merge autoland to mozilla-central. a=merge
This commit is contained in:
Коммит
90fa4c6afd
|
@ -537,7 +537,22 @@ Accessible* Accessible::ChildAtPoint(int32_t aX, int32_t aY,
|
||||||
// This happens in mobile platforms with async pinch zooming.
|
// This happens in mobile platforms with async pinch zooming.
|
||||||
offset = offset.RemoveResolution(presContext->PresShell()->GetResolution());
|
offset = offset.RemoveResolution(presContext->PresShell()->GetResolution());
|
||||||
|
|
||||||
nsIFrame* foundFrame = nsLayoutUtils::GetFrameForPoint(startFrame, offset);
|
// We need to translate with the offset of the edge of the visual
|
||||||
|
// viewport from top edge of the layout viewport.
|
||||||
|
offset += presContext->PresShell()->GetVisualViewportOffset() -
|
||||||
|
presContext->PresShell()->GetLayoutViewportOffset();
|
||||||
|
|
||||||
|
EnumSet<nsLayoutUtils::FrameForPointOption> options = {
|
||||||
|
#ifdef MOZ_WIDGET_ANDROID
|
||||||
|
// This is needed in Android to ignore the clipping of the scroll frame
|
||||||
|
// when zoomed in. May regress something on other platforms, so
|
||||||
|
// keeping it Android-exclusive for now.
|
||||||
|
nsLayoutUtils::FrameForPointOption::IgnoreRootScrollFrame
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
nsIFrame* foundFrame =
|
||||||
|
nsLayoutUtils::GetFrameForPoint(startFrame, offset, options);
|
||||||
|
|
||||||
nsIContent* content = nullptr;
|
nsIContent* content = nullptr;
|
||||||
if (!foundFrame || !(content = foundFrame->GetContent()))
|
if (!foundFrame || !(content = foundFrame->GetContent()))
|
||||||
|
@ -645,11 +660,18 @@ nsRect Accessible::BoundsInAppUnits() const {
|
||||||
return nsRect();
|
return nsRect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PresShell* presShell = mDoc->PresContext()->PresShell();
|
||||||
|
|
||||||
|
// We need to inverse translate with the offset of the edge of the visual
|
||||||
|
// viewport from top edge of the layout viewport.
|
||||||
|
nsPoint viewportOffset = presShell->GetVisualViewportOffset() -
|
||||||
|
presShell->GetLayoutViewportOffset();
|
||||||
|
unionRectTwips.MoveBy(-viewportOffset);
|
||||||
|
|
||||||
// We need to take into account a non-1 resolution set on the presshell.
|
// We need to take into account a non-1 resolution set on the presshell.
|
||||||
// This happens in mobile platforms with async pinch zooming. Here we
|
// This happens in mobile platforms with async pinch zooming. Here we
|
||||||
// scale the bounds before adding the screen-relative offset.
|
// scale the bounds before adding the screen-relative offset.
|
||||||
unionRectTwips.ScaleRoundOut(
|
unionRectTwips.ScaleRoundOut(presShell->GetResolution());
|
||||||
mDoc->PresContext()->PresShell()->GetResolution());
|
|
||||||
// We have the union of the rectangle, now we need to put it in absolute
|
// We have the union of the rectangle, now we need to put it in absolute
|
||||||
// screen coords.
|
// screen coords.
|
||||||
nsRect orgRectPixels = boundingFrame->GetScreenRectInAppUnits();
|
nsRect orgRectPixels = boundingFrame->GetScreenRectInAppUnits();
|
||||||
|
|
|
@ -304,7 +304,7 @@ bool HTMLComboboxAccessible::RemoveChild(Accessible* aChild) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTMLComboboxAccessible::Shutdown() {
|
void HTMLComboboxAccessible::Shutdown() {
|
||||||
MOZ_ASSERT(mDoc->IsDefunct() || !mListAccessible);
|
MOZ_ASSERT(!mDoc || mDoc->IsDefunct() || !mListAccessible);
|
||||||
if (mListAccessible) {
|
if (mListAccessible) {
|
||||||
mListAccessible->Shutdown();
|
mListAccessible->Shutdown();
|
||||||
mListAccessible = nullptr;
|
mListAccessible = nullptr;
|
||||||
|
|
|
@ -13,7 +13,7 @@ cpp_quote("// get_nodeInfo(")
|
||||||
cpp_quote("// /* [out] */ BSTR *nodeName, // For elements, this is the tag name")
|
cpp_quote("// /* [out] */ BSTR *nodeName, // For elements, this is the tag name")
|
||||||
cpp_quote("// /* [out] */ short *nameSpaceID,")
|
cpp_quote("// /* [out] */ short *nameSpaceID,")
|
||||||
cpp_quote("// /* [out] */ BSTR *nodeValue, ")
|
cpp_quote("// /* [out] */ BSTR *nodeValue, ")
|
||||||
cpp_quote("// /* [out] */ unsigned int *numChildren); ")
|
cpp_quote("// /* [out] */ unsigned int *numChildren); ")
|
||||||
cpp_quote("// /* [out] */ unsigned int *uniqueID; // In Win32 accessible events we generate, the target's childID matches to this")
|
cpp_quote("// /* [out] */ unsigned int *uniqueID; // In Win32 accessible events we generate, the target's childID matches to this")
|
||||||
cpp_quote("// /* [out] */ unsigned short *nodeType,")
|
cpp_quote("// /* [out] */ unsigned short *nodeType,")
|
||||||
cpp_quote("// ---------------------------------------------------------------------------------------------------=")
|
cpp_quote("// ---------------------------------------------------------------------------------------------------=")
|
||||||
|
@ -124,33 +124,33 @@ interface ISimpleDOMNode : IUnknown
|
||||||
[out, retval] unsigned short *nodeType
|
[out, retval] unsigned short *nodeType
|
||||||
);
|
);
|
||||||
|
|
||||||
[propget] HRESULT attributes(
|
[propget] HRESULT attributes(
|
||||||
[in] unsigned short maxAttribs,
|
[in] unsigned short maxAttribs,
|
||||||
[out, size_is(maxAttribs), length_is(*numAttribs)] BSTR *attribNames,
|
[out, size_is(maxAttribs), length_is(*numAttribs)] BSTR *attribNames,
|
||||||
[out, size_is(maxAttribs), length_is(*numAttribs)] short *nameSpaceID,
|
[out, size_is(maxAttribs), length_is(*numAttribs)] short *nameSpaceID,
|
||||||
[out, size_is(maxAttribs), length_is(*numAttribs)] BSTR *attribValues,
|
[out, size_is(maxAttribs), length_is(*numAttribs)] BSTR *attribValues,
|
||||||
[out, retval] unsigned short *numAttribs
|
[out, retval] unsigned short *numAttribs
|
||||||
);
|
);
|
||||||
|
|
||||||
[propget] HRESULT attributesForNames(
|
[propget] HRESULT attributesForNames(
|
||||||
[in] unsigned short numAttribs,
|
[in] unsigned short numAttribs,
|
||||||
[in, size_is(numAttribs), length_is(numAttribs)] BSTR *attribNames,
|
[in, size_is(numAttribs), length_is(numAttribs)] BSTR *attribNames,
|
||||||
[in, size_is(numAttribs), length_is(numAttribs)] short *nameSpaceID,
|
[in, size_is(numAttribs), length_is(numAttribs)] short *nameSpaceID,
|
||||||
[out, retval, size_is(numAttribs), length_is(numAttribs)] BSTR *attribValues
|
[out, retval, size_is(numAttribs), length_is(numAttribs)] BSTR *attribValues
|
||||||
);
|
);
|
||||||
|
|
||||||
[propget] HRESULT computedStyle(
|
[propget] HRESULT computedStyle(
|
||||||
[in] unsigned short maxStyleProperties,
|
[in] unsigned short maxStyleProperties,
|
||||||
[in] boolean useAlternateView, // If TRUE, returns properites for media as set in Document's set_alternateViewMediaTypes
|
[in] boolean useAlternateView, // If TRUE, returns properites for media as set in Document's set_alternateViewMediaTypes
|
||||||
[out, size_is(maxStyleProperties), length_is(*numStyleProperties)] BSTR *styleProperties,
|
[out, size_is(maxStyleProperties), length_is(*numStyleProperties)] BSTR *styleProperties,
|
||||||
[out, size_is(maxStyleProperties), length_is(*numStyleProperties)] BSTR *styleValues,
|
[out, size_is(maxStyleProperties), length_is(*numStyleProperties)] BSTR *styleValues,
|
||||||
[out, retval] unsigned short *numStyleProperties
|
[out, retval] unsigned short *numStyleProperties
|
||||||
);
|
);
|
||||||
|
|
||||||
[propget] HRESULT computedStyleForProperties(
|
[propget] HRESULT computedStyleForProperties(
|
||||||
[in] unsigned short numStyleProperties,
|
[in] unsigned short numStyleProperties,
|
||||||
[in] boolean useAlternateView, // If TRUE, returns properites for media as set in Document's set_alternateViewMediaTypes
|
[in] boolean useAlternateView, // If TRUE, returns properites for media as set in Document's set_alternateViewMediaTypes
|
||||||
[in, size_is(numStyleProperties), length_is(numStyleProperties)] BSTR *styleProperties,
|
[in, size_is(numStyleProperties), length_is(numStyleProperties)] BSTR *styleProperties,
|
||||||
[out, retval, size_is(numStyleProperties), length_is(numStyleProperties)] BSTR *styleValues
|
[out, retval, size_is(numStyleProperties), length_is(numStyleProperties)] BSTR *styleValues
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ interface ISimpleDOMNode : IUnknown
|
||||||
[propget] HRESULT lastChild([out, retval] ISimpleDOMNode **node);
|
[propget] HRESULT lastChild([out, retval] ISimpleDOMNode **node);
|
||||||
[propget] HRESULT previousSibling([out, retval] ISimpleDOMNode **node);
|
[propget] HRESULT previousSibling([out, retval] ISimpleDOMNode **node);
|
||||||
[propget] HRESULT nextSibling([out, retval] ISimpleDOMNode **node);
|
[propget] HRESULT nextSibling([out, retval] ISimpleDOMNode **node);
|
||||||
[propget] HRESULT childAt([in] unsigned childIndex,
|
[propget] HRESULT childAt([in] unsigned childIndex,
|
||||||
[out, retval] ISimpleDOMNode **node);
|
[out, retval] ISimpleDOMNode **node);
|
||||||
|
|
||||||
[propget] HRESULT innerHTML([out, retval] BSTR *innerHTML);
|
[propget] HRESULT innerHTML([out, retval] BSTR *innerHTML);
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
import "objidl.idl";
|
import "objidl.idl";
|
||||||
import "oaidl.idl";
|
import "oaidl.idl";
|
||||||
|
|
||||||
cpp_quote("///////////////////////////////////////////////////////////////////////////////////////////////////////")
|
cpp_quote("///////////////////////////////////////////////////////////////////////////////////////////////////////")
|
||||||
cpp_quote("//")
|
cpp_quote("//")
|
||||||
cpp_quote("// ISimpleDOMText")
|
cpp_quote("// ISimpleDOMText")
|
||||||
|
@ -57,21 +57,21 @@ interface ISimpleDOMText: IUnknown
|
||||||
// Includes whitespace in DOM
|
// Includes whitespace in DOM
|
||||||
[propget] HRESULT domText([out, retval] BSTR *domText);
|
[propget] HRESULT domText([out, retval] BSTR *domText);
|
||||||
|
|
||||||
HRESULT get_clippedSubstringBounds([in] unsigned int startIndex,
|
HRESULT get_clippedSubstringBounds([in] unsigned int startIndex,
|
||||||
[in] unsigned int endIndex,
|
[in] unsigned int endIndex,
|
||||||
[out] int *x,
|
[out] int *x,
|
||||||
[out] int *y,
|
[out] int *y,
|
||||||
[out] int *width,
|
[out] int *width,
|
||||||
[out] int *height);
|
[out] int *height);
|
||||||
|
|
||||||
HRESULT get_unclippedSubstringBounds([in] unsigned int startIndex,
|
HRESULT get_unclippedSubstringBounds([in] unsigned int startIndex,
|
||||||
[in] unsigned int endIndex,
|
[in] unsigned int endIndex,
|
||||||
[out] int *x,
|
[out] int *x,
|
||||||
[out] int *y,
|
[out] int *y,
|
||||||
[out] int *width,
|
[out] int *width,
|
||||||
[out] int *height);
|
[out] int *height);
|
||||||
|
|
||||||
HRESULT scrollToSubstring([in] unsigned int startIndex,
|
HRESULT scrollToSubstring([in] unsigned int startIndex,
|
||||||
[in] unsigned int endIndex);
|
[in] unsigned int endIndex);
|
||||||
|
|
||||||
[propget] HRESULT fontFamily([out, retval] BSTR *fontFamily);
|
[propget] HRESULT fontFamily([out, retval] BSTR *fontFamily);
|
||||||
|
|
|
@ -19,11 +19,11 @@ webidl Node;
|
||||||
* by in-process accessibility clients, which can be used
|
* by in-process accessibility clients, which can be used
|
||||||
* to find out how to get accessibility and DOM interfaces for
|
* to find out how to get accessibility and DOM interfaces for
|
||||||
* the event and its target. To listen to in-process accessibility invents,
|
* the event and its target. To listen to in-process accessibility invents,
|
||||||
* make your object an nsIObserver, and listen for accessible-event by
|
* make your object an nsIObserver, and listen for accessible-event by
|
||||||
* using code something like this:
|
* using code something like this:
|
||||||
* nsCOMPtr<nsIObserverService> observerService =
|
* nsCOMPtr<nsIObserverService> observerService =
|
||||||
* do_GetService("@mozilla.org/observer-service;1", &rv);
|
* do_GetService("@mozilla.org/observer-service;1", &rv);
|
||||||
* if (NS_SUCCEEDED(rv))
|
* if (NS_SUCCEEDED(rv))
|
||||||
* rv = observerService->AddObserver(this, "accessible-event", PR_TRUE);
|
* rv = observerService->AddObserver(this, "accessible-event", PR_TRUE);
|
||||||
*/
|
*/
|
||||||
[scriptable, builtinclass, uuid(20c69a40-6c2c-42a3-a578-6f4473aab9dd)]
|
[scriptable, builtinclass, uuid(20c69a40-6c2c-42a3-a578-6f4473aab9dd)]
|
||||||
|
@ -190,7 +190,7 @@ interface nsIAccessibleEvent : nsISupports
|
||||||
* An application is about to exit drag-and-drop mode
|
* An application is about to exit drag-and-drop mode
|
||||||
*/
|
*/
|
||||||
const unsigned long EVENT_DRAGDROP_END = 0x0020;
|
const unsigned long EVENT_DRAGDROP_END = 0x0020;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A dialog box has been displayed
|
* A dialog box has been displayed
|
||||||
*/
|
*/
|
||||||
|
@ -438,13 +438,13 @@ interface nsIAccessibleEvent : nsISupports
|
||||||
* defined in this interface.
|
* defined in this interface.
|
||||||
*/
|
*/
|
||||||
readonly attribute unsigned long eventType;
|
readonly attribute unsigned long eventType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The nsIAccessible associated with the event.
|
* The nsIAccessible associated with the event.
|
||||||
* May return null if no accessible is available
|
* May return null if no accessible is available
|
||||||
*/
|
*/
|
||||||
readonly attribute nsIAccessible accessible;
|
readonly attribute nsIAccessible accessible;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The nsIAccessibleDocument that the event target nsIAccessible
|
* The nsIAccessibleDocument that the event target nsIAccessible
|
||||||
* resides in. This can be used to get the DOM window,
|
* resides in. This can be used to get the DOM window,
|
||||||
|
|
|
@ -123,7 +123,7 @@ interface nsIAccessibleRole : nsISupports
|
||||||
const unsigned long ROLE_CHART = 17;
|
const unsigned long ROLE_CHART = 17;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a dialog box or message box. It is used for xul:dialog,
|
* Represents a dialog box or message box. It is used for xul:dialog,
|
||||||
* role="dialog".
|
* role="dialog".
|
||||||
*/
|
*/
|
||||||
const unsigned long ROLE_DIALOG = 18;
|
const unsigned long ROLE_DIALOG = 18;
|
||||||
|
@ -709,17 +709,17 @@ interface nsIAccessibleRole : nsISupports
|
||||||
* An image map -- has child links representing the areas
|
* An image map -- has child links representing the areas
|
||||||
*/
|
*/
|
||||||
const unsigned long ROLE_IMAGE_MAP = 116;
|
const unsigned long ROLE_IMAGE_MAP = 116;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An option in a listbox
|
* An option in a listbox
|
||||||
*/
|
*/
|
||||||
const unsigned long ROLE_OPTION = 117;
|
const unsigned long ROLE_OPTION = 117;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A rich option in a listbox, it can have other widgets as children
|
* A rich option in a listbox, it can have other widgets as children
|
||||||
*/
|
*/
|
||||||
const unsigned long ROLE_RICH_OPTION = 118;
|
const unsigned long ROLE_RICH_OPTION = 118;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A list of options
|
* A list of options
|
||||||
*/
|
*/
|
||||||
|
@ -729,7 +729,7 @@ interface nsIAccessibleRole : nsISupports
|
||||||
* Represents a mathematical equation in the accessible name
|
* Represents a mathematical equation in the accessible name
|
||||||
*/
|
*/
|
||||||
const unsigned long ROLE_FLAT_EQUATION = 120;
|
const unsigned long ROLE_FLAT_EQUATION = 120;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a cell within a grid. It is used for role="gridcell". Unlike
|
* Represents a cell within a grid. It is used for role="gridcell". Unlike
|
||||||
* ROLE_CELL, it allows the calculation of the accessible name from subtree.
|
* ROLE_CELL, it allows the calculation of the accessible name from subtree.
|
||||||
|
|
|
@ -59,14 +59,14 @@ interface nsIAccessibleStates : nsISupports
|
||||||
const unsigned long EXT_STATE_DEFUNCT = 0x00000002; // Object no longer exists
|
const unsigned long EXT_STATE_DEFUNCT = 0x00000002; // Object no longer exists
|
||||||
const unsigned long EXT_STATE_SELECTABLE_TEXT = 0x00000004; // For text which is selectable, object must implement nsIAccessibleText
|
const unsigned long EXT_STATE_SELECTABLE_TEXT = 0x00000004; // For text which is selectable, object must implement nsIAccessibleText
|
||||||
const unsigned long EXT_STATE_EDITABLE = 0x00000008; // Implements nsIAccessibleEditableText
|
const unsigned long EXT_STATE_EDITABLE = 0x00000008; // Implements nsIAccessibleEditableText
|
||||||
const unsigned long EXT_STATE_ACTIVE = 0x00000010; // This window is currently the active window
|
const unsigned long EXT_STATE_ACTIVE = 0x00000010; // This window is currently the active window
|
||||||
const unsigned long EXT_STATE_MODAL = 0x00000020; // Must do something with control before leaving it
|
const unsigned long EXT_STATE_MODAL = 0x00000020; // Must do something with control before leaving it
|
||||||
const unsigned long EXT_STATE_MULTI_LINE = 0x00000040; // Edit control that can take multiple lines
|
const unsigned long EXT_STATE_MULTI_LINE = 0x00000040; // Edit control that can take multiple lines
|
||||||
const unsigned long EXT_STATE_HORIZONTAL = 0x00000080; // Uses horizontal layout
|
const unsigned long EXT_STATE_HORIZONTAL = 0x00000080; // Uses horizontal layout
|
||||||
const unsigned long EXT_STATE_OPAQUE = 0x00000100; // Indicates this object paints every pixel within its rectangular region.
|
const unsigned long EXT_STATE_OPAQUE = 0x00000100; // Indicates this object paints every pixel within its rectangular region.
|
||||||
const unsigned long EXT_STATE_SINGLE_LINE = 0x00000200; // This text object can only contain 1 line of text
|
const unsigned long EXT_STATE_SINGLE_LINE = 0x00000200; // This text object can only contain 1 line of text
|
||||||
const unsigned long EXT_STATE_TRANSIENT = 0x00000400; //
|
const unsigned long EXT_STATE_TRANSIENT = 0x00000400; //
|
||||||
const unsigned long EXT_STATE_VERTICAL = 0x00000800; // Especially used for sliders and scrollbars
|
const unsigned long EXT_STATE_VERTICAL = 0x00000800; // Especially used for sliders and scrollbars
|
||||||
const unsigned long EXT_STATE_STALE = 0x00001000; // Object not dead, but not up-to-date either
|
const unsigned long EXT_STATE_STALE = 0x00001000; // Object not dead, but not up-to-date either
|
||||||
const unsigned long EXT_STATE_ENABLED = 0x00002000; // A widget that is not unavailable
|
const unsigned long EXT_STATE_ENABLED = 0x00002000; // A widget that is not unavailable
|
||||||
const unsigned long EXT_STATE_SENSITIVE = 0x00004000; // Same as ENABLED for now
|
const unsigned long EXT_STATE_SENSITIVE = 0x00004000; // Same as ENABLED for now
|
||||||
|
|
|
@ -143,7 +143,7 @@ interface IHandlerControl : IUnknown
|
||||||
[in] IA2TextSegment* aText);
|
[in] IA2TextSegment* aText);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct _IARelationData
|
typedef struct _IARelationData
|
||||||
{
|
{
|
||||||
BSTR mType;
|
BSTR mType;
|
||||||
long mNTargets;
|
long mNTargets;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<blocklist lastupdate="1558349549359" xmlns="http://www.mozilla.org/2006/addons-blocklist">
|
<blocklist lastupdate="1558536765550" xmlns="http://www.mozilla.org/2006/addons-blocklist">
|
||||||
<emItems>
|
<emItems>
|
||||||
<emItem blockID="i334" id="{0F827075-B026-42F3-885D-98981EE7B1AE}">
|
<emItem blockID="i334" id="{0F827075-B026-42F3-885D-98981EE7B1AE}">
|
||||||
<prefs/>
|
<prefs/>
|
||||||
|
@ -2997,6 +2997,38 @@
|
||||||
<prefs/>
|
<prefs/>
|
||||||
<versionRange minVersion="0" maxVersion="2.9.1.0" severity="3"/>
|
<versionRange minVersion="0" maxVersion="2.9.1.0" severity="3"/>
|
||||||
</emItem>
|
</emItem>
|
||||||
|
<emItem blockID="0225ae55-626d-42b2-8f48-46ec95ec89f8" id="/^((\{2b3eed60-8f6e-4afc-99f1-38d12f4253da\})|(\{3a6f9dac-3a93-4f6f-8b74-9ebc0f501306\})|(\{46bba8e9-7a75-4dd6-932e-bdd74141cb87\})|(\{4b480ab6-b63a-43f8-b4f4-d312972ab086\})|(\{6106687e-ca0c-4d7e-93bc-115929e4d299\})|(\{717ce133-3c0a-448e-b6ed-fc7d22b76534\})|(\{7224f1ae-c342-4bb5-8441-d324a8951624\})|(\{768e9638-2eba-42e4-a13a-4f3f1df391a2\})|(\{7b655f43-c871-46d2-8f6d-31989e8ee939\})|(\{7e46c692-9488-4671-8c39-7830f92628b0\})|(\{83bc6b56-545f-4ba1-a80b-f82d55cc0f68\})|(\{970a774e-b7a7-498f-b3f2-d88b14b4dab1\})|(\{9d2e8731-3287-46eb-9c19-ece63fe693c7\})|(\{a37ccd20-e04f-4949-b055-98ca58639606\})|(\{af85f82c-3e8f-4ee5-ab53-b8d3aaac34ec\})|(\{b35c6d47-8b07-4d49-89a9-dfe8c10f58f6\})|(\{c2485579-368c-4593-a1cd-985b2fa0b990\})|(\{c85c16ba-78b4-41b3-9201-f80fa662c52f\})|(\{c97e5535-6f2e-4d34-a5a3-0e6e07f7fd13\})|(\{ce7db166-9564-482f-91d9-3a450ec3216d\})|(\{d64a2c73-ff21-4e3e-998f-ec2dc42ad725\})|(\{db6d93c3-67a0-410c-b7bd-f72f267f0cec\})|(\{e513775f-359f-47aa-a3d9-eddc946aabe0\})|(\{f70258e4-643b-4ec2-9c84-de89009eec61\})|(\{f8794e87-82b2-4df4-bce6-db207f62c165\}))$/">
|
||||||
|
<prefs/>
|
||||||
|
<versionRange minVersion="0" maxVersion="*" severity="3"/>
|
||||||
|
</emItem>
|
||||||
|
<emItem blockID="2212748f-ad60-497f-af7b-50d20b326e40" id="{da993d54-9605-42f7-a32f-9f565245070c}">
|
||||||
|
<prefs/>
|
||||||
|
<versionRange minVersion="0" maxVersion="*" severity="3"/>
|
||||||
|
</emItem>
|
||||||
|
<emItem blockID="41137e55-8a11-4259-a009-42c29daadf17" id="{ac4be7d1-4db6-4b4c-bf48-e345350bcb59}">
|
||||||
|
<prefs/>
|
||||||
|
<versionRange minVersion="0" maxVersion="*" severity="3"/>
|
||||||
|
</emItem>
|
||||||
|
<emItem blockID="a5fa8f77-7761-4996-a11d-d8cf723103da" id="{dc6176c4-a192-4a92-849f-ad13abe889ad}">
|
||||||
|
<prefs/>
|
||||||
|
<versionRange minVersion="0" maxVersion="*" severity="3"/>
|
||||||
|
</emItem>
|
||||||
|
<emItem blockID="efecef61-549b-4c13-8a52-394c636dd24b" id="/^((\{ec19994c-c5a5-46d9-bd4d-0fc417c6f4b8\})|(\{a0be7e8d-b0a3-460b-8a52-429c79e49ee2\})|(\{1814dd58-4147-4cca-a0a3-c5aa35966d9c\}))$/">
|
||||||
|
<prefs/>
|
||||||
|
<versionRange minVersion="0" maxVersion="*" severity="3"/>
|
||||||
|
</emItem>
|
||||||
|
<emItem blockID="9c5f5681-8547-4e65-9c05-5796e483b8e1" id="/^((\{3e20d1e2-a7ee-4ce2-ab9c-51c8300a8ff6\})|(\{30906bbc-0942-445b-89c8-f74dac0edb8f\}))$/">
|
||||||
|
<prefs/>
|
||||||
|
<versionRange minVersion="0" maxVersion="*" severity="3"/>
|
||||||
|
</emItem>
|
||||||
|
<emItem blockID="7e86024e-5621-4ded-bc16-184f94fa2e29" id="{a37a7625-b64e-45f3-8b79-f71634f14438}">
|
||||||
|
<prefs/>
|
||||||
|
<versionRange minVersion="0" maxVersion="*" severity="3"/>
|
||||||
|
</emItem>
|
||||||
|
<emItem blockID="43966df2-e95c-415b-bffc-13814e1d2b11" id="{3fc1db2b-e7db-4512-b24e-1faf4d3a1b4d}">
|
||||||
|
<prefs/>
|
||||||
|
<versionRange minVersion="0" maxVersion="*" severity="3"/>
|
||||||
|
</emItem>
|
||||||
</emItems>
|
</emItems>
|
||||||
<pluginItems>
|
<pluginItems>
|
||||||
<pluginItem blockID="p332">
|
<pluginItem blockID="p332">
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
[DEFAULT]
|
[DEFAULT]
|
||||||
|
|
||||||
[browser_file_menu_import_wizard.js]
|
[browser_file_menu_import_wizard.js]
|
||||||
|
[browser_window_menu_list.js]
|
||||||
|
skip-if = os != "mac" # Mac only feature
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
add_task(async function test_window_menu_list() {
|
||||||
|
// This title is different depending on the build. For example, it's "Nightly"
|
||||||
|
// for a local build, "Mozilla Firefox" for an official release build.
|
||||||
|
const windowTitle = window.document.title;
|
||||||
|
await checkWindowMenu([windowTitle, "Browser chrome tests"]);
|
||||||
|
let newWindow = await BrowserTestUtils.openNewBrowserWindow();
|
||||||
|
await checkWindowMenu([windowTitle, "Browser chrome tests", windowTitle]);
|
||||||
|
await BrowserTestUtils.closeWindow(newWindow);
|
||||||
|
});
|
||||||
|
|
||||||
|
async function checkWindowMenu(labels) {
|
||||||
|
let menu = document.querySelector("#windowMenu");
|
||||||
|
// We can't toggle menubar items on OSX, so mocking instead.
|
||||||
|
await new Promise(resolve => {
|
||||||
|
menu.addEventListener("popupshown", resolve, { once: true });
|
||||||
|
menu.dispatchEvent(new MouseEvent("popupshowing"));
|
||||||
|
menu.dispatchEvent(new MouseEvent("popupshown"));
|
||||||
|
});
|
||||||
|
|
||||||
|
let menuitems = [...menu.querySelectorAll("menuseparator ~ menuitem")];
|
||||||
|
is(menuitems.length, labels.length, "Correct number of windows in the menu");
|
||||||
|
is(menuitems.map(item => item.label).join(","), labels.join(","), "Correct labels on menuitems");
|
||||||
|
for (let menuitem of menuitems) {
|
||||||
|
ok(menuitem instanceof customElements.get("menuitem"), "sibling is menuitem");
|
||||||
|
}
|
||||||
|
|
||||||
|
// We can't toggle menubar items on OSX, so mocking instead.
|
||||||
|
await new Promise(resolve => {
|
||||||
|
menu.addEventListener("popuphidden", resolve, { once: true });
|
||||||
|
menu.dispatchEvent(new MouseEvent("popuphiding"));
|
||||||
|
menu.dispatchEvent(new MouseEvent("popuphidden"));
|
||||||
|
});
|
||||||
|
}
|
|
@ -289,16 +289,6 @@ const startupPhases = {
|
||||||
read: 3,
|
read: 3,
|
||||||
close: 3,
|
close: 3,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: "UChrm:userChrome.css",
|
|
||||||
condition: WIN,
|
|
||||||
stat: 1,
|
|
||||||
},
|
|
||||||
{ // bug 1541233
|
|
||||||
path: "UChrm:userContent.css",
|
|
||||||
condition: WIN,
|
|
||||||
stat: 1,
|
|
||||||
},
|
|
||||||
{ // bug 1541246
|
{ // bug 1541246
|
||||||
path: "XREUSysExt:",
|
path: "XREUSysExt:",
|
||||||
condition: WIN,
|
condition: WIN,
|
||||||
|
|
|
@ -27,14 +27,14 @@ interface nsIBrowserProfileMigrator : nsISupports
|
||||||
/**
|
/**
|
||||||
* Copy user profile information to the current active profile.
|
* Copy user profile information to the current active profile.
|
||||||
* @param aItems list of data items to migrate. see above for values.
|
* @param aItems list of data items to migrate. see above for values.
|
||||||
* @param aStartup helper interface which is non-null if called during startup.
|
* @param aStartup helper interface which is non-null if called during startup.
|
||||||
* @param aProfile profile to migrate from, if there is more than one.
|
* @param aProfile profile to migrate from, if there is more than one.
|
||||||
*/
|
*/
|
||||||
void migrate(in unsigned short aItems, in nsIProfileStartup aStartup, in jsval aProfile);
|
void migrate(in unsigned short aItems, in nsIProfileStartup aStartup, in jsval aProfile);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A bit field containing profile items that this migrator
|
* A bit field containing profile items that this migrator
|
||||||
* offers for import.
|
* offers for import.
|
||||||
* @param aProfile the profile that we are looking for available data
|
* @param aProfile the profile that we are looking for available data
|
||||||
* to import
|
* to import
|
||||||
* @param aDoingStartup "true" if the profile is not currently being used.
|
* @param aDoingStartup "true" if the profile is not currently being used.
|
||||||
|
|
|
@ -26,16 +26,16 @@ interface nsIShellService : nsISupports
|
||||||
/**
|
/**
|
||||||
* Registers Firefox as the "Default Browser."
|
* Registers Firefox as the "Default Browser."
|
||||||
*
|
*
|
||||||
* @param aClaimAllTypes Register Firefox as the handler for
|
* @param aClaimAllTypes Register Firefox as the handler for
|
||||||
* additional protocols (ftp, chrome etc)
|
* additional protocols (ftp, chrome etc)
|
||||||
* and web documents (.html, .xhtml etc).
|
* and web documents (.html, .xhtml etc).
|
||||||
* @param aForAllUsers Whether or not Firefox should attempt
|
* @param aForAllUsers Whether or not Firefox should attempt
|
||||||
* to become the default browser for all
|
* to become the default browser for all
|
||||||
* users on a multi-user system.
|
* users on a multi-user system.
|
||||||
*/
|
*/
|
||||||
void setDefaultBrowser(in boolean aClaimAllTypes, in boolean aForAllUsers);
|
void setDefaultBrowser(in boolean aClaimAllTypes, in boolean aForAllUsers);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flags for positioning/sizing of the Desktop Background image.
|
* Flags for positioning/sizing of the Desktop Background image.
|
||||||
*/
|
*/
|
||||||
const long BACKGROUND_TILE = 1;
|
const long BACKGROUND_TILE = 1;
|
||||||
|
@ -46,12 +46,12 @@ interface nsIShellService : nsISupports
|
||||||
const long BACKGROUND_SPAN = 6;
|
const long BACKGROUND_SPAN = 6;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the desktop background image using either the HTML <IMG>
|
* Sets the desktop background image using either the HTML <IMG>
|
||||||
* element supplied or the background image of the element supplied.
|
* element supplied or the background image of the element supplied.
|
||||||
*
|
*
|
||||||
* @param aImageElement Either a HTML <IMG> element or an element with
|
* @param aImageElement Either a HTML <IMG> element or an element with
|
||||||
* a background image from which to source the
|
* a background image from which to source the
|
||||||
* background image.
|
* background image.
|
||||||
* @param aPosition How to place the image on the desktop
|
* @param aPosition How to place the image on the desktop
|
||||||
* @param aImageName The image name. Equivalent to the leaf name of the
|
* @param aImageName The image name. Equivalent to the leaf name of the
|
||||||
* location.href.
|
* location.href.
|
||||||
|
@ -70,13 +70,13 @@ interface nsIShellService : nsISupports
|
||||||
/**
|
/**
|
||||||
* Opens the application specified. If more than one application of the
|
* Opens the application specified. If more than one application of the
|
||||||
* given type is available on the system, the default or "preferred"
|
* given type is available on the system, the default or "preferred"
|
||||||
* application is used.
|
* application is used.
|
||||||
*/
|
*/
|
||||||
void openApplication(in long aApplication);
|
void openApplication(in long aApplication);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The desktop background color, visible when no background image is
|
* The desktop background color, visible when no background image is
|
||||||
* used, or if the background image is centered and does not fill the
|
* used, or if the background image is centered and does not fill the
|
||||||
* entire screen. A rgb value, where (r << 16 | g << 8 | b)
|
* entire screen. A rgb value, where (r << 16 | g << 8 | b)
|
||||||
*/
|
*/
|
||||||
attribute unsigned long desktopBackgroundColor;
|
attribute unsigned long desktopBackgroundColor;
|
||||||
|
|
|
@ -22,3 +22,9 @@ export MOZ_PACKAGE_JSSHELL=1
|
||||||
if test -n "$MOZ_ARTIFACT_TASK_WIN32_OPT"; then
|
if test -n "$MOZ_ARTIFACT_TASK_WIN32_OPT"; then
|
||||||
ac_add_options --enable-eme=widevine
|
ac_add_options --enable-eme=widevine
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Temporary signal to toolchain.configure that our compiler is patched to
|
||||||
|
# support CFG, until such support can be assumed.
|
||||||
|
if test -z "$USE_ARTIFACT"; then
|
||||||
|
ac_add_options --enable-hardening
|
||||||
|
fi
|
||||||
|
|
|
@ -1,9 +1,3 @@
|
||||||
# This file is used by all AArch64 Win64 builds
|
# This file is used by all AArch64 Win64 builds
|
||||||
|
|
||||||
ac_add_options --target=aarch64-windows-mingw32
|
ac_add_options --target=aarch64-windows-mingw32
|
||||||
|
|
||||||
# Temporary signal to toolchain.configure that our compiler is patched to
|
|
||||||
# support CFG, until such support can be assumed.
|
|
||||||
if test -z "$USE_ARTIFACT"; then
|
|
||||||
ac_add_options --enable-hardening
|
|
||||||
fi
|
|
||||||
|
|
|
@ -288,6 +288,7 @@
|
||||||
@RESPATH@/greprefs.js
|
@RESPATH@/greprefs.js
|
||||||
@RESPATH@/defaults/autoconfig/prefcalls.js
|
@RESPATH@/defaults/autoconfig/prefcalls.js
|
||||||
@RESPATH@/browser/defaults/permissions
|
@RESPATH@/browser/defaults/permissions
|
||||||
|
; Remote Settings JSON dumps
|
||||||
@RESPATH@/browser/defaults/settings/blocklists
|
@RESPATH@/browser/defaults/settings/blocklists
|
||||||
@RESPATH@/browser/defaults/settings/pinning
|
@RESPATH@/browser/defaults/settings/pinning
|
||||||
@RESPATH@/browser/defaults/settings/main
|
@RESPATH@/browser/defaults/settings/main
|
||||||
|
|
|
@ -11,7 +11,10 @@ import platform
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import uuid
|
import uuid
|
||||||
import __builtin__
|
if sys.version_info[0] < 3:
|
||||||
|
import __builtin__ as builtins
|
||||||
|
else:
|
||||||
|
import builtins
|
||||||
|
|
||||||
from types import ModuleType
|
from types import ModuleType
|
||||||
|
|
||||||
|
@ -434,4 +437,4 @@ class ImportHook(object):
|
||||||
|
|
||||||
|
|
||||||
# Install our hook
|
# Install our hook
|
||||||
__builtin__.__import__ = ImportHook(__builtin__.__import__)
|
builtins.__import__ = ImportHook(builtins.__import__)
|
||||||
|
|
|
@ -49,7 +49,7 @@ interface nsIXULChromeRegistry : nsIChromeRegistry
|
||||||
// passed to ECMA402 Intl API methods without throwing a RangeError.
|
// passed to ECMA402 Intl API methods without throwing a RangeError.
|
||||||
ACString getSelectedLocale(in ACString packageName,
|
ACString getSelectedLocale(in ACString packageName,
|
||||||
[optional] in boolean asBCP47);
|
[optional] in boolean asBCP47);
|
||||||
|
|
||||||
// Get whether the default writing direction of the locale is RTL
|
// Get whether the default writing direction of the locale is RTL
|
||||||
// (or may be overridden by intl.uidirection pref)
|
// (or may be overridden by intl.uidirection pref)
|
||||||
boolean isLocaleRTL(in ACString package);
|
boolean isLocaleRTL(in ACString package);
|
||||||
|
|
|
@ -714,11 +714,8 @@ $(foreach f,$(HOST_CSRCS) $(HOST_CPPSRCS) $(HOST_CMSRCS) $(HOST_CMMSRCS),$(eval
|
||||||
|
|
||||||
# The Rust compiler only outputs library objects, and so we need different
|
# The Rust compiler only outputs library objects, and so we need different
|
||||||
# mangling to generate dependency rules for it.
|
# mangling to generate dependency rules for it.
|
||||||
mk_libname = $(basename lib$(notdir $1)).rlib
|
|
||||||
src_libdep = $(call mk_libname,$1): $1 $$(call mkdir_deps,$$(MDDEPDIR))
|
|
||||||
mk_global_crate_libname = $(basename lib$(notdir $1)).$(LIB_SUFFIX)
|
mk_global_crate_libname = $(basename lib$(notdir $1)).$(LIB_SUFFIX)
|
||||||
crate_src_libdep = $(call mk_global_crate_libname,$1): $1 $$(call mkdir_deps,$$(MDDEPDIR))
|
crate_src_libdep = $(call mk_global_crate_libname,$1): $1 $$(call mkdir_deps,$$(MDDEPDIR))
|
||||||
$(foreach f,$(RSSRCS),$(eval $(call src_libdep,$(f))))
|
|
||||||
$(foreach f,$(RS_STATICLIB_CRATE_SRC),$(eval $(call crate_src_libdep,$(f))))
|
$(foreach f,$(RS_STATICLIB_CRATE_SRC),$(eval $(call crate_src_libdep,$(f))))
|
||||||
|
|
||||||
$(OBJS) $(HOST_OBJS) $(PROGOBJS) $(HOST_PROGOBJS): $(GLOBAL_DEPS)
|
$(OBJS) $(HOST_OBJS) $(PROGOBJS) $(HOST_PROGOBJS): $(GLOBAL_DEPS)
|
||||||
|
|
|
@ -101,7 +101,6 @@ devtools.jar:
|
||||||
skin/breadcrumbs.css (themes/breadcrumbs.css)
|
skin/breadcrumbs.css (themes/breadcrumbs.css)
|
||||||
skin/chart.css (themes/chart.css)
|
skin/chart.css (themes/chart.css)
|
||||||
skin/widgets.css (themes/widgets.css)
|
skin/widgets.css (themes/widgets.css)
|
||||||
skin/images/alerticon-unused.svg (themes/images/alerticon-unused.svg)
|
|
||||||
skin/rules.css (themes/rules.css)
|
skin/rules.css (themes/rules.css)
|
||||||
skin/images/command-paintflashing.svg (themes/images/command-paintflashing.svg)
|
skin/images/command-paintflashing.svg (themes/images/command-paintflashing.svg)
|
||||||
skin/images/command-screenshot.svg (themes/images/command-screenshot.svg)
|
skin/images/command-screenshot.svg (themes/images/command-screenshot.svg)
|
||||||
|
|
|
@ -552,6 +552,10 @@ netmonitor.toolbar.method=Method
|
||||||
# in the network table toolbar, above the "file" column.
|
# in the network table toolbar, above the "file" column.
|
||||||
netmonitor.toolbar.file=File
|
netmonitor.toolbar.file=File
|
||||||
|
|
||||||
|
# LOCALIZATION NOTE (netmonitor.toolbar.url): This is the label displayed
|
||||||
|
# in the network table toolbar, above the "url" column.
|
||||||
|
netmonitor.toolbar.url=URL
|
||||||
|
|
||||||
# LOCALIZATION NOTE (netmonitor.toolbar.protocol): This is the label displayed
|
# LOCALIZATION NOTE (netmonitor.toolbar.protocol): This is the label displayed
|
||||||
# in the network table toolbar, above the "protocol" column.
|
# in the network table toolbar, above the "protocol" column.
|
||||||
netmonitor.toolbar.protocol=Protocol
|
netmonitor.toolbar.protocol=Protocol
|
||||||
|
|
|
@ -4,14 +4,12 @@
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const { Component } = require("devtools/client/shared/vendor/react");
|
const { Component, createFactory } = require("devtools/client/shared/vendor/react");
|
||||||
const dom = require("devtools/client/shared/vendor/react-dom-factories");
|
const { td } = require("devtools/client/shared/vendor/react-dom-factories");
|
||||||
const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
|
const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
|
||||||
const { getFormattedIPAndPort } = require("../utils/format-utils");
|
const { getFormattedIPAndPort } = require("../utils/format-utils");
|
||||||
const { L10N } = require("../utils/l10n");
|
|
||||||
const { propertiesEqual } = require("../utils/request-utils");
|
const { propertiesEqual } = require("../utils/request-utils");
|
||||||
|
const SecurityState = createFactory(require("./SecurityState"));
|
||||||
const { div } = dom;
|
|
||||||
|
|
||||||
const UPDATED_DOMAIN_PROPS = [
|
const UPDATED_DOMAIN_PROPS = [
|
||||||
"remoteAddress",
|
"remoteAddress",
|
||||||
|
@ -32,38 +30,26 @@ class RequestListColumnDomain extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { item, onSecurityIconMouseDown } = this.props;
|
const {
|
||||||
const { remoteAddress, remotePort, securityState,
|
item,
|
||||||
urlDetails: { host, isLocal } } = item;
|
onSecurityIconMouseDown,
|
||||||
const iconClassList = ["requests-security-state-icon"];
|
} = this.props;
|
||||||
let iconTitle;
|
|
||||||
|
const {
|
||||||
|
remoteAddress,
|
||||||
|
remotePort,
|
||||||
|
urlDetails: {
|
||||||
|
host,
|
||||||
|
isLocal,
|
||||||
|
},
|
||||||
|
} = item;
|
||||||
|
|
||||||
const title = host + (remoteAddress ?
|
const title = host + (remoteAddress ?
|
||||||
` (${getFormattedIPAndPort(remoteAddress, remotePort)})` : "");
|
` (${getFormattedIPAndPort(remoteAddress, remotePort)})` : "");
|
||||||
|
|
||||||
let realSecurityState = securityState;
|
|
||||||
|
|
||||||
// Locally delivered files such as http://localhost and file:// paths
|
|
||||||
// are considered to have been delivered securely.
|
|
||||||
if (isLocal) {
|
|
||||||
realSecurityState = "secure";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (realSecurityState) {
|
|
||||||
iconClassList.push(`security-state-${realSecurityState}`);
|
|
||||||
iconTitle = L10N.getStr(`netmonitor.security.state.${realSecurityState}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
dom.td({ className: "requests-list-column requests-list-domain", title },
|
td({ className: "requests-list-column requests-list-domain", title },
|
||||||
div({
|
SecurityState({item, onSecurityIconMouseDown, isLocal}),
|
||||||
className: iconClassList.join(" "),
|
|
||||||
onMouseDown: onSecurityIconMouseDown,
|
|
||||||
title: iconTitle,
|
|
||||||
}),
|
|
||||||
item.isThirdPartyTrackingResource && div({
|
|
||||||
className: "tracking-resource",
|
|
||||||
title: L10N.getStr("netmonitor.trackingResource.tooltip"),
|
|
||||||
}),
|
|
||||||
host,
|
host,
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
/* 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/. */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const { Component, createFactory } = require("devtools/client/shared/vendor/react");
|
||||||
|
const { td } = require("devtools/client/shared/vendor/react-dom-factories");
|
||||||
|
const { L10N } = require("../utils/l10n");
|
||||||
|
const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
|
||||||
|
const { getFormattedIPAndPort } = require("../utils/format-utils");
|
||||||
|
const { propertiesEqual } = require("../utils/request-utils");
|
||||||
|
const SecurityState = createFactory(require("./SecurityState"));
|
||||||
|
const UPDATED_FILE_PROPS = [
|
||||||
|
"remoteAddress",
|
||||||
|
"securityState",
|
||||||
|
"urlDetails",
|
||||||
|
];
|
||||||
|
|
||||||
|
class RequestListColumnUrl extends Component {
|
||||||
|
static get propTypes() {
|
||||||
|
return {
|
||||||
|
item: PropTypes.object.isRequired,
|
||||||
|
onSecurityIconMouseDown: PropTypes.func.isRequired,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
shouldComponentUpdate(nextProps) {
|
||||||
|
return !propertiesEqual(UPDATED_FILE_PROPS, this.props.item, nextProps.item);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
item: { urlDetails },
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
const {
|
||||||
|
item,
|
||||||
|
onSecurityIconMouseDown,
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
const {
|
||||||
|
remoteAddress,
|
||||||
|
remotePort,
|
||||||
|
urlDetails: {
|
||||||
|
isLocal,
|
||||||
|
},
|
||||||
|
} = item;
|
||||||
|
|
||||||
|
const title = (remoteAddress ?
|
||||||
|
` (${getFormattedIPAndPort(remoteAddress, remotePort)})` : "");
|
||||||
|
|
||||||
|
// deals with returning whole url
|
||||||
|
const originalURL = urlDetails.url;
|
||||||
|
const decodedFileURL = urlDetails.unicodeUrl;
|
||||||
|
const ORIGINAL_FILE_URL = L10N.getFormatStr("netRequest.originalFileURL.tooltip",
|
||||||
|
originalURL);
|
||||||
|
const DECODED_FILE_URL = L10N.getFormatStr("netRequest.decodedFileURL.tooltip",
|
||||||
|
decodedFileURL);
|
||||||
|
const urlToolTip = originalURL === decodedFileURL ?
|
||||||
|
originalURL : ORIGINAL_FILE_URL + "\n\n" + DECODED_FILE_URL;
|
||||||
|
|
||||||
|
return (
|
||||||
|
td({
|
||||||
|
className: "requests-list-column requests-list-url",
|
||||||
|
title: urlToolTip + title,
|
||||||
|
},
|
||||||
|
SecurityState({item, onSecurityIconMouseDown, isLocal}),
|
||||||
|
originalURL
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = RequestListColumnUrl;
|
|
@ -30,6 +30,7 @@ const { RESPONSE_HEADERS } = require("../constants");
|
||||||
RequestListColumnTime,
|
RequestListColumnTime,
|
||||||
RequestListColumnTransferredSize,
|
RequestListColumnTransferredSize,
|
||||||
RequestListColumnType,
|
RequestListColumnType,
|
||||||
|
RequestListColumnUrl,
|
||||||
RequestListColumnWaterfall
|
RequestListColumnWaterfall
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -48,6 +49,9 @@ loader.lazyGetter(this, "RequestListColumnDomain", function() {
|
||||||
loader.lazyGetter(this, "RequestListColumnFile", function() {
|
loader.lazyGetter(this, "RequestListColumnFile", function() {
|
||||||
return createFactory(require("./RequestListColumnFile"));
|
return createFactory(require("./RequestListColumnFile"));
|
||||||
});
|
});
|
||||||
|
loader.lazyGetter(this, "RequestListColumnUrl", function() {
|
||||||
|
return createFactory(require("./RequestListColumnUrl"));
|
||||||
|
});
|
||||||
loader.lazyGetter(this, "RequestListColumnMethod", function() {
|
loader.lazyGetter(this, "RequestListColumnMethod", function() {
|
||||||
return createFactory(require("./RequestListColumnMethod"));
|
return createFactory(require("./RequestListColumnMethod"));
|
||||||
});
|
});
|
||||||
|
@ -223,10 +227,14 @@ class RequestListItem extends Component {
|
||||||
columns.status && RequestListColumnStatus({ item }),
|
columns.status && RequestListColumnStatus({ item }),
|
||||||
columns.method && RequestListColumnMethod({ item }),
|
columns.method && RequestListColumnMethod({ item }),
|
||||||
columns.domain && RequestListColumnDomain({
|
columns.domain && RequestListColumnDomain({
|
||||||
item,
|
item,
|
||||||
onSecurityIconMouseDown,
|
onSecurityIconMouseDown,
|
||||||
}),
|
}),
|
||||||
columns.file && RequestListColumnFile({ item }),
|
columns.file && RequestListColumnFile({ item }),
|
||||||
|
columns.url && RequestListColumnUrl({
|
||||||
|
item,
|
||||||
|
onSecurityIconMouseDown,
|
||||||
|
}),
|
||||||
columns.protocol && RequestListColumnProtocol({ item }),
|
columns.protocol && RequestListColumnProtocol({ item }),
|
||||||
columns.scheme && RequestListColumnScheme({ item }),
|
columns.scheme && RequestListColumnScheme({ item }),
|
||||||
columns.remoteip && RequestListColumnRemoteIP({ item }),
|
columns.remoteip && RequestListColumnRemoteIP({ item }),
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
/* 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/. */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const { Component } = require("devtools/client/shared/vendor/react");
|
||||||
|
const { div } = require("devtools/client/shared/vendor/react-dom-factories");
|
||||||
|
const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
|
||||||
|
const { L10N } = require("../utils/l10n");
|
||||||
|
const { propertiesEqual } = require("../utils/request-utils");
|
||||||
|
|
||||||
|
const UPDATED_DOMAIN_PROPS = [
|
||||||
|
"remoteAddress",
|
||||||
|
"securityState",
|
||||||
|
"urlDetails",
|
||||||
|
];
|
||||||
|
|
||||||
|
class SecurityState extends Component {
|
||||||
|
static get propTypes() {
|
||||||
|
return {
|
||||||
|
item: PropTypes.object.isRequired,
|
||||||
|
onSecurityIconMouseDown: PropTypes.func.isRequired,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
shouldComponentUpdate(nextProps) {
|
||||||
|
return !propertiesEqual(UPDATED_DOMAIN_PROPS, this.props.item, nextProps.item);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
item,
|
||||||
|
onSecurityIconMouseDown,
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
const {
|
||||||
|
securityState,
|
||||||
|
urlDetails: {
|
||||||
|
isLocal,
|
||||||
|
},
|
||||||
|
} = item;
|
||||||
|
const iconClassList = ["requests-security-state-icon"];
|
||||||
|
|
||||||
|
let iconTitle;
|
||||||
|
let realSecurityState = securityState;
|
||||||
|
|
||||||
|
// Locally delivered files such as http://localhost and file:// paths
|
||||||
|
// are considered to have been delivered securely.
|
||||||
|
if (isLocal) {
|
||||||
|
realSecurityState = "secure";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (realSecurityState) {
|
||||||
|
iconClassList.push(`security-state-${realSecurityState}`);
|
||||||
|
iconTitle = L10N.getStr(`netmonitor.security.state.${realSecurityState}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
div({},
|
||||||
|
div({
|
||||||
|
className: iconClassList.join(" "),
|
||||||
|
onMouseDown: onSecurityIconMouseDown,
|
||||||
|
title: iconTitle,
|
||||||
|
}),
|
||||||
|
item.isThirdPartyTrackingResource && div({
|
||||||
|
className: "tracking-resource",
|
||||||
|
title: L10N.getStr("netmonitor.trackingResource.tooltip"),
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = SecurityState;
|
|
@ -30,6 +30,7 @@ DevToolsModules(
|
||||||
'RequestListColumnTime.js',
|
'RequestListColumnTime.js',
|
||||||
'RequestListColumnTransferredSize.js',
|
'RequestListColumnTransferredSize.js',
|
||||||
'RequestListColumnType.js',
|
'RequestListColumnType.js',
|
||||||
|
'RequestListColumnUrl.js',
|
||||||
'RequestListColumnWaterfall.js',
|
'RequestListColumnWaterfall.js',
|
||||||
'RequestListContent.js',
|
'RequestListContent.js',
|
||||||
'RequestListEmptyNotice.js',
|
'RequestListEmptyNotice.js',
|
||||||
|
@ -37,6 +38,7 @@ DevToolsModules(
|
||||||
'RequestListItem.js',
|
'RequestListItem.js',
|
||||||
'ResponsePanel.js',
|
'ResponsePanel.js',
|
||||||
'SecurityPanel.js',
|
'SecurityPanel.js',
|
||||||
|
'SecurityState.js',
|
||||||
'SourceEditor.js',
|
'SourceEditor.js',
|
||||||
'StackTracePanel.js',
|
'StackTracePanel.js',
|
||||||
'StatisticsPanel.js',
|
'StatisticsPanel.js',
|
||||||
|
|
|
@ -191,13 +191,17 @@ const HEADERS = [
|
||||||
canFilter: true,
|
canFilter: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "domain",
|
name: "domain",
|
||||||
canFilter: true,
|
canFilter: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "file",
|
name: "file",
|
||||||
canFilter: false,
|
canFilter: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "url",
|
||||||
|
canFilter: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "protocol",
|
name: "protocol",
|
||||||
canFilter: true,
|
canFilter: true,
|
||||||
|
|
|
@ -30,6 +30,7 @@ const cols = {
|
||||||
method: true,
|
method: true,
|
||||||
domain: true,
|
domain: true,
|
||||||
file: true,
|
file: true,
|
||||||
|
url: false,
|
||||||
protocol: false,
|
protocol: false,
|
||||||
scheme: false,
|
scheme: false,
|
||||||
remoteip: false,
|
remoteip: false,
|
||||||
|
|
|
@ -25,15 +25,23 @@ add_task(async function() {
|
||||||
"There were two requests due to redirect.");
|
"There were two requests due to redirect.");
|
||||||
|
|
||||||
const [
|
const [
|
||||||
initialSecurityIcon,
|
initialDomainSecurityIcon,
|
||||||
redirectSecurityIcon,
|
initialUrlSecurityIcon,
|
||||||
|
redirectDomainSecurityIcon,
|
||||||
|
redirectUrlSecurityIcon,
|
||||||
] = document.querySelectorAll(".requests-security-state-icon");
|
] = document.querySelectorAll(".requests-security-state-icon");
|
||||||
|
|
||||||
ok(initialSecurityIcon.classList.contains("security-state-insecure"),
|
ok(initialDomainSecurityIcon.classList.contains("security-state-insecure"),
|
||||||
"Initial request was marked insecure.");
|
"Initial request was marked insecure for domain column.");
|
||||||
|
|
||||||
ok(redirectSecurityIcon.classList.contains("security-state-secure"),
|
ok(redirectDomainSecurityIcon.classList.contains("security-state-secure"),
|
||||||
"Redirected request was marked secure.");
|
"Redirected request was marked secure for domain column.");
|
||||||
|
|
||||||
|
ok(initialUrlSecurityIcon.classList.contains("security-state-insecure"),
|
||||||
|
"Initial request was marked insecure for URL column.");
|
||||||
|
|
||||||
|
ok(redirectUrlSecurityIcon.classList.contains("security-state-secure"),
|
||||||
|
"Redirected request was marked secure for URL column.");
|
||||||
|
|
||||||
await teardown(monitor);
|
await teardown(monitor);
|
||||||
});
|
});
|
||||||
|
|
|
@ -30,8 +30,12 @@ add_task(async function() {
|
||||||
// Execute request with third party tracking protection flag.
|
// Execute request with third party tracking protection flag.
|
||||||
await performRequests(monitor, tab, 1);
|
await performRequests(monitor, tab, 1);
|
||||||
|
|
||||||
const requests = document.querySelectorAll(".request-list-item .tracking-resource");
|
const domainRequests =
|
||||||
is(requests.length, 1, "There should be one tracking request");
|
document.querySelectorAll(".requests-list-domain .tracking-resource");
|
||||||
|
const UrlRequests = document.querySelectorAll(".requests-list-url .tracking-resource");
|
||||||
|
|
||||||
|
is(domainRequests.length, 1, "There should be one domain column tracking request");
|
||||||
|
is(UrlRequests.length, 1, "There should be one URL column tracking request");
|
||||||
|
|
||||||
await teardown(monitor);
|
await teardown(monitor);
|
||||||
});
|
});
|
||||||
|
|
|
@ -118,7 +118,7 @@ const gDefaultFilters = Services.prefs.getCharPref("devtools.netmonitor.filters"
|
||||||
Services.prefs.setCharPref(
|
Services.prefs.setCharPref(
|
||||||
"devtools.netmonitor.visibleColumns",
|
"devtools.netmonitor.visibleColumns",
|
||||||
"[\"cause\",\"contentSize\",\"cookies\",\"domain\",\"duration\"," +
|
"[\"cause\",\"contentSize\",\"cookies\",\"domain\",\"duration\"," +
|
||||||
"\"endTime\",\"file\",\"latency\",\"method\",\"protocol\"," +
|
"\"endTime\",\"file\",\"url\",\"latency\",\"method\",\"protocol\"," +
|
||||||
"\"remoteip\",\"responseTime\",\"scheme\",\"setCookies\"," +
|
"\"remoteip\",\"responseTime\",\"scheme\",\"setCookies\"," +
|
||||||
"\"startTime\",\"status\",\"transferred\",\"type\",\"waterfall\"]"
|
"\"startTime\",\"status\",\"transferred\",\"type\",\"waterfall\"]"
|
||||||
);
|
);
|
||||||
|
@ -128,6 +128,7 @@ Services.prefs.setCharPref("devtools.netmonitor.columnsData",
|
||||||
'{"name":"method","minWidth":30,"width":5},' +
|
'{"name":"method","minWidth":30,"width":5},' +
|
||||||
'{"name":"domain","minWidth":30,"width":10},' +
|
'{"name":"domain","minWidth":30,"width":10},' +
|
||||||
'{"name":"file","minWidth":30,"width":25},' +
|
'{"name":"file","minWidth":30,"width":25},' +
|
||||||
|
'{"name":"url","minWidth":30,"width":25},' +
|
||||||
'{"name":"cause","minWidth":30,"width":10},' +
|
'{"name":"cause","minWidth":30,"width":10},' +
|
||||||
'{"name":"type","minWidth":30,"width":5},' +
|
'{"name":"type","minWidth":30,"width":5},' +
|
||||||
'{"name":"transferred","minWidth":30,"width":10},' +
|
'{"name":"transferred","minWidth":30,"width":10},' +
|
||||||
|
|
|
@ -168,7 +168,7 @@ pref("devtools.netmonitor.visibleColumns",
|
||||||
"[\"status\",\"method\",\"domain\",\"file\",\"cause\",\"type\",\"transferred\",\"contentSize\",\"waterfall\"]"
|
"[\"status\",\"method\",\"domain\",\"file\",\"cause\",\"type\",\"transferred\",\"contentSize\",\"waterfall\"]"
|
||||||
);
|
);
|
||||||
pref("devtools.netmonitor.columnsData",
|
pref("devtools.netmonitor.columnsData",
|
||||||
'[{"name":"status","minWidth":30,"width":5}, {"name":"method","minWidth":30,"width":5}, {"name":"domain","minWidth":30,"width":10}, {"name":"file","minWidth":30,"width":25}, {"name":"cause","minWidth":30,"width":10},{"name":"type","minWidth":30,"width":5},{"name":"transferred","minWidth":30,"width":10},{"name":"contentSize","minWidth":30,"width":5},{"name":"waterfall","minWidth":150,"width":25}]');
|
'[{"name":"status","minWidth":30,"width":5}, {"name":"method","minWidth":30,"width":5}, {"name":"domain","minWidth":30,"width":10}, {"name":"file","minWidth":30,"width":25}, {"name":"url","minWidth":30,"width":25}, {"name":"cause","minWidth":30,"width":10},{"name":"type","minWidth":30,"width":5},{"name":"transferred","minWidth":30,"width":10},{"name":"contentSize","minWidth":30,"width":5},{"name":"waterfall","minWidth":150,"width":25}]');
|
||||||
|
|
||||||
// Support for columns resizing pref is now enabled (after merge date 03/18/19).
|
// Support for columns resizing pref is now enabled (after merge date 03/18/19).
|
||||||
pref("devtools.netmonitor.features.resizeColumns", true);
|
pref("devtools.netmonitor.features.resizeColumns", true);
|
||||||
|
|
|
@ -32,7 +32,7 @@ class SearchBox extends PureComponent {
|
||||||
onFocus: PropTypes.func,
|
onFocus: PropTypes.func,
|
||||||
onKeyDown: PropTypes.func,
|
onKeyDown: PropTypes.func,
|
||||||
placeholder: PropTypes.string.isRequired,
|
placeholder: PropTypes.string.isRequired,
|
||||||
type: PropTypes.string.isRequired,
|
type: PropTypes.string,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
<!-- 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
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13.5 12.7" width="12" height="12">
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12">
|
||||||
<path fill="context-fill" d="M6 0a1 1 0 0 1 .89.54l5 9.6A1 1 0 0 1 11 11.6H1a1 1 0 0 1-.89-1.46l5-9.6A1 1 0 0 1 6 0zm-.25 8a.75.75 0 0 0-.75.75v.5c0 .41.34.75.75.75h.5c.41 0 .75-.34.75-.75v-.5A.75.75 0 0 0 6.25 8h-.5zM7 3.7a1 1 0 1 0-2 0v2.6a1 1 0 1 0 2 0V3.7z" />
|
<path fill="context-fill" d="M6 0a1 1 0 0 1 .89.54l5 9.6A1 1 0 0 1 11 11.6H1a1 1 0 0 1-.89-1.46l5-9.6A1 1 0 0 1 6 0zm-.25 8a.75.75 0 0 0-.75.75v.5c0 .41.34.75.75.75h.5c.41 0 .75-.34.75-.75v-.5A.75.75 0 0 0 6.25 8h-.5zM7 3.7a1 1 0 1 0-2 0v2.6a1 1 0 1 0 2 0V3.7z" />
|
||||||
</svg>
|
</svg>
|
||||||
|
|
До Ширина: | Высота: | Размер: 574 B После Ширина: | Высота: | Размер: 570 B |
|
@ -1,8 +0,0 @@
|
||||||
<!-- 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/. -->
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 14 14">
|
|
||||||
<path stroke="context-stroke" fill="none" d="M13 7C13 10.31 10.31 13 7 13C3.69 13 1 10.31 1 7C1 3.69 3.69 1 7 1C10.31 1 13 3.69 13 7Z"/>
|
|
||||||
<path fill="context-fill" d="M7.54 5.88C8.02 5.88 8.41 6.26 8.41 6.74C8.41 7.6 8.41 9.29 8.41 10.15C8.41 10.63 8.02 11.02 7.54 11.02C7.2 11.02 7.05 11.02 6.71 11.02C6.23 11.02 5.84 10.63 5.84 10.15C5.84 9.29 5.84 7.6 5.84 6.74C5.84 6.26 6.23 5.88 6.71 5.88C7.05 5.88 7.2 5.88 7.54 5.88Z"/>
|
|
||||||
<path fill="context-fill" d="M8.41 4.11C8.41 4.82 7.83 5.4 7.12 5.4C6.42 5.4 5.84 4.82 5.84 4.11C5.84 3.4 6.42 2.83 7.12 2.83C7.83 2.83 8.41 3.4 8.41 4.11Z"/>
|
|
||||||
</svg>
|
|
До Ширина: | Высота: | Размер: 895 B |
|
@ -365,22 +365,20 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 12px;
|
width: 12px;
|
||||||
height: 12px;
|
height: 12px;
|
||||||
background-size: cover;
|
background-size: 12px;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
-moz-context-properties: fill;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ruleview-warning {
|
.ruleview-warning {
|
||||||
background-image: url(chrome://devtools/skin/images/alert.svg);
|
background-image: url(chrome://devtools/skin/images/alert.svg);
|
||||||
background-position: 0.73px 0.4px;
|
|
||||||
-moz-context-properties: fill;
|
|
||||||
fill: var(--yellow-60);
|
fill: var(--yellow-60);
|
||||||
}
|
}
|
||||||
|
|
||||||
.ruleview-unused-warning {
|
.ruleview-unused-warning {
|
||||||
background-image: url(chrome://devtools/skin/images/alerticon-unused.svg);
|
background-image: url(chrome://devtools/skin/images/webconsole/info.svg);
|
||||||
background-color: var(--theme-sidebar-background);
|
background-color: var(--theme-sidebar-background);
|
||||||
-moz-context-properties: fill, stroke;
|
fill: var(--theme-icon-dimmed-color);
|
||||||
fill: var(--theme-icon-dimmed-color);
|
|
||||||
stroke: var(--theme-icon-dimmed-color);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.ruleview-unused-warning:hover {
|
.ruleview-unused-warning:hover {
|
||||||
|
|
|
@ -28,7 +28,6 @@ class FilterBar extends Component {
|
||||||
return {
|
return {
|
||||||
dispatch: PropTypes.func.isRequired,
|
dispatch: PropTypes.func.isRequired,
|
||||||
filter: PropTypes.object.isRequired,
|
filter: PropTypes.object.isRequired,
|
||||||
attachRefToWebConsoleUI: PropTypes.func.isRequired,
|
|
||||||
persistLogs: PropTypes.bool.isRequired,
|
persistLogs: PropTypes.bool.isRequired,
|
||||||
hidePersistLogsCheckbox: PropTypes.bool.isRequired,
|
hidePersistLogsCheckbox: PropTypes.bool.isRequired,
|
||||||
showContentMessages: PropTypes.bool.isRequired,
|
showContentMessages: PropTypes.bool.isRequired,
|
||||||
|
|
|
@ -1664,14 +1664,15 @@ const ThreadActor = ActorClassWithSpec(threadSpec, {
|
||||||
sourceActor = this.sources.createSourceActor(source);
|
sourceActor = this.sources.createSourceActor(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._onLoadBreakpointURLs.has(source.url)) {
|
const sourceUrl = sourceActor.url;
|
||||||
this.setBreakpoint({ sourceUrl: source.url, line: 1 }, {});
|
if (this._onLoadBreakpointURLs.has(sourceUrl)) {
|
||||||
|
this.setBreakpoint({ sourceUrl, line: 1 }, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
const bpActors = this.breakpointActorMap.findActors()
|
const bpActors = this.breakpointActorMap.findActors()
|
||||||
.filter((actor) => {
|
.filter((actor) =>
|
||||||
return actor.location.sourceUrl && actor.location.sourceUrl == source.url;
|
actor.location.sourceUrl && actor.location.sourceUrl == sourceUrl
|
||||||
});
|
);
|
||||||
|
|
||||||
for (const actor of bpActors) {
|
for (const actor of bpActors) {
|
||||||
sourceActor.applyBreakpoint(actor);
|
sourceActor.applyBreakpoint(actor);
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
/* eslint-disable max-nested-callbacks */
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bug 1552453 - Verify that breakpoints are hit for evaluated
|
||||||
|
* scripts that contain a source url pragma.
|
||||||
|
*/
|
||||||
|
add_task(threadClientTest(async ({ threadClient, targetFront }) => {
|
||||||
|
await threadClient.setBreakpoint(
|
||||||
|
{ sourceUrl: "http://example.com/code.js", line: 2, column: 1 },
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
|
||||||
|
info("Create a new script with the displayUrl code.js");
|
||||||
|
const consoleFront = await targetFront.getFront("console");
|
||||||
|
consoleFront.evaluateJSAsync("function f() {\n return 5; \n}\n//# sourceURL=http://example.com/code.js");
|
||||||
|
|
||||||
|
const sourcePacket = await waitForEvent(threadClient, "newSource");
|
||||||
|
equal(sourcePacket.source.url, "http://example.com/code.js");
|
||||||
|
|
||||||
|
info("Evaluate f() and pause at line 2");
|
||||||
|
consoleFront.evaluateJSAsync("f()");
|
||||||
|
const pausedPacket = await waitForPause(threadClient);
|
||||||
|
equal(pausedPacket.why.type, "breakpoint");
|
||||||
|
equal(pausedPacket.frame.where.line, 2);
|
||||||
|
}));
|
|
@ -132,6 +132,7 @@ reason = bug 1104838
|
||||||
[test_breakpoint-21.js]
|
[test_breakpoint-21.js]
|
||||||
[test_breakpoint-22.js]
|
[test_breakpoint-22.js]
|
||||||
skip-if = true # breakpoint sliding is not supported bug 1525685
|
skip-if = true # breakpoint sliding is not supported bug 1525685
|
||||||
|
[test_breakpoint-23.js]
|
||||||
[test_conditional_breakpoint-01.js]
|
[test_conditional_breakpoint-01.js]
|
||||||
[test_conditional_breakpoint-02.js]
|
[test_conditional_breakpoint-02.js]
|
||||||
[test_conditional_breakpoint-03.js]
|
[test_conditional_breakpoint-03.js]
|
||||||
|
|
|
@ -5,12 +5,24 @@
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const {arg, DebuggerClient} = require("devtools/shared/client/debugger-client");
|
const {
|
||||||
|
arg,
|
||||||
|
DebuggerClient,
|
||||||
|
} = require("devtools/shared/client/debugger-client");
|
||||||
const eventSource = require("devtools/shared/client/event-source");
|
const eventSource = require("devtools/shared/client/event-source");
|
||||||
const {ThreadStateTypes} = require("devtools/shared/client/constants");
|
const { ThreadStateTypes } = require("devtools/shared/client/constants");
|
||||||
|
|
||||||
loader.lazyRequireGetter(this, "ObjectClient", "devtools/shared/client/object-client");
|
loader.lazyRequireGetter(
|
||||||
loader.lazyRequireGetter(this, "SourceFront", "devtools/shared/fronts/source", true);
|
this,
|
||||||
|
"ObjectClient",
|
||||||
|
"devtools/shared/client/object-client"
|
||||||
|
);
|
||||||
|
loader.lazyRequireGetter(
|
||||||
|
this,
|
||||||
|
"SourceFront",
|
||||||
|
"devtools/shared/fronts/source",
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a thread client for the remote debugging protocol server. This client
|
* Creates a thread client for the remote debugging protocol server. This client
|
||||||
|
@ -50,7 +62,9 @@ ThreadClient.prototype = {
|
||||||
|
|
||||||
_assertPaused: function(command) {
|
_assertPaused: function(command) {
|
||||||
if (!this.paused) {
|
if (!this.paused) {
|
||||||
throw Error(command + " command sent while not paused. Currently " + this._state);
|
throw Error(
|
||||||
|
command + " command sent while not paused. Currently " + this._state
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -67,36 +81,39 @@ ThreadClient.prototype = {
|
||||||
* than proceeding forwards. This parameter has no effect if the
|
* than proceeding forwards. This parameter has no effect if the
|
||||||
* server does not support rewinding.
|
* server does not support rewinding.
|
||||||
*/
|
*/
|
||||||
_doResume: DebuggerClient.requester({
|
_doResume: DebuggerClient.requester(
|
||||||
type: "resume",
|
{
|
||||||
resumeLimit: arg(0),
|
type: "resume",
|
||||||
rewind: arg(1),
|
resumeLimit: arg(0),
|
||||||
}, {
|
rewind: arg(1),
|
||||||
before: function(packet) {
|
|
||||||
this._assertPaused("resume");
|
|
||||||
|
|
||||||
// Put the client in a tentative "resuming" state so we can prevent
|
|
||||||
// further requests that should only be sent in the paused state.
|
|
||||||
this._previousState = this._state;
|
|
||||||
this._state = "resuming";
|
|
||||||
|
|
||||||
return packet;
|
|
||||||
},
|
},
|
||||||
after: function(response) {
|
{
|
||||||
if (response.error && this._state == "resuming") {
|
before: function(packet) {
|
||||||
// There was an error resuming, update the state to the new one
|
this._assertPaused("resume");
|
||||||
// reported by the server, if given (only on wrongState), otherwise
|
|
||||||
// reset back to the previous state.
|
// Put the client in a tentative "resuming" state so we can prevent
|
||||||
if (response.state) {
|
// further requests that should only be sent in the paused state.
|
||||||
this._state = ThreadStateTypes[response.state];
|
this._previousState = this._state;
|
||||||
} else {
|
this._state = "resuming";
|
||||||
this._state = this._previousState;
|
|
||||||
|
return packet;
|
||||||
|
},
|
||||||
|
after: function(response) {
|
||||||
|
if (response.error && this._state == "resuming") {
|
||||||
|
// There was an error resuming, update the state to the new one
|
||||||
|
// reported by the server, if given (only on wrongState), otherwise
|
||||||
|
// reset back to the previous state.
|
||||||
|
if (response.state) {
|
||||||
|
this._state = ThreadStateTypes[response.state];
|
||||||
|
} else {
|
||||||
|
this._state = this._previousState;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
delete this._previousState;
|
||||||
delete this._previousState;
|
return response;
|
||||||
return response;
|
},
|
||||||
},
|
}
|
||||||
}),
|
),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reconfigure the thread actor.
|
* Reconfigure the thread actor.
|
||||||
|
@ -214,14 +231,17 @@ ThreadClient.prototype = {
|
||||||
/**
|
/**
|
||||||
* Detach from the thread actor.
|
* Detach from the thread actor.
|
||||||
*/
|
*/
|
||||||
detach: DebuggerClient.requester({
|
detach: DebuggerClient.requester(
|
||||||
type: "detach",
|
{
|
||||||
}, {
|
type: "detach",
|
||||||
after: function(response) {
|
|
||||||
this.client.unregisterClient(this);
|
|
||||||
return response;
|
|
||||||
},
|
},
|
||||||
}),
|
{
|
||||||
|
after: function(response) {
|
||||||
|
this.client.unregisterClient(this);
|
||||||
|
return response;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Promote multiple pause-lifetime object actors to thread-lifetime ones.
|
* Promote multiple pause-lifetime object actors to thread-lifetime ones.
|
||||||
|
|
|
@ -100,7 +100,7 @@ interface nsIContentViewer : nsISupports
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All users of a content viewer are responsible for calling both
|
* All users of a content viewer are responsible for calling both
|
||||||
* close() and destroy(), in that order.
|
* close() and destroy(), in that order.
|
||||||
*
|
*
|
||||||
* close() should be called when the load of a new page for the next
|
* close() should be called when the load of a new page for the next
|
||||||
* content viewer begins, and destroy() should be called when the next
|
* content viewer begins, and destroy() should be called when the next
|
||||||
|
|
|
@ -15,7 +15,7 @@ webidl Document;
|
||||||
/**
|
/**
|
||||||
* The nsIDocShellTreeItem supplies the methods that are required of any item
|
* The nsIDocShellTreeItem supplies the methods that are required of any item
|
||||||
* that wishes to be able to live within the docshell tree either as a middle
|
* that wishes to be able to live within the docshell tree either as a middle
|
||||||
* node or a leaf.
|
* node or a leaf.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
[scriptable, builtinclass, uuid(9b7c586f-9214-480c-a2c4-49b526fff1a6)]
|
[scriptable, builtinclass, uuid(9b7c586f-9214-480c-a2c4-49b526fff1a6)]
|
||||||
|
@ -46,7 +46,7 @@ interface nsIDocShellTreeItem : nsISupports
|
||||||
const long typeAll=0x7FFFFFFF;
|
const long typeAll=0x7FFFFFFF;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The type this item is.
|
The type this item is.
|
||||||
*/
|
*/
|
||||||
readonly attribute long itemType;
|
readonly attribute long itemType;
|
||||||
[noscript,notxpcom,nostdcall] long ItemType();
|
[noscript,notxpcom,nostdcall] long ItemType();
|
||||||
|
@ -65,20 +65,20 @@ interface nsIDocShellTreeItem : nsISupports
|
||||||
readonly attribute nsIDocShellTreeItem sameTypeParent;
|
readonly attribute nsIDocShellTreeItem sameTypeParent;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Returns the root DocShellTreeItem. This is a convience equivalent to
|
Returns the root DocShellTreeItem. This is a convience equivalent to
|
||||||
getting the parent and its parent until there isn't a parent.
|
getting the parent and its parent until there isn't a parent.
|
||||||
*/
|
*/
|
||||||
readonly attribute nsIDocShellTreeItem rootTreeItem;
|
readonly attribute nsIDocShellTreeItem rootTreeItem;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Returns the root DocShellTreeItem of the same type. This is a convience
|
Returns the root DocShellTreeItem of the same type. This is a convience
|
||||||
equivalent to getting the parent of the same type and its parent until
|
equivalent to getting the parent of the same type and its parent until
|
||||||
there isn't a parent.
|
there isn't a parent.
|
||||||
*/
|
*/
|
||||||
readonly attribute nsIDocShellTreeItem sameTypeRootTreeItem;
|
readonly attribute nsIDocShellTreeItem sameTypeRootTreeItem;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Returns the docShellTreeItem with the specified name. Search order is as
|
Returns the docShellTreeItem with the specified name. Search order is as
|
||||||
follows...
|
follows...
|
||||||
1.) Check name of self, if it matches return it.
|
1.) Check name of self, if it matches return it.
|
||||||
2.) For each immediate child.
|
2.) For each immediate child.
|
||||||
|
@ -114,25 +114,25 @@ interface nsIDocShellTreeItem : nsISupports
|
||||||
The owner of the DocShell Tree. This interface will be called upon when
|
The owner of the DocShell Tree. This interface will be called upon when
|
||||||
the docshell has things it needs to tell to the owner of the docshell.
|
the docshell has things it needs to tell to the owner of the docshell.
|
||||||
Note that docShell tree ownership does not cross tree types. Meaning
|
Note that docShell tree ownership does not cross tree types. Meaning
|
||||||
setting ownership on a chrome tree does not set ownership on the content
|
setting ownership on a chrome tree does not set ownership on the content
|
||||||
sub-trees. A given tree's boundaries are identified by the type changes.
|
sub-trees. A given tree's boundaries are identified by the type changes.
|
||||||
Trees of different types may be connected, but should not be traversed
|
Trees of different types may be connected, but should not be traversed
|
||||||
for things such as ownership.
|
for things such as ownership.
|
||||||
|
|
||||||
Note implementers of this interface should NOT effect the lifetime of the
|
Note implementers of this interface should NOT effect the lifetime of the
|
||||||
parent DocShell by holding this reference as it creates a cycle. Owners
|
parent DocShell by holding this reference as it creates a cycle. Owners
|
||||||
when releasing this interface should set the treeOwner to nullptr.
|
when releasing this interface should set the treeOwner to nullptr.
|
||||||
Implementers of this interface are guaranteed that when treeOwner is
|
Implementers of this interface are guaranteed that when treeOwner is
|
||||||
set that the poitner is valid without having to addref.
|
set that the poitner is valid without having to addref.
|
||||||
|
|
||||||
Further note however when others try to get the interface it should be
|
Further note however when others try to get the interface it should be
|
||||||
addref'd before handing it to them.
|
addref'd before handing it to them.
|
||||||
*/
|
*/
|
||||||
readonly attribute nsIDocShellTreeOwner treeOwner;
|
readonly attribute nsIDocShellTreeOwner treeOwner;
|
||||||
[noscript] void setTreeOwner(in nsIDocShellTreeOwner treeOwner);
|
[noscript] void setTreeOwner(in nsIDocShellTreeOwner treeOwner);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The current number of DocShells which are immediate children of the
|
The current number of DocShells which are immediate children of the
|
||||||
this object.
|
this object.
|
||||||
*/
|
*/
|
||||||
readonly attribute long childCount;
|
readonly attribute long childCount;
|
||||||
|
|
|
@ -28,7 +28,7 @@ interface nsIDocumentLoaderFactory : nsISupports {
|
||||||
nsIContentViewer createInstance(in string aCommand,
|
nsIContentViewer createInstance(in string aCommand,
|
||||||
in nsIChannel aChannel,
|
in nsIChannel aChannel,
|
||||||
in nsILoadGroup aLoadGroup,
|
in nsILoadGroup aLoadGroup,
|
||||||
in ACString aContentType,
|
in ACString aContentType,
|
||||||
in nsIDocShell aContainer,
|
in nsIDocShell aContainer,
|
||||||
in nsISupports aExtraInfo,
|
in nsISupports aExtraInfo,
|
||||||
out nsIStreamListener aDocListenerResult);
|
out nsIStreamListener aDocListenerResult);
|
||||||
|
|
|
@ -15,14 +15,14 @@ interface nsIRefreshURI : nsISupports {
|
||||||
/**
|
/**
|
||||||
* Load a uri after waiting for aMillis milliseconds. If the docshell
|
* Load a uri after waiting for aMillis milliseconds. If the docshell
|
||||||
* is busy loading a page currently, the refresh request will be
|
* is busy loading a page currently, the refresh request will be
|
||||||
* queued and executed when the current load finishes.
|
* queued and executed when the current load finishes.
|
||||||
*
|
*
|
||||||
* @param aUri The uri to refresh.
|
* @param aUri The uri to refresh.
|
||||||
* @param aPrincipal The triggeringPrincipal for the refresh load
|
* @param aPrincipal The triggeringPrincipal for the refresh load
|
||||||
* May be null, in which case the principal of current document will be
|
* May be null, in which case the principal of current document will be
|
||||||
* applied.
|
* applied.
|
||||||
* @param aMillis The number of milliseconds to wait.
|
* @param aMillis The number of milliseconds to wait.
|
||||||
* @param aRepeat Flag to indicate if the uri is to be
|
* @param aRepeat Flag to indicate if the uri is to be
|
||||||
* repeatedly refreshed every aMillis milliseconds.
|
* repeatedly refreshed every aMillis milliseconds.
|
||||||
* @param aMetaRefresh Flag to indicate if this is a Meta refresh.
|
* @param aMetaRefresh Flag to indicate if this is a Meta refresh.
|
||||||
*/
|
*/
|
||||||
|
@ -45,24 +45,24 @@ interface nsIRefreshURI : nsISupports {
|
||||||
in long aMillis, in boolean aMetaRefresh);
|
in long aMillis, in boolean aMetaRefresh);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks the passed in channel to see if there is a refresh header,
|
* Checks the passed in channel to see if there is a refresh header,
|
||||||
* if there is, will setup a timer to refresh the uri found
|
* if there is, will setup a timer to refresh the uri found
|
||||||
* in the header. If docshell is busy loading a page currently, the
|
* in the header. If docshell is busy loading a page currently, the
|
||||||
* request will be queued and executed when the current page
|
* request will be queued and executed when the current page
|
||||||
* finishes loading.
|
* finishes loading.
|
||||||
*
|
*
|
||||||
* Returns the NS_REFRESHURI_HEADER_FOUND success code if a refresh
|
* Returns the NS_REFRESHURI_HEADER_FOUND success code if a refresh
|
||||||
* header was found and successfully setup.
|
* header was found and successfully setup.
|
||||||
*
|
*
|
||||||
* @param aChannel The channel to be parsed.
|
* @param aChannel The channel to be parsed.
|
||||||
*/
|
*/
|
||||||
void setupRefreshURI(in nsIChannel aChannel);
|
void setupRefreshURI(in nsIChannel aChannel);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the passed in header string and sets up a refreshURI if
|
* Parses the passed in header string and sets up a refreshURI if
|
||||||
* a "refresh" header is found. If docshell is busy loading a page
|
* a "refresh" header is found. If docshell is busy loading a page
|
||||||
* currently, the request will be queued and executed when
|
* currently, the request will be queued and executed when
|
||||||
* the current page finishes loading.
|
* the current page finishes loading.
|
||||||
*
|
*
|
||||||
* @param aBaseURI base URI to resolve refresh uri with.
|
* @param aBaseURI base URI to resolve refresh uri with.
|
||||||
* @param aPrincipal The triggeringPrincipal for the refresh load
|
* @param aPrincipal The triggeringPrincipal for the refresh load
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The nsIScrollable is an interface that can be implemented by a control that
|
* The nsIScrollable is an interface that can be implemented by a control that
|
||||||
* supports scrolling. This is a generic interface without concern for the
|
* supports scrolling. This is a generic interface without concern for the
|
||||||
* type of content that may be inside.
|
* type of content that may be inside.
|
||||||
*/
|
*/
|
||||||
[scriptable, uuid(3507fc93-313e-4a4c-8ca8-4d0ea0f97315)]
|
[scriptable, uuid(3507fc93-313e-4a4c-8ca8-4d0ea0f97315)]
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
/* 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
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
#include "nsISupports.idl"
|
#include "nsISupports.idl"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -35,7 +35,7 @@ interface nsITooltipListener : nsISupports
|
||||||
*/
|
*/
|
||||||
void onShowTooltip(in long aXCoords, in long aYCoords, in AString aTipText,
|
void onShowTooltip(in long aXCoords, in long aYCoords, in AString aTipText,
|
||||||
in AString aTipDir);
|
in AString aTipDir);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the tooltip should be hidden, either because the pointer
|
* Called when the tooltip should be hidden, either because the pointer
|
||||||
* has moved or the tooltip has timed out.
|
* has moved or the tooltip has timed out.
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
/* 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
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
#include "nsISupports.idl"
|
#include "nsISupports.idl"
|
||||||
|
|
||||||
webidl Node;
|
webidl Node;
|
||||||
|
@ -13,7 +13,7 @@ webidl Node;
|
||||||
* with the node that the pointer is positioned over.
|
* with the node that the pointer is positioned over.
|
||||||
*
|
*
|
||||||
* Embedders may implement and register their own tooltip text provider
|
* Embedders may implement and register their own tooltip text provider
|
||||||
* service if they wish to provide different tooltip text.
|
* service if they wish to provide different tooltip text.
|
||||||
*
|
*
|
||||||
* The default service returns the text stored in the TITLE
|
* The default service returns the text stored in the TITLE
|
||||||
* attribute of the node or a containing parent.
|
* attribute of the node or a containing parent.
|
||||||
|
|
|
@ -145,7 +145,7 @@ interface nsIWebNavigation : nsISupports
|
||||||
* document.
|
* document.
|
||||||
*/
|
*/
|
||||||
const unsigned long LOAD_FLAGS_CHARSET_CHANGE = 0x0400;
|
const unsigned long LOAD_FLAGS_CHARSET_CHANGE = 0x0400;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If this flag is set, Stop() will be called before the load starts
|
* If this flag is set, Stop() will be called before the load starts
|
||||||
* and will stop both content and network activity (the default is to
|
* and will stop both content and network activity (the default is to
|
||||||
|
@ -168,7 +168,7 @@ interface nsIWebNavigation : nsISupports
|
||||||
/**
|
/**
|
||||||
* This flag specifies that this is the first load in this object.
|
* This flag specifies that this is the first load in this object.
|
||||||
* Set with care, since setting incorrectly can cause us to assume that
|
* Set with care, since setting incorrectly can cause us to assume that
|
||||||
* nothing was actually loaded in this object if the load ends up being
|
* nothing was actually loaded in this object if the load ends up being
|
||||||
* handled by an external application. This flag must not be passed to
|
* handled by an external application. This flag must not be passed to
|
||||||
* Reload.
|
* Reload.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -39,7 +39,7 @@ interface nsIWebNavigationInfo : nsISupports
|
||||||
* @note Other return types may be added here in the future as they become
|
* @note Other return types may be added here in the future as they become
|
||||||
* relevant.
|
* relevant.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returned by isTypeSupported to indicate that a type is supported via some
|
* Returned by isTypeSupported to indicate that a type is supported via some
|
||||||
* other means.
|
* other means.
|
||||||
|
|
|
@ -18,7 +18,7 @@ interface nsIWebPageDescriptor : nsISupports
|
||||||
/**
|
/**
|
||||||
* Tells the object to load the page specified by the page descriptor
|
* Tells the object to load the page specified by the page descriptor
|
||||||
*
|
*
|
||||||
* @throws NS_ERROR_FAILURE -
|
* @throws NS_ERROR_FAILURE -
|
||||||
*/
|
*/
|
||||||
void loadPage(in nsISupports aPageDescriptor, in unsigned long aDisplayType);
|
void loadPage(in nsISupports aPageDescriptor, in unsigned long aDisplayType);
|
||||||
|
|
||||||
|
|
|
@ -3291,11 +3291,7 @@ CORSMode Element::AttrValueToCORSMode(const nsAttrValue* aValue) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* GetFullscreenError(CallerType aCallerType) {
|
static const char* GetFullscreenError(CallerType aCallerType) {
|
||||||
if (!nsContentUtils::IsRequestFullscreenAllowed(aCallerType)) {
|
return nsContentUtils::CheckRequestFullscreenAllowed(aCallerType);
|
||||||
return "FullscreenDeniedNotInputDriven";
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
already_AddRefed<Promise> Element::RequestFullscreen(CallerType aCallerType,
|
already_AddRefed<Promise> Element::RequestFullscreen(CallerType aCallerType,
|
||||||
|
|
|
@ -6581,24 +6581,36 @@ bool nsContentUtils::ChannelShouldInheritPrincipal(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */
|
/* static */
|
||||||
bool nsContentUtils::IsRequestFullscreenAllowed(CallerType aCallerType) {
|
const char* nsContentUtils::CheckRequestFullscreenAllowed(
|
||||||
// If more time has elapsed since the user input than is specified by the
|
CallerType aCallerType) {
|
||||||
// dom.event.handling-user-input-time-limit pref (default 1 second), this
|
|
||||||
// function also returns false.
|
|
||||||
|
|
||||||
if (!StaticPrefs::full_screen_api_allow_trusted_requests_only() ||
|
if (!StaticPrefs::full_screen_api_allow_trusted_requests_only() ||
|
||||||
aCallerType == CallerType::System) {
|
aCallerType == CallerType::System) {
|
||||||
return true;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EventStateManager::IsHandlingUserInput()) {
|
if (!EventStateManager::IsHandlingUserInput()) {
|
||||||
TimeDuration timeout = HandlingUserInputTimeout();
|
return "FullscreenDeniedNotInputDriven";
|
||||||
return timeout <= TimeDuration(nullptr) ||
|
|
||||||
(TimeStamp::Now() - EventStateManager::GetHandlingInputStart()) <=
|
|
||||||
timeout;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
// If more time has elapsed since the user input than is specified by the
|
||||||
|
// dom.event.handling-user-input-time-limit pref (default 1 second),
|
||||||
|
// disallow fullscreen
|
||||||
|
TimeDuration timeout = HandlingUserInputTimeout();
|
||||||
|
if (timeout > TimeDuration(nullptr) &&
|
||||||
|
(TimeStamp::Now() - EventStateManager::GetHandlingInputStart()) >
|
||||||
|
timeout) {
|
||||||
|
return "FullscreenDeniedNotInputDriven";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Entering full-screen on mouse mouse event is only allowed with left mouse
|
||||||
|
// button
|
||||||
|
if (StaticPrefs::full_screen_api_mouse_event_allow_left_button_only() &&
|
||||||
|
(EventStateManager::sCurrentMouseBtn == MouseButton::eMiddle ||
|
||||||
|
EventStateManager::sCurrentMouseBtn == MouseButton::eRight)) {
|
||||||
|
return "FullscreenDeniedMouseEventOnlyLeftBtn";
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */
|
/* static */
|
||||||
|
|
|
@ -2332,12 +2332,14 @@ class nsContentUtils {
|
||||||
static bool IsFocusedContent(const nsIContent* aContent);
|
static bool IsFocusedContent(const nsIContent* aContent);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if requests for fullscreen are allowed in the current
|
* Returns nullptr if requests for fullscreen are allowed in the current
|
||||||
* context. Requests are only allowed if the user initiated them (like with
|
* context. Requests are only allowed if the user initiated them (like with
|
||||||
* a mouse-click or key press), unless this check has been disabled by
|
* a mouse-click or key press), unless this check has been disabled by
|
||||||
* setting the pref "full-screen-api.allow-trusted-requests-only" to false.
|
* setting the pref "full-screen-api.allow-trusted-requests-only" to false.
|
||||||
|
* If fullscreen is not allowed, a key for the error message is returned.
|
||||||
*/
|
*/
|
||||||
static bool IsRequestFullscreenAllowed(mozilla::dom::CallerType aCallerType);
|
static const char* CheckRequestFullscreenAllowed(
|
||||||
|
mozilla::dom::CallerType aCallerType);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if calling execCommand with 'cut' or 'copy' arguments is
|
* Returns true if calling execCommand with 'cut' or 'copy' arguments is
|
||||||
|
|
|
@ -179,6 +179,25 @@ class EncodingScope {
|
||||||
|
|
||||||
bool EncodingScope::IsLimited() const { return mSelection || mRange || mNode; }
|
bool EncodingScope::IsLimited() const { return mSelection || mRange || mNode; }
|
||||||
|
|
||||||
|
struct RangeBoundaryPathsAndOffsets {
|
||||||
|
using ContainerPath = AutoTArray<nsIContent*, 8>;
|
||||||
|
using ContainerOffsets = AutoTArray<int32_t, 8>;
|
||||||
|
|
||||||
|
// The first node is the range's boundary node, the following ones the
|
||||||
|
// ancestors.
|
||||||
|
ContainerPath mStartContainerPath;
|
||||||
|
// The first offset represents where at the boundary node the range starts.
|
||||||
|
// Each other offset is the index of the child relative to its parent.
|
||||||
|
ContainerOffsets mStartContainerOffsets;
|
||||||
|
|
||||||
|
// The first node is the range's boundary node, the following one the
|
||||||
|
// ancestors.
|
||||||
|
ContainerPath mEndContainerPath;
|
||||||
|
// The first offset represents where at the boundary node the range ends.
|
||||||
|
// Each other offset is the index of the child relative to its parent.
|
||||||
|
ContainerOffsets mEndContainerOffsets;
|
||||||
|
};
|
||||||
|
|
||||||
class nsDocumentEncoder : public nsIDocumentEncoder {
|
class nsDocumentEncoder : public nsIDocumentEncoder {
|
||||||
public:
|
public:
|
||||||
nsDocumentEncoder();
|
nsDocumentEncoder();
|
||||||
|
@ -263,7 +282,7 @@ class nsDocumentEncoder : public nsIDocumentEncoder {
|
||||||
|
|
||||||
virtual bool IncludeInContext(nsINode* aNode);
|
virtual bool IncludeInContext(nsINode* aNode);
|
||||||
|
|
||||||
void Clear();
|
void ReleaseDocumentReferenceAndInitialize(bool aClearCachedSerializer);
|
||||||
|
|
||||||
class MOZ_STACK_CLASS AutoReleaseDocumentIfNeeded final {
|
class MOZ_STACK_CLASS AutoReleaseDocumentIfNeeded final {
|
||||||
public:
|
public:
|
||||||
|
@ -272,7 +291,8 @@ class nsDocumentEncoder : public nsIDocumentEncoder {
|
||||||
|
|
||||||
~AutoReleaseDocumentIfNeeded() {
|
~AutoReleaseDocumentIfNeeded() {
|
||||||
if (mEncoder->mFlags & RequiresReinitAfterOutput) {
|
if (mEncoder->mFlags & RequiresReinitAfterOutput) {
|
||||||
mEncoder->Clear();
|
const bool clearCachedSerializer = false;
|
||||||
|
mEncoder->ReleaseDocumentReferenceAndInitialize(clearCachedSerializer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,10 +316,7 @@ class nsDocumentEncoder : public nsIDocumentEncoder {
|
||||||
int32_t mStartRootIndex;
|
int32_t mStartRootIndex;
|
||||||
int32_t mEndRootIndex;
|
int32_t mEndRootIndex;
|
||||||
AutoTArray<nsINode*, 8> mCommonAncestors;
|
AutoTArray<nsINode*, 8> mCommonAncestors;
|
||||||
AutoTArray<nsIContent*, 8> mStartNodes;
|
RangeBoundaryPathsAndOffsets mRangeBoundaryPathsAndOffsets;
|
||||||
AutoTArray<int32_t, 8> mStartOffsets;
|
|
||||||
AutoTArray<nsIContent*, 8> mEndNodes;
|
|
||||||
AutoTArray<int32_t, 8> mEndOffsets;
|
|
||||||
AutoTArray<AutoTArray<nsINode*, 8>, 8> mRangeContexts;
|
AutoTArray<AutoTArray<nsINode*, 8>, 8> mRangeContexts;
|
||||||
// Whether the serializer cares about being notified to scan elements to
|
// Whether the serializer cares about being notified to scan elements to
|
||||||
// keep track of whether they are preformatted. This stores the out
|
// keep track of whether they are preformatted. This stores the out
|
||||||
|
@ -314,7 +331,8 @@ class nsDocumentEncoder : public nsIDocumentEncoder {
|
||||||
};
|
};
|
||||||
|
|
||||||
NS_IMPL_CYCLE_COLLECTING_ADDREF(nsDocumentEncoder)
|
NS_IMPL_CYCLE_COLLECTING_ADDREF(nsDocumentEncoder)
|
||||||
NS_IMPL_CYCLE_COLLECTING_RELEASE_WITH_LAST_RELEASE(nsDocumentEncoder, Clear())
|
NS_IMPL_CYCLE_COLLECTING_RELEASE_WITH_LAST_RELEASE(
|
||||||
|
nsDocumentEncoder, ReleaseDocumentReferenceAndInitialize(true))
|
||||||
|
|
||||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsDocumentEncoder)
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsDocumentEncoder)
|
||||||
NS_INTERFACE_MAP_ENTRY(nsIDocumentEncoder)
|
NS_INTERFACE_MAP_ENTRY(nsIDocumentEncoder)
|
||||||
|
@ -342,6 +360,9 @@ void nsDocumentEncoder::Initialize(bool aClearCachedSerializer) {
|
||||||
mHaltRangeHint = false;
|
mHaltRangeHint = false;
|
||||||
mDisableContextSerialize = false;
|
mDisableContextSerialize = false;
|
||||||
mEncodingScope = {};
|
mEncodingScope = {};
|
||||||
|
mCommonParent = nullptr;
|
||||||
|
mNodeFixup = nullptr;
|
||||||
|
mRangeBoundaryPathsAndOffsets = {};
|
||||||
if (aClearCachedSerializer) {
|
if (aClearCachedSerializer) {
|
||||||
mSerializer = nullptr;
|
mSerializer = nullptr;
|
||||||
}
|
}
|
||||||
|
@ -771,13 +792,18 @@ nsresult nsDocumentEncoder::SerializeRangeNodes(nsRange* const aRange,
|
||||||
// get start and end nodes for this recursion level
|
// get start and end nodes for this recursion level
|
||||||
nsCOMPtr<nsIContent> startNode, endNode;
|
nsCOMPtr<nsIContent> startNode, endNode;
|
||||||
{
|
{
|
||||||
|
auto& startContainerPath =
|
||||||
|
mRangeBoundaryPathsAndOffsets.mStartContainerPath;
|
||||||
|
auto& endContainerPath = mRangeBoundaryPathsAndOffsets.mEndContainerPath;
|
||||||
int32_t start = mStartRootIndex - aDepth;
|
int32_t start = mStartRootIndex - aDepth;
|
||||||
if (start >= 0 && (uint32_t)start <= mStartNodes.Length())
|
if (start >= 0 && (uint32_t)start <= startContainerPath.Length()) {
|
||||||
startNode = mStartNodes[start];
|
startNode = startContainerPath[start];
|
||||||
|
}
|
||||||
|
|
||||||
int32_t end = mEndRootIndex - aDepth;
|
int32_t end = mEndRootIndex - aDepth;
|
||||||
if (end >= 0 && (uint32_t)end <= mEndNodes.Length())
|
if (end >= 0 && (uint32_t)end <= endContainerPath.Length()) {
|
||||||
endNode = mEndNodes[end];
|
endNode = endContainerPath[end];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (startNode != content && endNode != content) {
|
if (startNode != content && endNode != content) {
|
||||||
|
@ -816,13 +842,19 @@ nsresult nsDocumentEncoder::SerializeRangeNodes(nsRange* const aRange,
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto& startContainerOffsets =
|
||||||
|
mRangeBoundaryPathsAndOffsets.mStartContainerOffsets;
|
||||||
|
const auto& endContainerOffsets =
|
||||||
|
mRangeBoundaryPathsAndOffsets.mEndContainerOffsets;
|
||||||
// do some calculations that will tell us which children of this
|
// do some calculations that will tell us which children of this
|
||||||
// node are in the range.
|
// node are in the range.
|
||||||
int32_t startOffset = 0, endOffset = -1;
|
int32_t startOffset = 0, endOffset = -1;
|
||||||
if (startNode == content && mStartRootIndex >= aDepth)
|
if (startNode == content && mStartRootIndex >= aDepth) {
|
||||||
startOffset = mStartOffsets[mStartRootIndex - aDepth];
|
startOffset = startContainerOffsets[mStartRootIndex - aDepth];
|
||||||
if (endNode == content && mEndRootIndex >= aDepth)
|
}
|
||||||
endOffset = mEndOffsets[mEndRootIndex - aDepth];
|
if (endNode == content && mEndRootIndex >= aDepth) {
|
||||||
|
endOffset = endContainerOffsets[mEndRootIndex - aDepth];
|
||||||
|
}
|
||||||
// generated content will cause offset values of -1 to be returned.
|
// generated content will cause offset values of -1 to be returned.
|
||||||
uint32_t childCount = content->GetChildCount();
|
uint32_t childCount = content->GetChildCount();
|
||||||
|
|
||||||
|
@ -944,20 +976,24 @@ nsresult nsDocumentEncoder::SerializeRangeToString(nsRange* aRange,
|
||||||
|
|
||||||
mStartDepth = mEndDepth = 0;
|
mStartDepth = mEndDepth = 0;
|
||||||
mCommonAncestors.Clear();
|
mCommonAncestors.Clear();
|
||||||
mStartNodes.Clear();
|
|
||||||
mStartOffsets.Clear();
|
mRangeBoundaryPathsAndOffsets = {};
|
||||||
mEndNodes.Clear();
|
auto& startContainerPath = mRangeBoundaryPathsAndOffsets.mStartContainerPath;
|
||||||
mEndOffsets.Clear();
|
auto& startContainerOffsets =
|
||||||
|
mRangeBoundaryPathsAndOffsets.mStartContainerOffsets;
|
||||||
|
auto& endContainerPath = mRangeBoundaryPathsAndOffsets.mEndContainerPath;
|
||||||
|
auto& endContainerOffsets =
|
||||||
|
mRangeBoundaryPathsAndOffsets.mEndContainerOffsets;
|
||||||
|
|
||||||
nsContentUtils::GetAncestors(mCommonParent, mCommonAncestors);
|
nsContentUtils::GetAncestors(mCommonParent, mCommonAncestors);
|
||||||
nsContentUtils::GetAncestorsAndOffsets(startContainer, startOffset,
|
nsContentUtils::GetAncestorsAndOffsets(
|
||||||
&mStartNodes, &mStartOffsets);
|
startContainer, startOffset, &startContainerPath, &startContainerOffsets);
|
||||||
nsContentUtils::GetAncestorsAndOffsets(endContainer, endOffset, &mEndNodes,
|
nsContentUtils::GetAncestorsAndOffsets(
|
||||||
&mEndOffsets);
|
endContainer, endOffset, &endContainerPath, &endContainerOffsets);
|
||||||
|
|
||||||
nsCOMPtr<nsIContent> commonContent = do_QueryInterface(mCommonParent);
|
nsCOMPtr<nsIContent> commonContent = do_QueryInterface(mCommonParent);
|
||||||
mStartRootIndex = mStartNodes.IndexOf(commonContent);
|
mStartRootIndex = startContainerPath.IndexOf(commonContent);
|
||||||
mEndRootIndex = mEndNodes.IndexOf(commonContent);
|
mEndRootIndex = endContainerPath.IndexOf(commonContent);
|
||||||
|
|
||||||
nsresult rv = NS_OK;
|
nsresult rv = NS_OK;
|
||||||
|
|
||||||
|
@ -991,12 +1027,11 @@ nsresult nsDocumentEncoder::SerializeRangeToString(nsRange* aRange,
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nsDocumentEncoder::Clear() {
|
void nsDocumentEncoder::ReleaseDocumentReferenceAndInitialize(
|
||||||
|
bool aClearCachedSerializer) {
|
||||||
mDocument = nullptr;
|
mDocument = nullptr;
|
||||||
mCommonParent = nullptr;
|
|
||||||
mNodeFixup = nullptr;
|
|
||||||
|
|
||||||
Initialize(false);
|
Initialize(aClearCachedSerializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|
|
@ -231,6 +231,7 @@ interface nsIDocumentEncoder : nsISupports
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize with a pointer to the document and the mime type.
|
* Initialize with a pointer to the document and the mime type.
|
||||||
|
* Resets wrap column to 72 and resets node fixup.
|
||||||
* @param aDocument Document to encode.
|
* @param aDocument Document to encode.
|
||||||
* @param aMimeType MimeType to use. May also be set by SetMimeType.
|
* @param aMimeType MimeType to use. May also be set by SetMimeType.
|
||||||
* @param aFlags Flags to use while encoding. May also be set by SetFlags.
|
* @param aFlags Flags to use while encoding. May also be set by SetFlags.
|
||||||
|
|
|
@ -17,10 +17,10 @@ interface nsISelectionDisplay : nsISupports
|
||||||
/*
|
/*
|
||||||
SetSelectionFlags used to set whether you want to see HRULES/IMAGES with border.
|
SetSelectionFlags used to set whether you want to see HRULES/IMAGES with border.
|
||||||
also used to tell if the presshell is an editor right now. this should change
|
also used to tell if the presshell is an editor right now. this should change
|
||||||
|
|
||||||
@param aToggle -either DISPLAY_(TEXT,IMAGES,FRAMES,ALL)
|
@param aToggle -either DISPLAY_(TEXT,IMAGES,FRAMES,ALL)
|
||||||
This will tell the rendering engine to draw the different
|
This will tell the rendering engine to draw the different
|
||||||
selection types.
|
selection types.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
void setSelectionFlags(in short toggle);
|
void setSelectionFlags(in short toggle);
|
||||||
|
@ -28,8 +28,8 @@ interface nsISelectionDisplay : nsISupports
|
||||||
/*
|
/*
|
||||||
GetSelectionFlags used to get whether you want to see HRULES/IMAGES with border.
|
GetSelectionFlags used to get whether you want to see HRULES/IMAGES with border.
|
||||||
also used to tell if the presshell is an editor right now. this should change
|
also used to tell if the presshell is an editor right now. this should change
|
||||||
|
|
||||||
@param short *aReturn - This will be filled with DISPLAY_(TEXT,IMAGE,FRAMES,ALL)
|
@param short *aReturn - This will be filled with DISPLAY_(TEXT,IMAGE,FRAMES,ALL)
|
||||||
bit flags.
|
bit flags.
|
||||||
*/
|
*/
|
||||||
short getSelectionFlags();
|
short getSelectionFlags();
|
||||||
|
|
|
@ -396,7 +396,7 @@ partial namespace ChromeUtils {
|
||||||
void resetLastExternalProtocolIframeAllowed();
|
void resetLastExternalProtocolIframeAllowed();
|
||||||
|
|
||||||
[ChromeOnly, Throws]
|
[ChromeOnly, Throws]
|
||||||
void registerWindowActor(DOMString aName, WindowActorOptions aOptions);
|
void registerWindowActor(DOMString aName, optional WindowActorOptions aOptions);
|
||||||
|
|
||||||
[ChromeOnly]
|
[ChromeOnly]
|
||||||
void unregisterWindowActor(DOMString aName);
|
void unregisterWindowActor(DOMString aName);
|
||||||
|
@ -621,13 +621,13 @@ dictionary WindowActorOptions {
|
||||||
sequence<DOMString> remoteTypes;
|
sequence<DOMString> remoteTypes;
|
||||||
|
|
||||||
/** This fields are used for configuring individual sides of the actor. */
|
/** This fields are used for configuring individual sides of the actor. */
|
||||||
required WindowActorSidedOptions parent;
|
WindowActorSidedOptions parent = null;
|
||||||
required WindowActorChildOptions child;
|
WindowActorChildOptions child = null;
|
||||||
};
|
};
|
||||||
|
|
||||||
dictionary WindowActorSidedOptions {
|
dictionary WindowActorSidedOptions {
|
||||||
/** The module path which should be loaded for the actor on this side. */
|
/** The module path which should be loaded for the actor on this side. */
|
||||||
required ByteString moduleURI;
|
ByteString moduleURI;
|
||||||
};
|
};
|
||||||
|
|
||||||
dictionary WindowActorChildOptions : WindowActorSidedOptions {
|
dictionary WindowActorChildOptions : WindowActorSidedOptions {
|
||||||
|
|
|
@ -74,7 +74,7 @@ interface nsICommandManager : nsISupports
|
||||||
* (equivalent to calling isCommandEnabled).
|
* (equivalent to calling isCommandEnabled).
|
||||||
*
|
*
|
||||||
* aCommandName is the name of the command that needs the state
|
* aCommandName is the name of the command that needs the state
|
||||||
* aTargetWindow is the source of command controller
|
* aTargetWindow is the source of command controller
|
||||||
* (null means use focus controller)
|
* (null means use focus controller)
|
||||||
* On output: aCommandParams: values set by the caller filled in with
|
* On output: aCommandParams: values set by the caller filled in with
|
||||||
* state from the command.
|
* state from the command.
|
||||||
|
|
|
@ -33,12 +33,12 @@ interface nsIControllerCommand : nsISupports
|
||||||
boolean isCommandEnabled(in string aCommandName, in nsISupports aCommandContext);
|
boolean isCommandEnabled(in string aCommandName, in nsISupports aCommandContext);
|
||||||
|
|
||||||
void getCommandStateParams(in string aCommandName, in nsICommandParams aParams, in nsISupports aCommandContext);
|
void getCommandStateParams(in string aCommandName, in nsICommandParams aParams, in nsISupports aCommandContext);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the name command.
|
* Execute the name command.
|
||||||
*
|
*
|
||||||
* @param aCommandName the name of the command to execute.
|
* @param aCommandName the name of the command to execute.
|
||||||
*
|
*
|
||||||
* @param aCommandContext a cookie held by the nsIControllerCommandTable,
|
* @param aCommandContext a cookie held by the nsIControllerCommandTable,
|
||||||
* allowing the command to get some context information.
|
* allowing the command to get some context information.
|
||||||
* The contents of this cookie are implementation-defined.
|
* The contents of this cookie are implementation-defined.
|
||||||
|
@ -48,6 +48,6 @@ interface nsIControllerCommand : nsISupports
|
||||||
|
|
||||||
[can_run_script]
|
[can_run_script]
|
||||||
void doCommandParams(in string aCommandName, in nsICommandParams aParams, in nsISupports aCommandContext);
|
void doCommandParams(in string aCommandName, in nsICommandParams aParams, in nsISupports aCommandContext);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -12,14 +12,14 @@ class nsControllerCommandTable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nsIControllerCommandTable
|
* nsIControllerCommandTable
|
||||||
*
|
*
|
||||||
* An interface via which a controller can maintain a series of commands,
|
* An interface via which a controller can maintain a series of commands,
|
||||||
* and efficiently dispatch commands to their respective handlers.
|
* and efficiently dispatch commands to their respective handlers.
|
||||||
*
|
*
|
||||||
* Controllers that use an nsIControllerCommandTable should support
|
* Controllers that use an nsIControllerCommandTable should support
|
||||||
* nsIInterfaceRequestor, and be able to return an interface to their
|
* nsIInterfaceRequestor, and be able to return an interface to their
|
||||||
* controller command table via getInterface().
|
* controller command table via getInterface().
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
[scriptable, builtinclass, uuid(c847f90e-b8f3-49db-a4df-8867831f2800)]
|
[scriptable, builtinclass, uuid(c847f90e-b8f3-49db-a4df-8867831f2800)]
|
||||||
|
@ -28,11 +28,11 @@ interface nsIControllerCommandTable : nsISupports
|
||||||
/**
|
/**
|
||||||
* Make this command table immutable, so that commands cannot
|
* Make this command table immutable, so that commands cannot
|
||||||
* be registered or unregistered. Some command tables are made
|
* be registered or unregistered. Some command tables are made
|
||||||
* mutable after command registration so that they can be
|
* mutable after command registration so that they can be
|
||||||
* used as singletons.
|
* used as singletons.
|
||||||
*/
|
*/
|
||||||
void makeImmutable();
|
void makeImmutable();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register and unregister commands with the command table.
|
* Register and unregister commands with the command table.
|
||||||
*
|
*
|
||||||
|
@ -43,7 +43,7 @@ interface nsIControllerCommandTable : nsISupports
|
||||||
*/
|
*/
|
||||||
void registerCommand(in string aCommandName, in nsIControllerCommand aCommand);
|
void registerCommand(in string aCommandName, in nsIControllerCommand aCommand);
|
||||||
void unregisterCommand(in string aCommandName, in nsIControllerCommand aCommand);
|
void unregisterCommand(in string aCommandName, in nsIControllerCommand aCommand);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the command handler which has been registered to handle the named command.
|
* Find the command handler which has been registered to handle the named command.
|
||||||
*
|
*
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
/* 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
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
#include "nsISupports.idl"
|
#include "nsISupports.idl"
|
||||||
#include "nsIControllerCommandTable.idl"
|
#include "nsIControllerCommandTable.idl"
|
||||||
|
|
||||||
|
|
|
@ -197,6 +197,7 @@ static uint32_t sESMInstanceCount = 0;
|
||||||
int32_t EventStateManager::sUserInputEventDepth = 0;
|
int32_t EventStateManager::sUserInputEventDepth = 0;
|
||||||
int32_t EventStateManager::sUserKeyboardEventDepth = 0;
|
int32_t EventStateManager::sUserKeyboardEventDepth = 0;
|
||||||
bool EventStateManager::sNormalLMouseEventInProcess = false;
|
bool EventStateManager::sNormalLMouseEventInProcess = false;
|
||||||
|
int16_t EventStateManager::sCurrentMouseBtn = MouseButton::eNotPressed;
|
||||||
EventStateManager* EventStateManager::sActiveESM = nullptr;
|
EventStateManager* EventStateManager::sActiveESM = nullptr;
|
||||||
Document* EventStateManager::sMouseOverDocument = nullptr;
|
Document* EventStateManager::sMouseOverDocument = nullptr;
|
||||||
AutoWeakFrame EventStateManager::sLastDragOverFrame = nullptr;
|
AutoWeakFrame EventStateManager::sLastDragOverFrame = nullptr;
|
||||||
|
@ -6280,6 +6281,12 @@ AutoHandlingUserInputStatePusher::AutoHandlingUserInputStatePusher(
|
||||||
mMouseButtonEventHandlingDocument =
|
mMouseButtonEventHandlingDocument =
|
||||||
fm->SetMouseButtonHandlingDocument(aDocument);
|
fm->SetMouseButtonHandlingDocument(aDocument);
|
||||||
}
|
}
|
||||||
|
if (NeedsToUpdateCurrentMouseBtnState()) {
|
||||||
|
WidgetMouseEvent* mouseEvent = aEvent->AsMouseEvent();
|
||||||
|
if (mouseEvent) {
|
||||||
|
EventStateManager::sCurrentMouseBtn = mouseEvent->mButton;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoHandlingUserInputStatePusher::~AutoHandlingUserInputStatePusher() {
|
AutoHandlingUserInputStatePusher::~AutoHandlingUserInputStatePusher() {
|
||||||
|
@ -6296,6 +6303,9 @@ AutoHandlingUserInputStatePusher::~AutoHandlingUserInputStatePusher() {
|
||||||
nsCOMPtr<Document> handlingDocument =
|
nsCOMPtr<Document> handlingDocument =
|
||||||
fm->SetMouseButtonHandlingDocument(mMouseButtonEventHandlingDocument);
|
fm->SetMouseButtonHandlingDocument(mMouseButtonEventHandlingDocument);
|
||||||
}
|
}
|
||||||
|
if (NeedsToUpdateCurrentMouseBtnState()) {
|
||||||
|
EventStateManager::sCurrentMouseBtn = MouseButton::eNotPressed;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|
|
@ -1262,6 +1262,7 @@ class EventStateManager : public nsSupportsWeakReference, public nsIObserver {
|
||||||
static int32_t sUserKeyboardEventDepth;
|
static int32_t sUserKeyboardEventDepth;
|
||||||
|
|
||||||
static bool sNormalLMouseEventInProcess;
|
static bool sNormalLMouseEventInProcess;
|
||||||
|
static int16_t sCurrentMouseBtn;
|
||||||
|
|
||||||
static EventStateManager* sActiveESM;
|
static EventStateManager* sActiveESM;
|
||||||
|
|
||||||
|
@ -1298,6 +1299,11 @@ class MOZ_RAII AutoHandlingUserInputStatePusher final {
|
||||||
bool NeedsToResetFocusManagerMouseButtonHandlingState() const {
|
bool NeedsToResetFocusManagerMouseButtonHandlingState() const {
|
||||||
return mMessage == eMouseDown || mMessage == eMouseUp;
|
return mMessage == eMouseDown || mMessage == eMouseUp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NeedsToUpdateCurrentMouseBtnState() const {
|
||||||
|
return mMessage == eMouseDown || mMessage == eMouseUp ||
|
||||||
|
mMessage == ePointerDown || mMessage == ePointerUp;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|
|
@ -44,4 +44,4 @@ interface nsIImageDocument : nsISupports {
|
||||||
*/
|
*/
|
||||||
[binaryname(DOMToggleImageSize)]
|
[binaryname(DOMToggleImageSize)]
|
||||||
void toggleImageSize();
|
void toggleImageSize();
|
||||||
};
|
};
|
||||||
|
|
|
@ -111,15 +111,50 @@ function testLongRunningEventHandler() {
|
||||||
}
|
}
|
||||||
addFullscreenErrorContinuation(() => {
|
addFullscreenErrorContinuation(() => {
|
||||||
ok(!document.fullscreenElement,
|
ok(!document.fullscreenElement,
|
||||||
"Should not grant request in long-running event handler.");
|
"Should not grant request in long-running event handler.");
|
||||||
// Restore the pref environment we changed before
|
SimpleTest.executeSoon(testFullscreenMouseBtn);
|
||||||
// entering testNonTrustContext.
|
|
||||||
SpecialPowers.popPrefEnv(finish);
|
|
||||||
});
|
});
|
||||||
window.addEventListener("keypress", longRunningHandler);
|
window.addEventListener("keypress", longRunningHandler);
|
||||||
sendString("a");
|
sendString("a");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function requestFullscreenMouseBtn(event, button) {
|
||||||
|
let clickEl = document.createElement("p");
|
||||||
|
clickEl.innerText = "Click Me";
|
||||||
|
|
||||||
|
function eventHandler(event) {
|
||||||
|
document.body.requestFullscreen();
|
||||||
|
event.target.removeEventListener(event, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
clickEl.addEventListener(event, eventHandler);
|
||||||
|
document.body.appendChild(clickEl);
|
||||||
|
synthesizeMouseAtCenter(clickEl, { button });
|
||||||
|
}
|
||||||
|
|
||||||
|
async function testFullscreenMouseBtn(event, button, next) {
|
||||||
|
await SpecialPowers.pushPrefEnv({
|
||||||
|
"set": [["full-screen-api.mouse-event-allow-left-button-only", true]]
|
||||||
|
});
|
||||||
|
let fsRequestEvents = ["mousedown", "mouseup", "pointerdown", "pointerup"];
|
||||||
|
let mouseButtons = [1, 2];
|
||||||
|
|
||||||
|
for (let i = 0; i < fsRequestEvents.length; i++) {
|
||||||
|
let event = fsRequestEvents[i];
|
||||||
|
for (let j = 0; j < mouseButtons.length; j++) {
|
||||||
|
let mouseButton = mouseButtons[j];
|
||||||
|
let fsDenied = addFullscreenErrorContinuation();
|
||||||
|
requestFullscreenMouseBtn(event, mouseButton);
|
||||||
|
await fsDenied;
|
||||||
|
ok(!document.fullscreenElement, `Should not grant request on '${event}' triggered by mouse button ${mouseButton}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Restore the pref environment we changed before
|
||||||
|
// entering testNonTrustContext.
|
||||||
|
await SpecialPowers.popPrefEnv();
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
function finish() {
|
function finish() {
|
||||||
opener.nextTest();
|
opener.nextTest();
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,12 +72,19 @@ function addFullscreenChangeContinuation(type, callback, inDoc) {
|
||||||
|
|
||||||
// Calls |callback| when the next fullscreenerror is dispatched to inDoc||document.
|
// Calls |callback| when the next fullscreenerror is dispatched to inDoc||document.
|
||||||
function addFullscreenErrorContinuation(callback, inDoc) {
|
function addFullscreenErrorContinuation(callback, inDoc) {
|
||||||
var doc = inDoc || document;
|
return new Promise((resolve) => {
|
||||||
var listener = function(event) {
|
let doc = inDoc || document;
|
||||||
doc.removeEventListener("fullscreenerror", listener);
|
let listener = function(event) {
|
||||||
setTimeout(function(){callback(event);}, 0);
|
doc.removeEventListener("fullscreenerror", listener);
|
||||||
};
|
setTimeout(function(){
|
||||||
doc.addEventListener("fullscreenerror", listener);
|
if(callback) {
|
||||||
|
callback(event);
|
||||||
|
}
|
||||||
|
resolve();
|
||||||
|
}, 0);
|
||||||
|
};
|
||||||
|
doc.addEventListener("fullscreenerror", listener);
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Waits until the window has both the load event and a MozAfterPaint called on
|
// Waits until the window has both the load event and a MozAfterPaint called on
|
||||||
|
|
|
@ -209,9 +209,9 @@ interface nsIDOMWindowUtils : nsISupports {
|
||||||
* The effect of this API is for gfx code to allocate more or fewer
|
* The effect of this API is for gfx code to allocate more or fewer
|
||||||
* pixels for rescalable content by a factor of |resolution| in
|
* pixels for rescalable content by a factor of |resolution| in
|
||||||
* both dimensions.
|
* both dimensions.
|
||||||
*
|
*
|
||||||
* In addition, the content is scaled by the amount of the resolution,
|
* In addition, the content is scaled by the amount of the resolution,
|
||||||
* so that it is displayed at a correspondingly larger or smaller size,
|
* so that it is displayed at a correspondingly larger or smaller size,
|
||||||
* without the need for the caller to set an additional transform.
|
* without the need for the caller to set an additional transform.
|
||||||
*
|
*
|
||||||
* This can be used to implement a non-reflowing scale-zoom, e.g.
|
* This can be used to implement a non-reflowing scale-zoom, e.g.
|
||||||
|
|
|
@ -96,7 +96,7 @@ interface nsIRemoteTab : nsISupports
|
||||||
/**
|
/**
|
||||||
* Notify APZ to start autoscrolling.
|
* Notify APZ to start autoscrolling.
|
||||||
* (aAnchorX, aAnchorY) are the coordinates of the autoscroll anchor,
|
* (aAnchorX, aAnchorY) are the coordinates of the autoscroll anchor,
|
||||||
* in CSS coordinates relative to the screen. aScrollId and
|
* in CSS coordinates relative to the screen. aScrollId and
|
||||||
* aPresShellId identify the scroll frame that content chose to scroll.
|
* aPresShellId identify the scroll frame that content chose to scroll.
|
||||||
* Returns whether we were successfully able to notify APZ.
|
* Returns whether we were successfully able to notify APZ.
|
||||||
* If this function returns true, APZ (which may live in another process)
|
* If this function returns true, APZ (which may live in another process)
|
||||||
|
|
|
@ -11,7 +11,7 @@ webidl Event;
|
||||||
* The nsIDOMEventListener interface is a callback interface for
|
* The nsIDOMEventListener interface is a callback interface for
|
||||||
* listening to events in the Document Object Model.
|
* listening to events in the Document Object Model.
|
||||||
*
|
*
|
||||||
* For more information on this interface please see
|
* For more information on this interface please see
|
||||||
* http://www.w3.org/TR/DOM-Level-2-Events/
|
* http://www.w3.org/TR/DOM-Level-2-Events/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -19,12 +19,12 @@ webidl Event;
|
||||||
interface nsIDOMEventListener : nsISupports
|
interface nsIDOMEventListener : nsISupports
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* This method is called whenever an event occurs of the type for which
|
* This method is called whenever an event occurs of the type for which
|
||||||
* the EventListener interface was registered.
|
* the EventListener interface was registered.
|
||||||
*
|
*
|
||||||
* @param evt The Event contains contextual information about the
|
* @param evt The Event contains contextual information about the
|
||||||
* event. It also contains the stopPropagation and
|
* event. It also contains the stopPropagation and
|
||||||
* preventDefault methods which are used in determining the
|
* preventDefault methods which are used in determining the
|
||||||
* event's flow and default action.
|
* event's flow and default action.
|
||||||
*/
|
*/
|
||||||
[can_run_script]
|
[can_run_script]
|
||||||
|
|
|
@ -242,7 +242,7 @@ interface nsIContentSecurityPolicy : nsISerializable
|
||||||
*/
|
*/
|
||||||
[noscript] void ensureEventTarget(in nsIEventTarget aEventTarget);
|
[noscript] void ensureEventTarget(in nsIEventTarget aEventTarget);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verifies ancestry as permitted by the policy.
|
* Verifies ancestry as permitted by the policy.
|
||||||
*
|
*
|
||||||
|
|
|
@ -10,13 +10,13 @@ interface nsIURI;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nsIWebProtocolHandlerRegistrar
|
* nsIWebProtocolHandlerRegistrar
|
||||||
*
|
*
|
||||||
* Applications wishing to use web protocol handlers need to implement this
|
* Applications wishing to use web protocol handlers need to implement this
|
||||||
* interface. Typically they will prompt the user to confirm adding an entry
|
* interface. Typically they will prompt the user to confirm adding an entry
|
||||||
* to the local list.
|
* to the local list.
|
||||||
*
|
*
|
||||||
* The component must have the contract id defined below so that the Navigator
|
* The component must have the contract id defined below so that the Navigator
|
||||||
* implementation can invoke it.
|
* implementation can invoke it.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
[scriptable, uuid(1ce9ef8d-f462-49ca-b8e9-c946c4f37d6e)]
|
[scriptable, uuid(1ce9ef8d-f462-49ca-b8e9-c946c4f37d6e)]
|
||||||
|
|
|
@ -12,7 +12,7 @@ interface nsIDOMXULButtonElement : nsIDOMXULControlElement {
|
||||||
|
|
||||||
// For buttons of type="menu" only.
|
// For buttons of type="menu" only.
|
||||||
attribute boolean open;
|
attribute boolean open;
|
||||||
|
|
||||||
// For buttons of type="checkbox" only.
|
// For buttons of type="checkbox" only.
|
||||||
attribute boolean checked;
|
attribute boolean checked;
|
||||||
|
|
||||||
|
|
|
@ -10,10 +10,10 @@ interface nsIControllers;
|
||||||
[scriptable, uuid(bdc1d047-6d22-4813-bc50-638ccb349c7d)]
|
[scriptable, uuid(bdc1d047-6d22-4813-bc50-638ccb349c7d)]
|
||||||
interface nsIDOMXULControlElement : nsISupports {
|
interface nsIDOMXULControlElement : nsISupports {
|
||||||
attribute boolean disabled;
|
attribute boolean disabled;
|
||||||
|
|
||||||
// XXX defined in XULElement, but should be defined here
|
// XXX defined in XULElement, but should be defined here
|
||||||
// readonly attribute nsIControllers controllers;
|
// readonly attribute nsIControllers controllers;
|
||||||
|
|
||||||
// void focus();
|
// void focus();
|
||||||
// void blur();
|
// void blur();
|
||||||
};
|
};
|
||||||
|
|
|
@ -11,13 +11,13 @@ webidl Element;
|
||||||
interface nsIDOMXULMenuListElement : nsIDOMXULSelectControlElement {
|
interface nsIDOMXULMenuListElement : nsIDOMXULSelectControlElement {
|
||||||
attribute boolean editable;
|
attribute boolean editable;
|
||||||
attribute boolean open;
|
attribute boolean open;
|
||||||
|
|
||||||
// label of selected option or value of textfield for editable menu lists
|
// label of selected option or value of textfield for editable menu lists
|
||||||
readonly attribute AString label;
|
readonly attribute AString label;
|
||||||
|
|
||||||
attribute AString crop;
|
attribute AString crop;
|
||||||
attribute AString image;
|
attribute AString image;
|
||||||
|
|
||||||
// For editable menu lists only.
|
// For editable menu lists only.
|
||||||
readonly attribute Element inputField;
|
readonly attribute Element inputField;
|
||||||
};
|
};
|
||||||
|
|
|
@ -17,7 +17,7 @@ interface nsIDOMXULMultiSelectControlElement : nsIDOMXULSelectControlElement
|
||||||
attribute long currentIndex;
|
attribute long currentIndex;
|
||||||
|
|
||||||
readonly attribute NodeList selectedItems;
|
readonly attribute NodeList selectedItems;
|
||||||
|
|
||||||
void addItemToSelection(in nsIDOMXULSelectControlItemElement item);
|
void addItemToSelection(in nsIDOMXULSelectControlItemElement item);
|
||||||
void removeItemFromSelection(in nsIDOMXULSelectControlItemElement item);
|
void removeItemFromSelection(in nsIDOMXULSelectControlItemElement item);
|
||||||
void toggleItemSelection(in nsIDOMXULSelectControlItemElement item);
|
void toggleItemSelection(in nsIDOMXULSelectControlItemElement item);
|
||||||
|
@ -29,7 +29,7 @@ interface nsIDOMXULMultiSelectControlElement : nsIDOMXULSelectControlElement
|
||||||
void invertSelection();
|
void invertSelection();
|
||||||
void clearSelection();
|
void clearSelection();
|
||||||
|
|
||||||
// XXX - temporary, pending implementation of scriptable,
|
// XXX - temporary, pending implementation of scriptable,
|
||||||
// mutable NodeList for selectedItems
|
// mutable NodeList for selectedItems
|
||||||
readonly attribute long selectedCount;
|
readonly attribute long selectedCount;
|
||||||
[binaryname(MultiGetSelectedItem)]
|
[binaryname(MultiGetSelectedItem)]
|
||||||
|
|
|
@ -16,13 +16,13 @@ interface nsIDOMXULSelectControlItemElement : nsISupports {
|
||||||
attribute AString label;
|
attribute AString label;
|
||||||
attribute AString accessKey;
|
attribute AString accessKey;
|
||||||
attribute AString command;
|
attribute AString command;
|
||||||
|
|
||||||
attribute AString value;
|
attribute AString value;
|
||||||
|
|
||||||
readonly attribute boolean selected;
|
readonly attribute boolean selected;
|
||||||
|
|
||||||
readonly attribute Element control;
|
readonly attribute Element control;
|
||||||
|
|
||||||
// XXX defined in XULElement, but should be defined here
|
// XXX defined in XULElement, but should be defined here
|
||||||
// void doCommand();
|
// void doCommand();
|
||||||
};
|
};
|
||||||
|
|
|
@ -47,7 +47,7 @@ JSWindowActorProtocol::FromIPC(const JSWindowActorInfo& aInfo) {
|
||||||
proto->mAllFrames = aInfo.allFrames();
|
proto->mAllFrames = aInfo.allFrames();
|
||||||
proto->mMatches = aInfo.matches();
|
proto->mMatches = aInfo.matches();
|
||||||
proto->mRemoteTypes = aInfo.remoteTypes();
|
proto->mRemoteTypes = aInfo.remoteTypes();
|
||||||
proto->mChild.mModuleURI.Assign(aInfo.url());
|
proto->mChild.mModuleURI = aInfo.url();
|
||||||
|
|
||||||
proto->mChild.mEvents.SetCapacity(aInfo.events().Length());
|
proto->mChild.mEvents.SetCapacity(aInfo.events().Length());
|
||||||
for (auto& ipc : aInfo.events()) {
|
for (auto& ipc : aInfo.events()) {
|
||||||
|
@ -111,8 +111,13 @@ JSWindowActorProtocol::FromWebIDLOptions(const nsAString& aName,
|
||||||
proto->mRemoteTypes = aOptions.mRemoteTypes.Value();
|
proto->mRemoteTypes = aOptions.mRemoteTypes.Value();
|
||||||
}
|
}
|
||||||
|
|
||||||
proto->mParent.mModuleURI = aOptions.mParent.mModuleURI;
|
if (aOptions.mParent.mModuleURI.WasPassed()) {
|
||||||
proto->mChild.mModuleURI = aOptions.mChild.mModuleURI;
|
proto->mParent.mModuleURI.emplace(aOptions.mParent.mModuleURI.Value());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aOptions.mChild.mModuleURI.WasPassed()) {
|
||||||
|
proto->mChild.mModuleURI.emplace(aOptions.mChild.mModuleURI.Value());
|
||||||
|
}
|
||||||
|
|
||||||
// For each event declared in the source dictionary, initialize the
|
// For each event declared in the source dictionary, initialize the
|
||||||
// corresponding envent declaration entry in the JSWindowActorProtocol.
|
// corresponding envent declaration entry in the JSWindowActorProtocol.
|
||||||
|
|
|
@ -51,7 +51,7 @@ class JSWindowActorProtocol final : public nsIObserver,
|
||||||
ErrorResult& aRv);
|
ErrorResult& aRv);
|
||||||
|
|
||||||
struct Sided {
|
struct Sided {
|
||||||
nsCString mModuleURI;
|
Maybe<nsCString> mModuleURI;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ParentSide : public Sided {};
|
struct ParentSide : public Sided {};
|
||||||
|
|
|
@ -227,7 +227,7 @@ struct JSWindowActorInfo
|
||||||
{
|
{
|
||||||
nsString name;
|
nsString name;
|
||||||
bool allFrames;
|
bool allFrames;
|
||||||
nsCString url;
|
nsCString? url;
|
||||||
|
|
||||||
JSWindowActorEventDecl[] events;
|
JSWindowActorEventDecl[] events;
|
||||||
nsCString[] observers;
|
nsCString[] observers;
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
#include "mozJSComponentLoader.h"
|
#include "mozJSComponentLoader.h"
|
||||||
#include "mozilla/Logging.h"
|
#include "mozilla/Logging.h"
|
||||||
#include "mozilla/dom/JSWindowActorService.h"
|
#include "mozilla/dom/JSWindowActorService.h"
|
||||||
|
#include "mozilla/dom/JSWindowActorParent.h"
|
||||||
|
#include "mozilla/dom/JSWindowActorChild.h"
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace dom {
|
namespace dom {
|
||||||
|
@ -57,7 +59,28 @@ void WindowGlobalActor::ConstructActor(const nsAString& aName,
|
||||||
side = &proto->Child();
|
side = &proto->Child();
|
||||||
}
|
}
|
||||||
|
|
||||||
aRv = loader->Import(cx, side->mModuleURI, &global, &exports);
|
// Support basic functionally such as SendAsyncMessage and SendQuery for
|
||||||
|
// unspecified moduleURI.
|
||||||
|
if (!side->mModuleURI) {
|
||||||
|
RefPtr<JSWindowActor> actor;
|
||||||
|
if (actorType == JSWindowActor::Type::Parent) {
|
||||||
|
actor = new JSWindowActorParent();
|
||||||
|
} else {
|
||||||
|
actor = new JSWindowActorChild();
|
||||||
|
}
|
||||||
|
|
||||||
|
JS::Rooted<JS::Value> wrapper(cx);
|
||||||
|
if (!ToJSValue(cx, actor, &wrapper)) {
|
||||||
|
aRv.NoteJSContextException(cx);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MOZ_ASSERT(wrapper.isObject());
|
||||||
|
aActor.set(&wrapper.toObject());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
aRv = loader->Import(cx, side->mModuleURI.ref(), &global, &exports);
|
||||||
if (aRv.Failed()) {
|
if (aRv.Failed()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,6 +63,7 @@ FullscreenDeniedFocusedPlugin=Request for fullscreen was denied because a window
|
||||||
FullscreenDeniedHidden=Request for fullscreen was denied because the document is no longer visible.
|
FullscreenDeniedHidden=Request for fullscreen was denied because the document is no longer visible.
|
||||||
FullscreenDeniedContainerNotAllowed=Request for fullscreen was denied because at least one of the document’s containing elements is not an iframe or does not have an “allowfullscreen” attribute.
|
FullscreenDeniedContainerNotAllowed=Request for fullscreen was denied because at least one of the document’s containing elements is not an iframe or does not have an “allowfullscreen” attribute.
|
||||||
FullscreenDeniedNotInputDriven=Request for fullscreen was denied because Element.requestFullscreen() was not called from inside a short running user-generated event handler.
|
FullscreenDeniedNotInputDriven=Request for fullscreen was denied because Element.requestFullscreen() was not called from inside a short running user-generated event handler.
|
||||||
|
FullscreenDeniedMouseEventOnlyLeftBtn=Request for fullscreen was denied because Element.requestFullscreen() was called from inside a mouse event handler not triggered by left mouse button.
|
||||||
FullscreenDeniedNotHTMLSVGOrMathML=Request for fullscreen was denied because requesting element is not <svg>, <math>, or an HTML element.
|
FullscreenDeniedNotHTMLSVGOrMathML=Request for fullscreen was denied because requesting element is not <svg>, <math>, or an HTML element.
|
||||||
FullscreenDeniedNotInDocument=Request for fullscreen was denied because requesting element is no longer in its document.
|
FullscreenDeniedNotInDocument=Request for fullscreen was denied because requesting element is no longer in its document.
|
||||||
FullscreenDeniedMovedDocument=Request for fullscreen was denied because requesting element has moved document.
|
FullscreenDeniedMovedDocument=Request for fullscreen was denied because requesting element has moved document.
|
||||||
|
|
|
@ -758,7 +758,8 @@ void DecodedStream::SendVideo(bool aIsSameOrigin,
|
||||||
|
|
||||||
for (uint32_t i = 0; i < video.Length(); ++i) {
|
for (uint32_t i = 0; i < video.Length(); ++i) {
|
||||||
VideoData* v = video[i];
|
VideoData* v = video[i];
|
||||||
TimeUnit lastStart = mData->mLastVideoStartTime.valueOr(mStartTime.ref());
|
TimeUnit lastStart = mData->mLastVideoStartTime.valueOr(
|
||||||
|
mStartTime.ref() - TimeUnit::FromMicroseconds(1));
|
||||||
TimeUnit lastEnd = mData->mLastVideoEndTime.valueOr(mStartTime.ref());
|
TimeUnit lastEnd = mData->mLastVideoEndTime.valueOr(mStartTime.ref());
|
||||||
|
|
||||||
if (lastEnd < v->mTime) {
|
if (lastEnd < v->mTime) {
|
||||||
|
@ -777,7 +778,10 @@ void DecodedStream::SendVideo(bool aIsSameOrigin,
|
||||||
mData->WriteVideoToSegment(mData->mLastVideoImage, lastEnd, v->mTime,
|
mData->WriteVideoToSegment(mData->mLastVideoImage, lastEnd, v->mTime,
|
||||||
mData->mLastVideoImageDisplaySize, t, &output,
|
mData->mLastVideoImageDisplaySize, t, &output,
|
||||||
aPrincipalHandle);
|
aPrincipalHandle);
|
||||||
} else if (lastStart < v->mTime) {
|
lastEnd = v->mTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastStart < v->mTime) {
|
||||||
// This frame starts after the last frame's start. Note that this could be
|
// This frame starts after the last frame's start. Note that this could be
|
||||||
// before the last frame's end time for some videos. This only matters for
|
// before the last frame's end time for some videos. This only matters for
|
||||||
// the track's lifetime in the MSG, as rendering is based on timestamps,
|
// the track's lifetime in the MSG, as rendering is based on timestamps,
|
||||||
|
|
|
@ -278,7 +278,7 @@ var gPlayTests = [
|
||||||
{ name:"test-7-6.1.opus", type:"audio/ogg; codecs=opus", duration:11.690 },
|
{ name:"test-7-6.1.opus", type:"audio/ogg; codecs=opus", duration:11.690 },
|
||||||
{ name:"test-8-7.1.opus", type:"audio/ogg; codecs=opus", duration:13.478 },
|
{ name:"test-8-7.1.opus", type:"audio/ogg; codecs=opus", duration:13.478 },
|
||||||
|
|
||||||
{ name:"gizmo-short.mp4", type:"video/mp4", duration:0.27 },
|
{ name:"gizmo-short.mp4", type:"video/mp4", duration:0.27, contentDuration:0.267 },
|
||||||
// Test playback of a MP4 file with a non-zero start time (and audio starting
|
// Test playback of a MP4 file with a non-zero start time (and audio starting
|
||||||
// a second later).
|
// a second later).
|
||||||
{ name:"bipbop-lateaudio.mp4", type:"video/mp4" },
|
{ name:"bipbop-lateaudio.mp4", type:"video/mp4" },
|
||||||
|
|
|
@ -78,6 +78,14 @@ already_AddRefed<MessageChannel> MessageChannel::Constructor(
|
||||||
channel->mPort1->UnshippedEntangle(channel->mPort2);
|
channel->mPort1->UnshippedEntangle(channel->mPort2);
|
||||||
channel->mPort2->UnshippedEntangle(channel->mPort1);
|
channel->mPort2->UnshippedEntangle(channel->mPort1);
|
||||||
|
|
||||||
|
// MessagePorts should not work if created from a disconnected window.
|
||||||
|
nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal);
|
||||||
|
if (window && !window->GetDocShell()) {
|
||||||
|
// The 2 ports are entangled. We can close one of them to close the other
|
||||||
|
// too.
|
||||||
|
channel->mPort1->CloseForced();
|
||||||
|
}
|
||||||
|
|
||||||
return channel.forget();
|
return channel.forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,3 +29,4 @@ skip-if = (os == "win" && processor == "aarch64") #bug 1535784
|
||||||
[test_messageChannel_bug1178076.html]
|
[test_messageChannel_bug1178076.html]
|
||||||
[test_messageChannel_bug1224825.html]
|
[test_messageChannel_bug1224825.html]
|
||||||
[test_messageChannel_worker_forceClose.html]
|
[test_messageChannel_worker_forceClose.html]
|
||||||
|
[test_removedWindow.html]
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<title>MessagePort should not work when created from a disconnected window</title>
|
||||||
|
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
SimpleTest.waitForExplicitFinish();
|
||||||
|
runTest();
|
||||||
|
|
||||||
|
async function runTest() {
|
||||||
|
let ifr = document.createElement('iframe');
|
||||||
|
await new Promise(resolve => {
|
||||||
|
ifr.onload = resolve;
|
||||||
|
ifr.src = 'support/empty.html';
|
||||||
|
document.body.appendChild(ifr);
|
||||||
|
});
|
||||||
|
|
||||||
|
let w = ifr.contentWindow;
|
||||||
|
|
||||||
|
let pre = new w.MessageChannel();
|
||||||
|
ok(!!pre, "We have a channel");
|
||||||
|
|
||||||
|
ifr.remove();
|
||||||
|
|
||||||
|
let post = new w.MessageChannel();
|
||||||
|
ok(!!post, "We have a channel");
|
||||||
|
|
||||||
|
// This should silently fail.
|
||||||
|
pre.port1.postMessage(42);
|
||||||
|
pre.port2.onmessage = e => {
|
||||||
|
ok(false, "No messages should be received!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// This should silently fail.
|
||||||
|
post.port1.postMessage(42);
|
||||||
|
post.port2.onmessage = e => {
|
||||||
|
ok(false, "No messages should be received!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Let's use another MessagePort just to be sure no messages are received by
|
||||||
|
// port2.
|
||||||
|
|
||||||
|
let mc = new MessageChannel();
|
||||||
|
mc.port1.postMessage(42);
|
||||||
|
mc.port2.onmessage = e => {
|
||||||
|
ok(true, "Ready to complete the test");
|
||||||
|
SimpleTest.finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
|
@ -16,7 +16,7 @@ interface nsIHTTPHeaderListener : nsISupports
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Called for each HTTP Response header.
|
* Called for each HTTP Response header.
|
||||||
* NOTE: You must copy the values of the params.
|
* NOTE: You must copy the values of the params.
|
||||||
*/
|
*/
|
||||||
void newResponseHeader(in string headerName, in string headerValue);
|
void newResponseHeader(in string headerName, in string headerValue);
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ interface nsIPluginInstanceOwner : nsISupports
|
||||||
* with nullptr aTarget.
|
* with nullptr aTarget.
|
||||||
*/
|
*/
|
||||||
NS_IMETHOD
|
NS_IMETHOD
|
||||||
GetURL(const char *aURL, const char *aTarget,
|
GetURL(const char *aURL, const char *aTarget,
|
||||||
nsIInputStream *aPostStream,
|
nsIInputStream *aPostStream,
|
||||||
void *aHeadersData, uint32_t aHeadersDataLen,
|
void *aHeadersData, uint32_t aHeadersDataLen,
|
||||||
bool aDoCheckLoadURIChecks) = 0;
|
bool aDoCheckLoadURIChecks) = 0;
|
||||||
|
|
|
@ -21,7 +21,7 @@ interface nsIController : nsISupports {
|
||||||
|
|
||||||
Enhanced controller interface that allows for passing of parameters
|
Enhanced controller interface that allows for passing of parameters
|
||||||
to commands.
|
to commands.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
interface nsICommandParams;
|
interface nsICommandParams;
|
||||||
|
@ -29,9 +29,9 @@ interface nsICommandParams;
|
||||||
[scriptable, uuid(EEC0B435-7F53-44FE-B00A-CF3EED65C01A)]
|
[scriptable, uuid(EEC0B435-7F53-44FE-B00A-CF3EED65C01A)]
|
||||||
interface nsICommandController : nsISupports
|
interface nsICommandController : nsISupports
|
||||||
{
|
{
|
||||||
|
|
||||||
void getCommandStateWithParams( in string command, in nsICommandParams aCommandParams);
|
void getCommandStateWithParams( in string command, in nsICommandParams aCommandParams);
|
||||||
|
|
||||||
[can_run_script]
|
[can_run_script]
|
||||||
void doCommandWithParams(in string command, in nsICommandParams aCommandParams);
|
void doCommandWithParams(in string command, in nsICommandParams aCommandParams);
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,6 @@ interface nsIControllers : nsISupports
|
||||||
Get the controller specified by the given ID.
|
Get the controller specified by the given ID.
|
||||||
*/
|
*/
|
||||||
nsIController getControllerById(in unsigned long controllerID);
|
nsIController getControllerById(in unsigned long controllerID);
|
||||||
|
|
||||||
unsigned long getControllerCount();
|
unsigned long getControllerCount();
|
||||||
};
|
};
|
||||||
|
|
|
@ -31,10 +31,10 @@ interface nsICollation : nsISupports {
|
||||||
// use the primary comparison for the given locale - no flags
|
// use the primary comparison for the given locale - no flags
|
||||||
const long kCollationStrengthDefault = 0;
|
const long kCollationStrengthDefault = 0;
|
||||||
|
|
||||||
// do not consider case differences when doing the comparison i.e. A=a)
|
// do not consider case differences when doing the comparison i.e. A=a)
|
||||||
const long kCollationCaseInsensitiveAscii = 1;
|
const long kCollationCaseInsensitiveAscii = 1;
|
||||||
|
|
||||||
// do not consider accent differences when doing the comparison a=á)
|
// do not consider accent differences when doing the comparison a=á)
|
||||||
const long kCollationAccentInsenstive = 2;
|
const long kCollationAccentInsenstive = 2;
|
||||||
|
|
||||||
// case sensitive collation (default)
|
// case sensitive collation (default)
|
||||||
|
@ -52,7 +52,7 @@ interface nsICollation : nsISupports {
|
||||||
|
|
||||||
// allocate sort key from input string
|
// allocate sort key from input string
|
||||||
// returns newly allocated key, and its band its byte length
|
// returns newly allocated key, and its band its byte length
|
||||||
[noscript] void allocateRawSortKey(in long strength,
|
[noscript] void allocateRawSortKey(in long strength,
|
||||||
in AString stringIn,
|
in AString stringIn,
|
||||||
[array,size_is(outLen)] out octet key,
|
[array,size_is(outLen)] out octet key,
|
||||||
out unsigned long outLen);
|
out unsigned long outLen);
|
||||||
|
|
|
@ -771,7 +771,7 @@ struct RealmStats {
|
||||||
MACRO(Other, MallocHeap, baselineData) \
|
MACRO(Other, MallocHeap, baselineData) \
|
||||||
MACRO(Other, MallocHeap, baselineStubsFallback) \
|
MACRO(Other, MallocHeap, baselineStubsFallback) \
|
||||||
MACRO(Other, MallocHeap, ionData) \
|
MACRO(Other, MallocHeap, ionData) \
|
||||||
MACRO(Other, MallocHeap, typeInferenceTypeScripts) \
|
MACRO(Other, MallocHeap, jitScripts) \
|
||||||
MACRO(Other, MallocHeap, typeInferenceAllocationSiteTables) \
|
MACRO(Other, MallocHeap, typeInferenceAllocationSiteTables) \
|
||||||
MACRO(Other, MallocHeap, typeInferenceArrayTypeTables) \
|
MACRO(Other, MallocHeap, typeInferenceArrayTypeTables) \
|
||||||
MACRO(Other, MallocHeap, typeInferenceObjectTypeTables) \
|
MACRO(Other, MallocHeap, typeInferenceObjectTypeTables) \
|
||||||
|
|
|
@ -2531,7 +2531,7 @@ void GCRuntime::sweepTypesAfterCompacting(Zone* zone) {
|
||||||
|
|
||||||
for (auto script = zone->cellIterUnsafe<JSScript>(); !script.done();
|
for (auto script = zone->cellIterUnsafe<JSScript>(); !script.done();
|
||||||
script.next()) {
|
script.next()) {
|
||||||
AutoSweepTypeScript sweep(script);
|
AutoSweepJitScript sweep(script);
|
||||||
}
|
}
|
||||||
for (auto group = zone->cellIterUnsafe<ObjectGroup>(); !group.done();
|
for (auto group = zone->cellIterUnsafe<ObjectGroup>(); !group.done();
|
||||||
group.next()) {
|
group.next()) {
|
||||||
|
@ -5916,7 +5916,7 @@ static void SweepThing(Shape* shape) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SweepThing(JSScript* script) { AutoSweepTypeScript sweep(script); }
|
static void SweepThing(JSScript* script) { AutoSweepJitScript sweep(script); }
|
||||||
|
|
||||||
static void SweepThing(ObjectGroup* group) {
|
static void SweepThing(ObjectGroup* group) {
|
||||||
AutoSweepObjectGroup sweep(group);
|
AutoSweepObjectGroup sweep(group);
|
||||||
|
@ -8102,7 +8102,7 @@ void GCRuntime::mergeRealms(Realm* source, Realm* target) {
|
||||||
script.next()) {
|
script.next()) {
|
||||||
MOZ_ASSERT(script->realm() == source);
|
MOZ_ASSERT(script->realm() == source);
|
||||||
script->realm_ = target;
|
script->realm_ = target;
|
||||||
MOZ_ASSERT(!script->types());
|
MOZ_ASSERT(!script->jitScript());
|
||||||
}
|
}
|
||||||
|
|
||||||
GlobalObject* global = target->maybeGlobal();
|
GlobalObject* global = target->maybeGlobal();
|
||||||
|
|
|
@ -16,8 +16,9 @@
|
||||||
namespace js {
|
namespace js {
|
||||||
namespace gc {
|
namespace gc {
|
||||||
|
|
||||||
// Mark colors to pass to markIfUnmarked.
|
// Mark colors. Order is important here: the greater value the 'more marked' a
|
||||||
enum class MarkColor : uint32_t { Black = 0, Gray };
|
// cell is.
|
||||||
|
enum class MarkColor : uint8_t { Gray = 1, Black = 2 };
|
||||||
|
|
||||||
// The phases of an incremental GC.
|
// The phases of an incremental GC.
|
||||||
#define GCSTATES(D) \
|
#define GCSTATES(D) \
|
||||||
|
|
|
@ -17,9 +17,12 @@ namespace js {
|
||||||
namespace gc {
|
namespace gc {
|
||||||
|
|
||||||
// Like gc::MarkColor but allows the possibility of the cell being
|
// Like gc::MarkColor but allows the possibility of the cell being
|
||||||
// unmarked. Order is important here, with white being 'least marked'
|
// unmarked.
|
||||||
// and black being 'most marked'.
|
enum class CellColor : uint8_t {
|
||||||
enum class CellColor : uint8_t { White = 0, Gray = 1, Black = 2 };
|
White = 0,
|
||||||
|
Gray = uint8_t(MarkColor::Gray),
|
||||||
|
Black = uint8_t(MarkColor::Black)
|
||||||
|
};
|
||||||
|
|
||||||
static constexpr CellColor AllCellColors[] = {
|
static constexpr CellColor AllCellColors[] = {
|
||||||
CellColor::White, CellColor::Gray, CellColor::Black
|
CellColor::White, CellColor::Gray, CellColor::Black
|
||||||
|
|
|
@ -207,16 +207,16 @@ void Zone::discardJitCode(FreeOp* fop,
|
||||||
|
|
||||||
if (discardBaselineCode || releaseTypes) {
|
if (discardBaselineCode || releaseTypes) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
// Assert no TypeScripts are marked as active.
|
// Assert no JitScripts are marked as active.
|
||||||
for (auto script = cellIter<JSScript>(); !script.done(); script.next()) {
|
for (auto script = cellIter<JSScript>(); !script.done(); script.next()) {
|
||||||
if (TypeScript* types = script.unbarrieredGet()->types()) {
|
if (JitScript* jitScript = script.unbarrieredGet()->jitScript()) {
|
||||||
MOZ_ASSERT(!types->active());
|
MOZ_ASSERT(!jitScript->active());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Mark TypeScripts on the stack as active.
|
// Mark JitScripts on the stack as active.
|
||||||
jit::MarkActiveTypeScripts(this);
|
jit::MarkActiveJitScripts(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invalidate all Ion code in this zone.
|
// Invalidate all Ion code in this zone.
|
||||||
|
@ -228,7 +228,7 @@ void Zone::discardJitCode(FreeOp* fop,
|
||||||
|
|
||||||
// Discard baseline script if it's not marked as active.
|
// Discard baseline script if it's not marked as active.
|
||||||
if (discardBaselineCode && script->hasBaselineScript()) {
|
if (discardBaselineCode && script->hasBaselineScript()) {
|
||||||
if (script->types()->active()) {
|
if (script->jitScript()->active()) {
|
||||||
// ICs will be purged so the script will need to warm back up before it
|
// ICs will be purged so the script will need to warm back up before it
|
||||||
// can be inlined during Ion compilation.
|
// can be inlined during Ion compilation.
|
||||||
script->baselineScript()->clearIonCompiledOrInlined();
|
script->baselineScript()->clearIonCompiledOrInlined();
|
||||||
|
@ -248,24 +248,22 @@ void Zone::discardJitCode(FreeOp* fop,
|
||||||
script->baselineScript()->setControlFlowGraph(nullptr);
|
script->baselineScript()->setControlFlowGraph(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to release the script's TypeScript. This should happen after
|
// Try to release the script's JitScript. This should happen after
|
||||||
// releasing JIT code because we can't do this when the script still has
|
// releasing JIT code because we can't do this when the script still has
|
||||||
// JIT code.
|
// JIT code.
|
||||||
if (releaseTypes) {
|
if (releaseTypes) {
|
||||||
script->maybeReleaseTypes();
|
script->maybeReleaseJitScript();
|
||||||
}
|
}
|
||||||
|
|
||||||
// The optimizedStubSpace will be purged below so make sure ICScript
|
if (JitScript* jitScript = script->jitScript()) {
|
||||||
// doesn't point into it. We do this after (potentially) releasing types
|
// If we did not release the JitScript, we need to purge optimized IC
|
||||||
// because TypeScript contains the ICScript* and there's no need to
|
// stubs because the optimizedStubSpace will be purged below.
|
||||||
// purge stubs if we just destroyed the Typescript.
|
if (discardBaselineCode) {
|
||||||
if (discardBaselineCode && script->hasICScript()) {
|
jitScript->purgeOptimizedStubs(script);
|
||||||
script->icScript()->purgeOptimizedStubs(script);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Finally, reset the active flag.
|
// Finally, reset the active flag.
|
||||||
if (TypeScript* types = script->types()) {
|
jitScript->resetActive();
|
||||||
types->resetActive();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -527,10 +525,11 @@ void MemoryTracker::adopt(MemoryTracker& other) {
|
||||||
|
|
||||||
static const char* MemoryUseName(MemoryUse use) {
|
static const char* MemoryUseName(MemoryUse use) {
|
||||||
switch (use) {
|
switch (use) {
|
||||||
#define DEFINE_CASE(Name) \
|
# define DEFINE_CASE(Name) \
|
||||||
case MemoryUse::Name: return #Name;
|
case MemoryUse::Name: \
|
||||||
JS_FOR_EACH_MEMORY_USE(DEFINE_CASE)
|
return #Name;
|
||||||
#undef DEFINE_CASE
|
JS_FOR_EACH_MEMORY_USE(DEFINE_CASE)
|
||||||
|
# undef DEFINE_CASE
|
||||||
}
|
}
|
||||||
|
|
||||||
MOZ_CRASH("Unknown memory use");
|
MOZ_CRASH("Unknown memory use");
|
||||||
|
@ -551,8 +550,7 @@ MemoryTracker::~MemoryTracker() {
|
||||||
|
|
||||||
fprintf(stderr, "Missing calls to JS::RemoveAssociatedMemory:\n");
|
fprintf(stderr, "Missing calls to JS::RemoveAssociatedMemory:\n");
|
||||||
for (auto r = map.all(); !r.empty(); r.popFront()) {
|
for (auto r = map.all(); !r.empty(); r.popFront()) {
|
||||||
fprintf(stderr, " %p 0x%zx %s\n", r.front().key().cell,
|
fprintf(stderr, " %p 0x%zx %s\n", r.front().key().cell, r.front().value(),
|
||||||
r.front().value(),
|
|
||||||
MemoryUseName(r.front().key().use));
|
MemoryUseName(r.front().key().use));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1073,7 +1073,7 @@ static bool InitFromBailout(JSContext* cx, size_t frameNo, HandleFunction fun,
|
||||||
|
|
||||||
const uint32_t pcOff = script->pcToOffset(pc);
|
const uint32_t pcOff = script->pcToOffset(pc);
|
||||||
BaselineScript* baselineScript = script->baselineScript();
|
BaselineScript* baselineScript = script->baselineScript();
|
||||||
ICScript* icScript = script->icScript();
|
JitScript* jitScript = script->jitScript();
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
uint32_t expectedDepth;
|
uint32_t expectedDepth;
|
||||||
|
@ -1136,7 +1136,7 @@ static bool InitFromBailout(JSContext* cx, size_t frameNo, HandleFunction fun,
|
||||||
// Not every monitored op has a monitored fallback stub, e.g.
|
// Not every monitored op has a monitored fallback stub, e.g.
|
||||||
// JSOP_NEWOBJECT, which always returns the same type for a
|
// JSOP_NEWOBJECT, which always returns the same type for a
|
||||||
// particular script/pc location.
|
// particular script/pc location.
|
||||||
ICEntry& icEntry = icScript->icEntryFromPCOffset(pcOff);
|
ICEntry& icEntry = jitScript->icEntryFromPCOffset(pcOff);
|
||||||
ICFallbackStub* fallbackStub = icEntry.firstStub()->getChainFallback();
|
ICFallbackStub* fallbackStub = icEntry.firstStub()->getChainFallback();
|
||||||
if (fallbackStub->isMonitoredFallback()) {
|
if (fallbackStub->isMonitoredFallback()) {
|
||||||
enterMonitorChain = true;
|
enterMonitorChain = true;
|
||||||
|
@ -1153,7 +1153,7 @@ static bool InitFromBailout(JSContext* cx, size_t frameNo, HandleFunction fun,
|
||||||
builder.setResumeFramePtr(prevFramePtr);
|
builder.setResumeFramePtr(prevFramePtr);
|
||||||
|
|
||||||
if (enterMonitorChain) {
|
if (enterMonitorChain) {
|
||||||
ICEntry& icEntry = icScript->icEntryFromPCOffset(pcOff);
|
ICEntry& icEntry = jitScript->icEntryFromPCOffset(pcOff);
|
||||||
ICFallbackStub* fallbackStub = icEntry.firstStub()->getChainFallback();
|
ICFallbackStub* fallbackStub = icEntry.firstStub()->getChainFallback();
|
||||||
MOZ_ASSERT(fallbackStub->isMonitoredFallback());
|
MOZ_ASSERT(fallbackStub->isMonitoredFallback());
|
||||||
JitSpew(JitSpew_BaselineBailouts, " [TYPE-MONITOR CHAIN]");
|
JitSpew(JitSpew_BaselineBailouts, " [TYPE-MONITOR CHAIN]");
|
||||||
|
@ -1337,7 +1337,7 @@ static bool InitFromBailout(JSContext* cx, size_t frameNo, HandleFunction fun,
|
||||||
|
|
||||||
// Calculate and write out return address.
|
// Calculate and write out return address.
|
||||||
// The icEntry in question MUST have an inlinable fallback stub.
|
// The icEntry in question MUST have an inlinable fallback stub.
|
||||||
ICEntry& icEntry = icScript->icEntryFromPCOffset(pcOff);
|
ICEntry& icEntry = jitScript->icEntryFromPCOffset(pcOff);
|
||||||
MOZ_ASSERT(IsInlinableFallback(icEntry.firstStub()->getChainFallback()));
|
MOZ_ASSERT(IsInlinableFallback(icEntry.firstStub()->getChainFallback()));
|
||||||
|
|
||||||
RetAddrEntry& retAddrEntry =
|
RetAddrEntry& retAddrEntry =
|
||||||
|
|
|
@ -162,8 +162,8 @@ MethodStatus BaselineCompiler::compile() {
|
||||||
AutoTraceLog logScript(logger, scriptEvent);
|
AutoTraceLog logScript(logger, scriptEvent);
|
||||||
AutoTraceLog logCompile(logger, TraceLogger_BaselineCompilation);
|
AutoTraceLog logCompile(logger, TraceLogger_BaselineCompilation);
|
||||||
|
|
||||||
AutoKeepTypeScripts keepTypes(cx);
|
AutoKeepJitScripts keepJitScript(cx);
|
||||||
if (!script->ensureHasTypes(cx, keepTypes)) {
|
if (!script->ensureHasJitScript(cx, keepJitScript)) {
|
||||||
return Method_Error;
|
return Method_Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -542,8 +542,8 @@ bool BaselineCodeGen<Handler>::emitOutOfLinePostBarrierSlot() {
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
bool BaselineCompilerCodeGen::emitNextIC() {
|
bool BaselineCompilerCodeGen::emitNextIC() {
|
||||||
// Emit a call to an IC stored in ICScript. Calls to this must match the
|
// Emit a call to an IC stored in JitScript. Calls to this must match the
|
||||||
// ICEntry order in ICScript: first the non-op IC entries for |this| and
|
// ICEntry order in JitScript: first the non-op IC entries for |this| and
|
||||||
// formal arguments, then the for-op IC entries for JOF_IC ops.
|
// formal arguments, then the for-op IC entries for JOF_IC ops.
|
||||||
|
|
||||||
JSScript* script = handler.script();
|
JSScript* script = handler.script();
|
||||||
|
@ -553,7 +553,7 @@ bool BaselineCompilerCodeGen::emitNextIC() {
|
||||||
// to loop until we find an ICEntry for the current pc.
|
// to loop until we find an ICEntry for the current pc.
|
||||||
const ICEntry* entry;
|
const ICEntry* entry;
|
||||||
do {
|
do {
|
||||||
entry = &script->icScript()->icEntry(handler.icEntryIndex());
|
entry = &script->jitScript()->icEntry(handler.icEntryIndex());
|
||||||
handler.moveToNextICEntry();
|
handler.moveToNextICEntry();
|
||||||
} while (entry->pcOffset() < pcOffset);
|
} while (entry->pcOffset() < pcOffset);
|
||||||
|
|
||||||
|
@ -1111,10 +1111,9 @@ void BaselineInterpreterCodeGen::emitInitFrameFields() {
|
||||||
masm.storePtr(scratch1, frame.addressOfInterpreterScript());
|
masm.storePtr(scratch1, frame.addressOfInterpreterScript());
|
||||||
|
|
||||||
// Initialize interpreterICEntry.
|
// Initialize interpreterICEntry.
|
||||||
masm.loadPtr(Address(scratch1, JSScript::offsetOfTypes()), scratch2);
|
masm.loadPtr(Address(scratch1, JSScript::offsetOfJitScript()), scratch2);
|
||||||
masm.loadPtr(Address(scratch2, TypeScript::offsetOfICScript()), scratch2);
|
masm.computeEffectiveAddress(
|
||||||
masm.computeEffectiveAddress(Address(scratch2, ICScript::offsetOfICEntries()),
|
Address(scratch2, JitScript::offsetOfICEntries()), scratch2);
|
||||||
scratch2);
|
|
||||||
masm.storePtr(scratch2, frame.addressOfInterpreterICEntry());
|
masm.storePtr(scratch2, frame.addressOfInterpreterICEntry());
|
||||||
|
|
||||||
// Initialize interpreterPC.
|
// Initialize interpreterPC.
|
||||||
|
@ -5897,7 +5896,7 @@ bool BaselineCodeGen<Handler>::emitGeneratorResume(
|
||||||
ValueOperand retVal = regs.takeAnyValue();
|
ValueOperand retVal = regs.takeAnyValue();
|
||||||
masm.loadValue(frame.addressOfStackValue(-1), retVal);
|
masm.loadValue(frame.addressOfStackValue(-1), retVal);
|
||||||
|
|
||||||
// Branch to interpret if the script does not have a TypeScript or
|
// Branch to interpret if the script does not have a JitScript or
|
||||||
// BaselineScript (depending on whether the Baseline Interpreter is enabled).
|
// BaselineScript (depending on whether the Baseline Interpreter is enabled).
|
||||||
// Note that we don't relazify generator scripts, so the function is
|
// Note that we don't relazify generator scripts, so the function is
|
||||||
// guaranteed to be non-lazy.
|
// guaranteed to be non-lazy.
|
||||||
|
@ -5906,8 +5905,9 @@ bool BaselineCodeGen<Handler>::emitGeneratorResume(
|
||||||
masm.loadPtr(Address(callee, JSFunction::offsetOfScript()), scratch1);
|
masm.loadPtr(Address(callee, JSFunction::offsetOfScript()), scratch1);
|
||||||
Address baselineAddr(scratch1, JSScript::offsetOfBaselineScript());
|
Address baselineAddr(scratch1, JSScript::offsetOfBaselineScript());
|
||||||
if (JitOptions.baselineInterpreter) {
|
if (JitOptions.baselineInterpreter) {
|
||||||
Address typesAddr(scratch1, JSScript::offsetOfTypes());
|
Address jitScriptAddr(scratch1, JSScript::offsetOfJitScript());
|
||||||
masm.branchPtr(Assembler::Equal, typesAddr, ImmPtr(nullptr), &interpret);
|
masm.branchPtr(Assembler::Equal, jitScriptAddr, ImmPtr(nullptr),
|
||||||
|
&interpret);
|
||||||
} else {
|
} else {
|
||||||
masm.branchPtr(Assembler::BelowOrEqual, baselineAddr,
|
masm.branchPtr(Assembler::BelowOrEqual, baselineAddr,
|
||||||
ImmPtr(BASELINE_DISABLED_SCRIPT), &interpret);
|
ImmPtr(BASELINE_DISABLED_SCRIPT), &interpret);
|
||||||
|
@ -6126,7 +6126,7 @@ bool BaselineCodeGen<Handler>::emitGeneratorResume(
|
||||||
masm.implicitPop((fun.explicitStackSlots() + 1) * sizeof(void*));
|
masm.implicitPop((fun.explicitStackSlots() + 1) * sizeof(void*));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call into the VM to run in the C++ interpreter if there's no TypeScript or
|
// Call into the VM to run in the C++ interpreter if there's no JitScript or
|
||||||
// BaselineScript.
|
// BaselineScript.
|
||||||
masm.bind(&interpret);
|
masm.bind(&interpret);
|
||||||
|
|
||||||
|
@ -6264,10 +6264,9 @@ bool BaselineInterpreterCodeGen::emit_JSOP_JUMPTARGET() {
|
||||||
|
|
||||||
// Compute ICEntry* and store to frame->interpreterICEntry.
|
// Compute ICEntry* and store to frame->interpreterICEntry.
|
||||||
loadScript(scratch2);
|
loadScript(scratch2);
|
||||||
masm.loadPtr(Address(scratch2, JSScript::offsetOfTypes()), scratch2);
|
masm.loadPtr(Address(scratch2, JSScript::offsetOfJitScript()), scratch2);
|
||||||
masm.loadPtr(Address(scratch2, TypeScript::offsetOfICScript()), scratch2);
|
|
||||||
masm.computeEffectiveAddress(
|
masm.computeEffectiveAddress(
|
||||||
BaseIndex(scratch2, scratch1, TimesOne, ICScript::offsetOfICEntries()),
|
BaseIndex(scratch2, scratch1, TimesOne, JitScript::offsetOfICEntries()),
|
||||||
scratch2);
|
scratch2);
|
||||||
masm.storePtr(scratch2, frame.addressOfInterpreterICEntry());
|
masm.storePtr(scratch2, frame.addressOfInterpreterICEntry());
|
||||||
return true;
|
return true;
|
||||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче