From 3849bcfb400f266376b7250a6c44a739bcb34b20 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 25 May 2018 10:36:20 +0100 Subject: [PATCH 1/7] Add a `waitFor` helper to the ide object --- services/web/public/coffee/ide.coffee | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index 4f2d914135..3ddf9521b6 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -229,4 +229,18 @@ define [ ide.$scope.project.publicAccesLevel = data.newAccessLevel $scope.$digest() + ide.waitFor = (fn, callback, timeout) -> + sleepTime = 500 + iterationLimit = Math.floor(timeout / sleepTime) + iterations = 0 + do tryIteration = () -> + if iterations > iterationLimit + return + iterations += 1 + result = fn() + if result? + callback(result) + else + setTimeout(tryIteration, sleepTime) + angular.bootstrap(document.body, ["SharelatexApp"]) From 19d870094789027a9916f12f62403fbf73d1a6de Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 25 May 2018 10:36:39 +0100 Subject: [PATCH 2/7] Use `waitFor` when refreshing the binary file view --- .../controllers/BinaryFileController.coffee | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee b/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee index fddf315f66..ddff96e1d4 100644 --- a/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee +++ b/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee @@ -47,18 +47,6 @@ define [ else return url - _tryOpenFile = (new_file_id) -> - iterations = 0 - do tryOpen = () -> - if iterations > 10 - return - iterations += 1 - newFile = ide.fileTreeManager.findEntityById(new_file_id) - if newFile? - ide.binaryFilesManager.openFile(newFile) - else - setTimeout(tryOpen, 500) - $scope.refreshFile = (file) -> $scope.refreshing = true $scope.refreshError = null @@ -68,7 +56,13 @@ define [ { new_file_id } = data $timeout( () -> - _tryOpenFile(new_file_id) + ide.waitFor( + () -> + ide.fileTreeManager.findEntityById(new_file_id) + (newFile) -> + ide.binaryFilesManager.openFile(newFile) + 5000 + ) , 0 ) $scope.refreshError = null From e33b7b1a4925e0f2672d17d7b6d79c6826e00286 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 25 May 2018 10:37:04 +0100 Subject: [PATCH 3/7] Use `waitFor` when restoring a file in v2 history --- .../HistoryV2DiffController.coffee | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee b/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee index c2ced4cf59..a547f42f94 100644 --- a/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee +++ b/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee @@ -24,17 +24,14 @@ define [ $scope.restoreState.inflight = false openEntity = (data) -> - iterations = 0 {id, type} = data - do tryOpen = () -> - if iterations > 5 - return - iterations += 1 - entity = ide.fileTreeManager.findEntityById(id) - if entity? and type == 'doc' - ide.editorManager.openDoc(entity) - else if entity? and type == 'file' - ide.binaryFilesManager.openFile(entity) - else - setTimeout(tryOpen, 500) - \ No newline at end of file + ide.waitFor( + () -> + ide.fileTreeManager.findEntityById(id) + (entity) -> + if type == 'doc' + ide.editorManager.openDoc(entity) + else type == 'file' + ide.binaryFilesManager.openFile(entity) + 3000 + ) From f5f253ad019ca844debd67f179e266827b8010ba Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 25 May 2018 10:56:08 +0100 Subject: [PATCH 4/7] Add an optional pollInterval parameter to waitFor --- services/web/public/coffee/ide.coffee | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index 3ddf9521b6..312d528670 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -229,18 +229,17 @@ define [ ide.$scope.project.publicAccesLevel = data.newAccessLevel $scope.$digest() - ide.waitFor = (fn, callback, timeout) -> - sleepTime = 500 - iterationLimit = Math.floor(timeout / sleepTime) + ide.waitFor = (testFunction, callback, timeout, pollInterval=500) -> + iterationLimit = Math.floor(timeout / pollInterval) iterations = 0 do tryIteration = () -> if iterations > iterationLimit return iterations += 1 - result = fn() + result = testFunction() if result? callback(result) else - setTimeout(tryIteration, sleepTime) + setTimeout(tryIteration, pollInterval) angular.bootstrap(document.body, ["SharelatexApp"]) From 8be4279165e347953d31cc65cf6dcf8bf8f5f932 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 25 May 2018 10:56:32 +0100 Subject: [PATCH 5/7] Fix a broken if-else-if statement --- .../ide/history/controllers/HistoryV2DiffController.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee b/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee index a547f42f94..826d3381f1 100644 --- a/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee +++ b/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee @@ -31,7 +31,7 @@ define [ (entity) -> if type == 'doc' ide.editorManager.openDoc(entity) - else type == 'file' + else if type == 'file' ide.binaryFilesManager.openFile(entity) 3000 ) From cfc17d56e8f4702a047a5009cde15313178a148d Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 25 May 2018 11:42:13 +0100 Subject: [PATCH 6/7] Use a promise (with Angular's `$q`) in `waitFor` --- services/web/public/coffee/ide.coffee | 25 +++++++++++-------- .../controllers/BinaryFileController.coffee | 6 +++-- .../HistoryV2DiffController.coffee | 8 +++--- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index 312d528670..424f71988a 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -55,7 +55,7 @@ define [ SafariScrollPatcher ) -> - App.controller "IdeController", ($scope, $timeout, ide, localStorage, sixpack, event_tracking, metadata) -> + App.controller "IdeController", ($scope, $timeout, ide, localStorage, sixpack, event_tracking, metadata, $q) -> # Don't freak out if we're already in an apply callback $scope.$originalApply = $scope.$apply $scope.$apply = (fn = () ->) -> @@ -229,17 +229,20 @@ define [ ide.$scope.project.publicAccesLevel = data.newAccessLevel $scope.$digest() - ide.waitFor = (testFunction, callback, timeout, pollInterval=500) -> + ide.waitFor = (testFunction, timeout, pollInterval=500) -> iterationLimit = Math.floor(timeout / pollInterval) iterations = 0 - do tryIteration = () -> - if iterations > iterationLimit - return - iterations += 1 - result = testFunction() - if result? - callback(result) - else - setTimeout(tryIteration, pollInterval) + $q( + (resolve, reject) -> + do tryIteration = () -> + if iterations > iterationLimit + return reject(new Error("waiting too long, #{JSON.stringify({timeout, pollInterval})}")) + iterations += 1 + result = testFunction() + if result? + resolve(result) + else + setTimeout(tryIteration, pollInterval) + ) angular.bootstrap(document.body, ["SharelatexApp"]) diff --git a/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee b/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee index ddff96e1d4..ed6fb8ec11 100644 --- a/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee +++ b/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee @@ -59,10 +59,12 @@ define [ ide.waitFor( () -> ide.fileTreeManager.findEntityById(new_file_id) - (newFile) -> - ide.binaryFilesManager.openFile(newFile) 5000 ) + .then (newFile) -> + ide.binaryFilesManager.openFile(newFile) + .catch (err) -> + console.warn(err) , 0 ) $scope.refreshError = null diff --git a/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee b/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee index 826d3381f1..5db663cb5e 100644 --- a/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee +++ b/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee @@ -28,10 +28,12 @@ define [ ide.waitFor( () -> ide.fileTreeManager.findEntityById(id) - (entity) -> + 3000 + ) + .then (entity) -> if type == 'doc' ide.editorManager.openDoc(entity) else if type == 'file' ide.binaryFilesManager.openFile(entity) - 3000 - ) + .catch (err) -> + console.warn(err) From 105d858155668cab54cfe5c025da26cdd8c30c5f Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 25 May 2018 13:02:58 +0100 Subject: [PATCH 7/7] Move `waitFor` into an angular service --- services/web/public/coffee/ide.coffee | 17 +--------------- .../controllers/BinaryFileController.coffee | 4 ++-- .../HistoryV2DiffController.coffee | 4 ++-- .../public/coffee/services/wait-for.coffee | 20 +++++++++++++++++++ 4 files changed, 25 insertions(+), 20 deletions(-) create mode 100644 services/web/public/coffee/services/wait-for.coffee diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index 424f71988a..6c5b1d920e 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -35,6 +35,7 @@ define [ "directives/videoPlayState" "services/queued-http" "services/validateCaptcha" + "services/wait-for" "filters/formatDate" "main/event" "main/account-upgrade" @@ -229,20 +230,4 @@ define [ ide.$scope.project.publicAccesLevel = data.newAccessLevel $scope.$digest() - ide.waitFor = (testFunction, timeout, pollInterval=500) -> - iterationLimit = Math.floor(timeout / pollInterval) - iterations = 0 - $q( - (resolve, reject) -> - do tryIteration = () -> - if iterations > iterationLimit - return reject(new Error("waiting too long, #{JSON.stringify({timeout, pollInterval})}")) - iterations += 1 - result = testFunction() - if result? - resolve(result) - else - setTimeout(tryIteration, pollInterval) - ) - angular.bootstrap(document.body, ["SharelatexApp"]) diff --git a/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee b/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee index ed6fb8ec11..bba455c447 100644 --- a/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee +++ b/services/web/public/coffee/ide/binary-files/controllers/BinaryFileController.coffee @@ -2,7 +2,7 @@ define [ "base" "moment" ], (App, moment) -> - App.controller "BinaryFileController", ["$scope", "$rootScope", "$http", "$timeout", "$element", "ide", ($scope, $rootScope, $http, $timeout, $element, ide) -> + App.controller "BinaryFileController", ["$scope", "$rootScope", "$http", "$timeout", "$element", "ide", "waitFor", ($scope, $rootScope, $http, $timeout, $element, ide, waitFor) -> TWO_MEGABYTES = 2 * 1024 * 1024 @@ -56,7 +56,7 @@ define [ { new_file_id } = data $timeout( () -> - ide.waitFor( + waitFor( () -> ide.fileTreeManager.findEntityById(new_file_id) 5000 diff --git a/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee b/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee index 5db663cb5e..279c230afb 100644 --- a/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee +++ b/services/web/public/coffee/ide/history/controllers/HistoryV2DiffController.coffee @@ -1,7 +1,7 @@ define [ "base" ], (App) -> - App.controller "HistoryV2DiffController", ($scope, ide, event_tracking) -> + App.controller "HistoryV2DiffController", ($scope, ide, event_tracking, waitFor) -> $scope.restoreState = inflight: false error: false @@ -25,7 +25,7 @@ define [ openEntity = (data) -> {id, type} = data - ide.waitFor( + waitFor( () -> ide.fileTreeManager.findEntityById(id) 3000 diff --git a/services/web/public/coffee/services/wait-for.coffee b/services/web/public/coffee/services/wait-for.coffee new file mode 100644 index 0000000000..409142354c --- /dev/null +++ b/services/web/public/coffee/services/wait-for.coffee @@ -0,0 +1,20 @@ +define [ + "base" +], (App) -> + App.factory "waitFor", ($q) -> + waitFor = (testFunction, timeout, pollInterval=500) -> + iterationLimit = Math.floor(timeout / pollInterval) + iterations = 0 + $q( + (resolve, reject) -> + do tryIteration = () -> + if iterations > iterationLimit + return reject(new Error("waiting too long, #{JSON.stringify({timeout, pollInterval})}")) + iterations += 1 + result = testFunction() + if result? + resolve(result) + else + setTimeout(tryIteration, pollInterval) + ) + return waitFor