[CRX] Make textLayerMode pref visible and add migration logic

In a1cfa5f4d7c8fcf55e9f3b51a23885dca8782915, the textLayerMode
preference was introduced, to replace the disableTextLayer and
enhanceTextSelection preferences.

As a result, the text selection preference was no longer visible
in Chrome (because preferences are only rendered by default for
boolean preferences, not for enumerations).

This commit adds the necessary bits to
extensions/chromium/options/options.{html,js}
so that the textLayerMode preference can be changed again.

Also, migration logic has been added to move over preferences
from the old to the new names:
- In web/chromecom.js, the logic is added to translate
  preferences that were set by an administrator (it is read-only,
  so this layer is unavoidable).
- In extensions/chromium/options/migration.js, similar logic is
  added, except in this case the preference storage is writable,
  so this migration logic happens only once.

The "enhanced text selection" mode is still experimental, so it
has been marked as experimental to signal that there may be bugs.
The list of tasks that block promotion to stable is at #7584.
This commit is contained in:
Rob Wu 2018-02-16 18:02:05 +01:00
parent fc83ce1aae
commit 94a49fa048
5 changed files with 83 additions and 3 deletions

View File

@ -78,6 +78,9 @@ limitations under the License.
storageSync.get([
'enableHandToolOnLoad',
'cursorToolOnLoad',
'disableTextLayer',
'enhanceTextSelection',
'textLayerMode',
], function(items) {
// Migration code for https://github.com/mozilla/pdf.js/pull/7635.
if (typeof items.enableHandToolOnLoad === 'boolean') {
@ -93,6 +96,23 @@ limitations under the License.
storageSync.remove('enableHandToolOnLoad');
}
}
// Migration code for https://github.com/mozilla/pdf.js/pull/9479.
if (typeof items.disableTextLayer === 'boolean') {
var textLayerMode = items.disableTextLayer ? 0 :
items.enhanceTextSelection ? 2 : 1;
if (textLayerMode !== 1) {
// Overwrite if computed textLayerMode is not the default value (1).
storageSync.set({
textLayerMode: textLayerMode,
}, function() {
if (!chrome.runtime.lastError) {
storageSync.remove(['disableTextLayer', 'enhanceTextSelection']);
}
});
} else {
storageSync.remove(['disableTextLayer', 'enhanceTextSelection']);
}
}
});
}
})();

View File

@ -92,6 +92,19 @@ body {
</div>
</template>
<template id="textLayerMode-template">
<div class="settings-row">
<label>
<span></span>
<select>
<option value="0">Disable text selection</option>
<option value="1">Enable text selection</option>
<option value="2">Enable enhanced mode (experimental)</option>
</select>
</label>
</div>
</template>
<template id="externalLinkTarget-template">
<div class="settings-row">
<label>

View File

@ -81,6 +81,8 @@ Promise.all([
renderPreference = renderSidebarViewOnLoad(prefSchema.title);
} else if (prefName === 'cursorToolOnLoad') {
renderPreference = renderCursorToolOnLoad(prefSchema.title);
} else if (prefName === 'textLayerMode') {
renderPreference = renderTextLayerMode(prefSchema.title);
} else if (prefName === 'externalLinkTarget') {
renderPreference = renderExternalLinkTarget(prefSchema.title);
} else {
@ -217,6 +219,23 @@ function renderCursorToolOnLoad(shortDescription) {
return renderPreference;
}
function renderTextLayerMode(shortDescription) {
var wrapper = importTemplate('textLayerMode-template');
var select = wrapper.querySelector('select');
select.onchange = function() {
storageArea.set({
textLayerMode: parseInt(this.value),
});
};
wrapper.querySelector('span').textContent = shortDescription;
document.getElementById('settings-boxes').appendChild(wrapper);
function renderPreference(value) {
select.value = value;
}
return renderPreference;
}
function renderExternalLinkTarget(shortDescription) {
var wrapper = importTemplate('externalLinkTarget-template');
var select = wrapper.querySelector('select');

View File

@ -75,6 +75,16 @@
"type": "boolean",
"default": false
},
"disableTextLayer": {
"description": "DEPRECATED. Set textLayerMode to 0 to disable the text selection layer by default.",
"type": "boolean",
"default": false
},
"enhanceTextSelection": {
"description": "DEPRECATED. Set textLayerMode to 2 to use the enhanced text selection layer by default.",
"type": "boolean",
"default": false
},
"textLayerMode": {
"title": "Text layer mode",
"description": "Controls if the text layer is enabled, and the selection mode that is used.\n 0 = Disabled.\n 1 = Enabled.\n 2 = (Experimental) Enabled, with enhanced text selection.",

View File

@ -314,19 +314,37 @@ class ChromePreferences extends BasePreferences {
// compatibility with managed preferences.
let defaultManagedPrefs = Object.assign({
enableHandToolOnLoad: false,
disableTextLayer: false,
enhanceTextSelection: false,
}, this.defaults);
chrome.storage.managed.get(defaultManagedPrefs, function(items) {
items = items || defaultManagedPrefs;
// Migration code for https://github.com/mozilla/pdf.js/pull/7635.
// Migration logic for deprecated preferences: If the new preference
// is not defined by an administrator (i.e. the value is the same as
// the default value), and a deprecated preference is set with a
// non-default value, migrate the deprecated preference value to the
// new preference value.
// Never remove this, because we have no means of modifying managed
// preferences.
// Migration code for https://github.com/mozilla/pdf.js/pull/7635.
if (items.enableHandToolOnLoad && !items.cursorToolOnLoad) {
// if the old enableHandToolOnLoad has a non-default value,
// and cursorToolOnLoad has a default value, migrate.
items.cursorToolOnLoad = 1;
}
delete items.enableHandToolOnLoad;
// Migration code for https://github.com/mozilla/pdf.js/pull/9479.
if (items.textLayerMode !== 1) {
if (items.disableTextLayer) {
items.textLayerMode = 0;
} else if (items.enhanceTextSelection) {
items.textLayerMode = 2;
}
}
delete items.disableTextLayer;
delete items.enhanceTextSelection;
getPreferences(items);
});
} else {