Browse Source

Refactor the `selectScaleOption` function, in `Toolbar._updateUIState`, to prevent any possible future display glitches

Since the localization service is now asynchronous, depending on the load the browser is under, there's a small risk that the lookup of the 'page_scale_percent' string could be delayed slightly.
If the scale would change a couple of times in *very* quick succession, there's perhaps a *theoretical* possibility that the Zoom dropdown would display an incorrect value.

Consider the following, somewhat contrived, theoretical example of two zoom commands being executed *right* after one another:
```javascript
PDFViewerApplication.pdfViewer.currentScale = 1.23;
PDFViewerApplication.pdfViewer.currentScaleValue = 'page-width';
```

Only the `currentScale` call will currently trigger a l10n lookup in `selectScaleOption`. However, as far as I understand, there's no *guarantee* that the l10n string is resolved *before* `selectScaleOption` is called again as a result of the `currentScaleValue` call.

This thus has the possibility of putting the Zoom dropdown into an inconsistent state, since it's currently updated synchronously for one code-path and asynchronously for another.

To avoid these issues, I'm proposing that we *always* update the Zoom dropdown asynchronously, such that we can guarantee that the ordering is correct.
Jonas Jenwald 8 years ago
parent
commit
75edb859ce
  1. 16
      web/toolbar.js

16
web/toolbar.js

@ -180,10 +180,13 @@ var Toolbar = (function ToolbarClosure() {
} }
let selectScaleOption = (value, scale) => { let selectScaleOption = (value, scale) => {
var options = items.scaleSelect.options; let customScale = Math.round(scale * 10000) / 100;
var predefinedValueFound = false; this.l10n.get('page_scale_percent', { scale: customScale, },
for (var i = 0, ii = options.length; i < ii; i++) { '{{scale}}%').then((msg) => {
var option = options[i]; let options = items.scaleSelect.options;
let predefinedValueFound = false;
for (let i = 0, ii = options.length; i < ii; i++) {
let option = options[i];
if (option.value !== value) { if (option.value !== value) {
option.selected = false; option.selected = false;
continue; continue;
@ -192,13 +195,10 @@ var Toolbar = (function ToolbarClosure() {
predefinedValueFound = true; predefinedValueFound = true;
} }
if (!predefinedValueFound) { if (!predefinedValueFound) {
var customScale = Math.round(scale * 10000) / 100;
this.l10n.get('page_scale_percent', { scale: customScale, },
'{{scale}}%').then((msg) => {
items.customScaleOption.textContent = msg; items.customScaleOption.textContent = msg;
items.customScaleOption.selected = true; items.customScaleOption.selected = true;
});
} }
});
}; };
var pageNumber = this.pageNumber; var pageNumber = this.pageNumber;

Loading…
Cancel
Save