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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/emulation/SensorsView.js

Issue 1923843003: DevTools: Update 3D device in accelerometer emulation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Reset should revert back to portrait in select menu Created 4 years, 7 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 (c) 2015 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2015 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 /** 5 /**
6 * @constructor 6 * @constructor
7 * @extends {WebInspector.VBox} 7 * @extends {WebInspector.VBox}
8 */ 8 */
9 WebInspector.SensorsView = function() 9 WebInspector.SensorsView = function()
10 { 10 {
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 this._geolocation.apply(); 122 this._geolocation.apply();
123 } else { 123 } else {
124 this._geolocation.clear(); 124 this._geolocation.clear();
125 } 125 }
126 }, 126 },
127 127
128 _createDeviceOrientationSection: function() 128 _createDeviceOrientationSection: function()
129 { 129 {
130 var orientationGroup = this.contentElement.createChild("section", "senso rs-group"); 130 var orientationGroup = this.contentElement.createChild("section", "senso rs-group");
131 orientationGroup.createChild("div", "sensors-group-title").textContent = WebInspector.UIString("Accelerometer"); 131 orientationGroup.createChild("div", "sensors-group-title").textContent = WebInspector.UIString("Accelerometer");
132 var fields = orientationGroup.createChild("div", "geo-fields"); 132 var orientationContent = orientationGroup.createChild("div", "orientatio n-content");
133 var fields = orientationContent.createChild("div", "orientation-fields") ;
133 134
134 const accelerometerOffOption = {title: WebInspector.UIString("Off"), ori entation: WebInspector.SensorsView.NonPresetOptions.NoOverride}; 135 const accelerometerOffOption = {title: WebInspector.UIString("Off"), ori entation: WebInspector.SensorsView.NonPresetOptions.NoOverride};
135 const customOrientationOption = {title: WebInspector.UIString("Custom or ientation..."), orientation: WebInspector.SensorsView.NonPresetOptions.Custom}; 136 const customOrientationOption = {title: WebInspector.UIString("Custom or ientation..."), orientation: WebInspector.SensorsView.NonPresetOptions.Custom};
136 this._orientationSelectElement = this.contentElement.createChild("select ", "chrome-select"); 137 this._orientationSelectElement = this.contentElement.createChild("select ", "chrome-select");
137 this._orientationSelectElement.appendChild(new Option(accelerometerOffOp tion.title, accelerometerOffOption.orientation)); 138 this._orientationSelectElement.appendChild(new Option(accelerometerOffOp tion.title, accelerometerOffOption.orientation));
138 this._orientationSelectElement.appendChild(new Option(customOrientationO ption.title, customOrientationOption.orientation)); 139 this._orientationSelectElement.appendChild(new Option(customOrientationO ption.title, customOrientationOption.orientation));
139 140
140 var orientationGroups = WebInspector.SensorsView.PresetOrientations; 141 var orientationGroups = WebInspector.SensorsView.PresetOrientations;
141 for (var i = 0; i < orientationGroups.length; ++i) { 142 for (var i = 0; i < orientationGroups.length; ++i) {
142 var groupElement = this._orientationSelectElement.createChild("optgr oup"); 143 var groupElement = this._orientationSelectElement.createChild("optgr oup");
143 groupElement.label = orientationGroups[i].title; 144 groupElement.label = orientationGroups[i].title;
144 var group = orientationGroups[i].value; 145 var group = orientationGroups[i].value;
145 for (var j = 0; j < group.length; ++j) 146 for (var j = 0; j < group.length; ++j)
146 groupElement.appendChild(new Option(group[j].title, group[j].ori entation)); 147 groupElement.appendChild(new Option(group[j].title, group[j].ori entation));
147 } 148 }
148 this._orientationSelectElement.selectedIndex = 0; 149 this._orientationSelectElement.selectedIndex = 0;
149 fields.appendChild(this._orientationSelectElement); 150 fields.appendChild(this._orientationSelectElement);
150 this._orientationSelectElement.addEventListener("change", this._orientat ionSelectChanged.bind(this)); 151 this._orientationSelectElement.addEventListener("change", this._orientat ionSelectChanged.bind(this));
151 152
152 this._deviceOrientationFieldset = this._createDeviceOrientationOverrideE lement(this._deviceOrientation); 153 this._deviceOrientationFieldset = this._createDeviceOrientationOverrideE lement(this._deviceOrientation);
153 this._deviceOrientationFieldset.disabled = true; 154
155 this._stageElement = orientationContent.createChild("div", "acceleromete r-stage");
156 this._stageElement.title = WebInspector.UIString("shift+drag to rotate a round the z-axis");
157 this._boxElement = this._stageElement.createChild("section", "accelerome ter-box accelerometer-element");
158
159 this._boxElement.createChild("section", "accelerometer-front acceleromet er-element");
160 this._boxElement.createChild("section", "accelerometer-top accelerometer -element");
161 this._boxElement.createChild("section", "accelerometer-back acceleromete r-element");
162 this._boxElement.createChild("section", "accelerometer-left acceleromete r-element");
163 this._boxElement.createChild("section", "accelerometer-right acceleromet er-element");
164 this._boxElement.createChild("section", "accelerometer-bottom accelerome ter-element");
165
166 WebInspector.installDragHandle(this._stageElement, this._onBoxDragStart. bind(this), this._onBoxDrag.bind(this), this._onBoxDragEnd.bind(this), "-webkit- grabbing", "-webkit-grab");
167
154 fields.appendChild(this._deviceOrientationFieldset); 168 fields.appendChild(this._deviceOrientationFieldset);
169 this._enableOrientationFields(true);
170 this._setBoxOrientation(this._deviceOrientation);
171 },
172
173 /**
174 * @param {?boolean} disable
175 */
176 _enableOrientationFields: function(disable)
177 {
178 if (disable) {
179 this._deviceOrientationFieldset.disabled = true;
180 this._stageElement.classList.add("disabled");
181 } else {
182 this._deviceOrientationFieldset.disabled = false;
183 this._stageElement.classList.remove("disabled");
184 }
155 }, 185 },
156 186
157 _orientationSelectChanged: function() 187 _orientationSelectChanged: function()
158 { 188 {
159 var value = this._orientationSelectElement.options[this._orientationSele ctElement.selectedIndex].value; 189 var value = this._orientationSelectElement.options[this._orientationSele ctElement.selectedIndex].value;
160 this._deviceOrientationFieldset.disabled = false; 190 this._enableOrientationFields(false);
161 191
162 if (value === WebInspector.SensorsView.NonPresetOptions.NoOverride) { 192 if (value === WebInspector.SensorsView.NonPresetOptions.NoOverride) {
163 this._deviceOrientationOverrideEnabled = false; 193 this._deviceOrientationOverrideEnabled = false;
164 this._deviceOrientationFieldset.disabled = true; 194 this._enableOrientationFields(true);
165 } else if (value === WebInspector.SensorsView.NonPresetOptions.Custom) { 195 } else if (value === WebInspector.SensorsView.NonPresetOptions.Custom) {
166 this._deviceOrientationOverrideEnabled = true; 196 this._deviceOrientationOverrideEnabled = true;
167 this._alphaElement.focus(); 197 this._alphaElement.focus();
168 } else { 198 } else {
169 var parsedValue = JSON.parse(value); 199 var parsedValue = JSON.parse(value);
170 this._deviceOrientationOverrideEnabled = true; 200 this._deviceOrientationOverrideEnabled = true;
171 this._deviceOrientation = new WebInspector.DeviceOrientation(parsedV alue[0], parsedValue[1], parsedValue[2]); 201 this._deviceOrientation = new WebInspector.DeviceOrientation(parsedV alue[0], parsedValue[1], parsedValue[2]);
172 this._setDeviceOrientation(this._deviceOrientation, WebInspector.Sen sorsView.DeviceOrientationModificationSource.SelectPreset); 202 this._setDeviceOrientation(this._deviceOrientation, WebInspector.Sen sorsView.DeviceOrientationModificationSource.SelectPreset);
173 } 203 }
174 }, 204 },
(...skipping 19 matching lines...) Expand all
194 }, 224 },
195 225
196 _applyDeviceOrientationUserInput: function() 226 _applyDeviceOrientationUserInput: function()
197 { 227 {
198 this._setDeviceOrientation(WebInspector.DeviceOrientation.parseUserInput (this._alphaElement.value.trim(), this._betaElement.value.trim(), this._gammaEle ment.value.trim()), WebInspector.SensorsView.DeviceOrientationModificationSource .UserInput); 228 this._setDeviceOrientation(WebInspector.DeviceOrientation.parseUserInput (this._alphaElement.value.trim(), this._betaElement.value.trim(), this._gammaEle ment.value.trim()), WebInspector.SensorsView.DeviceOrientationModificationSource .UserInput);
199 this._setSelectElementLabel(this._orientationSelectElement, WebInspector .SensorsView.NonPresetOptions.Custom); 229 this._setSelectElementLabel(this._orientationSelectElement, WebInspector .SensorsView.NonPresetOptions.Custom);
200 }, 230 },
201 231
202 _resetDeviceOrientation: function() 232 _resetDeviceOrientation: function()
203 { 233 {
204 this._setDeviceOrientation(new WebInspector.DeviceOrientation(0, 0, 0), WebInspector.SensorsView.DeviceOrientationModificationSource.ResetButton); 234 this._setDeviceOrientation(new WebInspector.DeviceOrientation(0, 90, 0), WebInspector.SensorsView.DeviceOrientationModificationSource.ResetButton);
235 this._setSelectElementLabel(this._orientationSelectElement, "[0, 90, 0]" );
205 }, 236 },
206 237
207 /** 238 /**
208 * @param {?WebInspector.DeviceOrientation} deviceOrientation 239 * @param {?WebInspector.DeviceOrientation} deviceOrientation
209 * @param {!WebInspector.SensorsView.DeviceOrientationModificationSource} mo dificationSource 240 * @param {!WebInspector.SensorsView.DeviceOrientationModificationSource} mo dificationSource
210 */ 241 */
211 _setDeviceOrientation: function(deviceOrientation, modificationSource) 242 _setDeviceOrientation: function(deviceOrientation, modificationSource)
212 { 243 {
213 if (!deviceOrientation) 244 if (!deviceOrientation)
214 return; 245 return;
215 246
216 /** 247 /**
217 * @param {number} angle 248 * @param {number} angle
218 * @return {number} 249 * @return {number}
219 */ 250 */
220 function roundAngle(angle) 251 function roundAngle(angle)
221 { 252 {
222 return Math.round(angle*10000)/10000; 253 return Math.round(angle*10000)/10000;
223 } 254 }
224 255
225 if (modificationSource != WebInspector.SensorsView.DeviceOrientationModi ficationSource.UserInput) { 256 if (modificationSource != WebInspector.SensorsView.DeviceOrientationModi ficationSource.UserInput) {
226 this._alphaSetter(roundAngle(deviceOrientation.alpha)); 257 this._alphaSetter(roundAngle(deviceOrientation.alpha));
227 this._betaSetter(roundAngle(deviceOrientation.beta)); 258 this._betaSetter(roundAngle(deviceOrientation.beta));
228 this._gammaSetter(roundAngle(deviceOrientation.gamma)); 259 this._gammaSetter(roundAngle(deviceOrientation.gamma));
229 } 260 }
230 261
231 if (modificationSource != WebInspector.SensorsView.DeviceOrientationModi ficationSource.UserDrag) 262 if (modificationSource != WebInspector.SensorsView.DeviceOrientationModi ficationSource.UserDrag)
232 this._setBoxOrientation(deviceOrientation); 263 this._setBoxOrientation(deviceOrientation);
233 else 264 else
234 this._boxElement.classList.remove("smooth-transition"); 265 this._boxElement.classList.remove("is-animating");
235 266
236 this._deviceOrientation = deviceOrientation; 267 this._deviceOrientation = deviceOrientation;
237 this._applyDeviceOrientation(); 268 this._applyDeviceOrientation();
238 }, 269 },
239 270
240 /** 271 /**
241 * @param {!Element} parentElement 272 * @param {!Element} parentElement
242 * @param {!Element} input 273 * @param {!Element} input
243 * @param {string} label 274 * @param {string} label
244 * @return {function(string)} 275 * @return {function(string)}
245 */ 276 */
246 _createAxisInput: function(parentElement, input, label) 277 _createAxisInput: function(parentElement, input, label)
247 { 278 {
248 var div = parentElement.createChild("div", "accelerometer-axis-input-con tainer"); 279 var div = parentElement.createChild("div", "accelerometer-axis-input-con tainer");
249 div.appendChild(input); 280 div.appendChild(input);
250 div.createTextChild(label); 281 div.createTextChild(label);
251 input.type = "number"; 282 input.type = "number";
252 return WebInspector.bindInput(input, this._applyDeviceOrientationUserInp ut.bind(this), WebInspector.DeviceOrientation.validator, true); 283 return WebInspector.bindInput(input, this._applyDeviceOrientationUserInp ut.bind(this), WebInspector.DeviceOrientation.validator, true);
253 }, 284 },
254 285
255 /** 286 /**
256 * @param {!WebInspector.DeviceOrientation} deviceOrientation 287 * @param {!WebInspector.DeviceOrientation} deviceOrientation
257 * @return {!Element} 288 * @return {!Element}
258 */ 289 */
259 _createDeviceOrientationOverrideElement: function(deviceOrientation) 290 _createDeviceOrientationOverrideElement: function(deviceOrientation)
260 { 291 {
261 var fieldsetElement = createElement("fieldset"); 292 var fieldsetElement = createElement("fieldset");
262 fieldsetElement.classList.add("device-orientation-override-section"); 293 fieldsetElement.classList.add("device-orientation-override-section");
263 var tableElement = fieldsetElement.createChild("table"); 294 var cellElement = fieldsetElement.createChild("td", "accelerometer-input s-cell");
264 var rowElement = tableElement.createChild("tr");
265 var cellElement = rowElement.createChild("td", "accelerometer-inputs-cel l");
266 295
267 this._alphaElement = createElement("input"); 296 this._alphaElement = createElement("input");
268 this._alphaSetter = this._createAxisInput(cellElement, this._alphaElemen t, WebInspector.UIString("Tilt left/right (\u03B1)")); 297 this._alphaSetter = this._createAxisInput(cellElement, this._alphaElemen t, WebInspector.UIString("Tilt left/right (\u03B1)"));
269 this._alphaSetter(String(deviceOrientation.alpha)); 298 this._alphaSetter(String(deviceOrientation.alpha));
270 299
271 this._betaElement = createElement("input"); 300 this._betaElement = createElement("input");
272 this._betaSetter = this._createAxisInput(cellElement, this._betaElement, WebInspector.UIString("Tilt front/back (\u03B2)")); 301 this._betaSetter = this._createAxisInput(cellElement, this._betaElement, WebInspector.UIString("Tilt front/back (\u03B2)"));
273 this._betaSetter(String(deviceOrientation.beta)); 302 this._betaSetter(String(deviceOrientation.beta));
274 303
275 this._gammaElement = createElement("input"); 304 this._gammaElement = createElement("input");
276 this._gammaSetter = this._createAxisInput(cellElement, this._gammaElemen t, WebInspector.UIString("Rotate (\u03B3)")); 305 this._gammaSetter = this._createAxisInput(cellElement, this._gammaElemen t, WebInspector.UIString("Rotate (\u03B3)"));
277 this._gammaSetter(String(deviceOrientation.gamma)); 306 this._gammaSetter(String(deviceOrientation.gamma));
278 307
279 cellElement.appendChild(createTextButton(WebInspector.UIString("Reset"), this._resetDeviceOrientation.bind(this), "accelerometer-reset-button")); 308 cellElement.appendChild(createTextButton(WebInspector.UIString("Reset"), this._resetDeviceOrientation.bind(this), "accelerometer-reset-button"));
280
281 this._stageElement = rowElement.createChild("td","accelerometer-stage");
282 this._boxElement = this._stageElement.createChild("section", "accelerome ter-box");
283
284 this._boxElement.createChild("section", "front");
285 this._boxElement.createChild("section", "top");
286 this._boxElement.createChild("section", "back");
287 this._boxElement.createChild("section", "left");
288 this._boxElement.createChild("section", "right");
289 this._boxElement.createChild("section", "bottom");
290
291 WebInspector.installDragHandle(this._stageElement, this._onBoxDragStart. bind(this), this._onBoxDrag.bind(this), this._onBoxDragEnd.bind(this), "-webkit- grabbing", "-webkit-grab");
292 this._setBoxOrientation(deviceOrientation);
293 return fieldsetElement; 309 return fieldsetElement;
294 }, 310 },
295 311
296 /** 312 /**
297 * @param {!WebInspector.DeviceOrientation} deviceOrientation 313 * @param {!WebInspector.DeviceOrientation} deviceOrientation
298 */ 314 */
299 _setBoxOrientation: function(deviceOrientation) 315 _setBoxOrientation: function(deviceOrientation)
300 { 316 {
301 var matrix = new WebKitCSSMatrix(); 317 var matrix = new WebKitCSSMatrix();
302 this._boxMatrix = matrix.rotate(-deviceOrientation.beta, deviceOrientati on.gamma, -deviceOrientation.alpha); 318 this._boxMatrix = matrix.rotate(90-deviceOrientation.beta, deviceOrienta tion.gamma, -deviceOrientation.alpha);
303 this._boxElement.classList.add("smooth-transition"); 319 this._boxElement.classList.add("is-animating");
304 this._boxElement.style.webkitTransform = this._boxMatrix.toString(); 320 this._boxElement.style.webkitTransform = this._boxMatrix.toString();
305 }, 321 },
306 322
307 /** 323 /**
308 * @param {!MouseEvent} event 324 * @param {!MouseEvent} event
309 * @return {boolean} 325 * @return {boolean}
310 */ 326 */
311 _onBoxDrag: function(event) 327 _onBoxDrag: function(event)
312 { 328 {
313 var mouseMoveVector = this._calculateRadiusVector(event.x, event.y); 329 var mouseMoveVector = this._calculateRadiusVector(event.x, event.y);
314 if (!mouseMoveVector) 330 if (!mouseMoveVector)
315 return true; 331 return true;
316 332
317 event.consume(true); 333 event.consume(true);
318 var axis = WebInspector.Geometry.crossProduct(this._mouseDownVector, mou seMoveVector); 334 var axis, angle;
319 axis.normalize(); 335 if (event.shiftKey) {
320 var angle = WebInspector.Geometry.calculateAngle(this._mouseDownVector, mouseMoveVector); 336 axis = new WebInspector.Geometry.Vector(0, 0, 1);
337 angle = (this._mouseDownVector.x - mouseMoveVector.x)*WebInspector.S ensorsView.ShiftDragOrientationSpeed;
338 } else {
339 axis = WebInspector.Geometry.crossProduct(this._mouseDownVector, mou seMoveVector);
340 axis.normalize();
341 angle = WebInspector.Geometry.calculateAngle(this._mouseDownVector, mouseMoveVector);
342 }
321 var matrix = new WebKitCSSMatrix(); 343 var matrix = new WebKitCSSMatrix();
322 var rotationMatrix = matrix.rotateAxisAngle(axis.x, axis.y, axis.z, angl e); 344 var rotationMatrix = matrix.rotateAxisAngle(axis.x, axis.y, axis.z, angl e);
323 this._currentMatrix = rotationMatrix.multiply(this._boxMatrix); 345 this._currentMatrix = rotationMatrix.multiply(this._boxMatrix);
324 this._boxElement.style.webkitTransform = this._currentMatrix; 346
347 var mat90 = new WebKitCSSMatrix();
348 mat90.rotate(90);
349 this._boxElement.style.webkitTransform = mat90.multiply(this._currentMat rix);
325 var eulerAngles = WebInspector.Geometry.EulerAngles.fromRotationMatrix(t his._currentMatrix); 350 var eulerAngles = WebInspector.Geometry.EulerAngles.fromRotationMatrix(t his._currentMatrix);
326 var newOrientation = new WebInspector.DeviceOrientation(-eulerAngles.alp ha, -eulerAngles.beta, eulerAngles.gamma); 351 var newOrientation = new WebInspector.DeviceOrientation(-eulerAngles.alp ha, -eulerAngles.beta, eulerAngles.gamma);
327 this._setDeviceOrientation(newOrientation, WebInspector.SensorsView.Devi ceOrientationModificationSource.UserDrag); 352 this._setDeviceOrientation(newOrientation, WebInspector.SensorsView.Devi ceOrientationModificationSource.UserDrag);
328 this._setSelectElementLabel(this._orientationSelectElement, WebInspector .SensorsView.NonPresetOptions.Custom); 353 this._setSelectElementLabel(this._orientationSelectElement, WebInspector .SensorsView.NonPresetOptions.Custom);
329 return false; 354 return false;
330 }, 355 },
331 356
332 /** 357 /**
333 * @param {!MouseEvent} event 358 * @param {!MouseEvent} event
334 * @return {boolean} 359 * @return {boolean}
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 {title: WebInspector.UIString("Location unavailable"), location: Web Inspector.SensorsView.NonPresetOptions.Unavailable} 453 {title: WebInspector.UIString("Location unavailable"), location: Web Inspector.SensorsView.NonPresetOptions.Unavailable}
429 ] 454 ]
430 } 455 }
431 ] 456 ]
432 457
433 /** @type {!Array.<{title: string, value: !Array.<{title: string, orientation: ! WebInspector.DeviceOrientation}>}>} */ 458 /** @type {!Array.<{title: string, value: !Array.<{title: string, orientation: ! WebInspector.DeviceOrientation}>}>} */
434 WebInspector.SensorsView.PresetOrientations = [ 459 WebInspector.SensorsView.PresetOrientations = [
435 { 460 {
436 title: "Presets", 461 title: "Presets",
437 value: [ 462 value: [
438 {title: WebInspector.UIString("Portrait"), orientation: "[0, 0, 0]"} , 463 {title: WebInspector.UIString("Portrait"), orientation: "[0, 90, 0]" },
439 {title: WebInspector.UIString("Portrait upside down"), orientation: "[180, 0, 0]"}, 464 {title: WebInspector.UIString("Portrait upside down"), orientation: "[180, 90, 0]"},
440 {title: WebInspector.UIString("Landscape left"), orientation: "[90, 0, 0]"}, 465 {title: WebInspector.UIString("Landscape left"), orientation: "[90, 90, 0]"},
441 {title: WebInspector.UIString("Landscape right"), orientation: "[270 , 0, 0]"}, 466 {title: WebInspector.UIString("Landscape right"), orientation: "[270 , 90, 0]"},
442 {title: WebInspector.UIString("Display up"), orientation: "[0, 270, 0]"}, 467 {title: WebInspector.UIString("Display up"), orientation: "[0, 0, 0] "},
443 {title: WebInspector.UIString("Display down"), orientation: "[0, 90, 0]"} 468 {title: WebInspector.UIString("Display down"), orientation: "[0, 180 , 0]"}
444 ] 469 ]
445 } 470 }
446 ] 471 ]
447 472
448 /** 473 /**
449 * @return {!WebInspector.SensorsView} 474 * @return {!WebInspector.SensorsView}
450 */ 475 */
451 WebInspector.SensorsView.instance = function() 476 WebInspector.SensorsView.instance = function()
452 { 477 {
453 if (!WebInspector.SensorsView._instanceObject) 478 if (!WebInspector.SensorsView._instanceObject)
(...skipping 15 matching lines...) Expand all
469 * @param {!WebInspector.Context} context 494 * @param {!WebInspector.Context} context
470 * @param {string} actionId 495 * @param {string} actionId
471 * @return {boolean} 496 * @return {boolean}
472 */ 497 */
473 handleAction: function(context, actionId) 498 handleAction: function(context, actionId)
474 { 499 {
475 WebInspector.inspectorView.showViewInDrawer("sensors"); 500 WebInspector.inspectorView.showViewInDrawer("sensors");
476 return true; 501 return true;
477 } 502 }
478 } 503 }
504
505 WebInspector.SensorsView.ShiftDragOrientationSpeed = 16;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698