WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Add support for fractional scroll events
bug-101563-20121109151256.patch (text/plain), 19.67 KB, created by
Tai-Hsu Lin
on 2012-11-08 23:14:48 PST
(
hide
)
Description:
Add support for fractional scroll events
Filename:
MIME Type:
Creator:
Tai-Hsu Lin
Created:
2012-11-08 23:14:48 PST
Size:
19.67 KB
patch
obsolete
>Subversion Revision: 133857 >diff --git a/Source/Platform/ChangeLog b/Source/Platform/ChangeLog >index 3a3f85adafe72108ccb0afc469e0b0d4ef289cd3..d24803c0de93e9f280fcf71b488959db0ed80e11 100644 >--- a/Source/Platform/ChangeLog >+++ b/Source/Platform/ChangeLog >@@ -1,3 +1,14 @@ >+2012-11-08 Tai-Hsu Lin <sheckylin@chromium.org> >+ >+ Add support for fractional scroll events >+ https://bugs.webkit.org/show_bug.cgi?id=101563 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Change various scroll event data types from integers to floating-points. This allows more precise scrolling and provides more freedom to the WebKit users. >+ >+ * chromium/public/WebInputHandlerClient.h: >+ > 2012-11-07 Yusuf Ozuysal <yusufo@google.com> > > Add API for touchEventHandlerRegion to WebLayer >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 3617cf9c9d7b1e3ca253de110fe3bc20c4e0673f..f967dcc90be533973b43ad23cd50939548dc0552 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,34 @@ >+2012-11-08 Tai-Hsu Lin <sheckylin@chromium.org> >+ >+ Add support for fractional scroll events >+ https://bugs.webkit.org/show_bug.cgi?id=101563 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Change various scroll event data types from integers to floating-points. This allows more precise scrolling and provides more freedom to the WebKit users. >+ >+ No new tests (OOPS!). >+ >+ * platform/PlatformGestureCurveTarget.h: >+ (WebCore): >+ (PlatformGestureCurveTarget): >+ * platform/ScrollAnimatorNone.cpp: >+ (WebCore::ScrollAnimatorNone::scrollBy): >+ * platform/ScrollAnimatorNone.h: >+ (ScrollAnimatorNone): >+ * platform/TouchFlingPlatformGestureCurve.cpp: >+ (WebCore::TouchFlingPlatformGestureCurve::createForTouchPad): >+ (WebCore::TouchFlingPlatformGestureCurve::createForTouchScreen): >+ (WebCore::TouchFlingPlatformGestureCurve::create): >+ (WebCore::TouchFlingPlatformGestureCurve::TouchFlingPlatformGestureCurve): >+ (WebCore::TouchFlingPlatformGestureCurve::apply): >+ * platform/TouchFlingPlatformGestureCurve.h: >+ (TouchFlingPlatformGestureCurve): >+ * platform/chromium/support/PlatformGestureCurveFactory.cpp: >+ (WebKit::PlatformGestureCurveFactory::createCurve): >+ * platform/chromium/support/PlatformGestureCurveFactory.h: >+ (PlatformGestureCurveFactory): >+ > 2012-11-07 Vsevolod Vlasov <vsevik@chromium.org> > > Web Inspector: console error after inspecting IndexedDB >diff --git a/Source/WebKit/chromium/ChangeLog b/Source/WebKit/chromium/ChangeLog >index d17bccc2c9cd2de837b29867dfe2ad9043024ce8..7bde51d668a4ea57ade31994f33f84f2c1a352b2 100644 >--- a/Source/WebKit/chromium/ChangeLog >+++ b/Source/WebKit/chromium/ChangeLog >@@ -1,3 +1,25 @@ >+2012-11-08 Tai-Hsu Lin <sheckylin@chromium.org> >+ >+ Add support for fractional scroll events >+ https://bugs.webkit.org/show_bug.cgi?id=101563 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Change various scroll event data types from integers to floating-points. This allows more precise scrolling and provides more freedom to the WebKit users. >+ >+ * public/WebActiveWheelFlingParameters.h: >+ (WebActiveWheelFlingParameters): >+ * src/WebCompositorInputHandlerImpl.cpp: >+ (WebKit::WebCompositorInputHandlerImpl::handleInputEventInternal): >+ (WebKit::WebCompositorInputHandlerImpl::scrollBy): >+ * src/WebCompositorInputHandlerImpl.h: >+ (WebCompositorInputHandlerImpl): >+ * src/WebViewImpl.cpp: >+ (WebKit::WebViewImpl::scrollBy): >+ (WebKit::WebViewImpl::transferActiveWheelFlingAnimation): >+ * src/WebViewImpl.h: >+ (WebViewImpl): >+ > 2012-08-20 Taiju Tsuiki <tzik@chromium.org> > > Web Inspector: Drop dimmed crumb handling >diff --git a/Source/Platform/chromium/public/WebInputHandlerClient.h b/Source/Platform/chromium/public/WebInputHandlerClient.h >index 1bef205c4eb4514ca58f6d323902428f6231c243..1510ba323ef5abbe5bde9ca844fd20499c11e081 100644 >--- a/Source/Platform/chromium/public/WebInputHandlerClient.h >+++ b/Source/Platform/chromium/public/WebInputHandlerClient.h >@@ -25,6 +25,7 @@ > #define WebInputHandlerClient_h > > #include "WebCommon.h" >+#include "WebFloatPoint.h" > #include "WebPoint.h" > #include "WebSize.h" > >@@ -53,7 +54,7 @@ public: > // there is no room to move the layer in the requested direction, its first > // ancestor layer that can be scrolled will be moved instead. Should only be > // called if scrollBegin() returned ScrollStarted. >- virtual void scrollBy(WebPoint, WebSize) = 0; >+ virtual void scrollBy(WebPoint, WebFloatPoint) = 0; > > // Stop scrolling the selected layer. Should only be called if scrollBegin() > // returned ScrollStarted. >diff --git a/Source/WebCore/platform/PlatformGestureCurveTarget.h b/Source/WebCore/platform/PlatformGestureCurveTarget.h >index b28b292c18df048e3c30a1df4953042fbec30449..165c726eebe9fcc03afbf3e3264056184fb8e170 100644 >--- a/Source/WebCore/platform/PlatformGestureCurveTarget.h >+++ b/Source/WebCore/platform/PlatformGestureCurveTarget.h >@@ -27,11 +27,11 @@ > > namespace WebCore { > >-class IntPoint; >+class FloatPoint; > > class PlatformGestureCurveTarget { > public: >- virtual void scrollBy(const IntPoint&) = 0; >+ virtual void scrollBy(const FloatPoint&) = 0; > // FIXME: add interfaces for scroll(), etc. > > protected: >diff --git a/Source/WebCore/platform/ScrollAnimatorNone.cpp b/Source/WebCore/platform/ScrollAnimatorNone.cpp >index 04f26d27be0e98352438cf48b1bcde67d80b5836..5da9fe84eb455120475cd2689750d758e18a1d6b 100644 >--- a/Source/WebCore/platform/ScrollAnimatorNone.cpp >+++ b/Source/WebCore/platform/ScrollAnimatorNone.cpp >@@ -640,7 +640,7 @@ void ScrollAnimatorNone::stopAnimationTimerIfNeeded() > #endif > } > >-void ScrollAnimatorNone::scrollBy(const IntPoint& location) >+void ScrollAnimatorNone::scrollBy(const FloatPoint& location) > { > m_currentPosX += location.x(); > m_currentPosY += location.y(); >diff --git a/Source/WebCore/platform/ScrollAnimatorNone.h b/Source/WebCore/platform/ScrollAnimatorNone.h >index 867df9741f728cd394eb68e6dfffda230fa8e8c0..ede9d1f41879183b23e80a83721b5e29778b85c6 100644 >--- a/Source/WebCore/platform/ScrollAnimatorNone.h >+++ b/Source/WebCore/platform/ScrollAnimatorNone.h >@@ -98,7 +98,7 @@ public: > }; > > // PlatformGestureCurveTarget implementation. >- virtual void scrollBy(const IntPoint&); >+ virtual void scrollBy(const FloatPoint&); > > protected: > virtual void animationWillStart() { } >diff --git a/Source/WebCore/platform/TouchFlingPlatformGestureCurve.cpp b/Source/WebCore/platform/TouchFlingPlatformGestureCurve.cpp >index ed37cf1d912e78ba282fdfc5fdc3f77dc54a335d..510031c2a5dc0e6477cb1dc4aac0d1b4048cfd27 100644 >--- a/Source/WebCore/platform/TouchFlingPlatformGestureCurve.cpp >+++ b/Source/WebCore/platform/TouchFlingPlatformGestureCurve.cpp >@@ -53,19 +53,19 @@ using namespace std; > > static const int cMaxSearchIterations = 20; > >-PassOwnPtr<PlatformGestureCurve> TouchFlingPlatformGestureCurve::createForTouchPad(const FloatPoint& velocity, IntPoint cumulativeScroll) >+PassOwnPtr<PlatformGestureCurve> TouchFlingPlatformGestureCurve::createForTouchPad(const FloatPoint& velocity, FloatPoint cumulativeScroll) > { > // The default parameters listed below are a matched set, and should not be changed independently of one another. > return create(velocity, -5.70762e+03, 1.72e+02, 3.7e+00, 1.3, cumulativeScroll); > } > >-PassOwnPtr<PlatformGestureCurve> TouchFlingPlatformGestureCurve::createForTouchScreen(const FloatPoint& velocity, IntPoint cumulativeScroll) >+PassOwnPtr<PlatformGestureCurve> TouchFlingPlatformGestureCurve::createForTouchScreen(const FloatPoint& velocity, FloatPoint cumulativeScroll) > { > // The touchscreen-specific parameters listed below are a matched set, and should not be changed independently of one another. > return create(velocity, -5.70762e+03, 1.72e+02, 3.7e+00, 1.3, cumulativeScroll); > } > >-PassOwnPtr<PlatformGestureCurve> TouchFlingPlatformGestureCurve::create(const FloatPoint& velocity, float p0, float p1, float p2, float curveDuration, IntPoint cumulativeScroll) >+PassOwnPtr<PlatformGestureCurve> TouchFlingPlatformGestureCurve::create(const FloatPoint& velocity, float p0, float p1, float p2, float curveDuration, FloatPoint cumulativeScroll) > { > return adoptPtr(new TouchFlingPlatformGestureCurve(velocity, p0, p1, p2, curveDuration, cumulativeScroll)); > } >@@ -80,7 +80,7 @@ inline double velocity(double t, float* p) > return -p[0] * p[2] * exp(-p[2] * t) - p[1]; > } > >-TouchFlingPlatformGestureCurve::TouchFlingPlatformGestureCurve(const FloatPoint& initialVelocity, float p0, float p1, float p2, float curveDuration, const IntPoint& cumulativeScroll) >+TouchFlingPlatformGestureCurve::TouchFlingPlatformGestureCurve(const FloatPoint& initialVelocity, float p0, float p1, float p2, float curveDuration, const FloatPoint& cumulativeScroll) > : m_cumulativeScroll(cumulativeScroll) > , m_curveDuration(curveDuration) > { >@@ -147,11 +147,11 @@ bool TouchFlingPlatformGestureCurve::apply(double time, PlatformGestureCurveTarg > displacement = position(m_curveDuration, m_coefficients) - m_positionOffset; > > // Keep track of integer portion of scroll thus far, and prepare increment. >- IntPoint scroll(displacement * m_displacementRatio.x(), displacement * m_displacementRatio.y()); >- IntPoint scrollIncrement(scroll - m_cumulativeScroll); >+ FloatPoint scroll(displacement * m_displacementRatio.x(), displacement * m_displacementRatio.y()); >+ FloatPoint scrollIncrement(scroll - m_cumulativeScroll); > m_cumulativeScroll = scroll; > >- if (time + m_timeOffset < m_curveDuration || scrollIncrement != IntPoint::zero()) { >+ if (time + m_timeOffset < m_curveDuration || scrollIncrement != FloatPoint::zero()) { > target->scrollBy(scrollIncrement); > return true; > } >diff --git a/Source/WebCore/platform/TouchFlingPlatformGestureCurve.h b/Source/WebCore/platform/TouchFlingPlatformGestureCurve.h >index f238a717d219c90e361c3026f937d69e062461ba..7cbe45244fac78e79b9baaab3a91d4660d5de7df 100644 >--- a/Source/WebCore/platform/TouchFlingPlatformGestureCurve.h >+++ b/Source/WebCore/platform/TouchFlingPlatformGestureCurve.h >@@ -40,19 +40,19 @@ class PlatformGestureCurveTarget; > // the initial velocity. > class TouchFlingPlatformGestureCurve : public PlatformGestureCurve { > public: >- static PassOwnPtr<PlatformGestureCurve> createForTouchPad(const FloatPoint& velocity, IntPoint cumulativeScroll = IntPoint()); >- static PassOwnPtr<PlatformGestureCurve> createForTouchScreen(const FloatPoint& velocity, IntPoint cumulativeScroll = IntPoint()); >- static PassOwnPtr<PlatformGestureCurve> create(const FloatPoint& velocity, float p0, float p1, float p2, float curveDuration, IntPoint cumulativeScroll = IntPoint()); >+ static PassOwnPtr<PlatformGestureCurve> createForTouchPad(const FloatPoint& velocity, FloatPoint cumulativeScroll = FloatPoint()); >+ static PassOwnPtr<PlatformGestureCurve> createForTouchScreen(const FloatPoint& velocity, FloatPoint cumulativeScroll = FloatPoint()); >+ static PassOwnPtr<PlatformGestureCurve> create(const FloatPoint& velocity, float p0, float p1, float p2, float curveDuration, FloatPoint cumulativeScroll = FloatPoint()); > virtual ~TouchFlingPlatformGestureCurve(); > > virtual const char* debugName() const OVERRIDE; > virtual bool apply(double monotonicTime, PlatformGestureCurveTarget*) OVERRIDE; > > private: >- TouchFlingPlatformGestureCurve(const FloatPoint& velocity, float p0, float p1, float p2, float curveDuration, const IntPoint& cumulativeScroll); >+ TouchFlingPlatformGestureCurve(const FloatPoint& velocity, float p0, float p1, float p2, float curveDuration, const FloatPoint& cumulativeScroll); > > FloatPoint m_displacementRatio; >- IntPoint m_cumulativeScroll; >+ FloatPoint m_cumulativeScroll; > float m_coefficients[3]; > float m_timeOffset; > float m_curveDuration; >diff --git a/Source/WebCore/platform/chromium/support/PlatformGestureCurveFactory.cpp b/Source/WebCore/platform/chromium/support/PlatformGestureCurveFactory.cpp >index 203f39ce99f4258b4af06dc541c8ae8a2047ac43..211d06008440f3cf15c65d9f04292dbb31971bd9 100644 >--- a/Source/WebCore/platform/chromium/support/PlatformGestureCurveFactory.cpp >+++ b/Source/WebCore/platform/chromium/support/PlatformGestureCurveFactory.cpp >@@ -41,7 +41,7 @@ PlatformGestureCurveFactory* PlatformGestureCurveFactory::get() > return &factory; > } > >-PassOwnPtr<WebCore::PlatformGestureCurve> PlatformGestureCurveFactory::createCurve(int deviceSource, const WebCore::FloatPoint& point, WebCore::IntPoint cumulativeScroll) >+PassOwnPtr<WebCore::PlatformGestureCurve> PlatformGestureCurveFactory::createCurve(int deviceSource, const WebCore::FloatPoint& point, WebCore::FloatPoint cumulativeScroll) > { > OwnPtr<WebFlingAnimator> flingAnimator = m_mockFlingAnimator.release(); > if (!flingAnimator) >diff --git a/Source/WebCore/platform/chromium/support/PlatformGestureCurveFactory.h b/Source/WebCore/platform/chromium/support/PlatformGestureCurveFactory.h >index 1ab3bf441a93593b744bdb2c0522545484acba3e..ecc8695bbc7e8126344ead024d5da98ce05e8fa4 100644 >--- a/Source/WebCore/platform/chromium/support/PlatformGestureCurveFactory.h >+++ b/Source/WebCore/platform/chromium/support/PlatformGestureCurveFactory.h >@@ -36,7 +36,7 @@ class PlatformGestureCurveFactory { > public: > static PlatformGestureCurveFactory* get(); > >- PassOwnPtr<WebCore::PlatformGestureCurve> createCurve(int deviceSource, const WebCore::FloatPoint&, WebCore::IntPoint cumulativeScroll = WebCore::IntPoint()); >+ PassOwnPtr<WebCore::PlatformGestureCurve> createCurve(int deviceSource, const WebCore::FloatPoint&, WebCore::FloatPoint cumulativeScroll = WebCore::FloatPoint()); > void setWebFlingAnimatorForTest(PassOwnPtr<WebFlingAnimator>); > > private: >diff --git a/Source/WebKit/chromium/public/WebActiveWheelFlingParameters.h b/Source/WebKit/chromium/public/WebActiveWheelFlingParameters.h >index 2133e85084090cc7269f76f88386ad1c3bb9df88..ec39aeb4a906e38a379d582a13e56a468dec0b05 100644 >--- a/Source/WebKit/chromium/public/WebActiveWheelFlingParameters.h >+++ b/Source/WebKit/chromium/public/WebActiveWheelFlingParameters.h >@@ -41,7 +41,7 @@ struct WebActiveWheelFlingParameters { > WebPoint globalPoint; > int modifiers; > WebGestureEvent::SourceDevice sourceDevice; >- WebSize cumulativeScroll; >+ WebFloatPoint cumulativeScroll; > double startTime; > > WebActiveWheelFlingParameters() >diff --git a/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp b/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp >index 87d7b2522e9c696b2a5b1db3cba1b48684db2f75..a12caf0212e8aa6f3c397fb7390c73e91e235692 100644 >--- a/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp >+++ b/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp >@@ -119,7 +119,7 @@ WebCompositorInputHandlerImpl::EventDisposition WebCompositorInputHandlerImpl::h > switch (scrollStatus) { > case WebInputHandlerClient::ScrollStatusStarted: { > TRACE_EVENT_INSTANT2("cc", "WebCompositorInputHandlerImpl::handleInput wheel scroll", "deltaX", -wheelEvent.deltaX, "deltaY", -wheelEvent.deltaY); >- m_inputHandlerClient->scrollBy(WebPoint(wheelEvent.x, wheelEvent.y), IntSize(-wheelEvent.deltaX, -wheelEvent.deltaY)); >+ m_inputHandlerClient->scrollBy(WebPoint(wheelEvent.x, wheelEvent.y), WebFloatPoint(-wheelEvent.deltaX, -wheelEvent.deltaY)); > m_inputHandlerClient->scrollEnd(); > return DidHandle; > } >@@ -155,7 +155,7 @@ WebCompositorInputHandlerImpl::EventDisposition WebCompositorInputHandlerImpl::h > > const WebGestureEvent& gestureEvent = *static_cast<const WebGestureEvent*>(&event); > m_inputHandlerClient->scrollBy(WebPoint(gestureEvent.x, gestureEvent.y), >- IntSize(-gestureEvent.data.scrollUpdate.deltaX, -gestureEvent.data.scrollUpdate.deltaY)); >+ WebFloatPoint(-gestureEvent.data.scrollUpdate.deltaX, -gestureEvent.data.scrollUpdate.deltaY)); > return DidHandle; > } else if (event.type == WebInputEvent::GestureScrollEnd) { > ASSERT(m_expectScrollUpdateEnd); >@@ -273,9 +273,9 @@ bool WebCompositorInputHandlerImpl::cancelCurrentFling() > return hadFlingAnimation; > } > >-void WebCompositorInputHandlerImpl::scrollBy(const IntPoint& increment) >+void WebCompositorInputHandlerImpl::scrollBy(const FloatPoint& increment) > { >- if (increment == IntPoint::zero()) >+ if (increment == FloatPoint::zero()) > return; > > TRACE_EVENT2("cc", "WebCompositorInputHandlerImpl::scrollBy", "x", increment.x(), "y", increment.y()); >@@ -293,8 +293,8 @@ void WebCompositorInputHandlerImpl::scrollBy(const IntPoint& increment) > WebCompositorInputHandlerImpl::EventDisposition disposition = handleInputEventInternal(syntheticWheel); > switch (disposition) { > case DidHandle: >- m_wheelFlingParameters.cumulativeScroll.width += increment.x(); >- m_wheelFlingParameters.cumulativeScroll.height += increment.y(); >+ m_wheelFlingParameters.cumulativeScroll.x += increment.x(); >+ m_wheelFlingParameters.cumulativeScroll.y += increment.y(); > case DropEvent: > break; > case DidNotHandle: >diff --git a/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.h b/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.h >index fa81de94527cad9e2caacbd5a9d4a873b396cef1..dbf4253a72377023033c2dd7615052b64832a040 100644 >--- a/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.h >+++ b/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.h >@@ -65,7 +65,7 @@ public: > virtual void animate(double monotonicTime); > > // WebCore::PlatformGestureCurveTarget implementation. >- virtual void scrollBy(const WebCore::IntPoint&); >+ virtual void scrollBy(const WebCore::FloatPoint&); > > int identifier() const { return m_identifier; } > >diff --git a/Source/WebKit/chromium/src/WebViewImpl.cpp b/Source/WebKit/chromium/src/WebViewImpl.cpp >index f6f9fc6fa7c12480ad406ce5a8995ea63d4c3c90..d0a216c0dcd892ab1a4238e8f06e3910420e4517 100644 >--- a/Source/WebKit/chromium/src/WebViewImpl.cpp >+++ b/Source/WebKit/chromium/src/WebViewImpl.cpp >@@ -641,7 +641,7 @@ void WebViewImpl::handleMouseUp(Frame& mainFrame, const WebMouseEvent& event) > #endif > } > >-void WebViewImpl::scrollBy(const WebCore::IntPoint& delta) >+void WebViewImpl::scrollBy(const WebCore::FloatPoint& delta) > { > WebMouseWheelEvent syntheticWheel; > const float tickDivisor = WebCore::WheelEvent::tickMultiplier; >@@ -799,7 +799,7 @@ void WebViewImpl::transferActiveWheelFlingAnimation(const WebActiveWheelFlingPar > m_lastWheelPosition = parameters.point; > m_lastWheelGlobalPosition = parameters.globalPoint; > m_flingModifier = parameters.modifiers; >- OwnPtr<PlatformGestureCurve> curve = PlatformGestureCurveFactory::get()->createCurve(parameters.sourceDevice, parameters.delta, IntPoint(parameters.cumulativeScroll)); >+ OwnPtr<PlatformGestureCurve> curve = PlatformGestureCurveFactory::get()->createCurve(parameters.sourceDevice, parameters.delta, parameters.cumulativeScroll); > m_gestureAnimation = ActivePlatformGestureAnimation::create(curve.release(), this, parameters.startTime); > scheduleAnimation(); > } >diff --git a/Source/WebKit/chromium/src/WebViewImpl.h b/Source/WebKit/chromium/src/WebViewImpl.h >index 02a1e537040b6800768fc1be91c3fab6f06fec52..81756eacd1e86b54b1a76691a23bf993692b262a 100644 >--- a/Source/WebKit/chromium/src/WebViewImpl.h >+++ b/Source/WebKit/chromium/src/WebViewImpl.h >@@ -405,7 +405,7 @@ public: > void hasTouchEventHandlers(bool); > > // PlatformGestureCurveTarget implementation for wheel fling. >- virtual void scrollBy(const WebCore::IntPoint&); >+ virtual void scrollBy(const WebCore::FloatPoint&); > > // Handles context menu events orignated via the the keyboard. These > // include the VK_APPS virtual key and the Shift+F10 combine. Code is
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 101563
:
172958
|
173212
|
173214
|
173572
|
173583
|
173584