[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:
committed by
Christophe Matthieu
parent
bae6494520
commit
971629b9fe
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
},
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user