[IMP] web, web_tour: handle iframe in tests and tour

In both test util functions (`dragAndDrop`) and tours, using elements in iframe
was not supported.

As a jQuery selector won't work with an iframe, when using a selector like
`div.o_my_class iframe p:first` the tour manager will split the selector, which
will result to `$('div.o_my_class iframe').contents().find('p:first')`.
This commit is contained in:
Martin Geubelle
2018-08-13 17:09:28 +02:00
committed by Christophe Matthieu
parent bae6494520
commit 971629b9fe
5 changed files with 56 additions and 7 deletions
@@ -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,
@@ -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();
+1 -1
View File
@@ -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;
},
+19 -2
View File
@@ -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) {
@@ -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,
};
});