Changeset 202953 in webkit
- Timestamp:
- Jul 7, 2016 6:57:44 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r202950 r202953 1 2016-07-07 Ryosuke Niwa <rniwa@webkit.org> 2 3 Replace scoped flag in Event by composed flag 4 https://bugs.webkit.org/show_bug.cgi?id=158415 5 6 Reviewed by Chris Dumez. 7 8 Updated the tests to reflect the rename of scoped to composed and the negation of its semantics. 9 Now every Event is assumed to be scoped / non-composed by default, and we need to explicitly set 10 composed to true in order for events to cross shadow boundaries. 11 12 Also, every Event behaves as if related target is assumed to be scoped in the old terminology 13 althoug the flag no longer exists. 14 15 * fast/shadow-dom/Extensions-to-Event-Interface-expected.txt: 16 * fast/shadow-dom/Extensions-to-Event-Interface.html: Removed a test case that was testing 17 relatedTargetScoped to false since this flag no longer exists. 18 * fast/shadow-dom/MouseEvent-prototype-offsetX-offsetY.html: 19 * fast/shadow-dom/event-inside-shadow-tree.html: 20 * fast/shadow-dom/event-inside-slotted-node.html: 21 * fast/shadow-dom/event-with-related-target.html: 22 * fast/shadow-dom/trusted-event-scoped-flags-expected.txt: 23 * fast/shadow-dom/trusted-event-scoped-flags.html: 24 * fast/xmlhttprequest/xmlhttprequest-get-expected.txt: 25 * http/tests/workers/worker-importScriptsOnError-expected.txt: 26 * inspector/model/remote-object-get-properties-expected.txt: 27 1 28 2016-07-07 Dean Jackson <dino@apple.com> 2 29 -
trunk/LayoutTests/fast/shadow-dom/Extensions-to-Event-Interface-expected.txt
r200580 r202953 3 3 PASS composedPath() must return an empty array when the event has not been dispatched 4 4 PASS composedPath() must return an empty array when the event is no longer dispatched 5 PASS scoped must exist on Event 6 PASS scoped on EventInit must default to false 7 PASS scoped on EventInit must set the scoped flag 8 PASS relatedTargetScoped must exist on Event 9 PASS relatedTargetScoped on EventInit must default to false 10 PASS relatedTargetScoped on EventInit must set the scoped flag 11 PASS The event must propagate out of open mode shadow boundaries when the scoped flag is unset 12 PASS The event must propagate out of closed mode shadow boundaries when the scoped flag is unset 13 PASS The event must not propagate out of open mode shadow boundaries when the scoped flag is set 14 PASS The event must not propagate out of closed mode shadow boundaries when the scoped flag is set 15 PASS The event must propagate out of open mode shadow boundaries when the scoped flag is unset on an event with relatedTarget 16 PASS The event must propagate out of closed mode shadow boundaries when the scoped flag is unset on an event with relatedTarget 17 PASS The event must not propagate out of open mode shadow boundaries when the scoped flag is set on an event with relatedTarget 18 PASS The event must not propagate out of closed mode shadow boundaries when the scoped flag is set on an event with relatedTarget 5 PASS composed must exist on Event 6 PASS composed on EventInit must default to false 7 PASS composed on EventInit must set the composed flag 8 PASS The event must propagate out of open mode shadow boundaries when the composed flag is set 9 PASS The event must propagate out of closed mode shadow boundaries when the composed flag is set 10 PASS The event must not propagate out of open mode shadow boundaries when the composed flag is unset 11 PASS The event must not propagate out of closed mode shadow boundaries when the composed flag is unset 12 PASS The event must not propagate out of open mode shadow boundaries when the composed flag is unset on an event with relatedTarget 13 PASS The event must not propagate out of closed mode shadow boundaries when the composed flag is unset on an event with relatedTarget 19 14 PASS The event must not propagate out of open mode shadow tree of the target but must propagate out of inner shadow trees when the scoped flag is set 20 15 PASS The event must not propagate out of closed mode shadow tree of the target but must propagate out of inner shadow trees when the scoped flag is set -
trunk/LayoutTests/fast/shadow-dom/Extensions-to-Event-Interface.html
r200580 r202953 32 32 33 33 test(function () { 34 assert_true(' scoped' in Event.prototype);35 assert_true(' scoped' in new Event('my-event'));36 }, ' scoped must exist on Event');34 assert_true('composed' in Event.prototype); 35 assert_true('composed' in new Event('my-event')); 36 }, 'composed must exist on Event'); 37 37 38 38 test(function () { 39 39 var event = new Event('my-event'); 40 assert_false(event.scoped); 41 }, 'scoped on EventInit must default to false'); 42 43 test(function () { 44 var event = new Event('my-event', {scoped: true}); 45 assert_true(event.scoped); 46 47 event = new Event('my-event', {scoped: false}); 48 assert_false(event.scoped); 49 }, 'scoped on EventInit must set the scoped flag'); 50 51 test(function () { 52 assert_true('relatedTargetScoped' in Event.prototype); 53 assert_true('relatedTargetScoped' in new Event('my-event')); 54 }, 'relatedTargetScoped must exist on Event'); 55 56 test(function () { 57 var event = new Event('my-event'); 58 assert_false(event.relatedTargetScoped); 59 }, 'relatedTargetScoped on EventInit must default to false'); 60 61 test(function () { 62 var event = new Event('my-event', {relatedTargetScoped: true}); 63 assert_true(event.relatedTargetScoped); 64 65 event = new Event('my-event', {relatedTargetScoped: false}); 66 assert_false(event.relatedTargetScoped); 67 }, 'relatedTargetScoped on EventInit must set the scoped flag'); 40 assert_false(event.composed); 41 }, 'composed on EventInit must default to false'); 42 43 test(function () { 44 var event = new Event('my-event', {composed: true}); 45 assert_true(event.composed); 46 47 event = new Event('my-event', {composed: false}); 48 assert_false(event.composed); 49 }, 'composed on EventInit must set the composed flag'); 68 50 69 51 /* … … 77 59 */ 78 60 79 function test UnscopedEvent(mode) {80 test(function () { 81 var nodes = createTestTree(mode); 82 var log = dispatchEventWithLog(nodes, nodes.A1a, new Event('my-event', { scoped: false, bubbles: true}));61 function testComposedEvent(mode) { 62 test(function () { 63 var nodes = createTestTree(mode); 64 var log = dispatchEventWithLog(nodes, nodes.A1a, new Event('my-event', {composed: true, bubbles: true})); 83 65 84 66 var expectedPath = ['A1a', 'A1-SR', 'A1', 'A-SR', 'A']; … … 89 71 assert_array_equals(log.pathAtTargets[2], mode == 'open' ? expectedPath : ['A1', 'A-SR', 'A'], 90 72 'composedPath must only contain unclosed nodes of the current target.'); 91 }, 'The event must propagate out of ' + mode + ' mode shadow boundaries when the scoped flag is unset');92 } 93 94 test UnscopedEvent('open');95 test UnscopedEvent('closed');73 }, 'The event must propagate out of ' + mode + ' mode shadow boundaries when the composed flag is set'); 74 } 75 76 testComposedEvent('open'); 77 testComposedEvent('closed'); 96 78 97 79 /* … … 105 87 */ 106 88 107 function test ScopedEvent(mode) {108 test(function () { 109 var nodes = createTestTree(mode); 110 var log = dispatchEventWithLog(nodes, nodes.A1a, new Event('my-event', { scoped: true, bubbles: true}));89 function testNonComposedEvent(mode) { 90 test(function () { 91 var nodes = createTestTree(mode); 92 var log = dispatchEventWithLog(nodes, nodes.A1a, new Event('my-event', {composed: false, bubbles: true})); 111 93 112 94 var expectedPath = ['A1a', 'A1-SR']; … … 115 97 assert_array_equals(log.pathAtTargets[0], expectedPath); 116 98 assert_array_equals(log.pathAtTargets[1], expectedPath); 117 }, 'The event must not propagate out of ' + mode + ' mode shadow boundaries when the scoped flag is set'); 118 } 119 120 testScopedEvent('open'); 121 testScopedEvent('closed'); 122 123 /* 124 -SR: ShadowRoot -S: Slot target: (~) relatedTarget: [~] *: indicates start digit: event path order 125 A (4) [4] ----------------------- A-SR (3) 126 + B ------------ B-SR + A1 (2) ------- A1-SR (1) 127 + C + B1 --- B1-SR + A2-S [*; 0-3] + A1a (*; 0) 128 + D --- D-SR + B1a + B1b --- B1b-SR 129 + D1 + B1c-S + B1b1 130 + B1b2 131 */ 132 133 function testUnscopedEventWithUnscopedRelatedTarget(mode) { 134 test(function () { 135 var nodes = createTestTree(mode); 136 var log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', {scoped: false, relatedTargetScoped: false, bubbles: true, relatedTarget: nodes['A2-S']})); 137 138 var expectedPath = ['A1a', 'A1-SR', 'A1', 'A-SR', 'A']; 139 var pathExposedToA1 = ['A1', 'A-SR', 'A']; 140 var pathExposedToA = ['A']; 141 assert_array_equals(log.eventPath, expectedPath); 142 assert_array_equals(log.eventPath.length, log.pathAtTargets.length); 143 assert_array_equals(log.pathAtTargets[0], expectedPath); 144 assert_array_equals(log.pathAtTargets[1], expectedPath); 145 assert_array_equals(log.pathAtTargets[2], mode == 'open' ? expectedPath : pathExposedToA1); 146 assert_array_equals(log.pathAtTargets[3], mode == 'open' ? expectedPath : pathExposedToA1); 147 assert_array_equals(log.pathAtTargets[4], mode == 'open' ? expectedPath : pathExposedToA); 148 assert_array_equals(log.relatedTargets, ['A2-S', 'A2-S', 'A2-S', 'A2-S', 'A']); 149 }, 'The event must propagate out of ' + mode + ' mode shadow boundaries when the scoped flag is unset on an event with relatedTarget'); 150 } 151 152 testUnscopedEventWithUnscopedRelatedTarget('open'); 153 testUnscopedEventWithUnscopedRelatedTarget('closed'); 99 }, 'The event must not propagate out of ' + mode + ' mode shadow boundaries when the composed flag is unset'); 100 } 101 102 testNonComposedEvent('open'); 103 testNonComposedEvent('closed'); 154 104 155 105 /* … … 163 113 */ 164 114 165 function test ScopedEventWithUnscopedRelatedTarget(mode) {166 test(function () { 167 var nodes = createTestTree(mode); 168 var log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', { scoped: true, relatedTargetScoped: false, bubbles: true, relatedTarget: nodes['A2-S']}));115 function testNonComposedEventWithRelatedTarget(mode) { 116 test(function () { 117 var nodes = createTestTree(mode); 118 var log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', {composed: false, bubbles: true, relatedTarget: nodes['A2-S']})); 169 119 170 120 var expectedPath = ['A1a', 'A1-SR']; … … 174 124 assert_array_equals(log.pathAtTargets[1], expectedPath); 175 125 assert_array_equals(log.relatedTargets, ['A2-S', 'A2-S']); 176 }, 'The event must not propagate out of ' + mode + ' mode shadow boundaries when the scoped flag isset on an event with relatedTarget');177 } 178 179 test ScopedEventWithUnscopedRelatedTarget('open');180 test ScopedEventWithUnscopedRelatedTarget('closed');126 }, 'The event must not propagate out of ' + mode + ' mode shadow boundaries when the composed flag is unset on an event with relatedTarget'); 127 } 128 129 testNonComposedEventWithRelatedTarget('open'); 130 testNonComposedEventWithRelatedTarget('closed'); 181 131 182 132 /* … … 221 171 */ 222 172 223 function test UnscopedEventWithScopedRelatedTarget(mode) {224 test(function () { 225 var nodes = createTestTree(mode); 226 log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', { scoped: false, relatedTargetScoped: true, bubbles: true, relatedTarget: nodes['A2-S']}));173 function testComposedEventWithRelatedTarget(mode) { 174 test(function () { 175 var nodes = createTestTree(mode); 176 log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', {composed: true, bubbles: true, relatedTarget: nodes['A2-S']})); 227 177 228 178 var expectedPath = ['A1a', 'A1-SR', 'A1', 'A-SR']; … … 238 188 } 239 189 240 test UnscopedEventWithScopedRelatedTarget('open');241 test UnscopedEventWithScopedRelatedTarget('closed');190 testComposedEventWithRelatedTarget('open'); 191 testComposedEventWithRelatedTarget('closed'); 242 192 243 193 /* … … 251 201 */ 252 202 253 function test UnscopedEventWithScopedRelatedTargetThroughSlot(mode) {254 test(function () { 255 var nodes = createTestTree(mode); 256 log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', { scoped: false, relatedTargetScoped: true, bubbles: true, relatedTarget: nodes.A1a}));203 function testComposedEventThroughSlot(mode) { 204 test(function () { 205 var nodes = createTestTree(mode); 206 log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {composed: true, bubbles: true, relatedTarget: nodes.A1a})); 257 207 258 208 var expectedPath = ['B1a', 'B1c-S', 'B1-SR', 'B1', 'B-SR', 'B', 'A2-S', 'A-SR', 'A']; … … 278 228 } 279 229 280 test UnscopedEventWithScopedRelatedTargetThroughSlot('open');281 test UnscopedEventWithScopedRelatedTargetThroughSlot('closed');230 testComposedEventThroughSlot('open'); 231 testComposedEventThroughSlot('closed'); 282 232 283 233 </script> -
trunk/LayoutTests/fast/shadow-dom/MouseEvent-prototype-offsetX-offsetY.html
r200536 r202953 42 42 43 43 var eventLogs = attachLoggers([target, container, host, document.body]); 44 var mouseEvent = new MouseEvent('mousedown', {clientX: 51, clientY: 37, scoped: false, bubbles: true});44 var mouseEvent = new MouseEvent('mousedown', {clientX: 51, clientY: 37, composed: true, bubbles: true}); 45 45 target.dispatchEvent(mouseEvent); 46 46 … … 79 79 80 80 var eventLogs = attachLoggers([target, container, shadowRoot, host, document.body]); 81 var mouseEvent = new MouseEvent('mousedown', {clientX: 51, clientY: 37, scoped: false, bubbles: true});81 var mouseEvent = new MouseEvent('mousedown', {clientX: 51, clientY: 37, composed: true, bubbles: true}); 82 82 target.dispatchEvent(mouseEvent); 83 83 -
trunk/LayoutTests/fast/shadow-dom/event-inside-shadow-tree.html
r190214 r202953 44 44 var shadow = createShadowRootWithGrandChild(mode); 45 45 46 log = dispatchEventWithLog(shadow.target, new Event('foo', { bubbles: true}));46 log = dispatchEventWithLog(shadow.target, new Event('foo', {composed: true, bubbles: true})); 47 47 48 48 assert_array_equals(log.length, 4, 'EventPath must contain [target, parent, shadow root, shadow host]'); … … 63 63 document.body.appendChild(shadow.host); 64 64 65 log = dispatchEventWithLog(shadow.target, new Event('foo', { bubbles: true}));65 log = dispatchEventWithLog(shadow.target, new Event('foo', {composed: true, bubbles: true})); 66 66 67 67 assert_array_equals(log.length, 7, 'EventPath must contain [target, parent, shadow root, shadow host, body, html, document]'); … … 101 101 var shadow = createNestedShadowRoot(innerMode, outerMode); 102 102 103 log = dispatchEventWithLog(shadow.target, new Event('bar', { bubbles: true}));103 log = dispatchEventWithLog(shadow.target, new Event('bar', {composed: true, bubbles: true})); 104 104 105 105 assert_array_equals(log.length, 6, 'EventPath must contain [target, inner root, inner host, parent, outer root, outer host]'); … … 124 124 document.body.appendChild(shadow.outerHost); 125 125 126 log = dispatchEventWithLog(shadow.target, new Event('bar', { bubbles: true}));126 log = dispatchEventWithLog(shadow.target, new Event('bar', {composed: true, bubbles: true})); 127 127 128 128 assert_array_equals(log.length, 6, 'EventPath must contain [target, inner root, inner host, parent, outer root, outer host]'); -
trunk/LayoutTests/fast/shadow-dom/event-inside-slotted-node.html
r200464 r202953 76 76 var shadow = createShadowHostWithAssignedGrandChild(mode); 77 77 78 log = dispatchEventWithLog(shadow, new Event('foo', {bubbles: true }));78 log = dispatchEventWithLog(shadow, new Event('foo', {bubbles: true, composed: true})); 79 79 80 80 assert_equals(log.length, 6, 'EventPath must contain [target, target parent, slot, slot parent, shadow root, shadow host]'); … … 97 97 document.body.appendChild(shadow.host); 98 98 99 log = dispatchEventWithLog(shadow, new Event('foo', {bubbles: true }));99 log = dispatchEventWithLog(shadow, new Event('foo', {bubbles: true, composed: true})); 100 100 101 101 assert_equals(log.length, 9, 'EventPath must contain [target, target parent, slot, slot parent, shadow root, shadow host, body, html, document]'); … … 175 175 var shadow = createNestedShadowTreesWithSlots(innerMode, outerUpperMode, outerLowerMode); 176 176 177 log = dispatchEventWithLog(shadow, new Event('foo', {bubbles: true }));177 log = dispatchEventWithLog(shadow, new Event('foo', {bubbles: true, composed: true})); 178 178 179 179 assert_equals(log.length, 15, 'EventPath must contain 15 targets'); … … 225 225 shadow.target = shadow.innerSlot; 226 226 227 log = dispatchEventWithLog(shadow, new Event('foo', {bubbles: true }));227 log = dispatchEventWithLog(shadow, new Event('foo', {bubbles: true, composed: true})); 228 228 229 229 assert_equals(log.length, 12, 'EventPath must contain 12 targets'); -
trunk/LayoutTests/fast/shadow-dom/event-with-related-target.html
r198056 r202953 17 17 /* 18 18 -SR: ShadowRoot -S: Slot target: (~) relatedTarget: [~] *: indicates start digit: event path order 19 A (8) --------------------------------------------- A-SR (7)20 + B (5) [5-8] --- B-SR (4) + A1 -------- A1-SR21 + C + B1 (3) [*; 0-4] --- B1-SR (2) + A2-S (6)+ A1a22 + D --- D-SR 23 + D1 24 19 A ----------------------------------------------- A-SR 20 + B ----------- B-SR (4) + A1 --- A1-SR 21 + C + B1 (3) [*; 0-4] --- B1-SR (2) + A2-S + A1a 22 + D --- D-SR + B1a (*; 0) + B1b [1,2] --- B1b-SR 23 + D1 + B1c-S (1) + B1b1 24 + B1b2 25 25 */ 26 26 function testEventAtB1aWithB1a(mode) { … … 28 28 var nodes = createTestTree(mode); 29 29 30 log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, relatedTarget: nodes.B1}));31 32 assert_array_equals(log.eventPath, 33 ['B1a', 'B1c-S', 'B1-SR', 'B1', 'B-SR' , 'B', 'A2-S', 'A-SR', 'A'], 'The event path must be correct.');34 assert_array_equals(log.relatedTargets, 35 ['B1', 'B1', 'B1', 'B1', 'B1' , 'B', 'B', 'B', 'B'], 'The related targets must be correct.');30 log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1})); 31 32 assert_array_equals(log.eventPath, 33 ['B1a', 'B1c-S', 'B1-SR', 'B1', 'B-SR'], 'The event path must be correct.'); 34 assert_array_equals(log.relatedTargets, 35 ['B1', 'B1', 'B1', 'B1', 'B1'], 'The related targets must be correct.'); 36 36 37 37 }, 'Firing an event at B1a with relatedNode at B1 with ' + mode + ' mode shadow trees'); … … 43 43 /* 44 44 -SR: ShadowRoot -S: Slot target: (~) relatedTarget: [~] *: indicates start digit: event path order 45 A (8) -------------------------------------------- A-SR (7)46 + B (5) [5-8] --- B-SR (4) + A1 ------ A1-SR47 + C + B1 (3) [0,3-4] --- B1-SR (2) + A2-S (6)+ A1a48 + D --- D-SR 49 + D1 50 45 A ------------------------------------------------- A-SR 46 + B ----------- B-SR (4) + A1 --- A1-SR 47 + C + B1 (3) [0,3-4] --- B1-SR (2) + A2-S + A1a 48 + D --- D-SR + B1a (*; 0) + B1b [1,2] --- B1b-SR 49 + D1 + B1c-S (1) + B1b1 [*] 50 + B1b2 51 51 */ 52 52 function testEventAtB1aWithB1b1(mode) { … … 54 54 var nodes = createTestTree(mode); 55 55 56 log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, relatedTarget: nodes.B1b1}));57 58 assert_array_equals(log.eventPath, 59 ['B1a', 'B1c-S', 'B1-SR', 'B1', 'B-SR' , 'B', 'A2-S', 'A-SR', 'A'], 'The event path must be correct.');60 assert_array_equals(log.relatedTargets, 61 ['B1', 'B1b', 'B1b', 'B1', 'B1' , 'B', 'B', 'B', 'B'], 'The related targets must be correct.');56 log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1b1})); 57 58 assert_array_equals(log.eventPath, 59 ['B1a', 'B1c-S', 'B1-SR', 'B1', 'B-SR'], 'The event path must be correct.'); 60 assert_array_equals(log.relatedTargets, 61 ['B1', 'B1b', 'B1b', 'B1', 'B1'], 'The related targets must be correct.'); 62 62 63 63 }, 'Firing an event at B1a with relatedNode at B1b1 with ' + mode + ' mode shadow trees'); … … 69 69 /* 70 70 -SR: ShadowRoot -S: Slot target: (~) relatedTarget: [~] *: indicates start digit: event path order 71 A (9) ------------------------------------------------------- A-SR (8)72 + B (6) [6-9] --- B-SR (5) + A1 ------ A1-SR73 + C + B1 (4) ------- -- B1-SR (3) + A2-S (7)+ A1a74 + D --- D-SR 75 + D1 76 71 A -------------------------------------------------- A-SR 72 + B ------------- B-SR (5) + A1 --- A1-SR 73 + C + B1 (4) ------- B1-SR (3) + A2-S + A1a 74 + D --- D-SR + B1a [*; 0-5] + B1b (2) --- B1b-SR (1) 75 + D1 + B1c-S + B1b1 (*; 0) 76 + B1b2 77 77 */ 78 78 function testEventAtB1b1WithB1a(mode) { … … 80 80 var nodes = createTestTree(mode); 81 81 82 log = dispatchEventWithLog(nodes, nodes.B1b1, new MouseEvent('foo', {bubbles: true, relatedTarget: nodes.B1a}));83 84 assert_array_equals(log.eventPath, 85 ['B1b1', 'B1b-SR', 'B1b', 'B1-SR', 'B1', 'B-SR' , 'B', 'A2-S', 'A-SR', 'A'], 'The event path must be correct.');86 assert_array_equals(log.relatedTargets, 87 ['B1a', 'B1a', 'B1a', 'B1a', 'B1a', 'B1a' , 'B', 'B', 'B', 'B'], 'The related targets must be correct.');82 log = dispatchEventWithLog(nodes, nodes.B1b1, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1a})); 83 84 assert_array_equals(log.eventPath, 85 ['B1b1', 'B1b-SR', 'B1b', 'B1-SR', 'B1', 'B-SR'], 'The event path must be correct.'); 86 assert_array_equals(log.relatedTargets, 87 ['B1a', 'B1a', 'B1a', 'B1a', 'B1a', 'B1a'], 'The related targets must be correct.'); 88 88 89 89 }, 'Firing an event at B1b1 with relatedNode at B1a with ' + mode + ' mode shadow trees'); … … 106 106 var nodes = createTestTree(mode); 107 107 108 log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, relatedTarget: nodes.D1}));108 log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.D1})); 109 109 110 110 assert_array_equals(log.eventPath, … … 132 132 var nodes = createTestTree(mode); 133 133 134 log = dispatchEventWithLog(nodes, nodes.D1, new MouseEvent('foo', {bubbles: true, relatedTarget: nodes.B1a}));134 log = dispatchEventWithLog(nodes, nodes.D1, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1a})); 135 135 136 136 assert_array_equals(log.eventPath, … … 158 158 var nodes = createTestTree(mode); 159 159 160 log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, relatedTarget: nodes.A1a}));160 log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.A1a})); 161 161 162 162 assert_array_equals(log.eventPath, … … 184 184 var nodes = createTestTree(mode); 185 185 186 log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', {bubbles: true, relatedTarget: nodes.B1a}));186 log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1a})); 187 187 188 188 assert_array_equals(log.eventPath, … … 213 213 214 214 nodes['A-SR'].removeChild(nodes.A1); 215 log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, relatedTarget: nodes.A1a}));215 log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.A1a})); 216 216 217 217 assert_array_equals(log.eventPath, … … 242 242 243 243 nodes['A-SR'].removeChild(nodes.A1); 244 log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', {bubbles: true, relatedTarget: nodes.B1a}));244 log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1a})); 245 245 246 246 assert_array_equals(log.eventPath, ['A1a', 'A1-SR', 'A1'], 'The event path must be correct.'); -
trunk/LayoutTests/fast/shadow-dom/trusted-event-scoped-flags-expected.txt
r198056 r202953 2 2 world 3 3 PASS input.type = "radio"; log(input, "change"); input.click(); eventType is "change" 4 PASS scoped is true 5 PASS relatedTargetScoped is false 4 PASS composed is false 6 5 7 6 PASS log(form, "reset"); form.reset(); eventType is "reset" 8 PASS scoped is true 9 PASS relatedTargetScoped is false 7 PASS composed is false 10 8 11 9 PASS form.focus(); log(input, "focus"); input.focus(); eventType is "focus" 12 PASS scoped is false 13 PASS relatedTargetScoped is true 10 PASS composed is true 14 11 15 12 PASS log(input, "blur"); form.focus(); eventType is "blur" 16 PASS scoped is false 17 PASS relatedTargetScoped is true 13 PASS composed is true 18 14 19 15 PASS input.type = "text"; log(input, "mousemove"); eventSender.mouseMoveTo(x, y); eventType is "mousemove" 20 PASS scoped is false 21 PASS relatedTargetScoped is false 16 PASS composed is true 22 17 23 18 PASS log(input, "mousedown"); eventSender.mouseDown(); eventType is "mousedown" 24 PASS scoped is false 25 PASS relatedTargetScoped is false 19 PASS composed is true 26 20 27 21 PASS log(input, "mouseup"); eventSender.mouseUp(); eventType is "mouseup" 28 PASS scoped is false 29 PASS relatedTargetScoped is false 22 PASS composed is true 30 23 31 24 PASS log(input, "mouseout"); eventSender.mouseMoveTo(0, 0); eventType is "mouseout" 32 PASS scoped is false 33 PASS relatedTargetScoped is true 25 PASS composed is true 34 26 35 27 PASS log(input, "mouseover"); eventSender.mouseMoveTo(x, y); eventType is "mouseover" 36 PASS scoped is false 37 PASS relatedTargetScoped is true 28 PASS composed is true 38 29 39 30 input.value = "hello"; eventSender.mouseMoveTo(input.offsetLeft + 1, y); eventSender.mouseDown(); 40 31 PASS log(input, "select"); eventSender.mouseMoveTo(input.offsetLeft + input.offsetWidth - 2, y); eventSender.mouseUp(); eventType is "select" 41 PASS scoped is true 42 PASS relatedTargetScoped is false 32 PASS composed is false 43 33 44 34 PASS log(editableElement, "selectstart"); eventSender.mouseMoveTo(editableElement.offsetLeft + 1, y); eventSender.mouseDown(); eventType is "selectstart" 45 PASS scoped is true 46 PASS relatedTargetScoped is false 35 PASS composed is false 47 36 48 37 PASS eventType is "load" 49 PASS scoped is true 50 PASS relatedTargetScoped is false 38 PASS composed is false 51 39 52 40 PASS eventType is "error" 53 PASS scoped is true 54 PASS relatedTargetScoped is false 41 PASS composed is false 55 42 56 43 PASS eventType is "scroll" 57 PASS scoped is true 58 PASS relatedTargetScoped is false 44 PASS composed is false 59 45 60 46 PASS eventType is "resize" 61 PASS scoped is true 62 PASS relatedTargetScoped is false 47 PASS composed is false 63 48 64 49 PASS successfullyParsed is true -
trunk/LayoutTests/fast/shadow-dom/trusted-event-scoped-flags.html
r198056 r202953 9 9 10 10 var eventType; 11 var scoped; 12 var relatedTargetScoped; 11 var composed; 13 12 14 13 function logEvent(event) { 15 14 eventType = event.type; 16 scoped = event.scoped; 17 relatedTargetScoped = event.relatedTargetScoped; 15 composed = event.composed; 18 16 } 19 17 20 18 function checkFlags(code, expected) { 21 19 shouldBeEqualToString(code ? code + '; eventType' : 'eventType', expected.eventType); 22 shouldBe('scoped', expected.scoped.toString()); 23 shouldBe('relatedTargetScoped', expected.relatedTargetScoped.toString()); 20 shouldBe('composed', expected.composed.toString()); 24 21 debug(''); 25 22 } … … 29 26 function log(target, eventName) { 30 27 eventType = undefined; 31 scoped = undefined; 32 relatedTargetScoped = undefined; 28 composed = undefined; 33 29 if (lastTarget) 34 30 lastTarget.removeEventListener(lastEventName, logEvent); … … 42 38 form.tabIndex = 0; 43 39 44 checkFlags('input.type = "radio"; log(input, "change"); input.click()', {eventType: 'change', scoped: true, relatedTargetScoped: false});45 checkFlags('log(form, "reset"); form.reset()', {eventType: 'reset', scoped: true, relatedTargetScoped: false});40 checkFlags('input.type = "radio"; log(input, "change"); input.click()', {eventType: 'change', composed: false}); 41 checkFlags('log(form, "reset"); form.reset()', {eventType: 'reset', composed: false}); 46 42 47 checkFlags('form.focus(); log(input, "focus"); input.focus()', {eventType: 'focus', scoped: false, relatedTargetScoped: true});48 checkFlags('log(input, "blur"); form.focus()', {eventType: 'blur', scoped: false, relatedTargetScoped: true});43 checkFlags('form.focus(); log(input, "focus"); input.focus()', {eventType: 'focus', composed: true}); 44 checkFlags('log(input, "blur"); form.focus()', {eventType: 'blur', composed: true}); 49 45 50 46 if (!window.eventSender) … … 58 54 var y = input.offsetTop + input.offsetHeight / 2; 59 55 60 checkFlags('input.type = "text"; log(input, "mousemove"); eventSender.mouseMoveTo(x, y)', {eventType: 'mousemove', scoped: false, relatedTargetScoped: false});61 checkFlags('log(input, "mousedown"); eventSender.mouseDown()', {eventType: 'mousedown', scoped: false, relatedTargetScoped: false});62 checkFlags('log(input, "mouseup"); eventSender.mouseUp()', {eventType: 'mouseup', scoped: false, relatedTargetScoped: false});63 checkFlags('log(input, "mouseout"); eventSender.mouseMoveTo(0, 0)', {eventType: 'mouseout', scoped: false, relatedTargetScoped: true});64 checkFlags('log(input, "mouseover"); eventSender.mouseMoveTo(x, y)', {eventType: 'mouseover', scoped: false, relatedTargetScoped: true});56 checkFlags('input.type = "text"; log(input, "mousemove"); eventSender.mouseMoveTo(x, y)', {eventType: 'mousemove', composed: true}); 57 checkFlags('log(input, "mousedown"); eventSender.mouseDown()', {eventType: 'mousedown', composed: true}); 58 checkFlags('log(input, "mouseup"); eventSender.mouseUp()', {eventType: 'mouseup', composed: true}); 59 checkFlags('log(input, "mouseout"); eventSender.mouseMoveTo(0, 0)', {eventType: 'mouseout', composed: true}); 60 checkFlags('log(input, "mouseover"); eventSender.mouseMoveTo(x, y)', {eventType: 'mouseover', composed: true}); 65 61 66 62 evalAndLog('input.value = "hello"; eventSender.mouseMoveTo(input.offsetLeft + 1, y); eventSender.mouseDown();'); 67 63 checkFlags('log(input, "select"); eventSender.mouseMoveTo(input.offsetLeft + input.offsetWidth - 2, y); eventSender.mouseUp()', 68 {eventType: 'select', scoped: true, relatedTargetScoped: false});64 {eventType: 'select', composed: false}); 69 65 70 66 var editableElement = document.getElementById('editor'); 71 67 y = editableElement.offsetTop + editableElement.offsetHeight / 2; 72 68 checkFlags('log(editableElement, "selectstart"); eventSender.mouseMoveTo(editableElement.offsetLeft + 1, y); eventSender.mouseDown()', 73 {eventType: 'selectstart', scoped: true, relatedTargetScoped: false});69 {eventType: 'selectstart', composed: false}); 74 70 } 75 71 … … 79 75 scriptThatLoads.onload = function (event) { 80 76 logEvent(event); 81 checkFlags('', {eventType: 'load', scoped: true, relatedTargetScoped: false});77 checkFlags('', {eventType: 'load', composed: false}); 82 78 testErrorEvent(); 83 79 } … … 90 86 scriptThatFailsToLoad.onerror = function (event) { 91 87 logEvent(event); 92 checkFlags('', {eventType: 'error', scoped: true, relatedTargetScoped: false});88 checkFlags('', {eventType: 'error', composed: false}); 93 89 testScrollEvent(); 94 90 } … … 102 98 window.scrollTo(0, 1000); 103 99 setTimeout(function () { 104 checkFlags('', {eventType: 'scroll', scoped: true, relatedTargetScoped: false});100 checkFlags('', {eventType: 'scroll', composed: false}); 105 101 window.scrollTo(0, 0); 106 102 testResizeEvent(); … … 122 118 iframe.contentDocument.body.getBoundingClientRect(); 123 119 setTimeout(function () { 124 checkFlags('', {eventType: 'resize', scoped: true, relatedTargetScoped: false});120 checkFlags('', {eventType: 'resize', composed: false}); 125 121 finishJSTest(); 126 122 }, 0); -
trunk/LayoutTests/fast/xmlhttprequest/xmlhttprequest-get-expected.txt
r200585 r202953 48 48 cancelable : 'false' 49 49 clipboardData : 'undefined' 50 composed : 'false' 50 51 composedPath : 'function composedPath() { 51 52 [native code] … … 64 65 [native code] 65 66 }' 66 relatedTargetScoped : 'false'67 67 returnValue : 'true' 68 scoped : 'true'69 68 srcElement : '[object XMLHttpRequest]' 70 69 stopImmediatePropagation : 'function stopImmediatePropagation() { -
trunk/LayoutTests/http/tests/workers/worker-importScriptsOnError-expected.txt
r202023 r202953 28 28 clipboardData: undefined, 29 29 colno: 14, 30 composed: false, 30 31 composedPath: function composedPath() { [native code] }, 31 32 currentTarget: [object Worker], … … 39 40 message: Error: Script error., 40 41 preventDefault: function preventDefault() { [native code] }, 41 relatedTargetScoped: false,42 42 returnValue: true, 43 scoped: true,44 43 srcElement: [object Worker], 45 44 stopImmediatePropagation: function stopImmediatePropagation() { [native code] }, -
trunk/LayoutTests/inspector/model/remote-object-get-properties-expected.txt
r202568 r202953 49 49 bubbles 50 50 cancelable 51 scoped 52 relatedTargetScoped 51 composed 53 52 timeStamp 54 53 defaultPrevented … … 68 67 bubbles 69 68 cancelable 70 scoped 71 relatedTargetScoped 69 composed 72 70 timeStamp 73 71 defaultPrevented -
trunk/Source/WebCore/ChangeLog
r202952 r202953 1 2016-07-07 Ryosuke Niwa <rniwa@webkit.org> 2 3 Replace scoped flag in Event by composed flag 4 https://bugs.webkit.org/show_bug.cgi?id=158415 5 6 Reviewed by Chris Dumez. 7 8 Replace `scoped` flag with `composed` flag and negate its meaning per the latest spec: 9 https://dom.spec.whatwg.org/#dom-event-composed 10 https://github.com/w3c/webcomponents/issues/513 11 12 In the old spec, every event was assumed to be "composed" (crosses shadow boundaries) 13 by default and there was `scoped` flag which prevented the event from crossing bondaries, 14 and there was a handful of events for which `scoped` was set true when dispatched by UA. 15 16 In the new spec, every event is assumed to be "scoped" and a handful of user-initiated 17 events set `composed` flag to true, which is also exposed in EventInit dictionary. 18 `relatedTargetScoped` flag has been removed. New behavior is identical to when this flag 19 was set to true. 20 21 No new tests since existing tests are updated to test the new flag and behavior. 22 23 * dom/CompositionEvent.cpp: 24 (WebCore::CompositionEvent::isCompositionEvent): Added. 25 * dom/CompositionEvent.h: 26 * dom/Event.cpp: 27 (WebCore::Event::Event): Initialize m_composed. Also re-ordered m_type and m_isInitialized 28 for better packing. 29 (WebCore::Event::composed): Renamed from Event::composed. We return true whenever composed 30 is set to true in EventInit, or the engine is dispatching an user-initiated event listed in: 31 https://github.com/w3c/webcomponents/issues/513#issuecomment-224183937 32 as well as keypress, cut, paste, and, copy as discussed in: 33 https://github.com/w3c/webcomponents/issues/513#issuecomment-230988170 34 (WebCore::Event::isCompositionEvent): Added. 35 * dom/Event.h: 36 (WebCore::Event::composed): Added. 37 (WebCore::Event::scoped): Deleted. 38 (WebCore::Event::relatedTargetScoped): Deleted. 39 (WebCore::Event): Reordered m_type and m_isInitialized for better packing. Added m_composed 40 and removed m_scoped and m_relatedTargetScoped. 41 * dom/Event.idl: 42 * dom/EventPath.cpp: 43 (WebCore::shouldEventCrossShadowBoundary): Returns true if the event did not originate from 44 a shadow tree (this event entered the current shadow tree via a slot so we need to proceed with 45 the normal bubble path outside the shadow tree) or composed flag is set true. 46 (WebCore::EventPath::EventPath): m_event no longer exists, which was only used to get the value 47 of relatedTargetScoped which has been removed. 48 (WebCore::EventPath::setRelatedTarget): Behave as if relatedTargetScoped is always set true 49 since the flag has been removed. 50 * dom/EventPath.h: 51 * dom/FocusEvent.cpp: 52 (WebCore::FocusEvent::relatedTargetScoped): Deleted. 53 * dom/FocusEvent.h: 54 * dom/MouseEvent.cpp: 55 (WebCore::MouseEvent::relatedTargetScoped): Deleted. 56 * dom/MouseEvent.h: 57 1 58 2016-07-07 Chris Dumez <cdumez@apple.com> 2 59 -
trunk/Source/WebCore/dom/CompositionEvent.cpp
r196400 r202953 67 67 } 68 68 69 bool CompositionEvent::isCompositionEvent() const 70 { 71 return true; 72 } 73 69 74 } // namespace WebCore -
trunk/Source/WebCore/dom/CompositionEvent.h
r197563 r202953 66 66 CompositionEvent(const AtomicString& type, const CompositionEventInit&); 67 67 68 bool isCompositionEvent() const override; 69 68 70 String m_data; 69 71 }; -
trunk/Source/WebCore/dom/Event.cpp
r202105 r202953 38 38 39 39 Event::Event(const AtomicString& eventType, bool canBubbleArg, bool cancelableArg) 40 : m_ isInitialized(true)41 , m_ type(eventType)40 : m_type(eventType) 41 , m_isInitialized(true) 42 42 , m_canBubble(canBubbleArg) 43 43 , m_cancelable(cancelableArg) … … 48 48 49 49 Event::Event(const AtomicString& eventType, bool canBubbleArg, bool cancelableArg, double timestamp) 50 : m_ isInitialized(true)51 , m_ type(eventType)50 : m_type(eventType) 51 , m_isInitialized(true) 52 52 , m_canBubble(canBubbleArg) 53 53 , m_cancelable(cancelableArg) … … 58 58 59 59 Event::Event(const AtomicString& eventType, const EventInit& initializer) 60 : m_ isInitialized(true)61 , m_ type(eventType)60 : m_type(eventType) 61 , m_isInitialized(true) 62 62 , m_canBubble(initializer.bubbles) 63 63 , m_cancelable(initializer.cancelable) 64 , m_scoped(initializer.scoped) 65 , m_relatedTargetScoped(initializer.relatedTargetScoped) 64 , m_composed(initializer.composed) 66 65 , m_createTime(convertSecondsToDOMTimeStamp(currentTime())) 67 66 { … … 88 87 } 89 88 90 bool Event:: scoped() const91 { 92 if (m_ scoped)89 bool Event::composed() const 90 { 91 if (m_composed) 93 92 return true; 94 93 … … 97 96 return false; 98 97 99 return m_type == eventNames().abortEvent 100 || m_type == eventNames().changeEvent 101 || m_type == eventNames().errorEvent 102 || m_type == eventNames().loadEvent 103 || m_type == eventNames().resetEvent 104 || m_type == eventNames().resizeEvent 105 || m_type == eventNames().scrollEvent 106 || m_type == eventNames().selectEvent 107 || m_type == eventNames().selectstartEvent 108 || m_type == eventNames().slotchangeEvent; 98 return m_type == eventNames().inputEvent 99 || m_type == eventNames().textInputEvent 100 || isCompositionEvent() 101 || isClipboardEvent() 102 || isFocusEvent() 103 || isKeyboardEvent() 104 || isMouseEvent() 105 || isTouchEvent(); 109 106 } 110 107 … … 130 127 131 128 bool Event::isKeyboardEvent() const 129 { 130 return false; 131 } 132 133 bool Event::isCompositionEvent() const 132 134 { 133 135 return false; -
trunk/Source/WebCore/dom/Event.h
r201757 r202953 44 44 bool bubbles { false }; 45 45 bool cancelable { false }; 46 bool scoped { false }; 47 bool relatedTargetScoped { false }; 46 bool composed { false }; 48 47 }; 49 48 … … 118 117 bool bubbles() const { return m_canBubble; } 119 118 bool cancelable() const { return m_cancelable; } 120 bool scoped() const; 121 virtual bool relatedTargetScoped() const { return m_relatedTargetScoped; } 119 bool composed() const; 122 120 123 121 DOMTimeStamp timeStamp() const { return m_createTime; } … … 148 146 virtual bool isFocusEvent() const; 149 147 virtual bool isKeyboardEvent() const; 148 virtual bool isCompositionEvent() const; 150 149 virtual bool isTouchEvent() const; 151 150 … … 207 206 208 207 private: 208 AtomicString m_type; 209 209 210 bool m_isInitialized { false }; 210 AtomicString m_type;211 211 bool m_canBubble { false }; 212 212 bool m_cancelable { false }; 213 bool m_scoped { false }; 214 bool m_relatedTargetScoped { false }; 213 bool m_composed { false }; 215 214 216 215 bool m_propagationStopped { false }; -
trunk/Source/WebCore/dom/Event.idl
r202091 r202953 59 59 [InitializedByEventConstructor] readonly attribute boolean bubbles; 60 60 [InitializedByEventConstructor] readonly attribute boolean cancelable; 61 [InitializedByEventConstructor, EnabledAtRuntime=ShadowDOM] readonly attribute boolean scoped; 62 [InitializedByEventConstructor, EnabledAtRuntime=ShadowDOM] readonly attribute boolean relatedTargetScoped; 61 [InitializedByEventConstructor, EnabledAtRuntime=ShadowDOM] readonly attribute boolean composed; 63 62 readonly attribute DOMTimeStamp timeStamp; 64 63 -
trunk/Source/WebCore/dom/EventPath.cpp
r202091 r202953 51 51 52 52 bool targetIsInShadowRoot = targetNode && &targetNode->treeScope().rootNode() == &shadowRoot; 53 return !targetIsInShadowRoot || !event.scoped();53 return !targetIsInShadowRoot || event.composed(); 54 54 } 55 55 … … 85 85 86 86 EventPath::EventPath(Node& originalTarget, Event& event) 87 : m_event(event)88 87 { 89 88 bool isMouseOrFocusEvent = event.isMouseEvent() || event.isFocusEvent(); … … 142 141 143 142 bool originIsRelatedTarget = &origin == relatedNode; 144 bool relatedTargetScoped = m_event.relatedTargetScoped();145 143 Node& rootNodeInOriginTreeScope = origin.treeScope().rootNode(); 146 144 TreeScope* previousTreeScope = nullptr; … … 155 153 156 154 Node* currentRelatedNode = retargeter.currentNode(currentTarget); 157 if (UNLIKELY( relatedTargetScoped &&!originIsRelatedTarget && context.target() == currentRelatedNode)) {155 if (UNLIKELY(!originIsRelatedTarget && context.target() == currentRelatedNode)) { 158 156 m_path.shrink(contextIndex); 159 157 break; … … 162 160 context.setRelatedTarget(currentRelatedNode); 163 161 164 if (UNLIKELY( relatedTargetScoped &&originIsRelatedTarget && context.node() == &rootNodeInOriginTreeScope)) {162 if (UNLIKELY(originIsRelatedTarget && context.node() == &rootNodeInOriginTreeScope)) { 165 163 m_path.shrink(contextIndex + 1); 166 164 break; -
trunk/Source/WebCore/dom/EventPath.h
r200464 r202953 70 70 #endif 71 71 72 Event& m_event;73 72 Vector<std::unique_ptr<EventContext>, 32> m_path; 74 73 }; -
trunk/Source/WebCore/dom/FocusEvent.cpp
r198056 r202953 53 53 } 54 54 55 bool FocusEvent::relatedTargetScoped() const56 {57 return (isTrusted() && m_relatedTarget) || UIEvent::relatedTargetScoped();58 }59 60 55 } // namespace WebCore -
trunk/Source/WebCore/dom/FocusEvent.h
r198056 r202953 59 59 FocusEvent(const AtomicString& type, const FocusEventInit&); 60 60 61 bool relatedTargetScoped() const override;62 63 61 bool isFocusEvent() const override; 64 62 -
trunk/Source/WebCore/dom/MouseEvent.cpp
r198056 r202953 190 190 } 191 191 192 bool MouseEvent::relatedTargetScoped() const193 {194 return (isTrusted() && m_relatedTarget) || UIEvent::relatedTargetScoped();195 }196 197 192 int MouseEvent::which() const 198 193 { -
trunk/Source/WebCore/dom/MouseEvent.h
r198056 r202953 122 122 MouseEvent(); 123 123 124 bool relatedTargetScoped() const override;125 126 124 private: 127 125 unsigned short m_button;
Note: See TracChangeset
for help on using the changeset viewer.