Changeset 243763 in webkit


Ignore:
Timestamp:
Apr 2, 2019 3:19:05 PM (5 years ago)
Author:
Devin Rousso
Message:

Web Inspector: Canvas: add support for showing WebGPU contexts
https://bugs.webkit.org/show_bug.cgi?id=196413
<rdar://problem/49438898>

Reviewed by Timothy Hatcher.

Source/WebCore:

Tests: inspector/canvas/create-context-webgpu.html

inspector/canvas/resolveCanvasContext-webgpu.html

  • Modules/webgpu/GPUCanvasContext.idl:
  • Modules/webgpu/GPUCanvasContext.h:

(WebCore::GPUCanvasContext::canvas const): Added.

  • Modules/webgpu/GPUCanvasContext.cpp:

(WebCore::GPUCanvasContext::create):

  • testing/InternalSettings.idl:
  • testing/InternalSettings.h:
  • testing/InternalSettings.cpp:

(WebCore::InternalSettings::setWebGPUEnabled): Added.

LayoutTests:

  • inspector/canvas/create-context-webgpu.html: Added.
  • inspector/canvas/create-context-webgpu-expected.txt: Added.
  • inspector/canvas/resolveCanvasContext-webgpu.html: Added.
  • inspector/canvas/resolveCanvasContext-webgpu-expected.txt: Added.
  • inspector/canvas/resources/create-context-utilities.js:

(createDetachedCanvas):
(createCSSCanvas):
(destroyCanvases):
(TestPage.registerInitializer.InspectorTest.CreateContextUtilities.initializeTestSuite): Added.
(TestPage.registerInitializer.InspectorTest.CreateContextUtilities.addSimpleTestCase): Added.
(TestPage.registerInitializer.InspectorTest.CreateContextUtilities.addCSSCanvasTestCase): Added.
(TestPage.registerInitializer.window.initializeTestSuite): Deleted.
(TestPage.registerInitializer.window.addSimpleTestCase): Deleted.
(TestPage.registerInitializer.window.addCSSCanvasTestCase): Deleted.

  • inspector/canvas/create-context-2d.html:
  • inspector/canvas/create-context-2d-expected.txt:
  • inspector/canvas/create-context-bitmaprenderer.html:
  • inspector/canvas/create-context-bitmaprenderer-expected.txt:
  • inspector/canvas/create-context-webgl.html:
  • inspector/canvas/create-context-webgl-expected.txt:
  • inspector/canvas/create-context-webgl2.html:
  • inspector/canvas/create-context-webgl2-expected.txt:
  • platform/gtk/TestExpectations:
  • platform/ios/TestExpectations:
  • platform/mac-wk1/TestExpectations:
  • platform/mac/TestExpectations:
  • platform/win/TestExpectations:
  • platform/wincairo/TestExpectations:
  • platform/wpe/TestExpectations:
Location:
trunk
Files:
3 added
24 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r243762 r243763  
     12019-04-02  Devin Rousso  <drousso@apple.com>
     2
     3        Web Inspector: Canvas: add support for showing WebGPU contexts
     4        https://bugs.webkit.org/show_bug.cgi?id=196413
     5        <rdar://problem/49438898>
     6
     7        Reviewed by Timothy Hatcher.
     8
     9        * inspector/canvas/create-context-webgpu.html: Added.
     10        * inspector/canvas/create-context-webgpu-expected.txt: Added.
     11        * inspector/canvas/resolveCanvasContext-webgpu.html: Added.
     12        * inspector/canvas/resolveCanvasContext-webgpu-expected.txt: Added.
     13
     14        * inspector/canvas/resources/create-context-utilities.js:
     15        (createDetachedCanvas):
     16        (createCSSCanvas):
     17        (destroyCanvases):
     18        (TestPage.registerInitializer.InspectorTest.CreateContextUtilities.initializeTestSuite): Added.
     19        (TestPage.registerInitializer.InspectorTest.CreateContextUtilities.addSimpleTestCase): Added.
     20        (TestPage.registerInitializer.InspectorTest.CreateContextUtilities.addCSSCanvasTestCase): Added.
     21        (TestPage.registerInitializer.window.initializeTestSuite): Deleted.
     22        (TestPage.registerInitializer.window.addSimpleTestCase): Deleted.
     23        (TestPage.registerInitializer.window.addCSSCanvasTestCase): Deleted.
     24
     25        * inspector/canvas/create-context-2d.html:
     26        * inspector/canvas/create-context-2d-expected.txt:
     27        * inspector/canvas/create-context-bitmaprenderer.html:
     28        * inspector/canvas/create-context-bitmaprenderer-expected.txt:
     29        * inspector/canvas/create-context-webgl.html:
     30        * inspector/canvas/create-context-webgl-expected.txt:
     31        * inspector/canvas/create-context-webgl2.html:
     32        * inspector/canvas/create-context-webgl2-expected.txt:
     33
     34        * platform/gtk/TestExpectations:
     35        * platform/ios/TestExpectations:
     36        * platform/mac-wk1/TestExpectations:
     37        * platform/mac/TestExpectations:
     38        * platform/win/TestExpectations:
     39        * platform/wincairo/TestExpectations:
     40        * platform/wpe/TestExpectations:
     41
    1422019-04-02  Chris Dumez  <cdumez@apple.com>
    243
  • trunk/LayoutTests/inspector/canvas/create-context-2d-expected.txt

    r239976 r243763  
    2020PASS: Canvas context should be 2D.
    2121  0: getContext - [native code]
    22   1: createDetachedCanvas - inspector/canvas/resources/create-context-utilities.js:8:62
     22  1: createDetachedCanvas - inspector/canvas/resources/create-context-utilities.js:11:62
    2323  2: Global Code - [program code]
    2424  3: evaluateWithScopeExtension - [native code]
     
    3232PASS: Canvas context should be 2D.
    3333  0: getCSSCanvasContext - [native code]
    34   1: createCSSCanvas - inspector/canvas/resources/create-context-utilities.js:12:47
     34  1: createCSSCanvas - inspector/canvas/resources/create-context-utilities.js:18:47
    3535  2: Global Code - [program code]
    3636  3: evaluateWithScopeExtension - [native code]
  • trunk/LayoutTests/inspector/canvas/create-context-2d.html

    r220119 r243763  
    77<script>
    88function test() {
    9     let suite = initializeTestSuite("Canvas.CreateContext2D");
     9    let suite = InspectorTest.CreateContextUtilities.initializeTestSuite("Canvas.CreateContext2D");
    1010
    11     addSimpleTestCase({
     11    InspectorTest.CreateContextUtilities.addSimpleTestCase({
    1212        name: "Attached",
    1313        expression: `createAttachedCanvas("2d")`,
     
    1515    });
    1616
    17     addSimpleTestCase({
     17    InspectorTest.CreateContextUtilities.addSimpleTestCase({
    1818        name: "Detached",
    1919        expression: `createDetachedCanvas("2d")`,
     
    2121    });
    2222
    23     addCSSCanvasTestCase(WI.Canvas.ContextType.Canvas2D);
     23    InspectorTest.CreateContextUtilities.addCSSCanvasTestCase(WI.Canvas.ContextType.Canvas2D);
    2424
    2525    suite.runTestCasesAndFinish();
  • trunk/LayoutTests/inspector/canvas/create-context-bitmaprenderer-expected.txt

    r239976 r243763  
    2020PASS: Canvas context should be Bitmap Renderer.
    2121  0: getContext - [native code]
    22   1: createDetachedCanvas - inspector/canvas/resources/create-context-utilities.js:8:62
     22  1: createDetachedCanvas - inspector/canvas/resources/create-context-utilities.js:11:62
    2323  2: Global Code - [program code]
    2424  3: evaluateWithScopeExtension - [native code]
  • trunk/LayoutTests/inspector/canvas/create-context-bitmaprenderer.html

    r225884 r243763  
    77<script>
    88function test() {
    9     let suite = initializeTestSuite("Canvas.CreateContextBitmapRenderer");
     9    let suite = InspectorTest.CreateContextUtilities.initializeTestSuite("Canvas.CreateContextBitmapRenderer");
    1010
    11     addSimpleTestCase({
     11    InspectorTest.CreateContextUtilities.addSimpleTestCase({
    1212        name: "Attached",
    1313        expression: `createAttachedCanvas("bitmaprenderer")`,
     
    1515    });
    1616
    17     addSimpleTestCase({
     17    InspectorTest.CreateContextUtilities.addSimpleTestCase({
    1818        name: "Detached",
    1919        expression: `createDetachedCanvas("bitmaprenderer")`,
  • trunk/LayoutTests/inspector/canvas/create-context-webgl-expected.txt

    r239976 r243763  
    2020PASS: Canvas context should be WebGL.
    2121  0: getContext - [native code]
    22   1: createDetachedCanvas - inspector/canvas/resources/create-context-utilities.js:8:62
     22  1: createDetachedCanvas - inspector/canvas/resources/create-context-utilities.js:11:62
    2323  2: Global Code - [program code]
    2424  3: evaluateWithScopeExtension - [native code]
     
    3232PASS: Canvas context should be WebGL.
    3333  0: getCSSCanvasContext - [native code]
    34   1: createCSSCanvas - inspector/canvas/resources/create-context-utilities.js:12:47
     34  1: createCSSCanvas - inspector/canvas/resources/create-context-utilities.js:18:47
    3535  2: Global Code - [program code]
    3636  3: evaluateWithScopeExtension - [native code]
  • trunk/LayoutTests/inspector/canvas/create-context-webgl.html

    r220119 r243763  
    77<script>
    88function test() {
    9     let suite = initializeTestSuite("Canvas.CreateContextWebGL");
     9    let suite = InspectorTest.CreateContextUtilities.initializeTestSuite("Canvas.CreateContextWebGL");
    1010
    11     addSimpleTestCase({
     11    InspectorTest.CreateContextUtilities.addSimpleTestCase({
    1212        name: "Attached",
    1313        expression: `createAttachedCanvas("webgl")`,
     
    1515    });
    1616
    17     addSimpleTestCase({
     17    InspectorTest.CreateContextUtilities.addSimpleTestCase({
    1818        name: "Detached",
    1919        expression: `createDetachedCanvas("webgl")`,
     
    2121    });
    2222
    23     addCSSCanvasTestCase(WI.Canvas.ContextType.WebGL);
     23    InspectorTest.CreateContextUtilities.addCSSCanvasTestCase(WI.Canvas.ContextType.WebGL);
    2424
    2525    suite.runTestCasesAndFinish();
  • trunk/LayoutTests/inspector/canvas/create-context-webgl2-expected.txt

    r239976 r243763  
    2020PASS: Canvas context should be WebGL2.
    2121  0: getContext - [native code]
    22   1: createDetachedCanvas - inspector/canvas/resources/create-context-utilities.js:8:62
     22  1: createDetachedCanvas - inspector/canvas/resources/create-context-utilities.js:11:62
    2323  2: Global Code - [program code]
    2424  3: evaluateWithScopeExtension - [native code]
     
    3232PASS: Canvas context should be WebGL2.
    3333  0: getCSSCanvasContext - [native code]
    34   1: createCSSCanvas - inspector/canvas/resources/create-context-utilities.js:12:47
     34  1: createCSSCanvas - inspector/canvas/resources/create-context-utilities.js:18:47
    3535  2: Global Code - [program code]
    3636  3: evaluateWithScopeExtension - [native code]
  • trunk/LayoutTests/inspector/canvas/create-context-webgl2.html

    r220119 r243763  
    1010
    1111function test() {
    12     let suite = initializeTestSuite("Canvas.CreateContextWebGL2");
     12    let suite = InspectorTest.CreateContextUtilities.initializeTestSuite("Canvas.CreateContextWebGL2");
    1313
    14     addSimpleTestCase({
     14    InspectorTest.CreateContextUtilities.addSimpleTestCase({
    1515        name: "Attached",
    1616        expression: `createAttachedCanvas("webgl2")`,
     
    1818    });
    1919
    20     addSimpleTestCase({
     20    InspectorTest.CreateContextUtilities.addSimpleTestCase({
    2121        name: "Detached",
    2222        expression: `createDetachedCanvas("webgl2")`,
     
    2424    });
    2525
    26     addCSSCanvasTestCase(WI.Canvas.ContextType.WebGL2);
     26    InspectorTest.CreateContextUtilities.addCSSCanvasTestCase(WI.Canvas.ContextType.WebGL2);
    2727
    2828    suite.runTestCasesAndFinish();
  • trunk/LayoutTests/inspector/canvas/create-context-webgpu-expected.txt

    r243762 r243763  
    1 Test that CanvasManager tracks creation and destruction of WebGL canvases.
     1Test that CanvasManager tracks creation and destruction of WebGPU canvases.
    22
    33
    4 == Running test suite: Canvas.CreateContextWebGL
    5 -- Running test case: Canvas.CreateContextWebGL.NoCanvases
     4== Running test suite: Canvas.CreateContextWebGPU
     5-- Running test case: Canvas.CreateContextWebGPU.NoCanvases
    66PASS: CanvasManager should have no canvases.
    77
    8 -- Running test case: Canvas.CreateContextWebGL.Attached
    9 PASS: Canvas context should be WebGL.
     8-- Running test case: Canvas.CreateContextWebGPU.Attached
     9PASS: Canvas context should be Web GPU.
    1010  0: getContext - [native code]
    1111  1: createAttachedCanvas - inspector/canvas/resources/create-context-utilities.js:4:36
     
    1717PASS: Removed canvas has expected ID.
    1818
    19 -- Running test case: Canvas.CreateContextWebGL.Detached
    20 PASS: Canvas context should be WebGL.
     19-- Running test case: Canvas.CreateContextWebGPU.Detached
     20PASS: Canvas context should be Web GPU.
    2121  0: getContext - [native code]
    22   1: createDetachedCanvas - inspector/canvas/resources/create-context-utilities.js:8:62
     22  1: createDetachedCanvas - inspector/canvas/resources/create-context-utilities.js:11:62
    2323  2: Global Code - [program code]
    2424  3: evaluateWithScopeExtension - [native code]
     
    2828PASS: Removed canvas has expected ID.
    2929
    30 -- Running test case: Canvas.CreateContextWebGL.CSSCanvas
     30-- Running test case: Canvas.CreateContextWebGPU.CSSCanvas
    3131Create CSS canvas from -webkit-canvas(css-canvas).
    32 PASS: Canvas context should be WebGL.
     32PASS: Canvas context should be Web GPU.
    3333  0: getCSSCanvasContext - [native code]
    34   1: createCSSCanvas - inspector/canvas/resources/create-context-utilities.js:12:47
     34  1: createCSSCanvas - inspector/canvas/resources/create-context-utilities.js:18:47
    3535  2: Global Code - [program code]
    3636  3: evaluateWithScopeExtension - [native code]
  • trunk/LayoutTests/inspector/canvas/resources/create-context-utilities.js

    r225892 r243763  
    33function createAttachedCanvas(contextType) {
    44    let canvas = document.body.appendChild(document.createElement("canvas"));
    5     contexts.push(canvas.getContext(contextType));
     5    let context = canvas.getContext(contextType);
     6    if (!context)
     7        TestPage.addResult("FAIL: missing context for type " + contextType);
     8    contexts.push(context);
    69}
    710
    811function createDetachedCanvas(contextType) {
    9     contexts.push(document.createElement("canvas").getContext(contextType));
     12    let context = document.createElement("canvas").getContext(contextType);
     13    if (!context)
     14        TestPage.addResult("FAIL: missing context for type " + contextType);
     15    contexts.push(context);
    1016}
    1117
    1218function createCSSCanvas(contextType, canvasName) {
    13     contexts.push(document.getCSSCanvasContext(contextType, canvasName, 10, 10));
     19    let context = document.getCSSCanvasContext(contextType, canvasName, 10, 10);
     20    if (!context)
     21        TestPage.addResult("FAIL: missing context for type " + contextType);
     22    contexts.push();
    1423}
    1524
    1625function destroyCanvases() {
    1726    for (let context of contexts) {
     27        if (!context)
     28            continue;
     29
    1830        let canvasElement = context.canvas;
    1931        if (canvasElement && canvasElement.parentNode)
     
    6981    }
    7082
    71     window.initializeTestSuite = function(name) {
     83    InspectorTest.CreateContextUtilities = {};
     84
     85    InspectorTest.CreateContextUtilities.initializeTestSuite = function(name) {
    7286        suite = InspectorTest.createAsyncSuite(name);
    7387
     
    8498    };
    8599
    86     window.addSimpleTestCase = function({name, description, expression, contextType}) {
     100    InspectorTest.CreateContextUtilities.addSimpleTestCase = function({name, description, expression, contextType}) {
    87101        suite.addTestCase({
    88102            name: suite.name + "." + name,
     
    109123
    110124    let previousCSSCanvasContextType = null;
    111     window.addCSSCanvasTestCase = function(contextType) {
     125    InspectorTest.CreateContextUtilities.addCSSCanvasTestCase = function(contextType) {
    112126        InspectorTest.assert(!previousCSSCanvasContextType || previousCSSCanvasContextType === contextType, "addCSSCanvasTestCase cannot be called more than once with different context types.");
    113127        if (!previousCSSCanvasContextType)
     
    124138                .then(resolve, reject);
    125139
    126                 let contextId = contextType === WI.Canvas.ContextType.Canvas2D ? "2d" : contextType;
     140                let contextId = null;
     141                if (contextType === WI.Canvas.ContextType.Canvas2D)
     142                    contextId = "2d";
     143                else if (contextType === WI.Canvas.ContextType.WebGPU)
     144                    contextId = "gpu";
     145                else
     146                    contextId = contextType;
     147
    127148                InspectorTest.log(`Create CSS canvas from -webkit-canvas(css-canvas).`);
    128149                InspectorTest.evaluateInPage(`createCSSCanvas("${contextId}", "css-canvas")`);
  • trunk/LayoutTests/platform/gtk/TestExpectations

    r243666 r243763  
    12371237# No support for WebGPU yet
    12381238webkit.org/b/191005 webgpu/ [ Skip ]
     1239webkit.org/b/191005 inspector/canvas/create-context-webgpu.html [ Skip ]
     1240webkit.org/b/191005 inspector/canvas/resolveCanvasContext-webgpu.html [ Skip ]
    12391241
    12401242# No support for resource load statistics yet
  • trunk/LayoutTests/platform/ios/TestExpectations

    r243737 r243763  
    4242# WebGPU is not enabled on iOS Simulator.
    4343webgpu [ Skip ]
     44inspector/canvas/create-context-webgpu.html [ Skip ]
     45inspector/canvas/resolveCanvasContext-webgpu.html [ Skip ]
    4446
    4547# Encrypted Media Extensions are not enabled
  • trunk/LayoutTests/platform/mac-wk1/TestExpectations

    r243749 r243763  
    4444css-typedom [ Skip ]
    4545css-dark-mode [ Skip ]
     46
    4647webgpu [ Skip ]
     48inspector/canvas/create-context-webgpu.html [ Skip ]
     49inspector/canvas/resolveCanvasContext-webgpu.html [ Skip ]
    4750
    4851# Media Stream API testing is not supported for WK1 yet.
  • trunk/LayoutTests/platform/mac/TestExpectations

    r243750 r243763  
    17801780
    17811781webkit.org/b/192956 [ Sierra ] webgpu [ Skip ]
     1782webkit.org/b/192956 [ Sierra ] inspector/canvas/create-context-webgpu.html [ Skip ]
     1783webkit.org/b/192956 [ Sierra ] inspector/canvas/resolveCanvasContext-webgpu.html [ Skip ]
    17821784
    17831785webkit.org/b/189680 platform/mac/media/audio-session-category-video-paused.html [ Pass Timeout ]
  • trunk/LayoutTests/platform/win/TestExpectations

    r243714 r243763  
    42184218# WebGPU is not supported on Windows
    42194219webgpu [ Skip ]
     4220inspector/canvas/create-context-webgpu.html [ Skip ]
     4221inspector/canvas/resolveCanvasContext-webgpu.html [ Skip ]
    42204222
    42214223webkit.org/b/191194 fast/block/basic/inline-content-with-floating-image.html [ Failure ]
  • trunk/LayoutTests/platform/wincairo/TestExpectations

    r243666 r243763  
    292292# WEBGPU is disabled
    293293webgpu [ Skip ]
     294inspector/canvas/create-context-webgpu.html [ Skip ]
     295inspector/canvas/resolveCanvasContext-webgpu.html [ Skip ]
    294296
    295297# WIRELESS_PLAYBACK_TARGET is disabled
  • trunk/LayoutTests/platform/wpe/TestExpectations

    r243666 r243763  
    296296# No WebGPU support yet
    297297webgpu [ Skip ]
     298inspector/canvas/create-context-webgpu.html [ Skip ]
     299inspector/canvas/resolveCanvasContext-webgpu.html [ Skip ]
    298300
    299301# Skipped due to untestable DRM key system. ClearKey counterparts are tested instead.
  • trunk/Source/WebCore/ChangeLog

    r243762 r243763  
     12019-04-02  Devin Rousso  <drousso@apple.com>
     2
     3        Web Inspector: Canvas: add support for showing WebGPU contexts
     4        https://bugs.webkit.org/show_bug.cgi?id=196413
     5        <rdar://problem/49438898>
     6
     7        Reviewed by Timothy Hatcher.
     8
     9        Tests: inspector/canvas/create-context-webgpu.html
     10               inspector/canvas/resolveCanvasContext-webgpu.html
     11
     12        * Modules/webgpu/GPUCanvasContext.idl:
     13        * Modules/webgpu/GPUCanvasContext.h:
     14        (WebCore::GPUCanvasContext::canvas const): Added.
     15        * Modules/webgpu/GPUCanvasContext.cpp:
     16        (WebCore::GPUCanvasContext::create):
     17
     18        * testing/InternalSettings.idl:
     19        * testing/InternalSettings.h:
     20        * testing/InternalSettings.cpp:
     21        (WebCore::InternalSettings::setWebGPUEnabled): Added.
     22
    1232019-04-02  Chris Dumez  <cdumez@apple.com>
    224
  • trunk/Source/WebCore/Modules/webgpu/GPUCanvasContext.cpp

    r242759 r243763  
    2727#include "GPUCanvasContext.h"
    2828
     29#include "InspectorInstrumentation.h"
     30
    2931#if ENABLE(WEBGPU)
    3032
     
    3537    auto context = std::unique_ptr<GPUCanvasContext>(new GPUCanvasContext(canvas));
    3638    context->suspendIfNeeded();
     39
     40    InspectorInstrumentation::didCreateCanvasRenderingContext(*context);
     41
    3742    return context;
    3843}
  • trunk/Source/WebCore/Modules/webgpu/GPUCanvasContext.h

    r242759 r243763  
    2929
    3030#include "GPUBasedCanvasRenderingContext.h"
     31#include "HTMLCanvasElement.h"
    3132#include "WebGPUSwapChain.h"
    3233#include <wtf/RefPtr.h>
     
    3738public:
    3839    static std::unique_ptr<GPUCanvasContext> create(CanvasBase&);
     40
     41    HTMLCanvasElement& canvas() const { return downcast<HTMLCanvasElement>(canvasBase()); }
    3942
    4043    void replaceSwapChain(Ref<WebGPUSwapChain>&&);
  • trunk/Source/WebCore/Modules/webgpu/GPUCanvasContext.idl

    r242759 r243763  
    2929    EnabledAtRuntime=WebGPU
    3030] interface GPUCanvasContext {
     31    // back-reference to the canvas
     32    readonly attribute HTMLCanvasElement canvas;
    3133};
  • trunk/Source/WebCore/testing/InternalSettings.cpp

    r243666 r243763  
    759759}
    760760
     761void InternalSettings::setWebGPUEnabled(bool enabled)
     762{
     763#if ENABLE(WEBGPU)
     764    RuntimeEnabledFeatures::sharedFeatures().setWebGPUEnabled(enabled);
     765#else
     766    UNUSED_PARAM(enabled);
     767#endif
     768}
     769
    761770void InternalSettings::setWebVREnabled(bool enabled)
    762771{
  • trunk/Source/WebCore/testing/InternalSettings.h

    r243666 r243763  
    124124    static void setIndexedDBWorkersEnabled(bool);
    125125    static void setWebGL2Enabled(bool);
     126    static void setWebGPUEnabled(bool);
    126127    static void setWebVREnabled(bool);
    127128    static void setScreenCaptureEnabled(bool);
  • trunk/Source/WebCore/testing/InternalSettings.idl

    r243666 r243763  
    9292    void setIndexedDBWorkersEnabled(boolean enabled);
    9393    void setWebGL2Enabled(boolean enabled);
     94    void setWebGPUEnabled(boolean enabled);
    9495    void setWebVREnabled(boolean enabled);
    9596    void setScreenCaptureEnabled(boolean enabled);
Note: See TracChangeset for help on using the changeset viewer.