WebKit Bugzilla
Attachment 371275 Details for
Bug 198036
: The "mouseenter" and "pointerenter" events are fired from the bottom up
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch for landing
bug-198036-20190604155207.patch (text/plain), 20.26 KB, created by
Antoine Quint
on 2019-06-04 06:52:09 PDT
(
hide
)
Description:
Patch for landing
Filename:
MIME Type:
Creator:
Antoine Quint
Created:
2019-06-04 06:52:09 PDT
Size:
20.26 KB
patch
obsolete
>Subversion Revision: 246056 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index bf197880ab046e4b5ac6ea5da72bd00f0569cbe9..fd86a43c110592a02a61314385b578d542aea642 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,27 @@ >+2019-06-04 Antoine Quint <graouts@apple.com> >+ >+ The "mouseenter" and "pointerenter" events are fired from the bottom up >+ https://bugs.webkit.org/show_bug.cgi?id=198036 >+ <rdar://problem/50940350> >+ >+ Reviewed by Darin Adler. >+ >+ Ensure "mouseenter" and "pointerenter" events are dispatched from the bottom up to match the UI Events spec >+ at https://w3c.github.io/uievents/#events-mouseevent-event-order. We also fix the issue where "pointerevent" >+ and "pointerleave" events were dispatched as bubbling events on iOS which is not correct and was caught by the >+ new iOS test. >+ >+ Tests: pointerevents/ios/enter-leave-order.html >+ pointerevents/mouse/enter-leave-order.html >+ >+ * dom/ios/PointerEventIOS.cpp: >+ (WebCore::typeCanBubble): >+ (WebCore::PointerEvent::PointerEvent): >+ * page/EventHandler.cpp: >+ (WebCore::EventHandler::updateMouseEventTargetNode): >+ * page/PointerCaptureController.cpp: >+ (WebCore::PointerCaptureController::dispatchEventForTouchAtIndex): >+ > 2019-06-03 Andy Estes <aestes@apple.com> > > [Apple Pay] Disable script injection when canMakePayment APIs are called and return true >diff --git a/Source/WebCore/dom/ios/PointerEventIOS.cpp b/Source/WebCore/dom/ios/PointerEventIOS.cpp >index 6403e514352847170c36abb7b5563ba0e3c2aff3..b687300da486a2a13d6673b14ced054710697423 100644 >--- a/Source/WebCore/dom/ios/PointerEventIOS.cpp >+++ b/Source/WebCore/dom/ios/PointerEventIOS.cpp >@@ -57,6 +57,11 @@ static PointerEvent::IsCancelable phaseIsCancelable(PlatformTouchPoint::TouchPha > return PointerEvent::IsCancelable::Yes; > } > >+static Event::CanBubble typeCanBubble(const AtomicString& type) >+{ >+ return (type == eventNames().pointerenterEvent || type == eventNames().pointerleaveEvent) ? Event::CanBubble::No : Event::CanBubble::Yes; >+} >+ > Ref<PointerEvent> PointerEvent::create(const PlatformTouchEvent& event, unsigned index, bool isPrimary, Ref<WindowProxy>&& view) > { > auto phase = event.touchPhaseAtIndex(index); >@@ -69,7 +74,7 @@ Ref<PointerEvent> PointerEvent::create(const String& type, const PlatformTouchEv > } > > PointerEvent::PointerEvent(const AtomicString& type, const PlatformTouchEvent& event, IsCancelable isCancelable, unsigned index, bool isPrimary, Ref<WindowProxy>&& view) >- : MouseEvent(type, CanBubble::Yes, isCancelable, IsComposed::Yes, event.timestamp().approximateMonotonicTime(), WTFMove(view), 0, event.touchLocationAtIndex(index), event.touchLocationAtIndex(index), { }, event.modifiers(), 0, 0, nullptr, 0, 0, nullptr, IsSimulated::No, IsTrusted::Yes) >+ : MouseEvent(type, typeCanBubble(type), isCancelable, IsComposed::Yes, event.timestamp().approximateMonotonicTime(), WTFMove(view), 0, event.touchLocationAtIndex(index), event.touchLocationAtIndex(index), { }, event.modifiers(), 0, 0, nullptr, 0, 0, nullptr, IsSimulated::No, IsTrusted::Yes) > , m_pointerId(event.touchIdentifierAtIndex(index)) > , m_width(2 * event.radiusXAtIndex(index)) > , m_height(2 * event.radiusYAtIndex(index)) >diff --git a/Source/WebCore/page/EventHandler.cpp b/Source/WebCore/page/EventHandler.cpp >index ffbbac6732e446a9d42b6d15c18401d9eda957f3..a1f85110a0e81d0fa4a8538dfea35f0ed832f75e 100644 >--- a/Source/WebCore/page/EventHandler.cpp >+++ b/Source/WebCore/page/EventHandler.cpp >@@ -2594,7 +2594,7 @@ void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo > if (m_elementUnderMouse) > m_elementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventNames().mouseoverEvent, 0, m_lastElementUnderMouse.get()); > >- for (auto& chain : enteredElementsChain) { >+ for (auto& chain : WTF::makeReversedRange(enteredElementsChain)) { > if (hasCapturingMouseEnterListener || chain->hasEventListeners(eventNames().pointerenterEvent) || chain->hasEventListeners(eventNames().mouseenterEvent)) > chain->dispatchMouseEvent(platformMouseEvent, eventNames().mouseenterEvent, 0, m_lastElementUnderMouse.get()); > } >diff --git a/Source/WebCore/page/PointerCaptureController.cpp b/Source/WebCore/page/PointerCaptureController.cpp >index fdf2ec49c1b5e9878f30316cf76f2bdc53cb8f22..796b2f802b04fb9ce0dd979535ea56b0d48a37e3 100644 >--- a/Source/WebCore/page/PointerCaptureController.cpp >+++ b/Source/WebCore/page/PointerCaptureController.cpp >@@ -190,8 +190,17 @@ void PointerCaptureController::dispatchEventForTouchAtIndex(EventTarget& target, > } > } > >- for (Element* element = &downcast<Element>(target); element; element = element->parentElementInComposedTree()) { >+ Vector<Ref<Element>, 32> targetChain; >+ for (Element* element = targetElement; element; element = element->parentElementInComposedTree()) { > if (hasCapturingListenerInHierarchy || element->hasEventListeners(type)) >+ targetChain.append(*element); >+ } >+ >+ if (type == eventNames().pointerenterEvent) { >+ for (auto& element : WTF::makeReversedRange(targetChain)) >+ element->dispatchEvent(PointerEvent::create(type, platformTouchEvent, index, isPrimary, view)); >+ } else { >+ for (auto& element : targetChain) > element->dispatchEvent(PointerEvent::create(type, platformTouchEvent, index, isPrimary, view)); > } > }; >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index b3b473946565159a045a969e4bb4cca7a1022ec7..8734d22a248eb5c393c7e0724eb4d31d53ce3df0 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,26 @@ >+2019-06-04 Antoine Quint <graouts@apple.com> >+ >+ The "mouseenter" and "pointerenter" events are fired from the bottom up >+ https://bugs.webkit.org/show_bug.cgi?id=198036 >+ <rdar://problem/50940350> >+ >+ Reviewed by Darin Adler. >+ >+ * fast/events/mouseenter-mouseleave-capture-expected.txt: >+ * fast/events/mouseenter-mouseleave-expected.txt: >+ * fast/events/mouseenterleave-on-subframe-expected.txt: >+ * fast/events/shadow-event-path-expected.txt: >+ * fast/shadow-dom/mouseenter-mouseleave-across-shadow-boundary-expected.txt: >+ * fast/shadow-dom/mouseenter-mouseleave-inside-shadow-tree-expected.txt: >+ * fast/shadow-dom/mouseenter-mouseleave-on-slot-parent-expected.txt: >+ * platform/mac-wk1/TestExpectations: >+ * platform/mac-wk2/fast/events/shadow-event-path-expected.txt: >+ * platform/mac/fast/events/shadow-event-path-2-expected.txt: >+ * pointerevents/ios/enter-leave-order-expected.txt: Added. >+ * pointerevents/ios/enter-leave-order.html: Added. >+ * pointerevents/mouse/enter-leave-order-expected.txt: Added. >+ * pointerevents/mouse/enter-leave-order.html: Added. >+ > 2019-06-03 Youenn Fablet <youenn@apple.com> > > Allow resizing of camera video feeds to very small resolutions >diff --git a/LayoutTests/fast/events/mouseenter-mouseleave-capture-expected.txt b/LayoutTests/fast/events/mouseenter-mouseleave-capture-expected.txt >index f09f4c3aebf95606c13831482bd886f4953203ac..5c0ff9d1fedd7cd9b91b2bedb7ddf848c579cd46 100644 >--- a/LayoutTests/fast/events/mouseenter-mouseleave-capture-expected.txt >+++ b/LayoutTests/fast/events/mouseenter-mouseleave-capture-expected.txt >@@ -8,8 +8,8 @@ mousemove on html > mouseMoveTo(110,140) > mouseout on html > mouseover on outer1 >-mouseenter on outer1 > mouseenter on body >+mouseenter on outer1 > mousemove on outer1 > > mouseMoveTo(130,140) >@@ -22,8 +22,8 @@ mouseMoveTo(170,140) > mouseout on inner1 > mouseleave on inner1 > mouseover on inner3 >-mouseenter on inner3 > mouseenter on inner2 >+mouseenter on inner3 > mousemove on inner3 > > mouseMoveTo(180,140) >diff --git a/LayoutTests/fast/events/mouseenter-mouseleave-expected.txt b/LayoutTests/fast/events/mouseenter-mouseleave-expected.txt >index ee0ba741c4eec4827cf27c3e94d6ba2300a339f8..efd24199b91c1fd920099e779f7580234b46b67c 100644 >--- a/LayoutTests/fast/events/mouseenter-mouseleave-expected.txt >+++ b/LayoutTests/fast/events/mouseenter-mouseleave-expected.txt >@@ -9,8 +9,8 @@ mousemove on html > mouseMoveTo(110,140) > mouseout on html > mouseover on outer1 >-mouseenter on outer1 > mouseenter on body >+mouseenter on outer1 > mousemove on outer1 > > mouseMoveTo(130,140) >@@ -23,8 +23,8 @@ mouseMoveTo(170,140) > mouseout on inner1 > mouseleave on inner1 > mouseover on inner3 >-mouseenter on inner3 > mouseenter on inner2 >+mouseenter on inner3 > mousemove on inner3 > > mouseMoveTo(180,140) >diff --git a/LayoutTests/fast/events/mouseenterleave-on-subframe-expected.txt b/LayoutTests/fast/events/mouseenterleave-on-subframe-expected.txt >index 9ee2f5527d979d57fe782e1bda7e3b403ab51c7b..b7df932a7d1fd4d3f15a1f420f839f33f56f49ef 100644 >--- a/LayoutTests/fast/events/mouseenterleave-on-subframe-expected.txt >+++ b/LayoutTests/fast/events/mouseenterleave-on-subframe-expected.txt >@@ -1,9 +1,9 @@ > > This is a test of a mouseleave events in an inner-document. The test is success if we get matching mouseleave events for every mouseenter event, and if the logged nodeNames of event targets does not include '#document'. > >-mouseenter on DIV >-mouseenter on BODY > mouseenter on HTML >+mouseenter on BODY >+mouseenter on DIV > mouseleave on DIV > mouseleave on BODY > mouseleave on HTML >diff --git a/LayoutTests/fast/events/shadow-event-path-expected.txt b/LayoutTests/fast/events/shadow-event-path-expected.txt >index 96a91206f75becc5734ff38c6d992088ccd4f2d0..f0b135b16314a8fc45765fa760e77e024c1d8bcd 100644 >--- a/LayoutTests/fast/events/shadow-event-path-expected.txt >+++ b/LayoutTests/fast/events/shadow-event-path-expected.txt >@@ -39,32 +39,32 @@ mouseover@window > target:input#target > relatedTarget:null > >-mouseenter@input#target >- target:input#target >+mouseenter@html >+ target:html > relatedTarget:null > >-mouseenter@div#divInsideSummary >- target:div#divInsideSummary >+mouseenter@body >+ target:body > relatedTarget:null > >-mouseenter@summary >- target:summary >+mouseenter@div#detailsContainer >+ target:div#detailsContainer > relatedTarget:null > > mouseenter@details > target:details > relatedTarget:null > >-mouseenter@div#detailsContainer >- target:div#detailsContainer >+mouseenter@summary >+ target:summary > relatedTarget:null > >-mouseenter@body >- target:body >+mouseenter@div#divInsideSummary >+ target:div#divInsideSummary > relatedTarget:null > >-mouseenter@html >- target:html >+mouseenter@input#target >+ target:input#target > relatedTarget:null > > mousemove@input#target >diff --git a/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-across-shadow-boundary-expected.txt b/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-across-shadow-boundary-expected.txt >index 879066adcb65baa979c7453272046bab7c2b40d1..4a061cd5f48ea793ab3a3b9eda7603a146537536 100644 >--- a/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-across-shadow-boundary-expected.txt >+++ b/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-across-shadow-boundary-expected.txt >@@ -14,8 +14,8 @@ mouseenter on slotParent > mouseenter on slot > > ==Entering slotted element== >-mouseenter on target > mouseenter on targetParent >+mouseenter on target > > ==Leaving slotted element== > mouseleave on target >diff --git a/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-inside-shadow-tree-expected.txt b/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-inside-shadow-tree-expected.txt >index 6a43024d7470477c88f98eba5f07b3263ea197cd..720449cab4eacda90142436f6f46df4c728f1dc7 100644 >--- a/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-inside-shadow-tree-expected.txt >+++ b/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-inside-shadow-tree-expected.txt >@@ -4,10 +4,10 @@ WebKit must generate mouseenter and mouseleve events exactly once on host (as we > > > ==Entering target== >-mouseenter on target >-mouseenter on container >-mouseenter on host > mouseenter on hostParent >+mouseenter on host >+mouseenter on container >+mouseenter on target > > ==Leaving target== > mouseleave on target >diff --git a/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-on-slot-parent-expected.txt b/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-on-slot-parent-expected.txt >index 0f1d780ddfb11143e60864c784ed868fafced355..0e39255f3501b9961755d2da65a7d2f089b125dc 100644 >--- a/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-on-slot-parent-expected.txt >+++ b/LayoutTests/fast/shadow-dom/mouseenter-mouseleave-on-slot-parent-expected.txt >@@ -4,9 +4,9 @@ You should see mouseenter events on slotContainer, slot, and target in that orde > > > ==Entering target== >-mouseenter on target >-mouseenter on slot > mouseenter on slotContainer >+mouseenter on slot >+mouseenter on target > > ==Leaving target== > mouseleave on target >diff --git a/LayoutTests/platform/mac-wk1/TestExpectations b/LayoutTests/platform/mac-wk1/TestExpectations >index 57d2c830875c20e0a0b11777ca6971e5f76f369a..324e7ef73db4134b2640afd827f4d406e12ec714 100644 >--- a/LayoutTests/platform/mac-wk1/TestExpectations >+++ b/LayoutTests/platform/mac-wk1/TestExpectations >@@ -689,6 +689,7 @@ webkit.org/b/172384 fast/hidpi/hidpi-long-page-with-inset-element.html [ Skip ] > > webkit.org/b/194309 media/modern-media-controls/compact-media-controls/compact-media-controls-layout.html [ Pass Failure ] > >+webkit.org/b/195098 pointerevents/mouse/enter-leave-order.html [ Failure ] > webkit.org/b/195098 pointerevents/mouse/over-enter-out-leave.html [ Failure ] > webkit.org/b/195098 pointerevents/mouse/pointer-capture.html [ Failure ] > webkit.org/b/195098 pointerevents/mouse/pointer-events-before-mouse-events.html [ Failure ] >diff --git a/LayoutTests/platform/mac-wk2/fast/events/shadow-event-path-expected.txt b/LayoutTests/platform/mac-wk2/fast/events/shadow-event-path-expected.txt >index 33d65138c1650bea5c4e34605c28f53249538854..7945b694c9e0f4a3bc033a9f5a7a1af6650bb203 100644 >--- a/LayoutTests/platform/mac-wk2/fast/events/shadow-event-path-expected.txt >+++ b/LayoutTests/platform/mac-wk2/fast/events/shadow-event-path-expected.txt >@@ -39,32 +39,32 @@ mouseover@window > target:input#target > relatedTarget:null > >-mouseenter@input#target >- target:input#target >+mouseenter@html >+ target:html > relatedTarget:null > >-mouseenter@div#divInsideSummary >- target:div#divInsideSummary >+mouseenter@body >+ target:body > relatedTarget:null > >-mouseenter@summary >- target:summary >+mouseenter@div#detailsContainer >+ target:div#detailsContainer > relatedTarget:null > > mouseenter@details > target:details > relatedTarget:null > >-mouseenter@div#detailsContainer >- target:div#detailsContainer >+mouseenter@summary >+ target:summary > relatedTarget:null > >-mouseenter@body >- target:body >+mouseenter@div#divInsideSummary >+ target:div#divInsideSummary > relatedTarget:null > >-mouseenter@html >- target:html >+mouseenter@input#target >+ target:input#target > relatedTarget:null > > mousemove@input#target >diff --git a/LayoutTests/platform/mac/fast/events/shadow-event-path-2-expected.txt b/LayoutTests/platform/mac/fast/events/shadow-event-path-2-expected.txt >index 922c12882c4a3ba88dfa123e8c0c3b16ee8a2973..a21d0f61a17afeed3c632342ceb11a7496d26070 100644 >--- a/LayoutTests/platform/mac/fast/events/shadow-event-path-2-expected.txt >+++ b/LayoutTests/platform/mac/fast/events/shadow-event-path-2-expected.txt >@@ -67,16 +67,16 @@ mouseover@window > target:input#target > relatedTarget:html > >-mouseenter@input#target >- target:input#target >+mouseenter@body >+ target:body > relatedTarget:html > > mouseenter@div#detailsContainer > target:div#detailsContainer > relatedTarget:html > >-mouseenter@body >- target:body >+mouseenter@input#target >+ target:input#target > relatedTarget:html > > mousemove@input#target >diff --git a/LayoutTests/pointerevents/ios/enter-leave-order-expected.txt b/LayoutTests/pointerevents/ios/enter-leave-order-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..bbe603c0d7b799b68eef5e084e272d4f2b187923 >--- /dev/null >+++ b/LayoutTests/pointerevents/ios/enter-leave-order-expected.txt >@@ -0,0 +1,3 @@ >+ >+PASS Testing that "pointerenter" events are dispatched from top to bottom and "pointerleave" events are dispatched bottom to top. >+ >diff --git a/LayoutTests/pointerevents/ios/enter-leave-order.html b/LayoutTests/pointerevents/ios/enter-leave-order.html >new file mode 100644 >index 0000000000000000000000000000000000000000..dc5ae34ae94f12f24f56e1052b458da8a2bbe770 >--- /dev/null >+++ b/LayoutTests/pointerevents/ios/enter-leave-order.html >@@ -0,0 +1,66 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<meta name="viewport" content="width=device-width, initial-scale=1"> >+<style> >+ >+div.test-container { >+ position: absolute; >+ left: 0px; >+ top: 0px; >+ width: 100px; >+ height: 100px; >+} >+ >+#top { >+ left: 50px; >+ top: 50px; >+} >+ >+</style> >+</head> >+<body> >+<script src="../../resources/testharness.js"></script> >+<script src="../../resources/testharnessreport.js"></script> >+<script src="../utils.js"></script> >+<script> >+ >+'use strict'; >+ >+const events = []; >+ >+function logEvent(event) >+{ >+ events.push(`${event.type}@${event.target.id}`); >+} >+ >+function makeDiv(id) >+{ >+ const div = document.createElement("div"); >+ div.addEventListener("pointerenter", logEvent); >+ div.addEventListener("pointerleave", logEvent); >+ div.className = "test-container"; >+ div.id = id; >+ return div; >+} >+ >+document.body.appendChild(makeDiv("top")).appendChild(makeDiv("middle")).appendChild(makeDiv("bottom")); >+ >+async_test(test => { >+ const tapped = ui.tap({ x: 100, y: 100 }).then(() => { >+ assert_array_equals(events, [ >+ "pointerenter@top", >+ "pointerenter@middle", >+ "pointerenter@bottom", >+ "pointerleave@bottom", >+ "pointerleave@middle", >+ "pointerleave@top" >+ ]); >+ test.done(); >+ }); >+}, `Testing that "pointerenter" events are dispatched from top to bottom and "pointerleave" events are dispatched bottom to top.`); >+ >+</script> >+</body> >+</html> >\ No newline at end of file >diff --git a/LayoutTests/pointerevents/mouse/enter-leave-order-expected.txt b/LayoutTests/pointerevents/mouse/enter-leave-order-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..bbe603c0d7b799b68eef5e084e272d4f2b187923 >--- /dev/null >+++ b/LayoutTests/pointerevents/mouse/enter-leave-order-expected.txt >@@ -0,0 +1,3 @@ >+ >+PASS Testing that "pointerenter" events are dispatched from top to bottom and "pointerleave" events are dispatched bottom to top. >+ >diff --git a/LayoutTests/pointerevents/mouse/enter-leave-order.html b/LayoutTests/pointerevents/mouse/enter-leave-order.html >new file mode 100644 >index 0000000000000000000000000000000000000000..7ff2a319e6b2eeb9f75c2a9a62fe451e87934810 >--- /dev/null >+++ b/LayoutTests/pointerevents/mouse/enter-leave-order.html >@@ -0,0 +1,67 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<style> >+ >+div.test-container { >+ position: absolute; >+ left: 0px; >+ top: 0px; >+ width: 100px; >+ height: 100px; >+} >+ >+#top { >+ left: 50px; >+ top: 50px; >+} >+ >+</style> >+</head> >+<body> >+<script src="../../resources/testharness.js"></script> >+<script src="../../resources/testharnessreport.js"></script> >+<script src="../utils.js"></script> >+<script> >+ >+'use strict'; >+ >+const events = []; >+ >+function logEvent(event) >+{ >+ events.push(`${event.type}@${event.target.id}`); >+} >+ >+function makeDiv(id) >+{ >+ const div = document.createElement("div"); >+ div.addEventListener("pointerenter", logEvent); >+ div.addEventListener("pointerleave", logEvent); >+ div.className = "test-container"; >+ div.id = id; >+ return div; >+} >+ >+// Add three nested and fully overlapping elements. >+document.body.appendChild(makeDiv("top")).appendChild(makeDiv("middle")).appendChild(makeDiv("bottom")); >+ >+// mouse over and out of the elements. >+eventSender.mouseMoveTo(75, 75); >+eventSender.mouseMoveTo(25, 25); >+ >+test(() => { >+ assert_array_equals(events, [ >+ "pointerenter@top", >+ "pointerenter@middle", >+ "pointerenter@bottom", >+ "pointerleave@bottom", >+ "pointerleave@middle", >+ "pointerleave@top" >+ ]); >+}, `Testing that "pointerenter" events are dispatched from top to bottom and "pointerleave" events are dispatched bottom to top.`); >+ >+</script> >+</body> >+</html> >\ No newline at end of file
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 198036
:
370248
|
370726
|
370728
|
370730
|
370731
|
370733
|
370735
|
370740
|
370747
| 371275