diff --git a/services/web/app/views/project/editor/pdf.pug b/services/web/app/views/project/editor/pdf.pug index b4fbb4e42a..5b2bce8105 100644 --- a/services/web/app/views/project/editor/pdf.pug +++ b/services/web/app/views/project/editor/pdf.pug @@ -281,6 +281,8 @@ div.full-size.pdf(ng-controller="PdfController") resize-on="layout:main:resize,layout:pdf:resize" highlights="pdf.highlights" position="pdf.position" + first-render-done="pdf.firstRenderDone" + update-consumed-bandwidth="pdf.updateConsumedBandwidth" dbl-click-callback="syncToCode" ) iframe( diff --git a/services/web/frontend/js/ide/pdf/controllers/PdfController.js b/services/web/frontend/js/ide/pdf/controllers/PdfController.js index 4686b705e5..59b14171e3 100644 --- a/services/web/frontend/js/ide/pdf/controllers/PdfController.js +++ b/services/web/frontend/js/ide/pdf/controllers/PdfController.js @@ -338,6 +338,8 @@ App.controller( } } + function noop() {} + function parseCompileResponse(response) { // keep last url const lastPdfUrl = $scope.pdf.url @@ -347,6 +349,8 @@ App.controller( $scope.pdf.timedout = false $scope.pdf.failure = false $scope.pdf.url = null + $scope.pdf.updateConsumedBandwidth = noop + $scope.pdf.firstRenderDone = noop $scope.pdf.clsiMaintenance = false $scope.pdf.tooRecentlyCompiled = false $scope.pdf.renderingError = false @@ -396,6 +400,26 @@ App.controller( // convert the qs hash into a query string and append it $scope.pdf.url += createQueryString(qs) + const { + onFirstRenderDone, + firstRenderDone, + updateConsumedBandwidth, + } = trackPDFDownload() + $scope.pdf.firstRenderDone = firstRenderDone + $scope.pdf.updateConsumedBandwidth = updateConsumedBandwidth + const { serviceWorkerMetrics } = response + + onFirstRenderDone.then(({ latencyFetch, latencyRender }) => { + sl_console.log( + JSON.stringify({ + latencyFetch, + latencyRender, + totalBandwidthReportedByPdfJs, + serviceWorkerMetrics, + }) + ) + }) + // Save all downloads as files qs.popupDownload = true @@ -543,6 +567,33 @@ App.controller( ) } + let totalBandwidthReportedByPdfJs = 0 + function trackPDFDownload() { + const t0 = performance.now() + let bandwidth = 0 + function firstRenderDone({ timePDFFetched, timePDFRendered }) { + const latencyFetch = timePDFFetched - t0 + // The renderer does not yield in case the browser tab is hidden. + // It will yield when the browser tab is visible again. + // This will skew our performance metrics for rendering! + const latencyRender = timePDFRendered - t0 + done({ latencyFetch, latencyRender }) + } + function updateConsumedBandwidth(bytes) { + totalBandwidthReportedByPdfJs += bytes - bandwidth + bandwidth = bytes + } + let done + const onFirstRenderDone = new Promise(resolve => { + done = resolve + }) + return { + onFirstRenderDone, + firstRenderDone, + updateConsumedBandwidth, + } + } + function fetchLogs(fileByPath, options) { let blgFile, chktexFile, logFile diff --git a/services/web/frontend/js/ide/pdfng/directives/pdfJs.js b/services/web/frontend/js/ide/pdfng/directives/pdfJs.js index ea86faad27..1c75a718e6 100644 --- a/services/web/frontend/js/ide/pdfng/directives/pdfJs.js +++ b/services/web/frontend/js/ide/pdfng/directives/pdfJs.js @@ -21,6 +21,8 @@ export default App.directive('pdfng', ($timeout, localStorage) => ({ highlights: '=', position: '=', dblClickCallback: '=', + firstRenderDone: '=', + updateConsumedBandwidth: '=', }, link(scope, element, attrs) { scope.loading = false @@ -150,7 +152,18 @@ export default App.directive('pdfng', ($timeout, localStorage) => ({ // console.log 'pdfjs destroy event' template: `\ -
+