From 92983cfede4d4f1b320a6aca67c0f4cdab341fdc Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Tue, 23 Jun 2015 15:58:15 +0200 Subject: [PATCH] [IMP] tour: add log attribute on run method and add getHandlers on jQuery to display the list of handler when the tour try to trigger event --- addons/web/static/src/js/tour.js | 101 ++++++++++++++++++++++++------- 1 file changed, 80 insertions(+), 21 deletions(-) diff --git a/addons/web/static/src/js/tour.js b/addons/web/static/src/js/tour.js index 1e7c048ce4e..b2eb0f73e38 100644 --- a/addons/web/static/src/js/tour.js +++ b/addons/web/static/src/js/tour.js @@ -41,14 +41,65 @@ $.extend($.expr[':'],{ return $(element).prop("value") && $(element).prop("value").indexOf(matches[3]) !== -1; }, }); -$.ajaxSetup({ - beforeSend:function(){ - $.ajaxBusy = ($.ajaxBusy|0) + 1; - }, - complete:function(){ - $.ajaxBusy--; - } -}); + +$.fn.getHandlers = function () { + var results = []; + + var $elementsToWatch = $(this).add($(this).parents()); + var $allElements = $("*").add(document); + + var addEventHandlerInfo = function (element, event, $elementsCovered) { + var extendedEvent = event; + if ($elementsCovered !== void 0 && $elementsCovered !== null) { + $.extend(extendedEvent, { targets: $elementsCovered.toArray() }); + } + var eventInfo; + var eventsInfo = $.grep(results, function (evInfo, index) { + return element === evInfo.element; + }); + + if (eventsInfo.length === 0) { + eventInfo = { + element: element + }; + eventInfo[extendedEvent.type] = [extendedEvent]; + results.push(eventInfo); + } else { + eventInfo = eventsInfo[0]; + if (!eventInfo[extendedEvent.type]) { + eventInfo[extendedEvent.type] = []; + } + eventInfo[extendedEvent.type].push(extendedEvent); + } + }; + + var checkEventHandler = function (element, ElementEvents) { + $.each(ElementEvents, function(i, event){ + var isDelegateEvent = event.selector !== void 0 && event.selector !== null; + var $elementsCovered; + if (isDelegateEvent) { + $elementsCovered = $(event.selector, element); //only look at children of the element, since those are the only ones the handler covers + } else { + $elementsCovered = $(element); //just itself + } + + if (_.intersection($elementsCovered, $elementsToWatch).length) { + addEventHandlerInfo(element, event, $elementsCovered); + } + }); + }; + + $.each($allElements, function (elementIndex, element) { + var allElementEvents = $._data(element, "events"); + if (allElementEvents) { + _.each(allElementEvents, function (ElementEvents) { + checkEventHandler(element, ElementEvents); + }); + } + }); + + return results; +}; ///////////////////////////////////////////////// @@ -69,7 +120,13 @@ var Tour = { if (tour.mode !== "test") tour.mode = "tutorial"; Tour.tours[tour.id] = tour; }, - run: function (tour_id, mode) { + /* + * tour_id: string + * mode: test or tutorial + * log: null (alone log who display the html content) + * 'events' (add log for event handlers) + */ + run: function (tour_id, mode, log) { var tour = Tour.tours[tour_id]; if (!tour) { return Tour.error(null, "Can't run '"+tour_id+"' (tour undefined)"); @@ -86,11 +143,11 @@ var Tour = { this.time = new Date().getTime(); if (tour.path && !window.location.href.match(new RegExp("("+Tour.getLang()+")?"+tour.path+"#?$", "i"))) { var href = Tour.getLang()+tour.path; - Tour.saveState(tour.id, mode || tour.mode, -1, 0); + Tour.saveState(tour.id, mode || tour.mode, -1, 0, 0, log || null); $(document).one("ajaxStop", Tour.running); window.location.href = href; } else { - Tour.saveState(tour.id, mode || tour.mode, 0, 0); + Tour.saveState(tour.id, mode || tour.mode, 0, 0, 0, log || null); Tour.running(); } }, @@ -341,7 +398,7 @@ var Tour = { }; window.location.hash = ""; Tour.log("Tour '"+state.id+"' Begin from url hash"); - Tour.saveState(state.id, state.mode, state.step_id, 0); + Tour.saveState(state.id, state.mode, state.step_id, 0, state.log); } if (!state.id) { return; @@ -372,7 +429,7 @@ var Tour = { + (step ? '\nwaitFor: ' + ((!step.waitFor || $(step.waitFor).size()) ? 'true ' : 'false') : '' ) + (step && step.waitFor ? " "+JSON.stringify(step.waitFor) : "") + (all ? "\nlocalStorage: " + JSON.stringify(localStorage) : '' ) - + (all ? '\n\n' + $("body").html() : '' ); + + (all && !state.log ? '\n\n' + $("body").html() : '' ); Tour.log(message, true); }, error: function (step, message) { @@ -387,14 +444,15 @@ var Tour = { } return tour_ids; }, - saveState: function (tour_id, mode, step_id, number, wait) { + saveState: function (tour_id, mode, step_id, number, wait, log) { localStorage.setItem("tour", JSON.stringify({ "id":tour_id, "mode":mode, "step_id":step_id || 0, "time": this.time, "number": number+1, - "wait": wait || 0 + "wait": wait || 0, + "log": log })); }, reset: function () { @@ -425,7 +483,7 @@ var Tour = { if (state.mode === "test" && state.wait >= 10) { return Tour.error(state.step, "Tour '"+state.id+"' undefined"); } - Tour.saveState(state.id, state.mode, state.step_id, state.number-1, state.wait+1); + Tour.saveState(state.id, state.mode, state.step_id, state.number-1, state.wait+1, state.log); //Tour.log("Tour '"+state.id+"' wait for running (tour undefined)"); setTimeout(Tour.running, Tour.retryRunningDelay); } @@ -458,7 +516,7 @@ var Tour = { clearTimeout(Tour.currentTimer); // use an other timeout for cke dom loading - Tour.saveState(state.id, state.mode, state.step.id, 0); + Tour.saveState(state.id, state.mode, state.step.id, 0, 0, state.log); setTimeout(function () { if (state.step.onend) { try { @@ -518,7 +576,7 @@ var Tour = { if (!state) return true; if (id_or_title === undefined) return false; var step = Tour.search_step(id_or_title); - Tour.saveState(state.id, state.mode, step.id, 0); + Tour.saveState(state.id, state.mode, step.id, 0, 0, state.log); Tour.nextStep(Tour.getState().step); return true; }, @@ -536,7 +594,7 @@ var Tour = { return Tour.error(next, "Cycling. Can't reach the next step"); } - Tour.saveState(state.id, state.mode, step.id, state.number); + Tour.saveState(state.id, state.mode, step.id, state.number, 0, state.log); if (state.number === 1) { Tour.log("Tour '"+state.id+"' Step: '" + (step._title || step.title) + "' (" + (new Date().getTime() - this.time) + "ms)"); @@ -557,7 +615,7 @@ var Tour = { if (state.mode === "test") { setTimeout(function () { - Tour.autoNextStep(state.tour, step); + Tour.autoNextStep(state.tour, step, state); if (next && Tour.getState()) { Tour.waitNextStep(); } @@ -581,7 +639,7 @@ var Tour = { Tour.log('error'); } }, - autoNextStep: function (tour, step) { + autoNextStep: function (tour, step, state) { clearTimeout(Tour.testtimer); function autoStep () { @@ -597,6 +655,7 @@ var Tour = { var $element = $(step.element); if (!$element.size()) return; + if (state.log === "events") console.log("Event handlers:", $element[0], $element.getHandlers()); var click_event = function(type) { var evt = document.createEvent("MouseEvents");