Temporary fix for the changes made in the WME internal data structure that breaks any script that interacts with the map
目前為
// ==UserScript==
// @name WME Fix Map Object
// @namespace http://www.tomputtemans.com/
// @description Temporary fix for the changes made in the WME internal data structure that breaks any script that interacts with the map
// @include /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor.*$/
// @version 1.0.0
// @grant none
// ==/UserScript==
/* global W */
(function() {
'use strict';
var recoveredProperties = new Map();
function init() {
if (typeof W === 'undefined' ||
typeof W.map === 'undefined' ||
typeof W.map.olMap === 'undefined') {
setTimeout(init, 100);
return;
}
W.map = new Proxy(W.map, {
'get': function(target, property) {
checkProperty(property);
return Reflect.get(...arguments);
}
});
recoverProperties();
console.log("Fix Map Object: The following properties have been recovered: ", Array.from(recoveredProperties.keys()).sort());
}
init();
function recoverProperties() {
// Go through all properties, including the prototype chain
for (var mapProperty in W.map.getOLMap()) {
if (!W.map[mapProperty]) {
recoveredProperties.set(mapProperty, 0);
W.map[mapProperty] = W.map.getOLMap()[mapProperty];
}
}
}
function checkProperty(propertyName) {
if (recoveredProperties.has(propertyName)) {
var timesCalled = recoveredProperties.get(propertyName);
if (timesCalled >= 10) {
return;
}
console.groupCollapsed("Fix Map Object: Removed property W.map." + propertyName + " accessed. Expand for stack trace.");
console.trace();
console.groupEnd();
if (timesCalled == 9) {
console.warn("Fix Map Object: No longer reporting on removed property W.map." + propertyName + " (limit reached)");
}
recoveredProperties.set(propertyName, timesCalled + 1);
}
}
})();