added tests for external links in dialogs, small refactor for dialogClickHandler function

This commit is contained in:
John Bender 2011-01-20 22:20:07 -08:00
parent 52f86f2f9a
commit ffafa78e62
3 changed files with 133 additions and 16 deletions

View file

@ -11,25 +11,25 @@ $.widget( "mobile.dialog", $.mobile.widget, {
var self = this,
$el = self.element,
$prevPage = $.mobile.activePage,
$closeBtn = $('<a href="#" data-icon="delete" data-iconpos="notext">Close</a>');
$closeBtn = $('<a href="#" data-icon="delete" data-iconpos="notext">Close</a>'),
dialogClickHandler = function(e){
var $target = $(e.target);
var dialogClickHandler = function(e){
var $target = $(e.target);
// fixes issues with target links in dialogs breaking
// page transitions by reseting the active page below
if( $target.attr('target') || $.mobile.isExternalLink($target) ) {
return;
}
// fixes issues with target links in dialogs breaking
// page transitions by reseting the active page below
if( $target.attr('target') || $.mobile.isExternalLink($target) ) {
return;
}
if( e.type == "click" && ( $(e.target).closest('[data-back]')[0] || this==$closeBtn[0] ) ){
self.close();
return false;
}
if( e.type == "click" && ( $(e.target).closest('[data-back]')[0] || this==$closeBtn[0] ) ){
self.close();
return false;
}
//otherwise, assume we're headed somewhere new. set activepage to dialog so the transition will work
$.mobile.activePage = self.element;
};
//otherwise, assume we're headed somewhere new. set activepage to dialog so the transition will work
$.mobile.activePage = self.element;
};
// NOTE avoid click handler in the case of an external resource
// TODO add function in navigation to handle external check

View file

@ -0,0 +1,39 @@
/*
* mobile dialog unit tests
*/
(function($){
var testValue = "a value we can test!";
module('jquery.mobile.dialog.js', {
setup: function(){
//bring up the dialog
$("a[href='#foo-dialog']").click();
// We prefer the external links don't send the browser elsewhere
$("#foo-dialog").delegate("a", "click", function(e){
return false;
});
// set a test value to verify against change
$.mobile.activePage = testValue;
}
});
test( "external and targeted links do not set the active page", function(){
var verifyActivePage = function(selector){
$(selector).click();
same( $.mobile.activePage, testValue, "mobile active page remains untouched");
};
verifyActivePage("a#http-link");
verifyActivePage("a#mailto-link");
verifyActivePage("a#rel-link");
verifyActivePage("a#target-link");
});
test( "non external links set the active page", function(){
$.mobile.activePage = testValue;
$("a#internal-link").click();
ok( $.mobile.activePage !== testValue, "mobile active page remains untouched");
});
})(jQuery);

View file

@ -0,0 +1,78 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>jQuery Mobile Dialog Test Suite</title>
<script type="text/javascript" src="../../../js/jquery.js"></script>
<script type="text/javascript" src="../../../js/jquery.ui.widget.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.widget.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.media.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.support.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.event.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.hashchange.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.core.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.navigation.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.page.js"></script>
<script type="text/javascript" src="../../../js/jquery.ui.position.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.fixHeaderFooter.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.forms.checkboxradio.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.forms.textinput.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.forms.select.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.buttonMarkup.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.forms.button.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.forms.slider.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.collapsible.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.controlGroup.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.fieldContain.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.listview.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.listview.filter.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.dialog.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.navbar.js"></script>
<script type="text/javascript" src="../../../js/jquery.mobile.grid.js"></script>
<script type="text/javascript" src="../../../tests/jquery.testHelper.js"></script>
<link rel="stylesheet" href="../../../themes/default/" type="text/css"/>
<link rel="stylesheet" href="../../../external/qunit.css" type="text/css"/>
<script type="text/javascript" src="../../../external/qunit.js"></script>
<script type="text/javascript" src="dialog_events.js"></script>
</head>
<body>
<h1 id="qunit-header">jQuery Mobile Dialog Test Suite</h1>
<h2 id="qunit-banner"></h2>
<h2 id="qunit-userAgent"></h2>
<ol id="qunit-tests">
</ol>
<!-- NOTE body must be used in place of main otherwise transition behaviour fails -->
<style>
[data-role='page'], [data-role='dialog']{
position: absolute;
top: -10000px;
left: -10000px;
}
/* maintain styling */
.ui-mobile-viewport {
margin: 8px;
}
</style>
<div id="bar" data-role="page">
<a href="#foo-dialog" data-role="button" data-inline="true" data-rel="dialog"></a>
</div>
<div id="foo-dialog" data-role="dialog">
<a href="http://google.com" id="http-link">foo</a>
<a href="mailto:foo@bar.com" id="mailto-link">foo</a>
<a href="#bar" rel="external" id="rel-link">foo</a>
<a href="#bar" target="foo" id="target-link">foo</a>
<a href="#bar" id="internal-link">foo</a>
</div>
</body>
</html>