Merge mozilla-central to inbound. a=merge CLOSED TREE

This commit is contained in:
shindli 2019-02-26 12:20:22 +02:00
Родитель a4220fc608 dbddac86aa
Коммит c780ef516c
22 изменённых файлов: 391 добавлений и 109 удалений

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

@ -502,10 +502,10 @@
background-repeat: repeat-x;
}
/* Add a translucent color (current text color at .2 alpha) on top of multiselected tabs */
/* Add a translucent color on top of multiselected tabs */
.tab-background[multiselected=true]:not([selected=true]) > .tab-background-inner {
background: currentColor;
opacity: .2;
opacity: .1;
}
.tab-line[multiselected],

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

@ -0,0 +1,67 @@
# Running Tests with real USB connected devices for the new about:debugging
This document explains how to test with real USB connected devices.
## Tests overview
The tests that use a real device are located in `devtools/client/aboutdebugging-new/test/browser/`and the name of tests starts with `browser_aboutdebugging_real`. These are normal mochitest, but we need to setup the environment before starting tests.
## Setup environment
### Real device side
1. Enable USB debugging on your device
2. Launch Firefox
3. Enable USB debugging on your Firefox
4. Connect to your PC via USB
You can refer to https://developer.mozilla.org/docs/Tools/Remote_Debugging/Debugging_Firefox_for_Android_with_WebIDE#Setting_up_the_Android_device.
### PC side
Setup the real device information to evaluate the validity in tests.
1. Copy a sample file which is located at `devtools/client/aboutdebugging-new/test/browser/real/usb-runtimes-sample.json` and rename it for example to `devtools/client/aboutdebugging-new/test/browser/real/local-usb-runtimes.json`.
2. Edit the file.
This is a JSON file like below, write your real device information in here. This example indicates that there should be one USB device and should be displayed `Pixel 2` as device name and `Firefox Nightly` as short name on the sidebar of about:debugging. Regarding the other information, please see `Detail of config file` section of this document.
```
[
{
"sidebarInfo": {
"deviceName": "Pixel 2",
"shortName": "Firefox Nightly"
},
...
},
...
]
```
## Test
Normally, although we do test `./mach mochitest <path>`, to load the real device information created, specify the path as `USB_RUNTIME` environment variable, then do test.
For example, if the name of the saved file is `devtools/client/aboutdebugging-new/test/browser/real/local-usb-runtimes.json`, run all real device test with a command like the one below:
```
USB_RUNTIMES=devtools/client/aboutdebugging-new/test/browser/real/local-usb-runtimes.json ./mach mochitest devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_real
```
If there is no `USB_RUNTIMES` environment variable, the tests will not run. This is also to avoid to run on try-server and so on.
## Detail of config file
```
[
{
"sidebarInfo": {
"deviceName": "Pixel 2", // This should display as device name on the sidebar.
"shortName": "Firefox Nightly" // This should display as short name on the sidebar.
},
"runtimeDetails": {
"info": {
"name": "Mozilla Nightly", // This should display on the runtime info of runtime page.
"version": "64.0a1" // This should display on the runtime info of runtime page.
}
}
}
// Of course, you can append additional USB devices. Some tests can do with multiple devices.
]
```

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

@ -11,6 +11,7 @@ support-files =
helper-addons.js
helper-collapsibilities.js
helper-mocks.js
helper-real-usb.js
helper-serviceworker.js
helper-telemetry.js
mocks/*
@ -62,6 +63,8 @@ skip-if = (os == "win" && ccov) # Bug 1521349
[browser_aboutdebugging_navigate.js]
[browser_aboutdebugging_persist_connection.js]
[browser_aboutdebugging_profiler_dialog.js]
[browser_aboutdebugging_real_usb_runtime_page_runtime_info.js]
[browser_aboutdebugging_real_usb_sidebar.js]
[browser_aboutdebugging_routes.js]
[browser_aboutdebugging_runtime_compatibility_warning.js]
[browser_aboutdebugging_runtime_remote_runtime_buttons.js]

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

@ -0,0 +1,47 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
/* import-globals-from helper-real-usb.js */
Services.scriptloader.loadSubScript(CHROME_URL_ROOT + "helper-real-usb.js", this);
// Test that runtime info of USB runtime appears on main pane.
// Documentation for real usb tests in /documentation/TESTS_REAL_DEVICES.md
add_task(async function() {
if (!isAvailable()) {
ok(true, "Real usb runtime test is not available");
return;
}
const { document, tab } = await openAboutDebuggingWithADB();
const expectedRuntime = await getExpectedRuntime();
const { runtimeDetails, sidebarInfo } = expectedRuntime;
info("Connect a USB runtime");
await Promise.race([
connectToRuntime(sidebarInfo.deviceName, document),
/* eslint-disable mozilla/no-arbitrary-setTimeout */
new Promise(resolve => setTimeout(() => {
ok(false,
"Failed to connect, did you disable the connection prompt for this runtime?");
resolve();
}, 5000)),
/* eslint-enable mozilla/no-arbitrary-setTimeout */
]);
info("Select a USB runtime");
await selectRuntime(sidebarInfo.deviceName, runtimeDetails.info.name, document);
info("Check that runtime info is properly displayed");
const runtimeInfo = document.querySelector(".js-runtime-info");
ok(runtimeInfo, "Runtime info is displayed");
const runtimeInfoText = runtimeInfo.textContent;
ok(runtimeInfoText.includes(runtimeDetails.info.name),
"Runtime info shows the correct runtime name: " + runtimeInfoText);
ok(runtimeInfoText.includes(runtimeDetails.info.version),
"Runtime info shows the correct version number: " + runtimeInfoText);
await removeTab(tab);
});

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

@ -0,0 +1,29 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
/* import-globals-from helper-real-usb.js */
Services.scriptloader.loadSubScript(CHROME_URL_ROOT + "helper-real-usb.js", this);
// Test that USB runtimes appear from the sidebar.
// Documentation for real usb tests in /documentation/TESTS_REAL_DEVICES.md
add_task(async function() {
if (!isAvailable()) {
ok(true, "Real usb runtime test is not available");
return;
}
const { document, tab } = await openAboutDebuggingWithADB();
for (const { sidebarInfo } of await getExpectedRuntimeAll()) {
const { deviceName, shortName } = sidebarInfo;
await waitUntil(() => findSidebarItemByText(deviceName, document));
const usbRuntimeSidebarItem = findSidebarItemByText(deviceName, document);
ok(usbRuntimeSidebarItem.textContent.includes(shortName),
"The device name and short name of the usb runtime are visible in sidebar item " +
`[${usbRuntimeSidebarItem.textContent}]`);
}
await removeTab(tab);
});

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

@ -0,0 +1,51 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
/* import-globals-from helper-adb.js */
Services.scriptloader.loadSubScript(CHROME_URL_ROOT + "helper-adb.js", this);
async function getExpectedRuntime() {
const runtimes = await getExpectedRuntimeAll();
return runtimes[0];
}
/* exported getExpectedRuntime */
async function getExpectedRuntimeAll() {
const runtimesPath = _getExpectedRuntimesPath();
const currentPath = env.get("PWD");
const path = `${currentPath}/${runtimesPath}`;
info(`Load ${ path }`);
const buffer = await OS.File.read(path);
const data = new TextDecoder().decode(buffer);
return JSON.parse(data);
}
/* exported getExpectedRuntimeAll */
function isAvailable() {
return !!_getExpectedRuntimesPath();
}
/* exported isAvailable */
async function openAboutDebuggingWithADB() {
const { document, tab, window } = await openAboutDebugging();
await pushPref("devtools.remote.adb.extensionURL",
CHROME_URL_ROOT + "resources/test-adb-extension/adb-extension-#OS#.xpi");
await checkAdbNotRunning();
const { adbAddon } = require("devtools/shared/adb/adb-addon");
adbAddon.install("internal");
const usbStatusElement = document.querySelector(".js-sidebar-usb-status");
await waitUntil(() => usbStatusElement.textContent.includes("USB devices enabled"));
await waitForAdbStart();
return { document, tab, window };
}
/* exported openAboutDebuggingWithADB */
function _getExpectedRuntimesPath() {
const env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
return env.get("USB_RUNTIMES");
}

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

@ -0,0 +1,14 @@
[
{
"sidebarInfo": {
"deviceName": "Pixel 2",
"shortName": "Firefox Nightly"
},
"runtimeDetails": {
"info": {
"name": "Mozilla Nightly",
"version": "64.0a1"
}
}
}
]

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

@ -9,6 +9,6 @@ self.addEventListener("activate", event => {
});
self.addEventListener("fetch", event => {
const response = new Response("Service worker response");
const response = new Response("Service worker response", { statusText: "OK" });
event.respondWith(response);
});

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

@ -473,6 +473,8 @@ static RefPtr<const webgl::LinkedProgramInfo> QueryProgramInfo(
{
const auto& fragShader = prog->FragShader();
MOZ_RELEASE_ASSERT(fragShader);
MOZ_RELEASE_ASSERT(fragShader->Validator());
const auto& handle = fragShader->Validator()->Handle();
const auto version = sh::GetShaderVersion(handle);

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

@ -213,6 +213,7 @@ namespace webgl {
const ShBuiltInResources& resources, ShCompileOptions compileOptions) {
ShHandle handle =
sh::ConstructCompiler(shaderType, spec, outputLanguage, &resources);
MOZ_RELEASE_ASSERT(handle);
if (!handle) return nullptr;
return new ShaderValidator(handle, compileOptions,

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

@ -4,7 +4,7 @@ function testDefaultCtor() {
ok(res.headers instanceof Headers, "Response should have non-null Headers object");
is(res.url, "", "URL should be empty string");
is(res.status, 200, "Default status is 200");
is(res.statusText, "OK", "Default statusText is OK");
is(res.statusText, "", "Default statusText is an empty string");
}
function testClone() {

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

@ -44,7 +44,7 @@ partial interface Response {
dictionary ResponseInit {
unsigned short status = 200;
ByteString statusText = "OK";
ByteString statusText = "";
HeadersInit headers;
};

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

@ -5,7 +5,7 @@
use api::{BorderRadius, BorderSide, BorderStyle, ColorF, ColorU, DeviceRect, DeviceSize};
use api::{LayoutSideOffsets, LayoutSizeAu, LayoutPrimitiveInfo, LayoutToDeviceScale};
use api::{DeviceVector2D, DevicePoint, LayoutRect, LayoutSize, DeviceIntSize};
use api::{AuHelpers, LayoutPoint, LayoutPointAu, RepeatMode, TexelRect, LayoutVector2D};
use api::{AuHelpers, LayoutPoint, LayoutPointAu, RepeatMode, TexelRect};
use api::NormalBorder as ApiNormalBorder;
use ellipse::Ellipse;
use euclid::vec2;
@ -216,7 +216,6 @@ impl<'a> DisplayListFlattener<'a> {
border: &ApiNormalBorder,
widths: LayoutSideOffsets,
clip_and_scroll: ScrollNodeAndClipChain,
reference_frame_relative_offset: LayoutVector2D,
) {
let mut border = *border;
ensure_no_corner_overlap(&mut border.radius, info.rect.size);
@ -229,7 +228,6 @@ impl<'a> DisplayListFlattener<'a> {
border: border.into(),
widths: widths.to_au(),
},
reference_frame_relative_offset,
);
}
}

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

@ -77,7 +77,6 @@ impl<'a> DisplayListFlattener<'a> {
spread_radius: f32,
border_radius: BorderRadius,
clip_mode: BoxShadowClipMode,
reference_frame_relative_offset: LayoutVector2D,
) {
if color.a == 0.0 {
return;
@ -167,7 +166,6 @@ impl<'a> DisplayListFlattener<'a> {
PrimitiveKeyKind::Rectangle {
color: color.into(),
},
reference_frame_relative_offset,
);
} else {
// Normal path for box-shadows with a valid blur radius.
@ -257,7 +255,6 @@ impl<'a> DisplayListFlattener<'a> {
&prim_info,
extra_clips,
prim,
reference_frame_relative_offset,
);
}
}

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

@ -60,6 +60,78 @@ impl ClipNode {
}
}
/// The offset stack for a given reference frame.
struct ReferenceFrameState {
/// A stack of current offsets from the current reference frame scope.
offsets: Vec<LayoutVector2D>,
}
/// Maps from stacking context layout coordinates into reference frame
/// relative coordinates.
struct ReferenceFrameMapper {
/// A stack of reference frame scopes.
frames: Vec<ReferenceFrameState>,
}
impl ReferenceFrameMapper {
fn new() -> Self {
ReferenceFrameMapper {
frames: vec![
ReferenceFrameState {
offsets: vec![
LayoutVector2D::zero(),
],
}
],
}
}
/// Push a new scope. This resets the current offset to zero, and is
/// used when a new reference frame or iframe is pushed.
fn push_scope(&mut self) {
self.frames.push(ReferenceFrameState {
offsets: vec![
LayoutVector2D::zero(),
],
});
}
/// Pop a reference frame scope off the stack.
fn pop_scope(&mut self) {
self.frames.pop().unwrap();
}
/// Push a new offset for the current scope. This is used when
/// a new stacking context is pushed.
fn push_offset(&mut self, offset: LayoutVector2D) {
let frame = self.frames.last_mut().unwrap();
let current_offset = *frame.offsets.last().unwrap();
frame.offsets.push(current_offset + offset);
}
/// Pop a local stacking context offset from the current scope.
fn pop_offset(&mut self) {
let frame = self.frames.last_mut().unwrap();
frame.offsets.pop().unwrap();
}
/// Retrieve the current offset to allow converting a stacking context
/// relative coordinate to be relative to the owing reference frame.
/// TODO(gw): We could perhaps have separate coordinate spaces for this,
/// however that's going to either mean a lot of changes to
/// public API code, or a lot of changes to internal code.
/// Before doing that, we should revisit how Gecko would
/// prefer to provide coordinates.
/// TODO(gw): For now, this includes only the reference frame relative
/// offset. Soon, we will expand this to include the initial
/// scroll offsets that are now available on scroll nodes. This
/// will allow normalizing the coordinates even between display
/// lists where APZ has scrolled the content.
fn current_offset(&self) -> LayoutVector2D {
*self.frames.last().unwrap().offsets.last().unwrap()
}
}
/// A data structure that keeps track of mapping between API Ids for clips/spatials and the indices
/// used internally in the ClipScrollTree to avoid having to do HashMap lookups. NodeIdToIndexMapper
/// is responsible for mapping both ClipId to ClipChainIndex and SpatialId to SpatialNodeIndex.
@ -147,6 +219,9 @@ pub struct DisplayListFlattener<'a> {
/// The root picture index for this flattener. This is the picture
/// to start the culling phase from.
pub root_pic_index: PictureIndex,
/// Helper struct to map stacking context coords <-> reference frame coords.
rf_mapper: ReferenceFrameMapper,
}
impl<'a> DisplayListFlattener<'a> {
@ -184,6 +259,7 @@ impl<'a> DisplayListFlattener<'a> {
clip_store: ClipStore::new(),
interners,
root_pic_index: PictureIndex(0),
rf_mapper: ReferenceFrameMapper::new(),
};
flattener.push_root(
@ -217,7 +293,6 @@ impl<'a> DisplayListFlattener<'a> {
flattener.flatten_items(
&mut root_pipeline.display_list.iter(),
root_pipeline.pipeline_id,
LayoutVector2D::zero(),
true,
);
@ -469,7 +544,6 @@ impl<'a> DisplayListFlattener<'a> {
&mut self,
traversal: &mut BuiltDisplayListIter<'a>,
pipeline_id: PipelineId,
reference_frame_relative_offset: LayoutVector2D,
apply_pipeline_clip: bool,
) {
loop {
@ -488,7 +562,6 @@ impl<'a> DisplayListFlattener<'a> {
self.flatten_item(
item,
pipeline_id,
reference_frame_relative_offset,
apply_pipeline_clip,
)
};
@ -506,9 +579,9 @@ impl<'a> DisplayListFlattener<'a> {
item: &DisplayItemRef,
info: &StickyFrameDisplayItem,
parent_node_index: SpatialNodeIndex,
reference_frame_relative_offset: &LayoutVector2D,
) {
let frame_rect = item.rect().translate(reference_frame_relative_offset);
let current_offset = self.rf_mapper.current_offset();
let frame_rect = item.rect().translate(&current_offset);
let sticky_frame_info = StickyFrameInfo::new(
frame_rect,
info.margins,
@ -531,14 +604,14 @@ impl<'a> DisplayListFlattener<'a> {
info: &ScrollFrameDisplayItem,
parent_node_index: SpatialNodeIndex,
pipeline_id: PipelineId,
reference_frame_relative_offset: &LayoutVector2D,
) {
let complex_clips = self.get_complex_clips(pipeline_id, item.complex_clip().0);
let current_offset = self.rf_mapper.current_offset();
let clip_region = ClipRegion::create_for_clip_node(
*item.clip_rect(),
complex_clips,
info.image_mask,
reference_frame_relative_offset,
&current_offset,
);
// Just use clip rectangle as the frame rect for this scroll frame.
// This is useful when calculating scroll extents for the
@ -568,9 +641,9 @@ impl<'a> DisplayListFlattener<'a> {
parent_spatial_node: SpatialNodeIndex,
origin: LayoutPoint,
reference_frame: &ReferenceFrame,
reference_frame_relative_offset: LayoutVector2D,
apply_pipeline_clip: bool,
) {
let current_offset = self.rf_mapper.current_offset();
self.push_reference_frame(
reference_frame.id,
Some(parent_spatial_node),
@ -578,10 +651,16 @@ impl<'a> DisplayListFlattener<'a> {
reference_frame.transform_style,
reference_frame.transform,
reference_frame.kind,
reference_frame_relative_offset + origin.to_vector(),
current_offset + origin.to_vector(),
);
self.flatten_items(traversal, pipeline_id, LayoutVector2D::zero(), apply_pipeline_clip);
self.rf_mapper.push_scope();
self.flatten_items(
traversal,
pipeline_id,
apply_pipeline_clip,
);
self.rf_mapper.pop_scope();
}
@ -594,7 +673,6 @@ impl<'a> DisplayListFlattener<'a> {
origin: LayoutPoint,
filters: ItemRange<FilterOp>,
filter_datas: &[TempFilterData],
reference_frame_relative_offset: &LayoutVector2D,
is_backface_visible: bool,
apply_pipeline_clip: bool,
) {
@ -649,12 +727,13 @@ impl<'a> DisplayListFlattener<'a> {
debug_assert!(found_root);
}
self.rf_mapper.push_offset(origin.to_vector());
self.flatten_items(
traversal,
pipeline_id,
*reference_frame_relative_offset + origin.to_vector(),
apply_pipeline_clip && clip_chain_id == ClipChainId::NONE,
);
self.rf_mapper.pop_offset();
self.pop_stacking_context();
}
@ -664,7 +743,6 @@ impl<'a> DisplayListFlattener<'a> {
item: &DisplayItemRef,
info: &IframeDisplayItem,
spatial_node_index: SpatialNodeIndex,
reference_frame_relative_offset: &LayoutVector2D,
) {
let iframe_pipeline_id = info.pipeline_id;
let pipeline = match self.scene.pipelines.get(&iframe_pipeline_id) {
@ -675,18 +753,19 @@ impl<'a> DisplayListFlattener<'a> {
},
};
let current_offset = self.rf_mapper.current_offset();
let clip_chain_index = self.add_clip_node(
ClipId::root(iframe_pipeline_id),
item.space_and_clip_info(),
ClipRegion::create_for_clip_node_with_local_clip(
item.clip_rect(),
reference_frame_relative_offset,
&current_offset,
),
);
self.pipeline_clip_chain_stack.push(clip_chain_index);
let bounds = item.rect();
let origin = *reference_frame_relative_offset + bounds.origin.to_vector();
let origin = current_offset + bounds.origin.to_vector();
let spatial_node_index = self.push_reference_frame(
SpatialId::root_reference_frame(iframe_pipeline_id),
Some(spatial_node_index),
@ -709,12 +788,13 @@ impl<'a> DisplayListFlattener<'a> {
ScrollFrameKind::PipelineRoot,
);
self.rf_mapper.push_scope();
self.flatten_items(
&mut pipeline.display_list.iter(),
pipeline.pipeline_id,
LayoutVector2D::zero(),
true,
);
self.rf_mapper.pop_scope();
self.pipeline_clip_chain_stack.pop();
}
@ -723,7 +803,6 @@ impl<'a> DisplayListFlattener<'a> {
&'b mut self,
item: DisplayItemRef<'a, 'b>,
pipeline_id: PipelineId,
reference_frame_relative_offset: LayoutVector2D,
apply_pipeline_clip: bool,
) -> Option<BuiltDisplayListIter<'a>> {
let space_and_clip = item.space_and_clip_info();
@ -737,7 +816,9 @@ impl<'a> DisplayListFlattener<'a> {
ClipChainId::INVALID
},
);
let prim_info = item.get_layout_primitive_info(&reference_frame_relative_offset);
let prim_info = item.get_layout_primitive_info(
&self.rf_mapper.current_offset(),
);
match *item.item() {
SpecificDisplayItem::Image(ref info) => {
@ -751,7 +832,6 @@ impl<'a> DisplayListFlattener<'a> {
info.image_rendering,
info.alpha_type,
info.color,
reference_frame_relative_offset,
);
}
SpecificDisplayItem::YuvImage(ref info) => {
@ -762,13 +842,11 @@ impl<'a> DisplayListFlattener<'a> {
info.color_depth,
info.color_space,
info.image_rendering,
reference_frame_relative_offset,
);
}
SpecificDisplayItem::Text(ref text_info) => {
self.add_text(
clip_and_scroll,
reference_frame_relative_offset,
&prim_info,
&text_info.font_key,
&text_info.color,
@ -782,14 +860,12 @@ impl<'a> DisplayListFlattener<'a> {
clip_and_scroll,
&prim_info,
info.color,
reference_frame_relative_offset,
);
}
SpecificDisplayItem::ClearRectangle => {
self.add_clear_rectangle(
clip_and_scroll,
&prim_info,
reference_frame_relative_offset,
);
}
SpecificDisplayItem::Line(ref info) => {
@ -800,7 +876,6 @@ impl<'a> DisplayListFlattener<'a> {
info.orientation,
info.color,
info.style,
reference_frame_relative_offset,
);
}
SpecificDisplayItem::Gradient(ref info) => {
@ -820,7 +895,6 @@ impl<'a> DisplayListFlattener<'a> {
&prim_info,
Vec::new(),
prim_key_kind,
reference_frame_relative_offset,
);
}
}
@ -843,13 +917,13 @@ impl<'a> DisplayListFlattener<'a> {
&prim_info,
Vec::new(),
prim_key_kind,
reference_frame_relative_offset,
);
}
SpecificDisplayItem::BoxShadow(ref box_shadow_info) => {
let current_offset = self.rf_mapper.current_offset();
let bounds = box_shadow_info
.box_bounds
.translate(&reference_frame_relative_offset);
.translate(&current_offset);
let mut prim_info = prim_info.clone();
prim_info.rect = bounds;
self.add_box_shadow(
@ -861,7 +935,6 @@ impl<'a> DisplayListFlattener<'a> {
box_shadow_info.spread_radius,
box_shadow_info.border_radius,
box_shadow_info.clip_mode,
reference_frame_relative_offset,
);
}
SpecificDisplayItem::Border(ref info) => {
@ -871,7 +944,6 @@ impl<'a> DisplayListFlattener<'a> {
info,
item.gradient_stops(),
pipeline_id,
reference_frame_relative_offset,
);
}
SpecificDisplayItem::PushStackingContext(ref info) => {
@ -884,7 +956,6 @@ impl<'a> DisplayListFlattener<'a> {
item.rect().origin,
item.filters(),
item.filter_datas(),
&reference_frame_relative_offset,
prim_info.is_backface_visible,
apply_pipeline_clip,
);
@ -898,7 +969,6 @@ impl<'a> DisplayListFlattener<'a> {
clip_and_scroll.spatial_node_index,
item.rect().origin,
&info.reference_frame,
reference_frame_relative_offset,
apply_pipeline_clip,
);
return Some(subtraversal);
@ -908,16 +978,16 @@ impl<'a> DisplayListFlattener<'a> {
&item,
info,
clip_and_scroll.spatial_node_index,
&reference_frame_relative_offset,
);
}
SpecificDisplayItem::Clip(ref info) => {
let current_offset = self.rf_mapper.current_offset();
let complex_clips = self.get_complex_clips(pipeline_id, item.complex_clip().0);
let clip_region = ClipRegion::create_for_clip_node(
*item.clip_rect(),
complex_clips,
info.image_mask,
&reference_frame_relative_offset,
&current_offset,
);
self.add_clip_node(info.id, space_and_clip, clip_region);
}
@ -996,7 +1066,6 @@ impl<'a> DisplayListFlattener<'a> {
info,
clip_and_scroll.spatial_node_index,
pipeline_id,
&reference_frame_relative_offset,
);
}
SpecificDisplayItem::StickyFrame(ref info) => {
@ -1004,7 +1073,6 @@ impl<'a> DisplayListFlattener<'a> {
&item,
info,
clip_and_scroll.spatial_node_index,
&reference_frame_relative_offset,
);
}
@ -1021,13 +1089,14 @@ impl<'a> DisplayListFlattener<'a> {
self.push_shadow(shadow, clip_and_scroll);
}
SpecificDisplayItem::PopAllShadows => {
self.pop_all_shadows(reference_frame_relative_offset);
self.pop_all_shadows();
}
SpecificDisplayItem::PushCacheMarker(_marker) => {
}
SpecificDisplayItem::PopCacheMarker => {
}
}
None
}
@ -1076,7 +1145,6 @@ impl<'a> DisplayListFlattener<'a> {
clip_chain_id: ClipChainId,
spatial_node_index: SpatialNodeIndex,
prim: P,
reference_frame_relative_offset: LayoutVector2D,
) -> PrimitiveInstance
where
P: Internable<InternData=PrimitiveSceneData>,
@ -1096,10 +1164,12 @@ impl<'a> DisplayListFlattener<'a> {
}
});
let current_offset = self.rf_mapper.current_offset();
let instance_kind = prim_key.as_instance_kind(
prim_data_handle,
&mut self.prim_store,
reference_frame_relative_offset,
current_offset,
);
PrimitiveInstance::new(
@ -1155,7 +1225,6 @@ impl<'a> DisplayListFlattener<'a> {
info: &LayoutPrimitiveInfo,
clip_items: Vec<(LayoutPoint, ClipItemKey)>,
prim: P,
reference_frame_relative_offset: LayoutVector2D,
)
where
P: Internable<InternData = PrimitiveSceneData> + IsVisible,
@ -1173,7 +1242,6 @@ impl<'a> DisplayListFlattener<'a> {
clip_chain_id,
clip_and_scroll,
prim,
reference_frame_relative_offset,
);
}
}
@ -1184,7 +1252,6 @@ impl<'a> DisplayListFlattener<'a> {
info: &LayoutPrimitiveInfo,
clip_items: Vec<(LayoutPoint, ClipItemKey)>,
prim: P,
reference_frame_relative_offset: LayoutVector2D,
)
where
P: Internable<InternData = PrimitiveSceneData> + IsVisible,
@ -1200,7 +1267,6 @@ impl<'a> DisplayListFlattener<'a> {
info,
clip_items,
prim,
reference_frame_relative_offset,
);
} else {
debug_assert!(clip_items.is_empty(), "No per-prim clips expected for shadowed primitives");
@ -1221,7 +1287,6 @@ impl<'a> DisplayListFlattener<'a> {
clip_chain_id: ClipChainId,
clip_and_scroll: ScrollNodeAndClipChain,
prim: P,
reference_frame_relative_offset: LayoutVector2D,
)
where
P: Internable<InternData = PrimitiveSceneData>,
@ -1233,7 +1298,6 @@ impl<'a> DisplayListFlattener<'a> {
clip_chain_id,
clip_and_scroll.spatial_node_index,
prim,
reference_frame_relative_offset,
);
self.register_chase_primitive_by_rect(
&info.rect,
@ -1865,7 +1929,6 @@ impl<'a> DisplayListFlattener<'a> {
pub fn pop_all_shadows(
&mut self,
reference_frame_relative_offset: LayoutVector2D,
) {
assert!(!self.pending_shadow_items.is_empty(), "popped shadows, but none were present");
@ -1919,7 +1982,6 @@ impl<'a> DisplayListFlattener<'a> {
&pending_shadow,
pending_image,
&mut prims,
reference_frame_relative_offset,
)
}
ShadowItem::LineDecoration(ref pending_line_dec) => {
@ -1927,7 +1989,6 @@ impl<'a> DisplayListFlattener<'a> {
&pending_shadow,
pending_line_dec,
&mut prims,
reference_frame_relative_offset,
)
}
ShadowItem::NormalBorder(ref pending_border) => {
@ -1935,7 +1996,6 @@ impl<'a> DisplayListFlattener<'a> {
&pending_shadow,
pending_border,
&mut prims,
reference_frame_relative_offset,
)
}
ShadowItem::Primitive(ref pending_primitive) => {
@ -1943,7 +2003,6 @@ impl<'a> DisplayListFlattener<'a> {
&pending_shadow,
pending_primitive,
&mut prims,
reference_frame_relative_offset,
)
}
ShadowItem::TextRun(ref pending_text_run) => {
@ -1951,7 +2010,6 @@ impl<'a> DisplayListFlattener<'a> {
&pending_shadow,
pending_text_run,
&mut prims,
reference_frame_relative_offset,
)
}
_ => {}
@ -2031,31 +2089,26 @@ impl<'a> DisplayListFlattener<'a> {
ShadowItem::Image(pending_image) => {
self.add_shadow_prim_to_draw_list(
pending_image,
reference_frame_relative_offset,
)
},
ShadowItem::LineDecoration(pending_line_dec) => {
self.add_shadow_prim_to_draw_list(
pending_line_dec,
reference_frame_relative_offset,
)
},
ShadowItem::NormalBorder(pending_border) => {
self.add_shadow_prim_to_draw_list(
pending_border,
reference_frame_relative_offset,
)
},
ShadowItem::Primitive(pending_primitive) => {
self.add_shadow_prim_to_draw_list(
pending_primitive,
reference_frame_relative_offset,
)
},
ShadowItem::TextRun(pending_text_run) => {
self.add_shadow_prim_to_draw_list(
pending_text_run,
reference_frame_relative_offset,
)
},
}
@ -2070,7 +2123,6 @@ impl<'a> DisplayListFlattener<'a> {
pending_shadow: &PendingShadow,
pending_primitive: &PendingPrimitive<P>,
prims: &mut Vec<PrimitiveInstance>,
reference_frame_relative_offset: LayoutVector2D,
)
where
P: Internable<InternData=PrimitiveSceneData> + CreateShadow,
@ -2090,7 +2142,6 @@ impl<'a> DisplayListFlattener<'a> {
pending_primitive.prim.create_shadow(
&pending_shadow.shadow,
),
reference_frame_relative_offset,
);
// Add the new primitive to the shadow picture.
@ -2100,7 +2151,6 @@ impl<'a> DisplayListFlattener<'a> {
fn add_shadow_prim_to_draw_list<P>(
&mut self,
pending_primitive: PendingPrimitive<P>,
reference_frame_relative_offset: LayoutVector2D,
) where
P: Internable<InternData = PrimitiveSceneData> + IsVisible,
P::Source: AsInstanceKind<Handle<P::Marker>> + InternDebug,
@ -2114,7 +2164,6 @@ impl<'a> DisplayListFlattener<'a> {
pending_primitive.clip_and_scroll.clip_chain_id,
pending_primitive.clip_and_scroll,
pending_primitive.prim,
reference_frame_relative_offset,
);
}
}
@ -2144,7 +2193,6 @@ impl<'a> DisplayListFlattener<'a> {
clip_and_scroll: ScrollNodeAndClipChain,
info: &LayoutPrimitiveInfo,
color: ColorF,
reference_frame_relative_offset: LayoutVector2D,
) {
if color.a == 0.0 {
// Don't add transparent rectangles to the draw list, but do consider them for hit
@ -2160,7 +2208,6 @@ impl<'a> DisplayListFlattener<'a> {
PrimitiveKeyKind::Rectangle {
color: color.into(),
},
reference_frame_relative_offset,
);
}
@ -2168,14 +2215,12 @@ impl<'a> DisplayListFlattener<'a> {
&mut self,
clip_and_scroll: ScrollNodeAndClipChain,
info: &LayoutPrimitiveInfo,
reference_frame_relative_offset: LayoutVector2D,
) {
self.add_primitive(
clip_and_scroll,
info,
Vec::new(),
PrimitiveKeyKind::Clear,
reference_frame_relative_offset,
);
}
@ -2187,7 +2232,6 @@ impl<'a> DisplayListFlattener<'a> {
orientation: LineOrientation,
color: ColorF,
style: LineStyle,
reference_frame_relative_offset: LayoutVector2D,
) {
// For line decorations, we can construct the render task cache key
// here during scene building, since it doesn't depend on device
@ -2249,7 +2293,6 @@ impl<'a> DisplayListFlattener<'a> {
cache_key,
color: color.into(),
},
reference_frame_relative_offset,
);
}
@ -2260,7 +2303,6 @@ impl<'a> DisplayListFlattener<'a> {
border_item: &BorderDisplayItem,
gradient_stops: ItemRange<GradientStop>,
pipeline_id: PipelineId,
reference_frame_relative_offset: LayoutVector2D,
) {
match border_item.details {
BorderDetails::NinePatch(ref border) => {
@ -2291,7 +2333,6 @@ impl<'a> DisplayListFlattener<'a> {
info,
Vec::new(),
prim,
reference_frame_relative_offset,
);
}
NinePatchBorderSource::Gradient(gradient) => {
@ -2315,7 +2356,6 @@ impl<'a> DisplayListFlattener<'a> {
info,
Vec::new(),
prim,
reference_frame_relative_offset,
);
}
NinePatchBorderSource::RadialGradient(gradient) => {
@ -2338,7 +2378,6 @@ impl<'a> DisplayListFlattener<'a> {
info,
Vec::new(),
prim,
reference_frame_relative_offset,
);
}
};
@ -2349,7 +2388,6 @@ impl<'a> DisplayListFlattener<'a> {
border,
border_item.widths,
clip_and_scroll,
reference_frame_relative_offset,
);
}
}
@ -2469,7 +2507,6 @@ impl<'a> DisplayListFlattener<'a> {
pub fn add_text(
&mut self,
clip_and_scroll: ScrollNodeAndClipChain,
offset: LayoutVector2D,
prim_info: &LayoutPrimitiveInfo,
font_instance_key: &FontInstanceKey,
text_color: &ColorF,
@ -2477,6 +2514,8 @@ impl<'a> DisplayListFlattener<'a> {
glyph_options: Option<GlyphOptions>,
pipeline_id: PipelineId,
) {
let offset = self.rf_mapper.current_offset();
let text_run = {
let instance_map = self.font_instances.read().unwrap();
let font_instance = match instance_map.get(font_instance_key) {
@ -2542,7 +2581,6 @@ impl<'a> DisplayListFlattener<'a> {
prim_info,
Vec::new(),
text_run,
offset,
);
}
@ -2557,7 +2595,6 @@ impl<'a> DisplayListFlattener<'a> {
image_rendering: ImageRendering,
alpha_type: AlphaType,
color: ColorF,
reference_frame_relative_offset: LayoutVector2D,
) {
let mut prim_rect = info.rect;
simplify_repeated_primitive(&stretch_size, &mut tile_spacing, &mut prim_rect);
@ -2592,7 +2629,6 @@ impl<'a> DisplayListFlattener<'a> {
image_rendering,
alpha_type,
},
reference_frame_relative_offset,
);
}
@ -2604,7 +2640,6 @@ impl<'a> DisplayListFlattener<'a> {
color_depth: ColorDepth,
color_space: YuvColorSpace,
image_rendering: ImageRendering,
reference_frame_relative_offset: LayoutVector2D,
) {
let format = yuv_data.get_format();
let yuv_key = match yuv_data {
@ -2624,7 +2659,6 @@ impl<'a> DisplayListFlattener<'a> {
color_space,
image_rendering,
},
reference_frame_relative_offset,
);
}

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

@ -6861,6 +6861,12 @@ GeneralParser<ParseHandler, Unit>::classDefinition(
}
if (propType == PropertyType::Field) {
// TODO(khyperia): Delete the two lines below once fields are fully
// supported in the backend. We can't fail in BytecodeCompiler because of
// lazy parsing.
errorAt(propNameOffset, JSMSG_FIELDS_NOT_SUPPORTED);
return null();
if (isStatic) {
errorAt(propNameOffset, JSMSG_BAD_METHOD_DEF);
return null();
@ -6893,11 +6899,7 @@ GeneralParser<ParseHandler, Unit>::classDefinition(
return null();
}
// TODO(khyperia): Change the below to `continue;` once fields are
// fully supported in the backend. We can't fail in BytecodeCompiler
// because of lazy parsing.
errorAt(propNameOffset, JSMSG_FIELDS_NOT_SUPPORTED);
return null();
continue;
}
if (propType != PropertyType::Getter && propType != PropertyType::Setter &&

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

@ -8460,16 +8460,17 @@ JS_FN_HELP("parseBin", BinParse, 1, 0,
JS_FN_HELP("newGlobal", NewGlobal, 1, 0,
"newGlobal([options])",
" Return a new global object in a new realm. If options\n"
" is given, it may have any of the following properties:\n"
"\n"
" sameZoneAs: The compartment will be in the same zone as the given\n"
" object (defaults to a new zone).\n"
" sameCompartmentAs: The global will be in the same compartment and\n"
" zone as the given object (defaults to the current compartment,\n"
" unless the --more-compartments option is used).\n"
" Return a new global object/realm. The new global is created in the\n"
" 'newGlobal' function object's compartment and zone, unless the\n"
" '--more-compartments' command-line flag was given, in which case new\n"
" globals get a fresh compartment and zone. If options is given, it may\n"
" have any of the following properties:\n"
" sameCompartmentAs: If an object, the global will be in the same\n"
" compartment and zone as the given object.\n"
" sameZoneAs: The global will be in a new compartment in the same zone\n"
" as the given object.\n"
" newCompartment: If true, the global will always be created in a new\n"
" compartment, even without --more-compartments.\n"
" compartment and zone.\n"
" cloneSingletons: If true, always clone the objects baked into\n"
" scripts, even if it's a top-level script that will only run once\n"
" (defaults to using them directly in scripts that will only run\n"

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

@ -610,7 +610,25 @@ nsresult nsZipArchive::BuildFileList(PRFileDesc *aFd) {
#elif defined(XP_UNIX)
madvise(const_cast<uint8_t *>(startp), readaheadLength, MADV_WILLNEED);
#elif defined(XP_WIN)
if (aFd) {
static auto prefetchVirtualMemory =
reinterpret_cast<BOOL (*)(HANDLE, ULONG_PTR, PVOID, ULONG)>(
GetProcAddress(GetModuleHandle(L"kernel32.dll"),
"PrefetchVirtualMemory"));
if (prefetchVirtualMemory) {
// Normally, we'd use WIN32_MEMORY_RANGE_ENTRY, but that requires
// a different _WIN32_WINNT value before including windows.h, but
// that causes complications with unified sources. It's a simple
// enough struct anyways.
struct {
PVOID VirtualAddress;
SIZE_T NumberOfBytes;
} entry;
entry.VirtualAddress = const_cast<uint8_t *>(startp);
entry.NumberOfBytes = readaheadLength;
prefetchVirtualMemory(GetCurrentProcess(), 1, &entry, 0);
readaheadLength = 0;
}
if (readaheadLength && aFd) {
HANDLE hFile = (HANDLE)PR_FileDesc2NativeHandle(aFd);
mozilla::ReadAhead(hFile, 0, readaheadLength);
}

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

@ -0,0 +1,23 @@
// -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
// 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";
// Attempts to verify a certificate for a time a few weeks into the future in
// the hopes of avoiding mass test failures when the certificates all expire.
// If this test fails, the certificates probably need to be regenerated.
// See bug 1525191.
add_task(async function() {
do_get_profile();
let certDB = Cc["@mozilla.org/security/x509certdb;1"]
.getService(Ci.nsIX509CertDB);
addCertFromFile(certDB, "bad_certs/test-ca.pem", "CTu,,");
let threeWeeksFromNowInSeconds = (Date.now() / 1000) +
(3 * 7 * 24 * 60 * 60);
let ee = constructCertFromFile("bad_certs/default-ee.pem");
await checkCertErrorGenericAtTime(certDB, ee, PRErrorCodeSuccess,
certificateUsageSSLServer,
threeWeeksFromNowInSeconds, false,
"test.example.com");
});

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

@ -53,6 +53,8 @@ run-sequentially = hardcoded ports
[test_cert_dbKey.js]
[test_cert_eku.js]
[test_cert_embedded_null.js]
[test_cert_expiration_canary.js]
run-if = nightly_build
[test_cert_keyUsage.js]
[test_cert_isBuiltInRoot.js]
[test_cert_isBuiltInRoot_reload.js]

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

@ -35,6 +35,3 @@
[Cloned responses should provide the same data]
expected: FAIL
[Check Response's clone with default values, without body]
expected: FAIL

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

@ -1,4 +0,0 @@
[response-init-001.html]
[Check default value for statusText attribute]
expected: FAIL