WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-104574-20121212202248.patch (text/plain), 20.13 KB, created by
Andras Becsi
on 2012-12-12 11:25:33 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Andras Becsi
Created:
2012-12-12 11:25:33 PST
Size:
20.13 KB
patch
obsolete
>Subversion Revision: 137478 >diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog >index ad2dc8f5f6bb383693c12a031de6225405c43f4b..72bc742aca9f87b1e4bb93efe1601b491fd56b88 100644 >--- a/Source/WebKit2/ChangeLog >+++ b/Source/WebKit2/ChangeLog >@@ -1,3 +1,57 @@ >+2012-12-12 Andras Becsi <andras.becsi@digia.com> >+ >+ [Qt][WK2] Fix painting on Mac with retina display >+ https://bugs.webkit.org/show_bug.cgi?id=104574 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Since HiDPI support has been added and enabled in Qt we ended up >+ painting incorrectly scaled content on high-resolution screens. >+ Because the intrinsic device pixel ratio is always taken into >+ account by Qt when painting to high-resolution screens we should >+ automatically obtain the scale ratio from the window in which the >+ item is rendered instead of setting it in QML. >+ >+ Qt does not make it possible to override the device pixel ratio >+ of the native window, therefore our experimental QML API for setting >+ a custom value is of no use any more and should be removed. >+ >+ This patch fixes the scaling issue on Mac retina display by querying >+ the underlying window for the device scale factor and applying it to >+ the backing store and the scene-graph rendering of the content node. >+ Additionally removes the experimental API and related API tests. >+ >+ * UIProcess/API/qt/qquickwebpage.cpp: >+ (QQuickWebPage::updatePaintNode): >+ * UIProcess/API/qt/qquickwebview.cpp: >+ (QQuickWebViewPrivate::QQuickWebViewPrivate): >+ (QQuickWebViewLegacyPrivate::updateViewportSize): >+ (QQuickWebViewFlickablePrivate::onComponentComplete): >+ * UIProcess/API/qt/qquickwebview_p.h: >+ * UIProcess/API/qt/tests/qquickwebview/tst_qquickwebview.cpp: >+ (tst_QQuickWebView::newWebView): >+ * UIProcess/CoordinatedGraphics/CoordinatedLayerTreeHostProxy.cpp: >+ (WebKit::CoordinatedLayerTreeHostProxy::CoordinatedLayerTreeHostProxy): >+ (WebKit::CoordinatedLayerTreeHostProxy::setBackingStoreScaleFactor): >+ >+ Add backing store scale factor to support setting a custom >+ backing store resolution that does not affect the layout size. >+ Use this to apply the screen device pixel ratio of the >+ underlying window in which the content item is rendered. >+ >+ (WebKit::CoordinatedLayerTreeHostProxy::setVisibleContentsRect): >+ * UIProcess/CoordinatedGraphics/CoordinatedLayerTreeHostProxy.h: >+ (CoordinatedLayerTreeHostProxy): >+ * UIProcess/qt/QtWebPageSGNode.cpp: >+ (WebKit::ContentsSGNode::ContentsSGNode): >+ (WebKit::ContentsSGNode::render): >+ (WebKit::ContentsSGNode::clipRect): >+ (ContentsSGNode): >+ (WebKit::QtWebPageSGNode::QtWebPageSGNode): >+ (WebKit::QtWebPageSGNode::setRenderer): >+ * UIProcess/qt/QtWebPageSGNode.h: >+ (QtWebPageSGNode): >+ > 2012-12-12 Simon Pena <spena@igalia.com> > > [GTK] Add sections documentation to WebKit2 GTK+ API >diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp b/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp >index 6b39731895dfc0195e14a7a5ce424717ab6618af..dc5cca75296622ac637ba784908c6b03a006cfdf 100644 >--- a/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp >+++ b/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp >@@ -30,6 +30,7 @@ > #include "qquickwebpage_p_p.h" > #include "qquickwebview_p.h" > #include "qwebkittest_p.h" >+#include <QQuickWindow> > > using namespace WebKit; > >@@ -90,8 +91,19 @@ QSGNode* QQuickWebPage::updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData*) > LayerTreeRenderer* renderer = d->coordinatedLayerTreeHostProxy()->layerTreeRenderer(); > > QtWebPageSGNode* node = static_cast<QtWebPageSGNode*>(oldNode); >+ >+ const QWindow* const w = window(); >+ ASSERT(w); >+ >+ if (w && d->webPageProxy->deviceScaleFactor() != w->devicePixelRatio()) { >+ d->coordinatedLayerTreeHostProxy()->setBackingStoreScaleFactor(w->devicePixelRatio()); >+ d->webPageProxy->setIntrinsicDeviceScaleFactor(w->devicePixelRatio()); >+ d->viewportItem->experimental()->test()->devicePixelRatioChanged(); >+ } >+ > if (!node) >- node = new QtWebPageSGNode(); >+ node = new QtWebPageSGNode(this); >+ > node->setRenderer(renderer); > > node->setScale(d->contentsScale); >diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp >index 80baa9625cdc059dbd73c9e4036e1d6d71da5021..a8651dd176494e115d56806708b2a6468654fd4b 100644 >--- a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp >+++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp >@@ -280,7 +280,6 @@ QQuickWebViewPrivate::QQuickWebViewPrivate(QQuickWebView* viewport) > viewport->setPixelAligned(true); > QObject::connect(viewport, SIGNAL(visibleChanged()), viewport, SLOT(_q_onVisibleChanged())); > QObject::connect(viewport, SIGNAL(urlChanged()), viewport, SLOT(_q_onUrlChanged())); >- QObject::connect(experimental, SIGNAL(devicePixelRatioChanged()), experimental->test(), SIGNAL(devicePixelRatioChanged())); > pageView.reset(new QQuickWebPage(viewport)); > } > >@@ -827,16 +826,15 @@ void QQuickWebViewLegacyPrivate::updateViewportSize() > if (viewportSize.isEmpty()) > return; > >- float devicePixelRatio = webPageProxy->deviceScaleFactor(); > pageView->setContentsSize(viewportSize); >- // Make sure that our scale matches the one passed to setVisibleContentsRect. >- pageView->setContentsScale(devicePixelRatio); > > // The fixed layout is handled by the FrameView and the drawing area doesn't behave differently > // whether its fixed or not. We still need to tell the drawing area which part of it > // has to be rendered on tiles, and in desktop mode it's all of it. >- webPageProxy->drawingArea()->setSize((viewportSize / devicePixelRatio).toSize(), IntSize()); >- webPageProxy->drawingArea()->setVisibleContentsRect(FloatRect(FloatPoint(), FloatSize(viewportSize / devicePixelRatio)), devicePixelRatio, FloatPoint()); >+ webPageProxy->drawingArea()->setSize(viewportSize.toSize(), IntSize()); >+ // The backing store scale factor should already be set to the device pixel ratio >+ // of the underlying window, thus we set the effective scale to 1 here. >+ webPageProxy->drawingArea()->setVisibleContentsRect(FloatRect(FloatPoint(), FloatSize(viewportSize)), 1, FloatPoint()); > } > > qreal QQuickWebViewLegacyPrivate::zoomFactor() const >@@ -868,11 +866,6 @@ void QQuickWebViewFlickablePrivate::onComponentComplete() > m_pageViewportController.reset(new PageViewportController(webPageProxy.get(), m_pageViewportControllerClient.data())); > pageView->eventHandler()->setViewportController(m_pageViewportControllerClient.data()); > >- // Notify about device pixel ratio here because due to the delayed instantiation >- // of the viewport controller the correct value might not have reached QWebKitTest >- // in time it was used from QML. >- emit experimental->test()->devicePixelRatioChanged(); >- > // Trigger setting of correct visibility flags after everything was allocated and initialized. > _q_onVisibleChanged(); > } >@@ -1191,59 +1184,6 @@ void QQuickWebViewExperimental::setUserAgent(const QString& userAgent) > /*! > \internal > >- \qmlproperty real WebViewExperimental::devicePixelRatio >- \brief The ratio between the CSS units and device pixels when the content is unscaled. >- >- When designing touch-friendly contents, knowing the approximated target size on a device >- is important for contents providers in order to get the intented layout and element >- sizes. >- >- As most first generation touch devices had a PPI of approximately 160, this became a >- de-facto value, when used in conjunction with the viewport meta tag. >- >- Devices with a higher PPI learning towards 240 or 320, applies a pre-scaling on all >- content, of either 1.5 or 2.0, not affecting the CSS scale or pinch zooming. >- >- This value can be set using this property and it is exposed to CSS media queries using >- the -webkit-device-pixel-ratio query. >- >- For instance, if you want to load an image without having it upscaled on a web view >- using a device pixel ratio of 2.0 it can be done by loading an image of say 100x100 >- pixels but showing it at half the size. >- >- FIXME: Move documentation example out in separate files >- >- @media (-webkit-min-device-pixel-ratio: 1.5) { >- .icon { >- width: 50px; >- height: 50px; >- url: "/images/icon@2x.png"; // This is actually a 100x100 image >- } >- } >- >- If the above is used on a device with device pixel ratio of 1.5, it will be scaled >- down but still provide a better looking image. >-*/ >- >-qreal QQuickWebViewExperimental::devicePixelRatio() const >-{ >- Q_D(const QQuickWebView); >- return d->webPageProxy->deviceScaleFactor(); >-} >- >-void QQuickWebViewExperimental::setDevicePixelRatio(qreal devicePixelRatio) >-{ >- Q_D(QQuickWebView); >- if (0 >= devicePixelRatio || devicePixelRatio == this->devicePixelRatio()) >- return; >- >- d->webPageProxy->setIntrinsicDeviceScaleFactor(devicePixelRatio); >- emit devicePixelRatioChanged(); >-} >- >-/*! >- \internal >- > \qmlproperty int WebViewExperimental::deviceWidth > \brief The device width used by the viewport calculations. > >diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h >index dfe7ad88e3a9a0ac52a93d6e324db41210a9038d..1b372fa4075f517cf6eb161a763e05306871848e 100644 >--- a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h >+++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h >@@ -256,7 +256,6 @@ class QWEBKIT_EXPORT QQuickWebViewExperimental : public QObject { > Q_PROPERTY(int preferredMinimumContentsWidth WRITE setPreferredMinimumContentsWidth READ preferredMinimumContentsWidth NOTIFY preferredMinimumContentsWidthChanged) > Q_PROPERTY(int deviceWidth WRITE setDeviceWidth READ deviceWidth NOTIFY deviceWidthChanged) > Q_PROPERTY(int deviceHeight WRITE setDeviceHeight READ deviceHeight NOTIFY deviceHeightChanged) >- Q_PROPERTY(qreal devicePixelRatio READ devicePixelRatio WRITE setDevicePixelRatio NOTIFY devicePixelRatioChanged) > > Q_PROPERTY(QWebNavigationHistory* navigationHistory READ navigationHistory CONSTANT FINAL) > >@@ -312,8 +311,6 @@ public: > void setDeviceWidth(int); > int deviceHeight() const; > void setDeviceHeight(int); >- qreal devicePixelRatio() const; >- void setDevicePixelRatio(qreal); > QList<QUrl> userScripts() const; > void setUserScripts(const QList<QUrl>& userScripts); > QUrl remoteInspectorUrl() const; >@@ -371,7 +368,6 @@ Q_SIGNALS: > void userAgentChanged(); > void deviceWidthChanged(); > void deviceHeightChanged(); >- void devicePixelRatioChanged(); > void enterFullScreenRequested(); > void exitFullScreenRequested(); > void userScriptsChanged(); >diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/tst_qquickwebview.cpp b/Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/tst_qquickwebview.cpp >index 6e2c342cbbfaf9e7b103d535207fd9fbbcf5e916..7cf1ddb72b16167bf8bfd5210a24b60475842162 100644 >--- a/Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/tst_qquickwebview.cpp >+++ b/Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/tst_qquickwebview.cpp >@@ -93,7 +93,6 @@ QQuickWebView* tst_QQuickWebView::newWebView() > { > QObject* viewInstance = m_component->create(); > QQuickWebView* webView = qobject_cast<QQuickWebView*>(viewInstance); >- webView->experimental()->setDevicePixelRatio(1.5); > return webView; > } > >diff --git a/Source/WebKit2/UIProcess/CoordinatedGraphics/CoordinatedLayerTreeHostProxy.cpp b/Source/WebKit2/UIProcess/CoordinatedGraphics/CoordinatedLayerTreeHostProxy.cpp >index af42760714cadd149001d13e8723ae0d4491b9d5..705b284c10339305fc30d604f7751b91812467af 100644 >--- a/Source/WebKit2/UIProcess/CoordinatedGraphics/CoordinatedLayerTreeHostProxy.cpp >+++ b/Source/WebKit2/UIProcess/CoordinatedGraphics/CoordinatedLayerTreeHostProxy.cpp >@@ -42,6 +42,7 @@ CoordinatedLayerTreeHostProxy::CoordinatedLayerTreeHostProxy(DrawingAreaProxy* d > : m_drawingAreaProxy(drawingAreaProxy) > , m_renderer(adoptRef(new LayerTreeRenderer(this))) > , m_lastSentScale(0) >+ , m_backingStoreScaleFactor(1) > { > } > >@@ -175,17 +176,25 @@ void CoordinatedLayerTreeHostProxy::setAnimationsLocked(bool locked) > dispatchUpdate(bind(&LayerTreeRenderer::setAnimationsLocked, m_renderer.get(), locked)); > } > >+void CoordinatedLayerTreeHostProxy::setBackingStoreScaleFactor(float scale) >+{ >+ ASSERT(scale > 0); >+ m_backingStoreScaleFactor = scale; >+} >+ > void CoordinatedLayerTreeHostProxy::setVisibleContentsRect(const FloatRect& rect, float scale, const FloatPoint& trajectoryVector) > { > // Inform the renderer to adjust viewport-fixed layers. > dispatchUpdate(bind(&LayerTreeRenderer::setVisibleContentsRect, m_renderer.get(), rect)); > >- if (rect == m_lastSentVisibleRect && scale == m_lastSentScale && trajectoryVector == m_lastSentTrajectoryVector) >+ const float effectiveBackingStoreScale = m_backingStoreScaleFactor * scale; >+ >+ if (rect == m_lastSentVisibleRect && effectiveBackingStoreScale == m_lastSentScale && trajectoryVector == m_lastSentTrajectoryVector) > return; > >- m_drawingAreaProxy->page()->process()->send(Messages::CoordinatedLayerTreeHost::SetVisibleContentsRect(rect, scale, trajectoryVector), m_drawingAreaProxy->page()->pageID()); >+ m_drawingAreaProxy->page()->process()->send(Messages::CoordinatedLayerTreeHost::SetVisibleContentsRect(rect, effectiveBackingStoreScale, trajectoryVector), m_drawingAreaProxy->page()->pageID()); > m_lastSentVisibleRect = rect; >- m_lastSentScale = scale; >+ m_lastSentScale = effectiveBackingStoreScale; > m_lastSentTrajectoryVector = trajectoryVector; > } > >diff --git a/Source/WebKit2/UIProcess/CoordinatedGraphics/CoordinatedLayerTreeHostProxy.h b/Source/WebKit2/UIProcess/CoordinatedGraphics/CoordinatedLayerTreeHostProxy.h >index b51b3413937d05fd2ace546a045fa905a08a12e6..49e0d0a95d2bbe776fcc75031a0f1500c5ae9904 100644 >--- a/Source/WebKit2/UIProcess/CoordinatedGraphics/CoordinatedLayerTreeHostProxy.h >+++ b/Source/WebKit2/UIProcess/CoordinatedGraphics/CoordinatedLayerTreeHostProxy.h >@@ -64,6 +64,7 @@ public: > void deleteCompositingLayer(CoordinatedLayerID); > void setRootCompositingLayer(CoordinatedLayerID); > void setContentsSize(const WebCore::FloatSize&); >+ void setBackingStoreScaleFactor(float); > void setVisibleContentsRect(const WebCore::FloatRect&, float scale, const WebCore::FloatPoint& trajectoryVector); > void didRenderFrame(const WebCore::IntSize& contentsSize, const WebCore::IntRect& coveredRect); > void createTileForLayer(CoordinatedLayerID, uint32_t tileID, const WebCore::IntRect&, const SurfaceUpdateInfo&); >@@ -101,6 +102,7 @@ protected: > RefPtr<LayerTreeRenderer> m_renderer; > WebCore::FloatRect m_lastSentVisibleRect; > float m_lastSentScale; >+ float m_backingStoreScaleFactor; > WebCore::FloatPoint m_lastSentTrajectoryVector; > typedef HashMap<uint32_t /* atlasID */, RefPtr<CoordinatedSurface> > SurfaceMap; > SurfaceMap m_surfaces; >diff --git a/Source/WebKit2/UIProcess/qt/QtWebPageSGNode.cpp b/Source/WebKit2/UIProcess/qt/QtWebPageSGNode.cpp >index eb7023990194961c9db83f5e63d41d0b0cb49299..78dece6fc0b8013606819175260e73670e19d076 100644 >--- a/Source/WebKit2/UIProcess/qt/QtWebPageSGNode.cpp >+++ b/Source/WebKit2/UIProcess/qt/QtWebPageSGNode.cpp >@@ -23,7 +23,10 @@ > > #include "LayerTreeRenderer.h" > #include <QtGui/QPolygonF> >+#include <QtQuick/QQuickItem> >+#include <QtQuick/QQuickWindow> > #include <QtQuick/QSGSimpleRectNode> >+#include <WebCore/TransformationMatrix.h> > #include <private/qsgrendernode_p.h> > > using namespace WebCore; >@@ -32,8 +35,9 @@ namespace WebKit { > > class ContentsSGNode : public QSGRenderNode { > public: >- ContentsSGNode(PassRefPtr<LayerTreeRenderer> renderer) >+ ContentsSGNode(PassRefPtr<LayerTreeRenderer> renderer, const QtWebPageSGNode* parent) > : m_renderer(renderer) >+ , m_parent(parent) > { > layerTreeRenderer()->setActive(true); > } >@@ -45,7 +49,13 @@ public: > > virtual void render(const RenderState& state) > { >- QMatrix4x4 renderMatrix = matrix() ? *matrix() : QMatrix4x4(); >+ TransformationMatrix renderMatrix; >+ if (m_parent->devicePixelRatio() != 1.0) { >+ renderMatrix.scale(m_parent->devicePixelRatio()); >+ if (matrix()) >+ renderMatrix.multiply(*matrix()); >+ } else if (matrix()) >+ renderMatrix = *matrix(); > > // When rendering to an intermediate surface, Qt will > // mirror the projection matrix to fit on the destination coordinate system. >@@ -73,6 +83,8 @@ private: > QMatrix4x4 clipMatrix; > if (clip->matrix()) > clipMatrix = *clip->matrix(); >+ clipMatrix.scale(m_parent->devicePixelRatio()); >+ > QRectF currentClip; > > if (clip->isRectangular()) >@@ -106,11 +118,13 @@ private: > } > > RefPtr<LayerTreeRenderer> m_renderer; >+ const QtWebPageSGNode* const m_parent; > }; > >-QtWebPageSGNode::QtWebPageSGNode() >+QtWebPageSGNode::QtWebPageSGNode(const QQuickItem* parent) > : m_contentsNode(0) > , m_backgroundNode(new QSGSimpleRectNode) >+ , m_parent(parent) > { > appendChildNode(m_backgroundNode); > } >@@ -128,13 +142,21 @@ void QtWebPageSGNode::setScale(float scale) > setMatrix(matrix); > } > >+qreal QtWebPageSGNode::devicePixelRatio() const >+{ >+ if (m_parent->window()) >+ return m_parent->window()->devicePixelRatio(); >+ >+ return 1; >+} >+ > void QtWebPageSGNode::setRenderer(PassRefPtr<LayerTreeRenderer> renderer) > { > if (m_contentsNode && m_contentsNode->layerTreeRenderer() == renderer) > return; > > delete m_contentsNode; >- m_contentsNode = new ContentsSGNode(renderer); >+ m_contentsNode = new ContentsSGNode(renderer, this); > appendChildNode(m_contentsNode); > } > >diff --git a/Source/WebKit2/UIProcess/qt/QtWebPageSGNode.h b/Source/WebKit2/UIProcess/qt/QtWebPageSGNode.h >index 11d18984eda1e881790f92eb9ca2d1ab1ef499d8..be524b2f52f0907f6431dad6306b7d79b5ca3e70 100644 >--- a/Source/WebKit2/UIProcess/qt/QtWebPageSGNode.h >+++ b/Source/WebKit2/UIProcess/qt/QtWebPageSGNode.h >@@ -25,6 +25,7 @@ > #include <wtf/PassRefPtr.h> > > QT_BEGIN_NAMESPACE >+class QQuickItem; > class QSGSimpleRectNode; > QT_END_NAMESPACE > >@@ -35,14 +36,16 @@ class LayerTreeRenderer; > > class QtWebPageSGNode : public QSGTransformNode { > public: >- QtWebPageSGNode(); >+ QtWebPageSGNode(const QQuickItem* parent); > void setBackground(const QRectF&, const QColor&); > void setScale(float); > void setRenderer(PassRefPtr<LayerTreeRenderer>); >+ qreal devicePixelRatio() const; > > private: > ContentsSGNode* m_contentsNode; > QSGSimpleRectNode* m_backgroundNode; >+ const QQuickItem* const m_parent; > }; > > } // namespace WebKit >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index 90b10766dcc04852eaf09f4e61a5881503375f88..549620f8510bb7b11b1d20d87efad56e17390c53 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,15 @@ >+2012-12-12 Andras Becsi <andras.becsi@digia.com> >+ >+ [Qt][WK2] Fix painting on Mac with retina display >+ https://bugs.webkit.org/show_bug.cgi?id=104574 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Remove setting the devicePixelRatio experimental property >+ since the value is now automatically picked up from Qt. >+ >+ * MiniBrowser/qt/qml/BrowserWindow.qml: >+ > 2012-12-12 Krzysztof Czech <k.czech@samsung.com> > > [EFL] Possibility to turn off accessibility feature for WebKit-EFL. >diff --git a/Tools/MiniBrowser/qt/qml/BrowserWindow.qml b/Tools/MiniBrowser/qt/qml/BrowserWindow.qml >index c73308e15b8aac80694d401c86c62a0a2033f99e..e52b2f44b104359072266286b1e2ecaaf78f84ed 100644 >--- a/Tools/MiniBrowser/qt/qml/BrowserWindow.qml >+++ b/Tools/MiniBrowser/qt/qml/BrowserWindow.qml >@@ -354,7 +354,6 @@ Rectangle { > webView.loadHtml("Failed to load " + loadRequest.url, "", loadRequest.url) > } > >- experimental.devicePixelRatio: 1.5 > experimental.preferences.fullScreenEnabled: true > experimental.preferences.webGLEnabled: true > experimental.preferences.webAudioEnabled: true
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 104574
:
178588
|
178602
|
178898
|
179051
|
179085
|
179087
|
179274
|
179275