Skip to content
This repository was archived by the owner on Oct 8, 2021. It is now read-only.

Commit 480cdea

Browse files
committed
merge conflict resolved for checkbox radio and select tests
2 parents 934b24a + f86eb66 commit 480cdea

5 files changed

+124
-74
lines changed

js/jquery.mobile.forms.checkboxradio.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,11 @@ $.widget( "mobile.checkboxradio", $.mobile.widget, {
6060
});
6161

6262
// Wrap the input + label in a div
63-
input.add( label )
64-
.wrapAll( "<div class='ui-" + inputtype + "'></div>" );
63+
var wrapper = document.createElement('div');
64+
wrapper.className = 'ui-' + inputtype;
65+
input[0].parentNode.insertBefore(wrapper,input[0]);
66+
wrapper.appendChild(input[0]);
67+
wrapper.appendChild(label[0]);
6568

6669
label.bind({
6770
vmouseover: function( event ) {

js/jquery.mobile.forms.select.custom.js

+60-41
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ define( [
3535
"<div class='ui-title'>" + label.getEncodedText() + "</div>"+
3636
"</div>"+
3737
"<div data-" + $.mobile.ns + "role='content'></div>"+
38-
"</div>" ).appendTo( $.mobile.pageContainer ).page(),
38+
"</div>" ),
3939

4040
listbox = $("<div>", { "class": "ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-" + widget.options.overlayTheme + " " + $.mobile.defaultDialogTransition } ).insertAfter(screen),
4141

@@ -60,9 +60,9 @@ define( [
6060
"class": "ui-btn-left"
6161
}).attr( "data-" + $.mobile.ns + "iconpos", "notext" ).attr( "data-" + $.mobile.ns + "icon", "delete" ).appendTo( header ).buttonMarkup(),
6262

63-
menuPageContent = menuPage.find( ".ui-content" ),
64-
65-
menuPageClose = menuPage.find( ".ui-header a" );
63+
menuPageContent,
64+
65+
menuPageClose;
6666

6767

6868
$.extend( widget, {
@@ -333,6 +333,11 @@ define( [
333333
}
334334

335335
if ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) {
336+
337+
self.menuPage.appendTo( $.mobile.pageContainer ).page();
338+
self.menuPageContent = menuPage.find( ".ui-content" );
339+
self.menuPageClose = menuPage.find( ".ui-header a" );
340+
336341
// prevent the parent page from being removed from the DOM,
337342
// otherwise the results of selecting a list item in the dialog
338343
// fall into a black hole
@@ -425,49 +430,63 @@ define( [
425430

426431
self.list.empty().filter( ".ui-listview" ).listview( "destroy" );
427432

428-
// Populate menu with options from select element
429-
self.select.find( "option" ).each( function( i ) {
430-
var $this = $( this ),
431-
$parent = $this.parent(),
432-
text = $this.getEncodedText(),
433-
anchor = "<a href='#'>"+ text +"</a>",
434-
classes = [],
435-
extraAttrs = [];
436-
437-
// Are we inside an optgroup?
438-
if ( $parent.is( "optgroup" ) ) {
439-
var optLabel = $parent.attr( "label" );
440-
441-
// has this optgroup already been built yet?
442-
if ( $.inArray( optLabel, optgroups ) === -1 ) {
443-
lis.push( "<li data-" + $.mobile.ns + "role='list-divider'>"+ optLabel +"</li>" );
444-
optgroups.push( optLabel );
433+
var $options = self.select.find("option"),
434+
numOptions = $options.length,
435+
select = this.select[ 0 ],
436+
dataPrefix = 'data-' + $.mobile.ns,
437+
dataIndexAttr = dataPrefix + 'option-index',
438+
dataIconAttr = dataPrefix + 'icon',
439+
dataRoleAttr = dataPrefix + 'role',
440+
fragment = document.createDocumentFragment(),
441+
optGroup;
442+
443+
for (var i = 0; i < numOptions;i++){
444+
var option = $options[i],
445+
$option = $(option),
446+
parent = option.parentNode,
447+
text = $option.text(),
448+
anchor = document.createElement('a');
449+
classes = [];
450+
451+
anchor.setAttribute('href','#');
452+
anchor.appendChild(document.createTextNode(text));
453+
454+
// Are we inside an optgroup?
455+
if (parent !== select && parent.nodeName.toLowerCase() === "optgroup"){
456+
var optLabel = parent.getAttribute('label');
457+
if ( optLabel != optGroup) {
458+
var divider = document.createElement('li');
459+
divider.setAttribute(dataRoleAttr,'list-divider');
460+
divider.setAttribute('role','option');
461+
divider.setAttribute('tabindex','-1');
462+
divider.appendChild(document.createTextNode(optLabel));
463+
fragment.appendChild(divider);
464+
optGroup = optLabel;
445465
}
446-
}
447-
448-
// Find placeholder text
449-
// TODO: Are you sure you want to use getAttribute? ^RW
450-
if ( !this.getAttribute( "value" ) || text.length == 0 || $this.jqmData( "placeholder" ) ) {
466+
}
467+
468+
if (!placeholder && (!option.getAttribute( "value" ) || text.length == 0 || $option.jqmData( "placeholder" )) ) {
451469
if ( o.hidePlaceholderMenuItems ) {
452470
classes.push( "ui-selectmenu-placeholder" );
453-
}
454-
placeholder = self.placeholder = text;
471+
}
472+
placeholder = self.placeholder = text;
455473
}
456-
457-
// support disabled option tags
458-
if ( this.disabled ) {
474+
475+
var item = document.createElement('li');
476+
if ( option.disabled ) {
459477
classes.push( "ui-disabled" );
460-
extraAttrs.push( "aria-disabled='true'" );
478+
item.setAttribute('aria-disabled',true);
461479
}
462-
463-
lis.push( "<li data-" + $.mobile.ns + "option-index='" + i + "' data-" + $.mobile.ns + "icon='"+ dataIcon +"' class='"+ classes.join(" ") + "' " + extraAttrs.join(" ") +">"+ anchor +"</li>" );
464-
});
465-
466-
self.list.html( lis.join(" ") );
467-
468-
self.list.find( "li" )
469-
.attr({ "role": "option", "tabindex": "-1" })
470-
.first().attr( "tabindex", "0" );
480+
item.setAttribute(dataIndexAttr,i);
481+
item.setAttribute(dataIconAttr,dataIcon);
482+
item.className = classes.join(" ");
483+
item.setAttribute('role','option');
484+
item.setAttribute('tabindex','-1');
485+
item.appendChild(anchor);
486+
fragment.appendChild(item);
487+
}
488+
fragment.firstChild.setAttribute('tabindex',0);
489+
self.list[0].appendChild(fragment);
471490

472491
// Hide header close link for single selects
473492
if ( !this.isMultiple ) {

js/jquery.mobile.forms.slider.js

+42-16
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,12 @@ $.widget( "mobile.slider", $.mobile.widget, {
5050
step = window.parseFloat( control.attr( "step" ) || 1 ),
5151

5252
inlineClass = ( this.options.inline || control.jqmData("inline") == true ) ? " ui-slider-inline" : "",
53-
53+
5454
miniClass = ( this.options.mini || control.jqmData("mini") ) ? " ui-slider-mini" : "",
5555

56-
slider = $( "<div class='ui-slider " + selectClass + " ui-btn-down-" + trackTheme +
57-
" ui-btn-corner-all" + inlineClass + miniClass + "' role='application'></div>" ),
58-
5956
valuebg = control.jqmData("highlight") && cType != "select" ? $( "<div class='ui-slider-bg ui-btn-active ui-btn-corner-all'></div>" ).prependTo( slider ) : false,
6057

61-
handle = $( "<a href='#' class='ui-slider-handle'></a>" )
58+
handle = $( document.createElement('a') ) //"<a href='#' class='ui-slider-handle'></a>" )
6259
.appendTo( slider )
6360
.buttonMarkup({ corners: true, theme: theme, shadow: true })
6461
.attr({
@@ -70,8 +67,28 @@ $.widget( "mobile.slider", $.mobile.widget, {
7067
"title": val(),
7168
"aria-labelledby": labelID
7269
}),
70+
71+
domSlider = document.createElement('div'),
72+
slider = $(domSlider),
7373
options;
7474

75+
domSlider.setAttribute('role','application');
76+
domSlider.className = ['ui-slider ',selectClass," ui-btn-down-",trackTheme,' ui-btn-corner-all'].join("");
77+
handle.className = 'ui-slider-handle';
78+
domSlider.appendChild(handle);
79+
80+
handle
81+
.buttonMarkup({ corners: true, theme: theme, shadow: true })
82+
.attr({
83+
"role": "slider",
84+
"aria-valuemin": min,
85+
"aria-valuemax": max,
86+
"aria-valuenow": val(),
87+
"aria-valuetext": val(),
88+
"title": val(),
89+
"aria-labelledby": labelID
90+
}),
91+
7592
$.extend( this, {
7693
slider: slider,
7794
handle: handle,
@@ -83,25 +100,34 @@ $.widget( "mobile.slider", $.mobile.widget, {
83100
});
84101

85102
if ( cType == "select" ) {
86-
87-
slider.wrapInner( "<div class='ui-slider-inneroffset'></div>" );
103+
var wrapper = document.createElement('div');
104+
wrapper.className = 'ui-slider-inneroffset';
105+
for(var j = 0,length = domSlider.childNodes.length;j < length;j++){
106+
wrapper.appendChild(domSlider.childNodes[j]);
107+
}
108+
domSlider.appendChild(wrapper);
88109

89110
// make the handle move with a smooth transition
90111
handle.addClass( "ui-slider-handle-snapping" );
91112

92113
options = control.find( "option" );
93114

94-
control.find( "option" ).each(function( i ) {
95-
115+
for(var i = 0, length = options.length; i < length; i++){
96116
var side = !i ? "b":"a",
97-
theme = !i ? " ui-btn-down-" + trackTheme :( " " + $.mobile.activeBtnClass );
98-
99-
$( "<span class='ui-slider-label ui-slider-label-" + side + theme + " ui-btn-corner-all' role='img'>" + $( this ).getEncodedText() + "</span>" )
100-
.prependTo( slider );
101-
});
102-
103-
self._labels = $( ".ui-slider-label", slider );
117+
corners = !i ? "right" :"left",
118+
sliderTheme = !i ? " ui-btn-down-" + trackTheme :( " " + $.mobile.activeBtnClass ),
119+
sliderLabel = document.createElement('div'),
120+
sliderImg = document.createElement('span');
121+
122+
sliderLabel.className = ['ui-slider-labelbg ui-slider-labelbg-',side,sliderTheme," ui-btn-corner-",corners].join("");
123+
$(sliderLabel).prependTo( slider );
124+
sliderImg.className = ['ui-slider-label ui-slider-label-',side,sliderTheme," ui-btn-corner-",corners].join("");
125+
sliderImg.setAttribute('role','img');
126+
sliderImg.appendChild(document.createTextNode(options[i].innerHTML));
127+
$(sliderImg).prependTo( handle );
128+
}
104129

130+
self._labels = $( ".ui-slider-label", slider );
105131
}
106132

107133
label.addClass( "ui-slider" );

tests/unit/select/select_cached.js

+17-5
Original file line numberDiff line numberDiff line change
@@ -102,23 +102,35 @@
102102

103103
asyncTest( "menupage is removed when the parent page is removed", function(){
104104
var dialogCount = $(":jqmData(role='dialog')").length;
105-
106105
$.testHelper.pageSequence([
107106
resetHash,
108107

109108
function(){
110-
111109
$.mobile.changePage( "uncached-dom-cached-false.html" );
112110
},
113111

114112
function(){
115-
same( $(":jqmData(role='dialog')").length, dialogCount + 1 );
113+
// for performance reason we don't initially create the menu dialog now
114+
same( $(":jqmData(role='dialog')").length, dialogCount);
115+
116+
// manually trigger dialog opening
117+
$( "#domcache-uncached-page-select" ).data( 'selectmenu' ).open();
118+
},
119+
120+
function(){
121+
// check if dialog was successfully created
122+
same( $(":jqmData(role='dialog')").length, dialogCount + 1 );
123+
$( "#domcache-uncached-page-select" ).data( 'selectmenu' ).close();
124+
},
125+
126+
function(){
127+
// navigate to parent(initial) page
116128
window.history.back();
117129
},
118-
130+
119131
function() {
120132
same( $(":jqmData(role='dialog')").length, dialogCount );
121-
start();
133+
start();
122134
}
123135
]);
124136
});

tests/unit/select/select_core.js

-10
Original file line numberDiff line numberDiff line change
@@ -324,16 +324,6 @@
324324
same(window.encodedValueIsDefined, undefined);
325325
});
326326

327-
// issue #2547
328-
test( "custom select list item links have unencoded option text values when using vanilla $.fn.text", function() {
329-
// undo our changes, undone in teardown
330-
$.fn.getEncodedText = $.fn.text;
331-
332-
$( "#encoded-option" ).data( 'selectmenu' )._buildList();
333-
334-
same(window.encodedValueIsDefined, true);
335-
});
336-
337327
// not testing the positive case here since's it's obviously tested elsewhere
338328
test( "select elements in the keepNative set shouldn't be enhanced", function() {
339329
ok( !$("#keep-native").parent().is("div.ui-btn") );

0 commit comments

Comments
 (0)