diff --git a/addons/web/static/tests/helpers/test_utils.js b/addons/web/static/tests/helpers/test_utils.js index 677c7a7ae1a..c2687e40372 100644 --- a/addons/web/static/tests/helpers/test_utils.js +++ b/addons/web/static/tests/helpers/test_utils.js @@ -576,6 +576,13 @@ function dragAndDrop($el, $to, options) { toOffset.left += $to.outerWidth()/2; } + if ($to[0].ownerDocument !== document) { + // we are in an iframe + var bound = $('iframe')[0].getBoundingClientRect(); + toOffset.left += bound.left; + toOffset.top += bound.top; + } + $el.trigger($.Event("mousedown", { which: 1, pageX: elementCenter.left, diff --git a/addons/web_tour/static/src/js/running_tour_action_helper.js b/addons/web_tour/static/src/js/running_tour_action_helper.js index 9ca9cd43bc0..6820dab8817 100644 --- a/addons/web_tour/static/src/js/running_tour_action_helper.js +++ b/addons/web_tour/static/src/js/running_tour_action_helper.js @@ -6,6 +6,7 @@ var utils = require('web_tour.utils'); var Tip = require('web_tour.Tip'); var get_first_visible_element = utils.get_first_visible_element; +var get_jquery_element_from_selector = utils.get_jquery_element_from_selector; var RunningTourActionHelper = core.Class.extend({ init: function (tip_widget) { @@ -38,7 +39,7 @@ var RunningTourActionHelper = core.Class.extend({ } }, _get_action_values: function (element) { - var $e = $(element); + var $e = get_jquery_element_from_selector(element); var $element = element ? get_first_visible_element($e) : this.tip_widget.$anchor; if ($element.length === 0) { $element = $e.first(); @@ -90,20 +91,30 @@ var RunningTourActionHelper = core.Class.extend({ values.$element.trigger("change"); }, _drag_and_drop: function (values, to) { - var $to = $(to || document.body); - + var $to; + if (to) { + $to = get_jquery_element_from_selector(to); + } else { + $to = $(document.body); + } var elementCenter = values.$element.offset(); elementCenter.left += values.$element.outerWidth()/2; elementCenter.top += values.$element.outerHeight()/2; var toCenter = $to.offset(); + + if (to && to.indexOf('iframe') !== -1) { + var iFrameOffset = $('iframe').offset(); + toCenter.left += iFrameOffset.left; + toCenter.top += iFrameOffset.top; + } toCenter.left += $to.outerWidth()/2; toCenter.top += $to.outerHeight()/2; values.$element.trigger($.Event("mousedown", {which: 1, pageX: elementCenter.left, pageY: elementCenter.top})); values.$element.trigger($.Event("mousemove", {which: 1, pageX: toCenter.left, pageY: toCenter.top})); values.$element.trigger($.Event("mouseup", {which: 1, pageX: toCenter.left, pageY: toCenter.top})); - }, + }, _keydown: function (values, keyCodes) { while (keyCodes.length) { var keyCode = +keyCodes.shift(); diff --git a/addons/web_tour/static/src/js/tip.js b/addons/web_tour/static/src/js/tip.js index 2ee188ddd2a..33f20ee7496 100644 --- a/addons/web_tour/static/src/js/tip.js +++ b/addons/web_tour/static/src/js/tip.js @@ -132,7 +132,7 @@ var Tip = Widget.extend({ $location = $location.parent(); o = $location.css("overflow"); p = $location.css("position"); - } while ((o === "visible" || o === "hidden") && p !== "fixed" && $location[0] !== document.body); + } while ((o === "visible" || o === "hidden") && p !== "fixed" && $location[0].tagName.toUpperCase() !== 'BODY'); return $location; }, diff --git a/addons/web_tour/static/src/js/tour_manager.js b/addons/web_tour/static/src/js/tour_manager.js index 9e4046c389e..26d7d19689f 100644 --- a/addons/web_tour/static/src/js/tour_manager.js +++ b/addons/web_tour/static/src/js/tour_manager.js @@ -20,6 +20,7 @@ var get_running_key = utils.get_running_key; var get_running_delay_key = utils.get_running_delay_key; var get_first_visible_element = utils.get_first_visible_element; var do_before_unload = utils.do_before_unload; +var get_jquery_element_from_selector = utils.get_jquery_element_from_selector; return core.Class.extend(mixins.EventDispatcherMixin, ServicesMixin, { init: function(parent, consumed_tours) { @@ -187,14 +188,14 @@ return core.Class.extend(mixins.EventDispatcherMixin, ServicesMixin, { if (tip.in_modal !== false && this.$modal_displayed.length) { $trigger = this.$modal_displayed.find(tip.trigger); } else { - $trigger = $(tip.trigger); + $trigger = get_jquery_element_from_selector(tip.trigger); } var $visible_trigger = get_first_visible_element($trigger); var extra_trigger = true; var $extra_trigger = undefined; if (tip.extra_trigger) { - $extra_trigger = $(tip.extra_trigger); + $extra_trigger = get_jquery_element_from_selector(tip.extra_trigger); extra_trigger = get_first_visible_element($extra_trigger).length; } @@ -206,6 +207,22 @@ return core.Class.extend(mixins.EventDispatcherMixin, ServicesMixin, { tip.widget.update($visible_trigger); } } else { + if ($trigger.iframeContainer || ($extra_trigger && $extra_trigger.iframeContainer)) { + var $el = $(); + if ($trigger.iframeContainer) { + $el = $el.add($trigger.iframeContainer); + } + if (($extra_trigger && $extra_trigger.iframeContainer) && $trigger.iframeContainer !== $extra_trigger.iframeContainer) { + $el = $el.add($extra_trigger.iframeContainer); + } + var self = this; + $el.off('load').one('load', function () { + $el.off('load'); + if (self.active_tooltips[tour_name] === tip) { + self.update(tour_name); + } + }); + } this._deactivate_tip(tip); if (this.running_tour === tour_name) { diff --git a/addons/web_tour/static/src/js/tour_utils.js b/addons/web_tour/static/src/js/tour_utils.js index 25dea3ae836..c83edafe27e 100644 --- a/addons/web_tour/static/src/js/tour_utils.js +++ b/addons/web_tour/static/src/js/tour_utils.js @@ -41,6 +41,19 @@ function do_before_unload(if_unload_callback, if_not_unload_callback) { }); } +function get_jquery_element_from_selector(selector) { + if (_.isString(selector) && selector.indexOf('iframe') !== -1) { + var $iframe = $(selector.split('iframe')[0] + ' iframe'); + var $el = $iframe.contents() + .find(selector.split('iframe')[1]); + $el.iframeContainer = $iframe[0]; + return $el; + } else { + return $(selector); + } +} + + return { 'get_step_key': get_step_key, @@ -48,6 +61,7 @@ return { 'get_running_delay_key': get_running_delay_key, 'get_first_visible_element': get_first_visible_element, 'do_before_unload': do_before_unload, + 'get_jquery_element_from_selector' : get_jquery_element_from_selector, }; });