Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(296)

Side by Side Diff: components/dom_distiller/core/javascript/dom_distiller_viewer.js

Issue 1225183002: Font size in DomDistiller prefs syncs with local scaling (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix for rebasing Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // This variable will be changed by iOS scripts. 5 // This variable will be changed by iOS scripts.
6 var distiller_on_ios = false; 6 var distiller_on_ios = false;
7 7
8 function addToPage(html) { 8 function addToPage(html) {
9 var div = document.createElement('div'); 9 var div = document.createElement('div');
10 div.innerHTML = html; 10 div.innerHTML = html;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 cssClass = "dark"; 83 cssClass = "dark";
84 } else { 84 } else {
85 cssClass = "light"; 85 cssClass = "light";
86 } 86 }
87 // Relies on the classname order of the body being Theme class, then Font 87 // Relies on the classname order of the body being Theme class, then Font
88 // Family class. 88 // Family class.
89 var fontFamilyClass = document.body.className.split(" ")[1]; 89 var fontFamilyClass = document.body.className.split(" ")[1];
90 document.body.className = cssClass + " " + fontFamilyClass; 90 document.body.className = cssClass + " " + fontFamilyClass;
91 } 91 }
92 92
93 function useFontScaling(scaling) {
94 pincher.useFontScaling(scaling);
95 }
96
93 var updateLoadingIndicator = function() { 97 var updateLoadingIndicator = function() {
94 var colors = ["red", "yellow", "green", "blue"]; 98 var colors = ["red", "yellow", "green", "blue"];
95 return function(isLastPage) { 99 return function(isLastPage) {
96 if (!isLastPage && typeof this.colorShuffle == "undefined") { 100 if (!isLastPage && typeof this.colorShuffle == "undefined") {
97 var loader = document.getElementById("loader"); 101 var loader = document.getElementById("loader");
98 if (loader) { 102 if (loader) {
99 var colorIndex = -1; 103 var colorIndex = -1;
100 this.colorShuffle = setInterval(function() { 104 this.colorShuffle = setInterval(function() {
101 colorIndex = (colorIndex + 1) % colors.length; 105 colorIndex = (colorIndex + 1) % colors.length;
102 loader.className = colors[colorIndex]; 106 loader.className = colors[colorIndex];
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 209
206 var lastSpan; 210 var lastSpan;
207 var lastClientMid; 211 var lastClientMid;
208 212
209 var scale = 1; 213 var scale = 1;
210 var shiftX; 214 var shiftX;
211 var shiftY; 215 var shiftY;
212 216
213 // The zooming speed relative to pinching speed. 217 // The zooming speed relative to pinching speed.
214 var FONT_SCALE_MULTIPLIER = 0.5; 218 var FONT_SCALE_MULTIPLIER = 0.5;
219
215 var MIN_SPAN_LENGTH = 20; 220 var MIN_SPAN_LENGTH = 20;
216 221
217 // The font size is guaranteed to be in px. 222 // The font size is guaranteed to be in px.
218 var baseSize = 223 var baseSize =
219 parseFloat(getComputedStyle(document.documentElement).fontSize); 224 parseFloat(getComputedStyle(document.documentElement).fontSize);
220 225
221 var refreshTransform = function() { 226 var refreshTransform = function() {
222 var slowedScale = Math.exp(Math.log(scale) * FONT_SCALE_MULTIPLIER); 227 var slowedScale = Math.exp(Math.log(scale) * FONT_SCALE_MULTIPLIER);
223 clampedScale = Math.max(0.4, Math.min(2.5, fontSizeAnchor * slowedScale)); 228 clampedScale = Math.max(0.4, Math.min(2.5, fontSizeAnchor * slowedScale));
224 229
225 // Use "fake" 3D transform so that the layer is not repainted. 230 // Use "fake" 3D transform so that the layer is not repainted.
226 // With 2D transform, the frame rate would be much lower. 231 // With 2D transform, the frame rate would be much lower.
227 document.body.style.transform = 232 document.body.style.transform =
228 'translate3d(' + shiftX + 'px,' + 233 'translate3d(' + shiftX + 'px,' +
229 shiftY + 'px, 0px)' + 234 shiftY + 'px, 0px)' +
230 'scale(' + clampedScale/fontSizeAnchor + ')'; 235 'scale(' + clampedScale/fontSizeAnchor + ')';
231 }; 236 };
232 237
238 function saveCenter(clientMid) {
239 // Try to preserve the pinching center after text reflow.
240 // This is accurate to the HTML element level.
241 focusElement = document.elementFromPoint(clientMid.x, clientMid.y);
242 var rect = focusElement.getBoundingClientRect();
243 initClientMid = clientMid;
244 focusPos = (initClientMid.y - rect.top) / (rect.bottom - rect.top);
245 }
246
247 function restoreCenter() {
248 var rect = focusElement.getBoundingClientRect();
249 var targetTop = focusPos * (rect.bottom - rect.top) + rect.top +
250 document.body.scrollTop - (initClientMid.y + shiftY);
251 document.body.scrollTop = targetTop;
252 }
253
233 function endPinch() { 254 function endPinch() {
234 pinching = false; 255 pinching = false;
235 256
236 document.body.style.transformOrigin = ''; 257 document.body.style.transformOrigin = '';
237 document.body.style.transform = ''; 258 document.body.style.transform = '';
238 document.documentElement.style.fontSize = clampedScale * baseSize + "px"; 259 document.documentElement.style.fontSize = clampedScale * baseSize + "px";
239 260
240 var rect = focusElement.getBoundingClientRect(); 261 restoreCenter();
241 var targetTop = focusPos * (rect.bottom - rect.top) + rect.top + 262
242 document.body.scrollTop - (initClientMid.y + shiftY); 263 var img = document.getElementById('fontscaling-img');
243 document.body.scrollTop = targetTop; 264 if (!img) {
265 img = document.createElement('img');
266 img.id = 'fontscaling-img';
267 img.style.display = 'none';
268 document.body.appendChild(img);
269 }
270 img.src = "/savefontscaling/" + clampedScale;
244 } 271 }
245 272
246 function touchSpan(e) { 273 function touchSpan(e) {
247 var count = e.touches.length; 274 var count = e.touches.length;
248 var mid = touchClientMid(e); 275 var mid = touchClientMid(e);
249 var sum = 0; 276 var sum = 0;
250 for (var i = 0; i < count; i++) { 277 for (var i = 0; i < count; i++) {
251 var dx = (e.touches[i].clientX - mid.x); 278 var dx = (e.touches[i].clientX - mid.x);
252 var dy = (e.touches[i].clientY - mid.y); 279 var dy = (e.touches[i].clientY - mid.y);
253 sum += Math.hypot(dx, dy); 280 sum += Math.hypot(dx, dy);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 321
295 pinching = true; 322 pinching = true;
296 fontSizeAnchor = 323 fontSizeAnchor =
297 parseFloat(getComputedStyle(document.documentElement).fontSize) / 324 parseFloat(getComputedStyle(document.documentElement).fontSize) /
298 baseSize; 325 baseSize;
299 326
300 var pinchOrigin = touchPageMid(e); 327 var pinchOrigin = touchPageMid(e);
301 document.body.style.transformOrigin = 328 document.body.style.transformOrigin =
302 pinchOrigin.x + 'px ' + pinchOrigin.y + 'px'; 329 pinchOrigin.x + 'px ' + pinchOrigin.y + 'px';
303 330
304 // Try to preserve the pinching center after text reflow. 331 saveCenter(clientMid);
305 // This is accurate to the HTML element level.
306 focusElement = document.elementFromPoint(clientMid.x, clientMid.y);
307 var rect = focusElement.getBoundingClientRect();
308 initClientMid = clientMid;
309 focusPos = (initClientMid.y - rect.top) / (rect.bottom - rect.top);
310 332
311 lastSpan = span; 333 lastSpan = span;
312 lastClientMid = clientMid; 334 lastClientMid = clientMid;
313 335
314 refreshTransform(); 336 refreshTransform();
315 }, 337 },
316 338
317 handleTouchMove: function(e) { 339 handleTouchMove: function(e) {
318 if (!pinching) return; 340 if (!pinching) return;
319 if (e.touches.length < 2) return; 341 if (e.touches.length < 2) return;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 document.documentElement.style.fontSize = clampedScale * baseSize + "px"; 383 document.documentElement.style.fontSize = clampedScale * baseSize + "px";
362 }, 384 },
363 385
364 status: function() { 386 status: function() {
365 return { 387 return {
366 scale: scale, 388 scale: scale,
367 clampedScale: clampedScale, 389 clampedScale: clampedScale,
368 shiftX: shiftX, 390 shiftX: shiftX,
369 shiftY: shiftY 391 shiftY: shiftY
370 }; 392 };
393 },
394
395 useFontScaling: function(scaling) {
396 saveCenter({x: window.innerWidth/2, y: window.innerHeight/2});
397 shiftX = 0;
398 shiftY = 0;
399 document.documentElement.style.fontSize = scaling * baseSize + "px";
400 clampedScale = scaling;
401 restoreCenter();
371 } 402 }
372 }; 403 };
373 }()); 404 }());
374 405
375 window.addEventListener('touchstart', pincher.handleTouchStart, false); 406 window.addEventListener('touchstart', pincher.handleTouchStart, false);
376 window.addEventListener('touchmove', pincher.handleTouchMove, false); 407 window.addEventListener('touchmove', pincher.handleTouchMove, false);
377 window.addEventListener('touchend', pincher.handleTouchEnd, false); 408 window.addEventListener('touchend', pincher.handleTouchEnd, false);
378 window.addEventListener('touchcancel', pincher.handleTouchCancel, false); 409 window.addEventListener('touchcancel', pincher.handleTouchCancel, false);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698