Changeset 123634 in webkit
- Timestamp:
- Jul 25, 2012, 10:50:44 AM (13 years ago)
- Location:
- trunk
- Files:
-
- 6 added
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r123631 r123634 1 2012-07-25 Konrad Piascik <kpiascik@rim.com> 2 3 Web Inspector: Geolocation override 4 https://bugs.webkit.org/show_bug.cgi?id=89365 5 6 Reviewed by Pavel Feldman. 7 8 Added new tests. 9 10 * inspector/geolocation-error-expected.txt: Added. 11 * inspector/geolocation-error.html: Added. 12 * inspector/geolocation-success-expected.txt: Added. 13 * inspector/geolocation-success.html: Added. 14 * inspector/geolocation-watchPosition-expected.txt: Added. 15 * inspector/geolocation-watchPosition.html: Added. 16 1 17 2012-07-25 Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> 2 18 -
trunk/Source/WebCore/ChangeLog
r123633 r123634 1 2012-07-25 Konrad Piascik <kpiascik@rim.com> 2 3 Web Inspector: Geolocation override 4 https://bugs.webkit.org/show_bug.cgi?id=89365 5 6 Reviewed by Pavel Feldman. 7 8 Re-added the m_page member variable for GeolocationController since 9 it's now being used by InspectorInstrumentaiton. 10 11 Added a way to override the GeolocationPosition and GeolocationError 12 using Web Inspector. Curretnly only PositionError can be set. 13 14 This will be hidden behind the experiments flag for now. 15 16 Tests: inspector/geolocation-error.html 17 inspector/geolocation-success.html 18 inspector/geolocation-watchPosition.html 19 20 * English.lproj/localizedStrings.js: 21 * Modules/geolocation/GeolocationController.cpp: 22 (WebCore::GeolocationController::GeolocationController): 23 (WebCore::GeolocationController::positionChanged): 24 * Modules/geolocation/GeolocationController.h: 25 (GeolocationController): 26 * inspector/Inspector.json: 27 * inspector/InspectorInstrumentation.cpp: 28 (WebCore): 29 (WebCore::InspectorInstrumentation::overrideGeolocationPositionImpl): 30 * inspector/InspectorInstrumentation.h: 31 (WebCore): 32 (InspectorInstrumentation): 33 (WebCore::InspectorInstrumentation::overrideGeolocationPosition): 34 * inspector/InspectorPageAgent.cpp: 35 (WebCore::InspectorPageAgent::InspectorPageAgent): 36 (WebCore::InspectorPageAgent::setGeolocationOverride): 37 (WebCore): 38 (WebCore::InspectorPageAgent::clearGeolocationOverride): 39 (WebCore::InspectorPageAgent::canOverrideGeolocation): 40 (WebCore::InspectorPageAgent::overrideGeolocationPosition): 41 * inspector/InspectorPageAgent.h: 42 * inspector/front-end/Settings.js: 43 * inspector/front-end/SettingsScreen.js: 44 (WebInspector.UserAgentSettingsTab): 45 (WebInspector.UserAgentSettingsTab.prototype._createDeviceMetricsElement): 46 (WebInspector.UserAgentSettingsTab.prototype._onGeolocationOverrideCheckboxClicked): 47 (WebInspector.UserAgentSettingsTab.prototype._applyGeolocationUserInput): 48 (WebInspector.UserAgentSettingsTab.prototype._setGeolocationPosition.set if): 49 (WebInspector.UserAgentSettingsTab.prototype._setGeolocationPosition): 50 (WebInspector.UserAgentSettingsTab.prototype._createGeolocationOverrideElement.createInput): 51 (WebInspector.UserAgentSettingsTab.prototype._createGeolocationOverrideElement): 52 * inspector/front-end/UserAgentSupport.js: 53 (WebInspector.UserAgentSupport.GeolocationPosition): 54 (WebInspector.UserAgentSupport.GeolocationPosition.prototype.toSetting): 55 (WebInspector.UserAgentSupport.GeolocationPosition.parseSetting): 56 (WebInspector.UserAgentSupport.GeolocationPosition.parseUserInput): 57 (WebInspector.UserAgentSupport.GeolocationPosition.clearGeolocationOverride): 58 * inspector/front-end/inspector.js: 59 (WebInspector.doLoadedDone): 60 1 61 2012-07-25 Shawn Singh <shawnsingh@chromium.org> 2 62 -
trunk/Source/WebCore/English.lproj/localizedStrings.js
r123494 r123634 723 723 localizedStrings["Previous"] = "Previous"; 724 724 localizedStrings["Paused in debugger"] = "Paused in debugger"; 725 localizedStrings["Emulate position unavailable"] = "Emulate position unavailable"; 726 localizedStrings["Override Geolocation"] = "Override Geolocation"; 727 localizedStrings["Geolocation Position"] = "Geolocation Position"; -
trunk/Source/WebCore/Modules/geolocation/GeolocationController.cpp
r122532 r123634 30 30 31 31 #include "GeolocationClient.h" 32 #include "GeolocationError.h" 32 33 #include "GeolocationPosition.h" 34 #include "InspectorInstrumentation.h" 33 35 34 36 namespace WebCore { 35 37 36 GeolocationController::GeolocationController(Page* , GeolocationClient* client)38 GeolocationController::GeolocationController(Page* page, GeolocationClient* client) 37 39 : m_client(client) 40 , m_page(page) 38 41 { 39 42 } … … 99 102 void GeolocationController::positionChanged(GeolocationPosition* position) 100 103 { 104 position = InspectorInstrumentation::overrideGeolocationPosition(m_page, position); 105 if (!position) { 106 errorOccurred(GeolocationError::create(GeolocationError::PositionUnavailable, "PositionUnavailable").get()); 107 return; 108 } 101 109 m_lastPosition = position; 102 110 Vector<RefPtr<Geolocation> > observersVector; -
trunk/Source/WebCore/Modules/geolocation/GeolocationController.h
r122532 r123634 69 69 70 70 GeolocationClient* m_client; 71 Page* m_page; 71 72 72 73 RefPtr<GeolocationPosition> m_lastPosition; -
trunk/Source/WebCore/inspector/Inspector.json
r123612 r123634 351 351 { "name": "value", "type": "boolean", "description": "Whether script execution should be disabled in the page." } 352 352 ] 353 }, 354 { 355 "name": "setGeolocationOverride", 356 "description": "Overrides the Geolocation Position or Error.", 357 "parameters": [ 358 { "name": "latitude", "type": "number", "optional": true, "description": "Mock longitude"}, 359 { "name": "longitude", "type": "number", "optional": true, "description": "Mock latitude"}, 360 { "name": "accuracy", "type": "number", "optional": true, "description": "Mock accuracy"} 361 ], 362 "hidden": true 363 }, 364 { 365 "name": "clearGeolocationOverride", 366 "description": "Clears the overriden Geolocation Position and Error.", 367 "hidden": true 368 }, 369 { 370 "name": "canOverrideGeolocation", 371 "description": "Checks if Geolocation can be overridden.", 372 "returns": [ 373 { "name": "result", "type": "boolean", "description": "True if browser can ovrride Geolocation." } 374 ], 375 "hidden": true 353 376 } 354 377 ], -
trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp
r123223 r123634 1175 1175 #endif 1176 1176 1177 #if ENABLE(GEOLOCATION) 1178 GeolocationPosition* InspectorInstrumentation::overrideGeolocationPositionImpl(InstrumentingAgents* instrumentingAgents, GeolocationPosition* position) 1179 { 1180 if (InspectorPageAgent* pageAgent = instrumentingAgents->inspectorPageAgent()) 1181 position = pageAgent->overrideGeolocationPosition(position); 1182 return position; 1183 } 1184 #endif 1185 1177 1186 } // namespace WebCore 1178 1187 -
trunk/Source/WebCore/inspector/InspectorInstrumentation.h
r123223 r123634 57 57 class EventContext; 58 58 class DocumentLoader; 59 class GeolocationPosition; 59 60 class GraphicsContext; 60 61 class HitTestResult; … … 259 260 #endif 260 261 262 #if ENABLE(GEOLOCATION) 263 static GeolocationPosition* overrideGeolocationPosition(Page*, GeolocationPosition*); 264 #endif 265 261 266 private: 262 267 #if ENABLE(INSPECTOR) … … 418 423 static InspectorTimelineAgent* retrieveTimelineAgent(const InspectorInstrumentationCookie&); 419 424 425 #if ENABLE(GEOLOCATION) 426 static GeolocationPosition* overrideGeolocationPositionImpl(InstrumentingAgents*, GeolocationPosition*); 427 #endif 428 420 429 static int s_frontendCounter; 421 430 #endif … … 1364 1373 #endif 1365 1374 } 1375 1376 1377 #if ENABLE(GEOLOCATION) 1378 inline GeolocationPosition* InspectorInstrumentation::overrideGeolocationPosition(Page* page, GeolocationPosition* position) 1379 { 1380 #if ENABLE(INSPECTOR) 1381 FAST_RETURN_IF_NO_FRONTENDS(position); 1382 if (InstrumentingAgents* instrumentingAgents = instrumentingAgentsForPage(page)) 1383 return overrideGeolocationPositionImpl(instrumentingAgents, position); 1384 #endif 1385 return position; 1386 } 1387 #endif 1366 1388 1367 1389 #if ENABLE(INSPECTOR) -
trunk/Source/WebCore/inspector/InspectorPageAgent.cpp
r122966 r123634 51 51 #include "Frame.h" 52 52 #include "FrameView.h" 53 #include "GeolocationController.h" 54 #include "GeolocationError.h" 53 55 #include "HTMLFrameOwnerElement.h" 54 56 #include "HTMLNames.h" … … 320 322 , m_lastPaintContext(0) 321 323 , m_didLoadEventFire(false) 324 , m_geolocationOverridden(false) 322 325 { 323 326 } … … 969 972 } 970 973 974 void InspectorPageAgent::setGeolocationOverride(ErrorString* error, const double* latitude, const double* longitude, const double* accuracy) 975 { 976 #if ENABLE (GEOLOCATION) 977 GeolocationController* controller = GeolocationController::from(m_page); 978 GeolocationPosition* position = 0; 979 if (!controller) { 980 *error = "Internal error: unable to override geolocation."; 981 return; 982 } 983 position = controller->lastPosition(); 984 if (!m_geolocationOverridden && position) 985 m_platformGeolocationPosition = position; 986 987 m_geolocationOverridden = true; 988 if (latitude && longitude && accuracy) 989 m_geolocationPosition = GeolocationPosition::create(currentTimeMS(), *latitude, *longitude, *accuracy); 990 else 991 m_geolocationPosition.clear(); 992 993 controller->positionChanged(0); // Kick location update. 994 #else 995 *error = "Geolocation is not available."; 996 #endif 997 } 998 999 void InspectorPageAgent::clearGeolocationOverride(ErrorString* error) 1000 { 1001 if (!m_geolocationOverridden) 1002 return; 1003 #if ENABLE(GEOLOCATION) 1004 ASSERT_UNUSED(error, true); 1005 m_geolocationOverridden = false; 1006 m_geolocationPosition.clear(); 1007 1008 GeolocationController* controller = GeolocationController::from(m_page); 1009 if (controller && m_platformGeolocationPosition.get()) 1010 controller->positionChanged(m_platformGeolocationPosition.get()); 1011 #else 1012 *error = "Geolocation is not available."; 1013 #endif 1014 } 1015 1016 void InspectorPageAgent::canOverrideGeolocation(ErrorString*, bool* out_param) 1017 { 1018 #if ENABLE(GEOLOCATION) 1019 *out_param = true; 1020 #else 1021 *out_param = false; 1022 #endif 1023 } 1024 1025 GeolocationPosition* InspectorPageAgent::overrideGeolocationPosition(GeolocationPosition* position) 1026 { 1027 if (m_geolocationOverridden) { 1028 if (position) 1029 m_platformGeolocationPosition = position; 1030 return m_geolocationPosition.get(); 1031 } 1032 return position; 1033 } 1034 971 1035 } // namespace WebCore 972 1036 -
trunk/Source/WebCore/inspector/InspectorPageAgent.h
r122966 r123634 35 35 36 36 #include "Frame.h" 37 #include "GeolocationPosition.h" 37 38 #include "InspectorBaseAgent.h" 38 39 #include "InspectorFrontend.h" … … 110 111 virtual void getScriptExecutionStatus(ErrorString*, PageCommandHandler::Result::Enum*); 111 112 virtual void setScriptExecutionDisabled(ErrorString*, bool); 113 virtual void setGeolocationOverride(ErrorString*, const double*, const double*, const double*); 114 virtual void clearGeolocationOverride(ErrorString*); 115 virtual void canOverrideGeolocation(ErrorString*, bool* out_param); 116 117 118 // Geolocation override helpers. 119 GeolocationPosition* overrideGeolocationPosition(GeolocationPosition*); 112 120 113 121 // InspectorInstrumentation API … … 159 167 LayoutRect m_lastPaintRect; 160 168 bool m_didLoadEventFire; 169 bool m_geolocationOverridden; 170 RefPtr<GeolocationPosition> m_geolocationPosition; 171 RefPtr<GeolocationPosition> m_platformGeolocationPosition; 161 172 }; 162 173 -
trunk/Source/WebCore/inspector/front-end/Settings.js
r123452 r123634 57 57 canOverrideDeviceMetrics: false, 58 58 timelineSupportsFrameInstrumentation: false, 59 canOverrideGeolocation: false, 59 60 } 60 61 … … 99 100 this.savedURLs = this.createSetting("savedURLs", {}); 100 101 this.javaScriptDisabled = this.createSetting("javaScriptDisabled", false); 102 this.geolocationOverride = this.createSetting("geolocationOverride", ""); 101 103 102 104 // If there are too many breakpoints in a storage, it is likely due to a recent bug that caused … … 188 190 this.fileSystemInspection = this._createExperiment("fileSystemInspection", "FileSystem inspection"); 189 191 this.mainThreadMonitoring = this._createExperiment("mainThreadMonitoring", "Show CPU activity in Timeline"); 192 this.geolocationOverride = this._createExperiment("geolocationOverride", "Override Device Geolocation"); 190 193 191 194 this._cleanUpSetting(); -
trunk/Source/WebCore/inspector/front-end/SettingsScreen.js
r122532 r123634 350 350 if (Capabilities.canOverrideDeviceMetrics) 351 351 p.appendChild(this._createDeviceMetricsControl()); 352 if (Capabilities.canOverrideGeolocation && WebInspector.experimentsSettings.geolocationOverride.isEnabled()) 353 p.appendChild(this._createGeolocationOverrideControl()); 352 354 p.appendChild(this._createCheckboxSetting(WebInspector.UIString("Emulate touch events"), WebInspector.settings.emulateTouchEvents)); 353 355 } … … 650 652 651 653 return fieldsetElement; 654 }, 655 656 _createGeolocationOverrideControl: function() 657 { 658 const geolocationSetting = WebInspector.settings.geolocationOverride.get(); 659 var geolocation = WebInspector.UserAgentSupport.GeolocationPosition.parseSetting(geolocationSetting); 660 var p = document.createElement("p"); 661 var labelElement = p.createChild("label"); 662 var checkboxElement = labelElement.createChild("input"); 663 checkboxElement.id = "geolocation-override-checkbox"; 664 checkboxElement.type = "checkbox"; 665 checkboxElement.checked = !geolocation || (((typeof geolocation.latitude === "number") && (typeof geolocation.longitude === "number")) || geolocation.error); 666 checkboxElement.addEventListener("click", this._onGeolocationOverrideCheckboxClicked.bind(this), false); 667 this._geolocationOverrideCheckboxElement = checkboxElement; 668 labelElement.appendChild(document.createTextNode(WebInspector.UIString("Override Geolocation"))); 669 670 var geolocationSectionElement = this._createGeolocationOverrideElement(geolocation); 671 p.appendChild(geolocationSectionElement); 672 this._geolocationSectionElement = geolocationSectionElement; 673 this._setGeolocationPosition(geolocation, false, true); 674 return p; 675 }, 676 677 _onGeolocationOverrideCheckboxClicked: function() 678 { 679 var controlsDisabled = !this._geolocationOverrideCheckboxElement.checked; 680 this._latitudeElement.disabled = controlsDisabled; 681 this._longitudeElement.disabled = controlsDisabled; 682 this._geolocationErrorElement.disabled = controlsDisabled; 683 684 if (this._geolocationOverrideCheckboxElement.checked) { 685 var geolocation = WebInspector.UserAgentSupport.GeolocationPosition.parseUserInput(this._latitudeElement.value, this._longitudeElement.value, this._geolocationErrorElement.checked); 686 if (geolocation) 687 this._setGeolocationPosition(geolocation, false, false); 688 if (!this._latitudeElement.value) 689 this._latitudeElement.focus(); 690 } else 691 WebInspector.UserAgentSupport.GeolocationPosition.clearGeolocationOverride(); 692 }, 693 694 _applyGeolocationUserInput: function() 695 { 696 this._setGeolocationPosition(WebInspector.UserAgentSupport.GeolocationPosition.parseUserInput(this._latitudeElement.value.trim(), this._longitudeElement.value.trim(), this._geolocationErrorElement.checked), true, false); 697 }, 698 699 /** 700 * @param {?WebInspector.UserAgentSupport.GeolocationPosition} geolocation 701 * @param {boolean} userInputModified 702 * @param {boolean} updateCheckbox 703 */ 704 _setGeolocationPosition: function(geolocation, userInputModified, updateCheckbox) 705 { 706 if (!geolocation) 707 return; 708 709 if (!userInputModified) { 710 this._latitudeElement.value = geolocation.latitude; 711 this._longitudeElement.value = geolocation.longitude; 712 } 713 714 var value = geolocation.toSetting(); 715 WebInspector.settings.geolocationOverride.set(value); 716 717 if (this._geolocationOverrideCheckboxElement && updateCheckbox) { 718 this._geolocationOverrideCheckboxElement.checked = !!geolocation.toSetting(); 719 this._onGeolocationOverrideCheckboxClicked(); 720 } 721 }, 722 723 /** 724 * @param {WebInspector.UserAgentSupport.GeolocationPosition} geolocation 725 */ 726 _createGeolocationOverrideElement: function(geolocation) 727 { 728 var fieldsetElement = document.createElement("fieldset"); 729 fieldsetElement.id = "geolocation-override-section"; 730 731 function createInput(parentElement, id, defaultText) 732 { 733 var element = parentElement.createChild("input"); 734 element.id = id; 735 element.maxLength = 12; 736 element.style.width = "80px"; 737 element.value = defaultText; 738 element.addEventListener("blur", this._applyGeolocationUserInput.bind(this), false); 739 return element; 740 } 741 742 var tableElement = fieldsetElement.createChild("table"); 743 744 var rowElement = tableElement.createChild("tr"); 745 var cellElement = rowElement.createChild("td"); 746 cellElement.appendChild(document.createTextNode(WebInspector.UIString("Geolocation Position") + ":")); 747 cellElement = rowElement.createChild("td"); 748 this._latitudeElement = createInput.call(this, cellElement, "geolocation-override-latitude", String(geolocation.latitude)); 749 cellElement.appendChild(document.createTextNode(" , ")); 750 this._longitudeElement = createInput.call(this, cellElement, "geolocation-override-longitude", String(geolocation.longitude)); 751 rowElement = tableElement.createChild("tr"); 752 cellElement = rowElement.createChild("td"); 753 var geolocationErrorLabelElement = document.createElement("label"); 754 var geolocationErrorCheckboxElement = geolocationErrorLabelElement.createChild("input"); 755 geolocationErrorCheckboxElement.id = "geolocation-error"; 756 geolocationErrorCheckboxElement.type = "checkbox"; 757 geolocationErrorCheckboxElement.checked = !geolocation || geolocation.error; 758 geolocationErrorCheckboxElement.addEventListener("click", this._applyGeolocationUserInput.bind(this), false); 759 geolocationErrorLabelElement.appendChild(document.createTextNode(WebInspector.UIString("Emulate position unavailable"))); 760 this._geolocationErrorElement = geolocationErrorCheckboxElement; 761 cellElement.appendChild(geolocationErrorLabelElement); 762 763 return fieldsetElement; 652 764 } 653 765 } -
trunk/Source/WebCore/inspector/front-end/UserAgentSupport.js
r122532 r123634 38 38 WebInspector.settings.deviceMetrics.addChangeListener(this._deviceMetricsChanged, this); 39 39 WebInspector.settings.deviceFitWindow.addChangeListener(this._deviceMetricsChanged, this); 40 WebInspector.settings.geolocationOverride.addChangeListener(this._geolocationPositionChanged, this); 40 41 } 41 42 … … 164 165 } 165 166 167 /** 168 * @constructor 169 * @param {number} latitude 170 * @param {number} longitude 171 */ 172 WebInspector.UserAgentSupport.GeolocationPosition = function(latitude, longitude, error) 173 { 174 this.latitude = latitude; 175 this.longitude = longitude; 176 this.error = error; 177 } 178 179 WebInspector.UserAgentSupport.GeolocationPosition.prototype = { 180 /** 181 * @return {string} 182 */ 183 toSetting: function() 184 { 185 return (typeof this.latitude === "number" && typeof this.longitude === "number" && typeof this.error === "string") ? this.latitude + "@" + this.longitude + ":" + this.error : ""; 186 } 187 } 188 189 /** 190 * @return {WebInspector.UserAgentSupport.GeolocationPosition} 191 */ 192 WebInspector.UserAgentSupport.GeolocationPosition.parseSetting = function(value) 193 { 194 if (value) { 195 var splitError = value.split(":"); 196 if (splitError.length === 2) { 197 var splitPosition = splitError[0].split("@") 198 if (splitPosition.length === 2) 199 return new WebInspector.UserAgentSupport.GeolocationPosition(parseFloat(splitPosition[0]), parseFloat(splitPosition[1]), splitError[1]); 200 } 201 } 202 return new WebInspector.UserAgentSupport.GeolocationPosition(0, 0, ""); 203 } 204 205 /** 206 * @return {?WebInspector.UserAgentSupport.GeolocationPosition} 207 */ 208 WebInspector.UserAgentSupport.GeolocationPosition.parseUserInput = function(latitudeString, longitudeString, errorStatus) 209 { 210 function isUserInputValid(value) 211 { 212 if (!value) 213 return true; 214 return /^[-]?[0-9]*[.]?[0-9]*$/.test(value); 215 } 216 217 if (!latitudeString ^ !latitudeString) 218 return null; 219 220 var isLatitudeValid = isUserInputValid(latitudeString); 221 var isLongitudeValid = isUserInputValid(longitudeString); 222 223 if (!isLatitudeValid && !isLongitudeValid) 224 return null; 225 226 var latitude = isLatitudeValid ? parseFloat(latitudeString) : -1; 227 var longitude = isLongitudeValid ? parseFloat(longitudeString) : -1; 228 229 return new WebInspector.UserAgentSupport.GeolocationPosition(latitude, longitude, errorStatus ? "PositionUnavailable" : ""); 230 } 231 232 WebInspector.UserAgentSupport.GeolocationPosition.clearGeolocationOverride = function() 233 { 234 PageAgent.clearGeolocationOverride(); 235 } 236 166 237 WebInspector.UserAgentSupport.prototype = { 167 238 _deviceMetricsChanged: function() … … 170 241 if (metrics.isValid()) 171 242 PageAgent.setDeviceMetricsOverride(metrics.width, metrics.height, metrics.fontScaleFactor, WebInspector.settings.deviceFitWindow.get()); 172 } 173 } 243 }, 244 245 _geolocationPositionChanged: function() 246 { 247 var geolocation = WebInspector.UserAgentSupport.GeolocationPosition.parseSetting(WebInspector.settings.geolocationOverride.get()); 248 if (geolocation.error) 249 PageAgent.setGeolocationOverride(); 250 else 251 PageAgent.setGeolocationOverride(geolocation.latitude, geolocation.longitude, 150); 252 } 253 } 254 -
trunk/Source/WebCore/inspector/front-end/inspector.js
r123223 r123634 435 435 ProfilerAgent.hasHeapProfiler(WebInspector._initializeCapability.bind(WebInspector, "heapProfilerPresent", null)); 436 436 TimelineAgent.supportsFrameInstrumentation(WebInspector._initializeCapability.bind(WebInspector, "timelineSupportsFrameInstrumentation", null)); 437 PageAgent.canOverrideDeviceMetrics(WebInspector._initializeCapability.bind(WebInspector, "canOverrideDeviceMetrics", WebInspector._doLoadedDoneWithCapabilities.bind(WebInspector))); 437 PageAgent.canOverrideDeviceMetrics(WebInspector._initializeCapability.bind(WebInspector, "canOverrideDeviceMetrics", null)); 438 PageAgent.canOverrideGeolocation(WebInspector._initializeCapability.bind(WebInspector, "canOverrideGeolocation", WebInspector._doLoadedDoneWithCapabilities.bind(WebInspector))); 438 439 } 439 440
Note:
See TracChangeset
for help on using the changeset viewer.