Add abilitly to query audit trail for batches by draw op

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1745513002

Review URL: https://codereview.chromium.org/1745513002
diff --git a/tools/debugger/SkDebugCanvas.cpp b/tools/debugger/SkDebugCanvas.cpp
index 34e582e..cc1733b 100644
--- a/tools/debugger/SkDebugCanvas.cpp
+++ b/tools/debugger/SkDebugCanvas.cpp
@@ -336,7 +336,8 @@
     result[SKDEBUGCANVAS_ATTRIBUTE_VERSION] = Json::Value(SKDEBUGCANVAS_VERSION);
     Json::Value commands = Json::Value(Json::arrayValue);
     for (int i = 0; i < this->getSize() && i <= n; i++) {
-        commands[i] = this->getDrawCommandAt(i)->drawToAndCollectJSON(canvas, urlDataManager);
+        commands[i] = this->getDrawCommandAt(i)->drawToAndCollectJSON(canvas, urlDataManager,
+                                                                      i);
     }
     result[SKDEBUGCANVAS_ATTRIBUTE_COMMANDS] = commands;
     return result;
diff --git a/tools/debugger/SkDrawCommand.cpp b/tools/debugger/SkDrawCommand.cpp
index 33e49ce..1af2998 100644
--- a/tools/debugger/SkDrawCommand.cpp
+++ b/tools/debugger/SkDrawCommand.cpp
@@ -228,7 +228,8 @@
 }
 
 Json::Value SkDrawCommand::drawToAndCollectJSON(SkCanvas* canvas,
-                                                UrlDataManager& urlDataManager) const {
+                                                UrlDataManager& urlDataManager,
+                                                int opIndex) const {
     Json::Value result = this->toJSON(urlDataManager);
 
     SkASSERT(canvas);
@@ -239,19 +240,18 @@
         GrContext* ctx = rt->getContext();
         if(ctx) {
             GrAuditTrail* at = ctx->getAuditTrail();
-            GrAuditTrail::AutoEnable enable(at);
+            GrAuditTrail::AutoCollectBatches enable(at, opIndex);
             this->execute(canvas);
 
             // TODO if this is inefficient we could add a method to GrAuditTrail which takes
             // a Json::Value and is only compiled in this file
             Json::Value parsedFromString;
             Json::Reader reader;
-            SkDEBUGCODE(bool parsingSuccessful = )reader.parse(at->toJson().c_str(),
+            SkDEBUGCODE(bool parsingSuccessful = )reader.parse(at->toJson(opIndex).c_str(),
                                                                parsedFromString);
             SkASSERT(parsingSuccessful);
 
             result[SKDEBUGCANVAS_ATTRIBUTE_AUDITTRAIL] = parsedFromString;
-            at->reset();
         }
     }
 #endif
diff --git a/tools/debugger/SkDrawCommand.h b/tools/debugger/SkDrawCommand.h
index 34832a7..74c2b2c 100644
--- a/tools/debugger/SkDrawCommand.h
+++ b/tools/debugger/SkDrawCommand.h
@@ -102,7 +102,8 @@
 
     virtual Json::Value toJSON(UrlDataManager& urlDataManager) const;
 
-    Json::Value drawToAndCollectJSON(SkCanvas*, UrlDataManager& urlDataManager) const;
+    Json::Value drawToAndCollectJSON(SkCanvas*, UrlDataManager& urlDataManager,
+                                     int opIndex) const;
 
     /* Converts a JSON representation of a command into a newly-allocated SkDrawCommand object. It
      * is the caller's responsibility to delete this object. This method may return null if an error
diff --git a/tools/skiaserve/Request.cpp b/tools/skiaserve/Request.cpp
index 4d256d5..bcaebde 100644
--- a/tools/skiaserve/Request.cpp
+++ b/tools/skiaserve/Request.cpp
@@ -138,6 +138,28 @@
     return true;
 }
 
+GrAuditTrail* Request::getAuditTrail(SkCanvas* canvas) {
+    GrAuditTrail* at = nullptr;
+#if SK_SUPPORT_GPU
+    GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget();
+    if (rt) {
+        GrContext* ctx = rt->getContext();
+        if (ctx) {
+            at = ctx->getAuditTrail();
+        }
+    }
+#endif
+    return at;
+}
+
+void Request::cleanupAuditTrail(SkCanvas* canvas) {
+    GrAuditTrail* at = this->getAuditTrail(canvas);
+    if (at) {
+        GrAuditTrail::AutoEnable ae(at);
+        at->fullReset();
+    }
+}
+
 SkData* Request::getJsonOps(int n) {
     SkCanvas* canvas = this->getCanvas();
     Json::Value root = fDebugCanvas->toJSON(fUrlDataManager, n, canvas);
@@ -145,6 +167,8 @@
     SkDynamicMemoryWStream stream;
     stream.writeText(Json::FastWriter().write(root).c_str());
 
+    this->cleanupAuditTrail(canvas);
+
     return stream.copyToData();
 }
 
@@ -156,11 +180,7 @@
     // a Json::Value and is only compiled in this file
     Json::Value parsedFromString;
 #if SK_SUPPORT_GPU
-    GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget();
-    SkASSERT(rt);
-    GrContext* ctx = rt->getContext();
-    SkASSERT(ctx);
-    GrAuditTrail* at = ctx->getAuditTrail();
+    GrAuditTrail* at = this->getAuditTrail(canvas);
     GrAuditTrail::AutoManageBatchList enable(at);
     
     fDebugCanvas->drawTo(canvas, n);
diff --git a/tools/skiaserve/Request.h b/tools/skiaserve/Request.h
index 5685186..bef8c4a 100644
--- a/tools/skiaserve/Request.h
+++ b/tools/skiaserve/Request.h
@@ -59,6 +59,8 @@
 private:
     SkSurface* createCPUSurface();
     SkSurface* createGPUSurface();
+    GrAuditTrail* getAuditTrail(SkCanvas*);
+    void cleanupAuditTrail(SkCanvas*);
     
     SkAutoTDelete<GrContextFactory> fContextFactory;
     SkAutoTUnref<SkSurface> fSurface;