[Pkg-javascript-commits] [pdf.js] 48/116: Chrome extension: Add options page

David Prévot taffit at moszumanska.debian.org
Fri Mar 6 16:20:00 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository pdf.js.

commit 1b043bfd5a3db1d1d2a47bd57273e544f0c3383a
Author: Rob Wu <rob at robwu.nl>
Date:   Tue Jan 6 18:22:35 2015 +0100

    Chrome extension: Add options page
---
 extensions/chromium/manifest.json           |   5 +
 extensions/chromium/options/options.html    |  85 ++++++++++++
 extensions/chromium/options/options.js      | 194 ++++++++++++++++++++++++++++
 extensions/chromium/preferences_schema.json |   2 +-
 make.js                                     |   1 +
 5 files changed, 286 insertions(+), 1 deletion(-)

diff --git a/extensions/chromium/manifest.json b/extensions/chromium/manifest.json
index 2448a98..872db35 100644
--- a/extensions/chromium/manifest.json
+++ b/extensions/chromium/manifest.json
@@ -43,6 +43,11 @@
   "storage": {
     "managed_schema": "preferences_schema.json"
   },
+  "options_ui": {
+    "page": "options/options.html",
+    "chrome_style": true
+  },
+  "options_page": "options/options.html",
   "background": {
     "page": "pdfHandler.html"
   },
diff --git a/extensions/chromium/options/options.html b/extensions/chromium/options/options.html
new file mode 100644
index 0000000..94ea0b4
--- /dev/null
+++ b/extensions/chromium/options/options.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<!--
+Copyright 2015 Mozilla Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<html>
+<head>
+<meta charset="utf-8">
+<title>PDF.js viewer options</title>
+<style>
+/* TODO: Remove as much custom CSS as possible - crbug.com/446511 */
+body {
+  min-width: 400px; /* a page at the settings page is at least 400px wide */
+  margin: 14px 17px; /* already added by default in Chrome 40.0.2212.0 */
+}
+.settings-row {
+  margin: 0.65em 0;
+}
+</style>
+</head>
+<body>
+<div id="settings-boxes"></div>
+<button id="reset-button">Restore default settings</button>
+
+<template id="checkbox-template">
+<!-- Chromium's style: //src/extensions/renderer/resources/extension.css -->
+<div class="checkbox">
+  <label>
+    <input type="checkbox">
+    <span></span>
+  </label>
+</div>
+</template>
+
+<template id="defaultZoomValue-template">
+<div class="settings-row">
+  <label>
+    <span></span>
+    <select>
+      <option value="auto" selected="selected">Automatic Zoom</option>
+      <option value="page-actual">Actual Size</option>
+      <option value="page-fit">Fit Page</option>
+      <option value="page-width">Full Width</option>
+      <option value="custom" class="custom-zoom" hidden></option>
+      <option value="50">50%</option>
+      <option value="75">75%</option>
+      <option value="100">100%</option>
+      <option value="125">125%</option>
+      <option value="150">150%</option>
+      <option value="200">200%</option>
+      <option value="300">300%</option>
+      <option value="400">400%</option>
+    </select>
+  </label>
+</div>
+</template>
+
+<template id="sidebarViewOnLoad-template">
+<div class="settings-row">
+  <label>
+    <span></span>
+    <select>
+      <option value="0">Do not show sidebar</option>
+      <option value="1">Show thumbnails in sidebar</option>
+      <option value="2">Show document outline in sidebar</option>
+      <option value="3">Show attachments in sidebar</option>
+    </select>
+  </label>
+</div>
+</template>
+
+<script src="options.js"></script>
+</body>
+</html>
diff --git a/extensions/chromium/options/options.js b/extensions/chromium/options/options.js
new file mode 100644
index 0000000..ef06467
--- /dev/null
+++ b/extensions/chromium/options/options.js
@@ -0,0 +1,194 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/*
+Copyright 2015 Mozilla Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+/* globals chrome, Promise */
+
+'use strict';
+
+Promise.all([
+  new Promise(function getManagedPrefs(resolve) {
+    // Get preferences as set by the system administrator.
+    chrome.storage.managed.get(null, function(prefs) {
+      // Managed storage may be disabled, e.g. in Opera.
+      resolve(prefs || {});
+    });
+  }),
+  new Promise(function getUserPrefs(resolve) {
+    chrome.storage.local.get(null, function(prefs) {
+      resolve(prefs || {});
+    });
+  }),
+  new Promise(function getStorageSchema(resolve) {
+    // Get the storage schema - a dictionary of preferences.
+    var x = new XMLHttpRequest();
+    var schema_location = chrome.runtime.getManifest().storage.managed_schema;
+    x.open('get', chrome.runtime.getURL(schema_location));
+    x.onload = function() {
+      resolve(x.response.properties);
+    };
+    x.responseType = 'json';
+    x.send();
+  })
+]).then(function(values) {
+  var managedPrefs = values[0];
+  var userPrefs = values[1];
+  var schema = values[2];
+  function getPrefValue(prefName) {
+    if (prefName in userPrefs) {
+      return userPrefs[prefName];
+    } else if (prefName in managedPrefs) {
+      return managedPrefs[prefName];
+    }
+    return schema[prefName].default;
+  }
+  var prefNames = Object.keys(schema);
+  var renderPreferenceFunctions = {};
+  // Render options
+  prefNames.forEach(function(prefName) {
+    var prefSchema = schema[prefName];
+    if (!prefSchema.title) {
+      // Don't show preferences if the title is missing.
+      return;
+    }
+
+    // A DOM element with a method renderPreference.
+    var renderPreference;
+    if (prefSchema.type === 'boolean') {
+      // Most prefs are booleans, render them in a generic way.
+      renderPreference = renderBooleanPref(prefSchema.title,
+                                           prefSchema.description,
+                                           prefName);
+    } else if (prefName === 'defaultZoomValue') {
+      renderPreference = renderDefaultZoomValue(prefSchema.title);
+    } else if (prefName === 'sidebarViewOnLoad') {
+      renderPreference = renderSidebarViewOnLoad(prefSchema.title);
+    } else {
+      // Should NEVER be reached. Only happens if a new type of preference is
+      // added to the storage manifest.
+      console.error('Don\'t know how to handle ' + prefName + '!');
+      return;
+    }
+
+    renderPreference(getPrefValue(prefName));
+    renderPreferenceFunctions[prefName] = renderPreference;
+  });
+
+  // Names of preferences that are displayed in the UI.
+  var renderedPrefNames = Object.keys(renderPreferenceFunctions);
+
+  // Reset button to restore default settings.
+  document.getElementById('reset-button').onclick = function() {
+    userPrefs = {};
+    chrome.storage.local.remove(prefNames, function() {
+      renderedPrefNames.forEach(function(prefName) {
+        renderPreferenceFunctions[prefName](getPrefValue(prefName));
+      });
+    });
+  };
+
+  // Automatically update the UI when the preferences were changed elsewhere.
+  chrome.storage.onChanged.addListener(function(changes, areaName) {
+    var prefs = areaName === 'local' ? userPrefs :
+                areaName === 'managed' ? managedPrefs : null;
+    if (prefs) {
+      renderedPrefNames.forEach(function(prefName) {
+        var prefChanges = changes[prefName];
+        if (prefChanges) {
+          if ('newValue' in prefChanges) {
+            userPrefs[prefName] = prefChanges.newValue;
+          } else {
+            // Otherwise the pref was deleted
+            delete userPrefs[prefName];
+          }
+          renderPreferenceFunctions[prefName](getPrefValue(prefName));
+        }
+      });
+    }
+  });
+}).then(null, console.error.bind(console));
+
+function importTemplate(id) {
+  return document.importNode(document.getElementById(id).content, true);
+}
+
+// Helpers to create UI elements that display the preference, and return a
+// function which updates the UI with the preference.
+
+function renderBooleanPref(shortDescription, description, prefName) {
+  var wrapper = importTemplate('checkbox-template');
+  wrapper.title = description;
+
+  var checkbox = wrapper.querySelector('input[type="checkbox"]');
+  checkbox.onchange = function() {
+    var pref = {};
+    pref[prefName] = this.checked;
+    chrome.storage.local.set(pref);
+  };
+  wrapper.querySelector('span').textContent = shortDescription;
+  document.getElementById('settings-boxes').appendChild(wrapper);
+
+  function renderPreference(value) {
+    checkbox.checked = value;
+  }
+  return renderPreference;
+}
+
+function renderDefaultZoomValue(shortDescription) {
+  var wrapper = importTemplate('defaultZoomValue-template');
+  var select = wrapper.querySelector('select');
+  select.onchange = function() {
+    chrome.storage.local.set({
+      defaultZoomValue: this.value
+    });
+  };
+  wrapper.querySelector('span').textContent = shortDescription;
+  document.getElementById('settings-boxes').appendChild(wrapper);
+
+  function renderPreference(value) {
+    value = value || 'auto';
+    select.value = value;
+    var customOption = select.querySelector('option.custom-zoom');
+    if (select.selectedIndex === -1 && value) {
+      // Custom zoom percentage, e.g. set via managed preferences.
+      // [zoom] or [zoom],[left],[top]
+      customOption.text = value.indexOf(',') > 0 ? value : value + '%';
+      customOption.value = value;
+      customOption.hidden = false;
+      customOption.selected = true;
+    } else {
+      customOption.hidden = true;
+    }
+  }
+  return renderPreference;
+}
+
+function renderSidebarViewOnLoad(shortDescription) {
+  var wrapper = importTemplate('sidebarViewOnLoad-template');
+  var select = wrapper.querySelector('select');
+  select.onchange = function() {
+    chrome.storage.local.set({
+      sidebarViewOnLoad: parseInt(this.value)
+    });
+  };
+  wrapper.querySelector('span').textContent = shortDescription;
+  document.getElementById('settings-boxes').appendChild(wrapper);
+
+  function renderPreference(value) {
+    select.value = value;
+  }
+  return renderPreference;
+}
diff --git a/extensions/chromium/preferences_schema.json b/extensions/chromium/preferences_schema.json
index 1cb556a..85cd24d 100644
--- a/extensions/chromium/preferences_schema.json
+++ b/extensions/chromium/preferences_schema.json
@@ -2,7 +2,7 @@
   "type": "object",
   "properties": {
     "showPreviousViewOnLoad": {
-      "title": "Resume view on load",
+      "title": "Show previous position of PDF upon load",
       "description": "Whether to view PDF documents in the last page and position upon opening the viewer.",
       "type": "boolean",
       "default": true
diff --git a/make.js b/make.js
index 5e1adcd..ff4c151 100644
--- a/make.js
+++ b/make.js
@@ -1042,6 +1042,7 @@ target.chromium = function() {
         'extensions/chromium/icon*.png',],
        CHROME_BUILD_DIR],
       ['extensions/chromium/pageAction/*.*', CHROME_BUILD_DIR + '/pageAction'],
+      ['extensions/chromium/options/*.*', CHROME_BUILD_DIR + '/options'],
       ['external/webL10n/l10n.js', CHROME_BUILD_CONTENT_DIR + '/web'],
       ['external/bcmaps/*', CHROME_BUILD_CONTENT_DIR + '/web/cmaps'],
       ['web/locale', CHROME_BUILD_CONTENT_DIR + '/web']

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/pdf.js.git



More information about the Pkg-javascript-commits mailing list