Index: third_party/WebKit/Source/devtools/front_end/emulation/SensorsView.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/SensorsView.js b/third_party/WebKit/Source/devtools/front_end/emulation/SensorsView.js |
index d9cf4d773f0147923dc28d809e36ca13db4546c8..858b5abc3a57e94441c7143dd40d6816483a81f0 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/emulation/SensorsView.js |
+++ b/third_party/WebKit/Source/devtools/front_end/emulation/SensorsView.js |
@@ -14,54 +14,110 @@ WebInspector.SensorsView = function() |
this._geolocationSetting = WebInspector.settings.createSetting("emulation.geolocationOverride", ""); |
this._geolocation = WebInspector.Geolocation.parseSetting(this._geolocationSetting.get()); |
- this._geolocationEnabled = false; |
- this._appendGeolocationOverrideControl(); |
+ this._geolocationOverrideEnabled = false; |
+ this._createGeolocationSection(this._geolocation); |
+ |
+ this.contentElement.createChild("div").classList.add("panel-section-separator"); |
this._deviceOrientationSetting = WebInspector.settings.createSetting("emulation.deviceOrientationOverride", ""); |
this._deviceOrientation = WebInspector.DeviceOrientation.parseSetting(this._deviceOrientationSetting.get()); |
- this._deviceOrientationEnabled = false; |
- this._appendDeviceOrientationOverrideControl(); |
+ this._deviceOrientationOverrideEnabled = false; |
+ this._createDeviceOrientationSection(); |
+ |
+ this.contentElement.createChild("div").classList.add("panel-section-separator"); |
this._appendTouchControl(); |
} |
WebInspector.SensorsView.prototype = { |
- _appendGeolocationOverrideControl: function() |
+ /** |
+ * @param {!WebInspector.Geolocation} geolocation |
+ */ |
+ _createGeolocationSection: function(geolocation) |
{ |
- var checkboxLabel = createCheckboxLabel(WebInspector.UIString("Emulate geolocation coordinates")); |
- this._geolocationOverrideCheckbox = checkboxLabel.checkboxElement; |
- this._geolocationOverrideCheckbox.addEventListener("click", this._geolocationOverrideCheckboxClicked.bind(this)); |
- this.contentElement.appendChild(checkboxLabel); |
- this._geolocationFieldset = this._createGeolocationOverrideElement(this._geolocation); |
- this._geolocationFieldset.disabled = true; |
- this.contentElement.appendChild(this._geolocationFieldset); |
+ var geogroup = this.contentElement.createChild("section", "sensors-group"); |
+ geogroup.createChild("div", "sensors-group-title").textContent = WebInspector.UIString("Geolocation"); |
+ var fields = geogroup.createChild("div", "geo-fields"); |
+ |
+ const noOverrideOption = {title: WebInspector.UIString("No override"), location: WebInspector.SensorsView.NonPresetOptions.NoOverride}; |
+ const customLocationOption = {title: WebInspector.UIString("Custom location..."), location: WebInspector.SensorsView.NonPresetOptions.Custom}; |
+ this._locationSelectElement = this.contentElement.createChild("select", "chrome-select"); |
+ this._locationSelectElement.appendChild(new Option(noOverrideOption.title, noOverrideOption.location)); |
+ this._locationSelectElement.appendChild(new Option(customLocationOption.title, customLocationOption.location)); |
+ |
+ var locationGroups = WebInspector.SensorsView.PresetLocations; |
+ for (var i = 0; i < locationGroups.length; ++i) { |
+ var group = locationGroups[i].value; |
+ var groupElement = this._locationSelectElement.createChild("optgroup"); |
+ groupElement.label = locationGroups[i].title; |
+ for (var j = 0; j < group.length; ++j) |
+ groupElement.appendChild(new Option(group[j].title, group[j].location)); |
+ } |
+ this._locationSelectElement.selectedIndex = 0; |
+ fields.appendChild(this._locationSelectElement); |
+ this._locationSelectElement.addEventListener("change", this._geolocationSelectChanged.bind(this)); |
+ |
+ // Validated input fieldset. |
+ this._fieldsetElement = fields.createChild("fieldset"); |
+ this._fieldsetElement.disabled = !this._geolocationOverrideEnabled; |
+ this._fieldsetElement.id = "geolocation-override-section"; |
+ |
+ var latitudeGroup = this._fieldsetElement.createChild("div", "latlong-group"); |
+ var longitudeGroup = this._fieldsetElement.createChild("div", "latlong-group"); |
+ |
+ this._latitudeInput = latitudeGroup.createChild("input"); |
+ this._latitudeInput.setAttribute("type", "text"); |
+ this._latitudeInput.value = 0; |
+ WebInspector.bindInput(this._latitudeInput, this._applyGeolocationUserInput.bind(this), WebInspector.Geolocation.latitudeValidator, true)(String(geolocation.latitude)); |
+ |
+ this._longitudeInput = longitudeGroup.createChild("input"); |
+ this._longitudeInput.setAttribute("type", "text"); |
+ this._longitudeInput.value = 0; |
+ WebInspector.bindInput(this._longitudeInput, this._applyGeolocationUserInput.bind(this), WebInspector.Geolocation.longitudeValidator, true)(String(geolocation.longitude)); |
+ |
+ latitudeGroup.createChild("div", "latlong-title").textContent = WebInspector.UIString("Latitude"); |
+ longitudeGroup.createChild("div", "latlong-title").textContent = WebInspector.UIString("Longitude"); |
}, |
- _geolocationOverrideCheckboxClicked: function() |
+ _geolocationSelectChanged: function() |
{ |
- var enabled = this._geolocationOverrideCheckbox.checked; |
+ this._fieldsetElement.disabled = false; |
+ var value = this._locationSelectElement.options[this._locationSelectElement.selectedIndex].value; |
+ if (value === WebInspector.SensorsView.NonPresetOptions.NoOverride) { |
+ this._geolocationOverrideEnabled = false; |
+ this._fieldsetElement.disabled = true; |
+ } else if (value === WebInspector.SensorsView.NonPresetOptions.Custom) { |
+ this._geolocationOverrideEnabled = true; |
+ } else if (value === WebInspector.SensorsView.NonPresetOptions.Unavailable) { |
+ this._geolocationOverrideEnabled = true; |
+ this._geolocation = new WebInspector.Geolocation(0, 0, true); |
+ } else { |
+ this._geolocationOverrideEnabled = true; |
+ var coordinates = JSON.parse(value); |
+ this._geolocation = new WebInspector.Geolocation(coordinates[0], coordinates[1], false); |
+ this._latitudeInput.value = coordinates[0]; |
+ this._longitudeInput.value = coordinates[1]; |
+ } |
- this._geolocationEnabled = enabled; |
this._applyGeolocation(); |
- |
- if (enabled && !this._latitudeElement.value) |
- this._latitudeElement.focus(); |
- this._geolocationFieldset.disabled = !enabled; |
+ if (value === WebInspector.SensorsView.NonPresetOptions.Custom) |
+ this._latitudeInput.focus(); |
}, |
_applyGeolocationUserInput: function() |
{ |
- var geolocation = WebInspector.Geolocation.parseUserInput(this._latitudeElement.value.trim(), this._longitudeElement.value.trim(), this._geolocationErrorElement.checked); |
+ var geolocation = WebInspector.Geolocation.parseUserInput(this._latitudeInput.value.trim(), this._longitudeInput.value.trim(), ""); |
if (!geolocation) |
return; |
+ this._setSelectElementLabel(this._locationSelectElement, WebInspector.SensorsView.NonPresetOptions.Custom); |
this._geolocation = geolocation; |
this._applyGeolocation(); |
}, |
_applyGeolocation: function() |
{ |
- if (this._geolocationEnabled) { |
+ if (this._geolocationOverrideEnabled) { |
this._geolocationSetting.set(this._geolocation.toSetting()); |
this._geolocation.apply(); |
} else { |
@@ -69,67 +125,57 @@ WebInspector.SensorsView.prototype = { |
} |
}, |
- /** |
- * @param {!WebInspector.Geolocation} geolocation |
- * @return {!Element} |
- */ |
- _createGeolocationOverrideElement: function(geolocation) |
+ _createDeviceOrientationSection: function() |
{ |
- var fieldsetElement = createElement("fieldset"); |
- fieldsetElement.id = "geolocation-override-section"; |
- |
- var tableElement = fieldsetElement.createChild("table"); |
- var rowElement = tableElement.createChild("tr"); |
- var cellElement = rowElement.createChild("td"); |
- cellElement = rowElement.createChild("td"); |
- cellElement.createTextChild(WebInspector.UIString("Lat = ")); |
- this._latitudeElement = cellElement.createChild("input"); |
- this._latitudeElement.type = "text"; |
- WebInspector.bindInput(this._latitudeElement, this._applyGeolocationUserInput.bind(this), WebInspector.Geolocation.latitudeValidator, true)(String(geolocation.latitude)); |
- cellElement.createTextChild(" , "); |
- cellElement.createTextChild(WebInspector.UIString("Lon = ")); |
- this._longitudeElement = cellElement.createChild("input"); |
- this._longitudeElement.type = "text"; |
- WebInspector.bindInput(this._longitudeElement, this._applyGeolocationUserInput.bind(this), WebInspector.Geolocation.longitudeValidator, true)(String(geolocation.longitude)); |
- rowElement = tableElement.createChild("tr"); |
- cellElement = rowElement.createChild("td"); |
- cellElement.colSpan = 2; |
- var geolocationErrorLabelElement = createCheckboxLabel(WebInspector.UIString("Emulate position unavailable"), !geolocation || !!geolocation.error); |
- var geolocationErrorCheckboxElement = geolocationErrorLabelElement.checkboxElement; |
- geolocationErrorCheckboxElement.id = "geolocation-error"; |
- geolocationErrorCheckboxElement.addEventListener("click", this._applyGeolocationUserInput.bind(this), false); |
- this._geolocationErrorElement = geolocationErrorCheckboxElement; |
- cellElement.appendChild(geolocationErrorLabelElement); |
- |
- return fieldsetElement; |
- }, |
+ var orientationGroup = this.contentElement.createChild("section", "sensors-group"); |
+ orientationGroup.createChild("div", "sensors-group-title").textContent = WebInspector.UIString("Accelerometer"); |
+ var fields = orientationGroup.createChild("div", "geo-fields"); |
+ |
+ const accelerometerOffOption = {title: WebInspector.UIString("Off"), orientation: WebInspector.SensorsView.NonPresetOptions.NoOverride}; |
+ const customOrientationOption = {title: WebInspector.UIString("Custom orientation..."), orientation: WebInspector.SensorsView.NonPresetOptions.Custom}; |
+ this._orientationSelectElement = this.contentElement.createChild("select", "chrome-select"); |
+ this._orientationSelectElement.appendChild(new Option(accelerometerOffOption.title, accelerometerOffOption.orientation)); |
+ this._orientationSelectElement.appendChild(new Option(customOrientationOption.title, customOrientationOption.orientation)); |
+ |
+ var orientationGroups = WebInspector.SensorsView.PresetOrientations; |
+ for (var i = 0; i < orientationGroups.length; ++i) { |
+ var groupElement = this._orientationSelectElement.createChild("optgroup"); |
+ groupElement.label = orientationGroups[i].title; |
+ var group = orientationGroups[i].value; |
+ for (var j = 0; j < group.length; ++j) |
+ groupElement.appendChild(new Option(group[j].title, group[j].orientation)); |
+ } |
+ this._orientationSelectElement.selectedIndex = 0; |
+ fields.appendChild(this._orientationSelectElement); |
+ this._orientationSelectElement.addEventListener("change", this._orientationSelectChanged.bind(this)); |
- _appendDeviceOrientationOverrideControl: function() |
- { |
- var checkboxLabel = createCheckboxLabel(WebInspector.UIString("Emulate device orientation")); |
- this._overrideDeviceOrientationCheckbox = checkboxLabel.checkboxElement; |
- this._overrideDeviceOrientationCheckbox.addEventListener("click", this._deviceOrientationOverrideCheckboxClicked.bind(this)); |
- this.contentElement.appendChild(checkboxLabel); |
this._deviceOrientationFieldset = this._createDeviceOrientationOverrideElement(this._deviceOrientation); |
this._deviceOrientationFieldset.disabled = true; |
- this.contentElement.appendChild(this._deviceOrientationFieldset); |
+ fields.appendChild(this._deviceOrientationFieldset); |
}, |
- _deviceOrientationOverrideCheckboxClicked: function() |
+ _orientationSelectChanged: function() |
{ |
- var enabled = this._overrideDeviceOrientationCheckbox.checked; |
- |
- this._deviceOrientationEnabled = enabled; |
- this._applyDeviceOrientation(); |
- |
- if (enabled && !this._alphaElement.value) |
+ var value = this._orientationSelectElement.options[this._orientationSelectElement.selectedIndex].value; |
+ this._deviceOrientationFieldset.disabled = false; |
+ |
+ if (value === WebInspector.SensorsView.NonPresetOptions.NoOverride) { |
+ this._deviceOrientationOverrideEnabled = false; |
+ this._deviceOrientationFieldset.disabled = true; |
+ } else if (value === WebInspector.SensorsView.NonPresetOptions.Custom) { |
+ this._deviceOrientationOverrideEnabled = true; |
this._alphaElement.focus(); |
- this._deviceOrientationFieldset.disabled = !enabled; |
+ } else { |
+ var parsedValue = JSON.parse(value); |
+ this._deviceOrientationOverrideEnabled = true; |
+ this._deviceOrientation = new WebInspector.DeviceOrientation(parsedValue[0], parsedValue[1], parsedValue[2]); |
+ this._setDeviceOrientation(this._deviceOrientation, WebInspector.SensorsView.DeviceOrientationModificationSource.SelectPreset); |
+ } |
}, |
_applyDeviceOrientation: function() |
{ |
- if (this._deviceOrientationEnabled) { |
+ if (this._deviceOrientationOverrideEnabled) { |
this._deviceOrientationSetting.set(this._deviceOrientation.toSetting()); |
this._deviceOrientation.apply(); |
} else { |
@@ -137,9 +183,20 @@ WebInspector.SensorsView.prototype = { |
} |
}, |
+ /** |
+ * @param {!Element} selectElement |
+ * @param {string} labelValue |
+ */ |
+ _setSelectElementLabel: function(selectElement, labelValue) |
+ { |
+ var optionValues = Array.prototype.map.call(selectElement.options, x => x.value); |
+ selectElement.selectedIndex = optionValues.indexOf(labelValue); |
+ }, |
+ |
_applyDeviceOrientationUserInput: function() |
{ |
this._setDeviceOrientation(WebInspector.DeviceOrientation.parseUserInput(this._alphaElement.value.trim(), this._betaElement.value.trim(), this._gammaElement.value.trim()), WebInspector.SensorsView.DeviceOrientationModificationSource.UserInput); |
+ this._setSelectElementLabel(this._orientationSelectElement, WebInspector.SensorsView.NonPresetOptions.Custom); |
}, |
_resetDeviceOrientation: function() |
@@ -156,14 +213,25 @@ WebInspector.SensorsView.prototype = { |
if (!deviceOrientation) |
return; |
+ /** |
+ * @param {number} angle |
+ * @return {number} |
+ */ |
+ function roundAngle(angle) |
+ { |
+ return Math.round(angle*10000)/10000; |
+ } |
+ |
if (modificationSource != WebInspector.SensorsView.DeviceOrientationModificationSource.UserInput) { |
- this._alphaSetter(deviceOrientation.alpha); |
- this._betaSetter(deviceOrientation.beta); |
- this._gammaSetter(deviceOrientation.gamma); |
+ this._alphaSetter(roundAngle(deviceOrientation.alpha)); |
+ this._betaSetter(roundAngle(deviceOrientation.beta)); |
+ this._gammaSetter(roundAngle(deviceOrientation.gamma)); |
} |
if (modificationSource != WebInspector.SensorsView.DeviceOrientationModificationSource.UserDrag) |
this._setBoxOrientation(deviceOrientation); |
+ else |
+ this._boxElement.classList.remove("smooth-transition"); |
this._deviceOrientation = deviceOrientation; |
this._applyDeviceOrientation(); |
@@ -178,14 +246,15 @@ WebInspector.SensorsView.prototype = { |
_createAxisInput: function(parentElement, input, label) |
{ |
var div = parentElement.createChild("div", "accelerometer-axis-input-container"); |
- div.createTextChild(label); |
div.appendChild(input); |
- input.type = "text"; |
+ div.createTextChild(label); |
+ input.type = "number"; |
return WebInspector.bindInput(input, this._applyDeviceOrientationUserInput.bind(this), WebInspector.DeviceOrientation.validator, true); |
}, |
/** |
* @param {!WebInspector.DeviceOrientation} deviceOrientation |
+ * @return {!Element} |
*/ |
_createDeviceOrientationOverrideElement: function(deviceOrientation) |
{ |
@@ -196,15 +265,15 @@ WebInspector.SensorsView.prototype = { |
var cellElement = rowElement.createChild("td", "accelerometer-inputs-cell"); |
this._alphaElement = createElement("input"); |
- this._alphaSetter = this._createAxisInput(cellElement, this._alphaElement, "\u03B1: "); |
+ this._alphaSetter = this._createAxisInput(cellElement, this._alphaElement, WebInspector.UIString("Tilt left/right (\u03B1)")); |
this._alphaSetter(String(deviceOrientation.alpha)); |
this._betaElement = createElement("input"); |
- this._betaSetter = this._createAxisInput(cellElement, this._betaElement, "\u03B2: "); |
+ this._betaSetter = this._createAxisInput(cellElement, this._betaElement, WebInspector.UIString("Tilt front/back (\u03B2)")); |
this._betaSetter(String(deviceOrientation.beta)); |
this._gammaElement = createElement("input"); |
- this._gammaSetter = this._createAxisInput(cellElement, this._gammaElement, "\u03B3: "); |
+ this._gammaSetter = this._createAxisInput(cellElement, this._gammaElement, WebInspector.UIString("Rotate (\u03B3)")); |
this._gammaSetter(String(deviceOrientation.gamma)); |
cellElement.appendChild(createTextButton(WebInspector.UIString("Reset"), this._resetDeviceOrientation.bind(this), "accelerometer-reset-button")); |
@@ -219,7 +288,7 @@ WebInspector.SensorsView.prototype = { |
this._boxElement.createChild("section", "right"); |
this._boxElement.createChild("section", "bottom"); |
- WebInspector.installDragHandle(this._stageElement, this._onBoxDragStart.bind(this), this._onBoxDrag.bind(this), this._onBoxDragEnd.bind(this), "move"); |
+ WebInspector.installDragHandle(this._stageElement, this._onBoxDragStart.bind(this), this._onBoxDrag.bind(this), this._onBoxDragEnd.bind(this), "-webkit-grabbing", "-webkit-grab"); |
this._setBoxOrientation(deviceOrientation); |
return fieldsetElement; |
}, |
@@ -231,6 +300,7 @@ WebInspector.SensorsView.prototype = { |
{ |
var matrix = new WebKitCSSMatrix(); |
this._boxMatrix = matrix.rotate(-deviceOrientation.beta, deviceOrientation.gamma, -deviceOrientation.alpha); |
+ this._boxElement.classList.add("smooth-transition"); |
this._boxElement.style.webkitTransform = this._boxMatrix.toString(); |
}, |
@@ -255,6 +325,7 @@ WebInspector.SensorsView.prototype = { |
var eulerAngles = WebInspector.Geometry.EulerAngles.fromRotationMatrix(this._currentMatrix); |
var newOrientation = new WebInspector.DeviceOrientation(-eulerAngles.alpha, -eulerAngles.beta, eulerAngles.gamma); |
this._setDeviceOrientation(newOrientation, WebInspector.SensorsView.DeviceOrientationModificationSource.UserDrag); |
+ this._setSelectElementLabel(this._orientationSelectElement, WebInspector.SensorsView.NonPresetOptions.Custom); |
return false; |
}, |
@@ -264,7 +335,7 @@ WebInspector.SensorsView.prototype = { |
*/ |
_onBoxDragStart: function(event) |
{ |
- if (!this._overrideDeviceOrientationCheckbox.checked) |
+ if (!this._deviceOrientationOverrideEnabled) |
return false; |
this._mouseDownVector = this._calculateRadiusVector(event.x, event.y); |
@@ -301,9 +372,12 @@ WebInspector.SensorsView.prototype = { |
_appendTouchControl: function() |
{ |
- var label = this.contentElement.createChild("label", "touch-label"); |
- label.createChild("span", "").textContent = WebInspector.UIString("Touch"); |
- var select = label.createChild("select", "chrome-select"); |
+ var groupElement = this.contentElement.createChild("div", "sensors-group"); |
+ var title = groupElement.createChild("div", "sensors-group-title"); |
+ var fieldsElement = groupElement.createChild("div", "sensors-group-fields"); |
+ |
+ title.textContent = WebInspector.UIString("Touch"); |
+ var select = fieldsElement.createChild("select", "chrome-select"); |
select.appendChild(new Option(WebInspector.UIString("Device-based"), "auto")); |
select.appendChild(new Option(WebInspector.UIString("Force enabled"), "enabled")); |
select.addEventListener("change", applyTouch, false); |
@@ -321,9 +395,56 @@ WebInspector.SensorsView.prototype = { |
WebInspector.SensorsView.DeviceOrientationModificationSource = { |
UserInput: "userInput", |
UserDrag: "userDrag", |
- ResetButton: "resetButton" |
+ ResetButton: "resetButton", |
+ SelectPreset: "selectPreset" |
+} |
+ |
+/** {string} */ |
+WebInspector.SensorsView.NonPresetOptions = { |
+ "NoOverride": "noOverride", |
+ "Custom": "custom", |
+ "Unavailable": "unavailable" |
} |
+/** @type {!Array.<{title: string, value: !Array.<{title: string, location: string}>}>} */ |
+WebInspector.SensorsView.PresetLocations = [ |
+ { |
+ title: "Presets", |
+ value: [ |
+ {title: WebInspector.UIString("Berlin"), location: "[52.520007, 13.404954]"}, |
+ {title: WebInspector.UIString("London"), location: "[51.507351, -0.127758]"}, |
+ {title: WebInspector.UIString("Moscow"), location: "[55.755826, 37.617300]"}, |
+ {title: WebInspector.UIString("Mountain View"), location: "[37.386052, -122.083851]"}, |
+ {title: WebInspector.UIString("Mumbai"), location: "[19.075984, 72.877656]"}, |
+ {title: WebInspector.UIString("San Francisco"), location: "[37.774929, -122.419416]"}, |
+ {title: WebInspector.UIString("Shanghai"), location: "[31.230416, 121.473701]"}, |
+ {title: WebInspector.UIString("São Paulo"), location: "[-23.550520, -46.633309]"}, |
+ {title: WebInspector.UIString("Tokyo"), location: "[35.689487, 139.691706]"}, |
+ ] |
+ }, |
+ { |
+ title: "Error", |
+ value: [ |
+ {title: WebInspector.UIString("Location unavailable"), location: WebInspector.SensorsView.NonPresetOptions.Unavailable} |
+ ] |
+ } |
+] |
+ |
+/** @type {!Array.<{title: string, value: !Array.<{title: string, orientation: !WebInspector.DeviceOrientation}>}>} */ |
+WebInspector.SensorsView.PresetOrientations = [ |
+ { |
+ title: "Presets", |
+ value: [ |
+ {title: WebInspector.UIString("Portrait"), orientation: "[0, 0, 0]"}, |
+ {title: WebInspector.UIString("Portrait upside down"), orientation: "[180, 0, 0]"}, |
+ {title: WebInspector.UIString("Landscape left"), orientation: "[90, 0, 0]"}, |
+ {title: WebInspector.UIString("Landscape right"), orientation: "[270, 0, 0]"}, |
+ {title: WebInspector.UIString("Display up"), orientation: "[0, 270, 0]"}, |
+ {title: WebInspector.UIString("Display down"), orientation: "[0, 90, 0]"} |
+ ] |
+ } |
+] |
+ |
/** |
* @return {!WebInspector.SensorsView} |
*/ |