Revision e9f36aa0be6522db24e0d27b293a78ba68214d02 authored by Ehsan Karamad on 25 April 2018, 15:35:03 UTC, committed by Blink WPT Bot on 25 April 2018, 15:45:19 UTC
If 'vertical-scroll' is disabled for an <iframe>, then it should not be able to affect the vertical scroll position. One way to block is to use scripted scrolling by calling "element.scrollIntoView()". To block such frames (whose feature's disabled), programmatic recursive scroll calls are not forwarded to parent frames. This means if a given <iframe> is blocked, then all the calls to scrollIntoView() are limited to the scope of frame (i.e., elements becoming visible in the frame). This applies to all the nested <iframe>'s of a disabled frame as well since they would have the feature disabled as part of propagating the container policy. Link to explainer/design document for "vertical-scroll": https://docs.google.com/document/d/1qiWelnMlsOHuT_CQ0Zm_qEAf54HS5DhoIvEDHBlfqps/edit?usp=sharing Bug: 611982 Change-Id: I0e06b399ad890e263128b997cfbb04eb3bdd1494 Reviewed-on: https://chromium-review.googlesource.com/1014191 Reviewed-by: Ian Clelland <iclelland@chromium.org> Reviewed-by: Ehsan Karamad <ekaramad@chromium.org> Reviewed-by: David Bokan <bokan@chromium.org> Commit-Queue: Ehsan Karamad <ekaramad@chromium.org> Cr-Commit-Position: refs/heads/master@{#553561}
1 parent 6c62c5b
interfaces.https.html
<!doctype html>
<meta charset=utf-8>
<title>WebRTC IDL Tests</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script>
<script src="./RTCPeerConnection-helper.js"></script>
<script>
'use strict';
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateAnswer()
// generateMediaStreamTrack()
// Put the global IDL test objects under a parent object.
// This allows easier search for the test cases when
// viewing the web page
const idlTestObjects = {};
// Helper function to create RTCTrackEvent object
function initTrackEvent() {
const pc = new RTCPeerConnection();
const transceiver = pc.addTransceiver('audio');
const { sender, receiver } = transceiver;
const { track } = receiver;
return new RTCTrackEvent('track', {
receiver, track, transceiver
});
}
// List of async test driver functions
const asyncInitTasks = [
asyncInitCertificate,
asyncInitTransports,
asyncInitMediaStreamTrack,
];
// Asynchronously generate an RTCCertificate
function asyncInitCertificate() {
return RTCPeerConnection.generateCertificate({
name: 'RSASSA-PKCS1-v1_5',
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: 'SHA-256'
}).then(cert => {
idlTestObjects.certificate = cert;
});
}
// Asynchronously generate instances of
// RTCSctpTransport, RTCDtlsTransport,
// and RTCIceTransport
function asyncInitTransports() {
const pc = new RTCPeerConnection();
pc.createDataChannel('test');
// setting answer description initializes pc.sctp
return pc.createOffer()
.then(offer =>
pc.setLocalDescription(offer)
.then(() => generateAnswer(offer)))
.then(answer => pc.setRemoteDescription(answer))
.then(() => {
const sctpTransport = pc.sctp;
assert_true(sctpTransport instanceof RTCSctpTransport,
'Expect pc.sctp to be instance of RTCSctpTransport');
idlTestObjects.sctpTransport = sctpTransport;
const dtlsTransport = sctpTransport.transport;
assert_true(dtlsTransport instanceof RTCDtlsTransport,
'Expect sctpTransport.transport to be instance of RTCDtlsTransport');
idlTestObjects.dtlsTransport = dtlsTransport;
const iceTransport = dtlsTransport.transport;
idlTestObjects.iceTransport = iceTransport;
});
}
// Asynchoronously generate MediaStreamTrack from getUserMedia
function asyncInitMediaStreamTrack() {
return navigator.mediaDevices.getUserMedia({ audio: true })
.then(mediaStream => {
const tracks = mediaStream.getTracks();
assert_greater_than(tracks.length, 0,
'Expect media stream to have at least one track');
idlTestObjects.mediaStreamTrack = tracks[0];
});
}
// Run all async test drivers, report and swallow any error
// thrown/rejected. Proper test for correct initialization
// of the objects are done in their respective test files.
function asyncInit() {
return Promise.all(asyncInitTasks.map(
task => {
const t = async_test(`Test driver for ${task.name}`);
let promise;
t.step(() => {
promise = task().then(
t.step_func_done(),
t.step_func(err =>
assert_unreached(`Failed to run ${task.name}: ${err}`)));
});
return promise;
}));
}
promise_test(async t => {
await asyncInit();
const idlArray = new IdlArray();
let webrtcIdl = fetch('/interfaces/webrtc-pc.idl').then(r => r.text());
let mediacaptureMainIdl = fetch('/interfaces/mediacapture-main.idl').then(r => r.text());
idlArray.add_untested_idls(mediacaptureMainIdl, { only: ['MediaStreamConstraints'] });
idlArray.add_idls(webrtcIdl);
idlArray.add_untested_idls('interface EventHandler {};');
idlArray.add_idls('interface EventTarget {};');
idlArray.add_idls('interface MediaStreamTrack : EventTarget {};');
idlArray.add_objects({
'RTCPeerConnection': [`new RTCPeerConnection()`],
'RTCSessionDescription': [`new RTCSessionDescription({ type: 'offer' })`],
'RTCIceCandidate': [`new RTCIceCandidate({ sdpMid: 1 })`],
'RTCDataChannel': [`new RTCPeerConnection().createDataChannel('')`],
'RTCRtpTransceiver': [`new RTCPeerConnection().addTransceiver('audio')`],
'RTCRtpSender': [`new RTCPeerConnection().addTransceiver('audio').sender`],
'RTCRtpReceiver': [`new RTCPeerConnection().addTransceiver('audio').receiver`],
'RTCPeerConnectionIceEvent': [`new RTCPeerConnectionIceEvent('ice')`],
'RTCPeerConnectionIceErrorEvent':
[`new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 });`],
'RTCTrackEvent': [`initTrackEvent()`],
'RTCErrorEvent': [`new RTCErrorEvent('error')`],
'RTCDataChannelEvent': [`new RTCDataChannelEvent('channel',
{ channel: new RTCPeerConnection().createDataChannel('') })`],
// Async initialized objects below
'RTCCertificate': ['idlTestObjects.certificate'],
'RTCSctpTransport': ['idlTestObjects.sctpTransport'],
'RTCDtlsTransport': ['idlTestObjects.dtlsTransport'],
'RTCIceTransport': ['idlTestObjects.iceTransport'],
// Test on both MediaStreamTrack from getUserMedia and transceiver
'MediaStreamTrack': [
`idlTestObjects.mediaStreamTrack`,
`generateMediaStreamTrack('audio')`]
});
idlArray.test();
}, 'Main test driver');
/*
TODO
RTCRtpContributingSource
RTCRtpSynchronizationSource
RTCDTMFSender
RTCDTMFToneChangeEvent
RTCIdentityProviderRegistrar
RTCIdentityAssertion
*/
</script>
Computing file changes ...