chore(release): v0.9.26 "rabbit"

This commit is contained in:
Andy Joslin
2014-02-26 14:38:03 -05:00
parent 1995e1c70f
commit 498706b157
15 changed files with 2238 additions and 1078 deletions

View File

@@ -1,3 +1,84 @@
<a name="0.9.26"></a>
### 0.9.26 "Rabbit" (2014-02-26)
#### Bug Fixes
* **actionsheet:** Actionsheet in modal has pointer-events enabled, closes #660 ([1503cc72](http://github.com/driftyco/ionic/commit/1503cc7213c13e87804c210dea7465931e972f4a))
* **click:** event.preventDefault() when setting focus() on an input, closes 583 ([fc8ab4b8](http://github.com/driftyco/ionic/commit/fc8ab4b8ea9b89bd3446b835476950bb70bba879))
* **ionContent:**
* Update scss for ion-infinite-scroll element ([788df524](http://github.com/driftyco/ionic/commit/788df5243dc5300204171bcd40bf1e20fe610dbe))
* Use new name to find ion-infinite-scroll element ([1702f5c9](http://github.com/driftyco/ionic/commit/1702f5c916dda20957761fd1e7b30d5f9bc1b6b4))
* **ionPrefix:** disableRegisterByTagName updated w/ `ion-` prefix for correct view history ([2494b5f9](http://github.com/driftyco/ionic/commit/2494b5f988991b97c278102f0da385e9cde00aee))
* **ionSideMenu:** use manual transclude instead of ngTransclude ([991d3cfd](http://github.com/driftyco/ionic/commit/991d3cfda1831467e38c176c69f0ecd084c86e50), closes [#666](http://github.com/driftyco/ionic/issues/666))
* **ionTabs:** cleanup and fix many issues ([0f1b6f47](http://github.com/driftyco/ionic/commit/0f1b6f47b8ee4c72facc269da2b648bb9cc397e0), closes [#597](http://github.com/driftyco/ionic/issues/597))
* **ionicScrollDelegate:**
* do not error if no scrollTop/Left values ([9e942f89](http://github.com/driftyco/ionic/commit/9e942f894b037284a2e36ff14d3615f076b84447), closes [#659](http://github.com/driftyco/ionic/issues/659)
* **item:** degrade .item right arrows by grade for low end devices ([3a69bb34](http://github.com/driftyco/ionic/commit/3a69bb3452944bc4d1764c7605aad0824cbb758c))
* **loading:** make showDelay option work correctly ([7281e2ab](http://github.com/driftyco/ionic/commit/7281e2abf0f6f624f296191b3f322227089e3658), closes [#562](http://github.com/driftyco/ionic/issues/562))
* **modal:**
* Fix modal animation for firefox, closes #671 ([0033c880](http://github.com/driftyco/ionic/commit/0033c8809a810c8b518ca68a9ada5704a7f6e9c9))
* **navBar:**
* animations, hide back button, no flicker ([465ea769](http://github.com/driftyco/ionic/commit/465ea76969b348b3074747dcd4cebf0861a38e6d), closes [#653](http://github.com/driftyco/ionic/issues/653))
* **platform:** Update ionic.Platform.is() to check all platforms, closes #604 ([fcd0fa73](http://github.com/driftyco/ionic/commit/fcd0fa73c4125593e6efce6b6410586f5a27fc02))
* **sideMenu:** remove translate3d when not needed, close #636 ([07092f00](http://github.com/driftyco/ionic/commit/07092f009cfa2b52b2dc2fdb915b237bd8c37dfa))
* **slideBox:** make `does-continue` attribute work continuously ([f6ec6a3c](http://github.com/driftyco/ionic/commit/f6ec6a3c89116174541c2fb08194a04ada92065b), closes [#575](http://github.com/driftyco/ionic/issues/575))
* **tabs:**
* Double tapping a tab would set the wrong view history, closes #656 ([f0faae16](http://github.com/driftyco/ionic/commit/f0faae16574b1247b6f5b1fa0180cfb9248804a1))
* **text-rendering:** Disable text-rendering:optimizeLegibility for low end devices ([10289466](http://github.com/driftyco/ionic/commit/10289466162f4efa36dc902052b78e42d0df0b2d))
* **thumbnail:** Correctly apply thumbnail style to item directive, closes #509 ([977c1cc6](http://github.com/driftyco/ionic/commit/977c1cc6e511d752e083081adbed9f8fda1d0312))
* **transform:** Polyfill `style.transform` to work w/ non-webkit ([52671c18](http://github.com/driftyco/ionic/commit/52671c18f97d057aca581a566cc7ea27cc055314))
#### Features
* **grade:** Set grade in body class depending on platform performance ([b69b40c8](http://github.com/driftyco/ionic/commit/b69b40c82684acf3003f19277a44caf4614c75e4))
* **ionContent:** use child scope instead of isolate scope ([49e0dac9](http://github.com/driftyco/ionic/commit/49e0dac9992d60ca098eb1dbd1acecbc74eae85c), closes [#555](http://github.com/driftyco/ionic/issues/555))
* **ionInfiniteScroll:** use event system ([7b0716c2](http://github.com/driftyco/ionic/commit/7b0716c23c44fe5530526c86d590111382f991d7), closes [#661](http://github.com/driftyco/ionic/issues/661))
* **ionNavAnimation:** `<a href="#/page" ion-nav-animation="slide-in-up">` ([8354d42b](http://github.com/driftyco/ionic/commit/8354d42b4b049e97bd93ce8ebacf047284a8fad1))
* **item:** Auto right-arrow for complex list items w/ ng-click/href, closes #472 ([327a6866](http://github.com/driftyco/ionic/commit/327a686626c81072df8e055c8be220144fade26a))
([110ff9f4](http://github.com/driftyco/ionic/commit/110ff9f47583c7f04bcf5b1eebea6d7bd0b25e99), closes [#243](http://github.com/driftyco/ionic/issues/243))
* **sass:** All variables now have !default assigned, closes #631 ([53af2c7a](http://github.com/driftyco/ionic/commit/53af2c7a0177f9bcd2b43d9179832a319ecb8f7f))
* **scrollbar:** Do not use rgba background for scrollbar on grade-b and c devices ([805c35c1](http://github.com/driftyco/ionic/commit/805c35c1f119530777498177016bb0c448e92b90))
* **sideMenu:**
* Degrade .menu-content box-shadow w/ platform grade for animation performance ([d2a0780b](http://github.com/driftyco/ionic/commit/d2a0780bbac5b17525def8b75c5c58c168675631))
#### Breaking Changes
* The binding for ionInfiniteScroll has changed, as well
as how you finish it.
If you had this code before:
```html
<ion-content on-infinite-scroll="doSomething"></ion-content>
```
```js
function MyCtrl($scope) {
$scope.doSomething = function(scrollDoneCallback) {
doSomething();
scrollDoneCallback();
};
}
```
Now, your code should look like this:
```html
<ion-content on-infinite-scroll="doSomething()"></ion-content>
```
```js
function MyCtrl($scope) {
$scope.doSomething = function() {
doSomething();
$scope.$broadcast('scroll.infiniteScrollComplete');
};
}
```
<a name="0.9.25"></a>
### 0.9.25 "Quokka" (2014-02-19)

View File

@@ -1,6 +1,6 @@
{
"name": "ionic",
"version": "0.9.25",
"version": "0.9.26",
"homepage": "https://github.com/driftyco/ionic",
"authors": [
"Max Lynch <max@drifty.com>",

View File

@@ -1,7 +1,7 @@
{
"repo": "driftyco/ionic",
"development": {},
"version": "0.9.25",
"version": "0.9.26",
"styles": [
"dist/css/ionic.css"
],

View File

@@ -1,8 +1,8 @@
{
"name": "ionic",
"private": false,
"version": "0.9.26-alpha",
"codename": "rabbit",
"version": "0.10.0-alpha",
"codename": "salamander",
"repository": {
"url": "git://github.com/driftyco/ionic.git"
},
@@ -17,7 +17,7 @@
"grunt-contrib-watch": "~0.5.3",
"grunt-ddescribe-iit": "0.0.4",
"grunt-merge-conflict": "0.0.2",
"grunt-sass": "~0.10.0",
"grunt-sass": "~0.10.0-alpha",
"grunt-string-replace": "~0.2.7",
"karma": "~0.11.13",
"karma-chrome-launcher": "~0.1.2",
@@ -29,9 +29,7 @@
"grunt-remove-logging": "~0.2.0",
"grunt-conventional-changelog": "~1.1.0",
"grunt-contrib-connect": "^0.6.0",
"sauce-connect-launcher": "^0.2.2",
"dgeni": "^0.1.1",
"dgeni-packages": "^0.2.4"
"sauce-connect-launcher": "^0.2.2"
},
"licenses": [
{

View File

@@ -2,7 +2,7 @@
* Copyright 2014 Drifty Co.
* http://drifty.com/
*
* Ionic, v0.9.25
* Ionic, v0.9.26
* A powerful HTML5 mobile app framework.
* http://ionicframework.com/
*
@@ -14,7 +14,7 @@
/*!
Ionicons, v#{$ionicons-version}
Created by Ben Sperry for the Ionic Framework, http://ionicons.com/
https://twitter.com/helloimben https://twitter.com/ionicframework
https://twitter.com/benjsperry https://twitter.com/ionicframework
MIT License: https://github.com/driftyco/ionicons
*/
@font-face {
@@ -1953,7 +1953,7 @@ table {
a {
-webkit-user-drag: none;
-webkit-tap-highlight-color: transparent; }
a:hover {
a[href]:hover {
cursor: pointer; }
img {
@@ -1963,7 +1963,6 @@ body, .ionic-body {
-webkit-touch-callout: none;
-webkit-font-smoothing: antialiased;
font-smoothing: antialiased;
-webkit-backface-visibility: hidden;
-webkit-text-size-adjust: none;
-moz-text-size-adjust: none;
text-size-adjust: none;
@@ -1987,29 +1986,31 @@ body, .ionic-body {
font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
line-height: 20px;
text-rendering: optimizeLegibility;
-webkit-backface-visibility: hidden;
-webkit-user-drag: none; }
body.grade-b, body.grade-c {
text-rendering: auto; }
.content {
position: relative; }
.scroll-content {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
position: absolute;
overflow: hidden;
-webkit-backface-visibility: hidden;
margin-top: -1px;
width: auto;
height: auto; }
.scroll-view {
height: 100%;
overflow: hidden;
position: relative;
-webkit-backface-visibility: hidden;
margin-top: -1px; }
overflow: hidden;
margin-top: -1px;
height: 100%; }
/**
* Scroll is the scroll view component available for complex and custom
@@ -2040,25 +2041,25 @@ body, .ionic-body {
visibility: hidden; }
.scroll-bar-h {
height: 3px;
left: 2px;
right: 2px;
bottom: 3px; }
bottom: 3px;
left: 2px;
height: 3px; }
.scroll-bar-h .scroll-bar-indicator {
height: 100%; }
.scroll-bar-v {
width: 3px;
bottom: 2px;
top: 2px;
right: 3px; }
right: 3px;
bottom: 2px;
width: 3px; }
.scroll-bar-v .scroll-bar-indicator {
width: 100%; }
.scroll-bar-indicator {
position: absolute;
background: rgba(0, 0, 0, 0.3);
border-radius: 4px;
background: rgba(0, 0, 0, 0.3);
opacity: 1; }
.scroll-bar-indicator.scroll-bar-fade-out {
-webkit-transition: opacity 0.3s linear;
@@ -2066,37 +2067,45 @@ body, .ionic-body {
transition: opacity 0.3s linear;
opacity: 0; }
.grade-b .scroll-bar-indicator, .grade-c .scroll-bar-indicator {
border-radius: 0;
background: #aaa; }
.grade-b .scroll-bar-indicator.scroll-bar-fade-out, .grade-c .scroll-bar-indicator.scroll-bar-fade-out {
-webkit-transition: none;
-moz-transition: none;
transition: none; }
.scroll-refresher {
overflow: hidden;
top: -60px;
height: 60px;
left: 0;
right: 0;
position: absolute;
margin: auto; }
top: -60px;
right: 0;
left: 0;
overflow: hidden;
margin: auto;
height: 60px; }
.scroll-refresher .icon-refreshing {
display: none;
-webkit-animation-duration: 1.5s;
-moz-animation-duration: 1.5s;
animation-duration: 1.5s; }
animation-duration: 1.5s;
display: none; }
.scroll-refresher-content {
position: absolute;
left: 0;
bottom: 15px;
left: 0;
width: 100%;
color: #666666;
text-align: center;
font-size: 30px;
color: #666666; }
font-size: 30px; }
.ionic-refresher-content {
position: absolute;
left: 0;
bottom: 15px;
left: 0;
width: 100%;
color: #666666;
text-align: center;
font-size: 30px;
color: #666666; }
font-size: 30px; }
.ionic-refresher-content .icon-pulling {
-webkit-animation-duration: 200ms;
-moz-animation-duration: 200ms;
@@ -2135,22 +2144,22 @@ body, .ionic-body {
-moz-animation-name: refresh-spin;
animation-name: refresh-spin; }
infinite-scroll .scroll-infinite {
ion-infinite-scroll .scroll-infinite {
position: relative;
overflow: hidden;
margin-top: -70px;
height: 60px;
position: relative; }
height: 60px; }
.scroll-infinite-content {
position: absolute;
left: 0;
bottom: 15px;
left: 0;
width: 100%;
color: #666666;
text-align: center;
font-size: 30px;
color: #666666; }
font-size: 30px; }
infinite-scroll.active .scroll-infinite {
ion-infinite-scroll.active .scroll-infinite {
margin-top: -30px; }
.overflow-scroll {
@@ -2182,17 +2191,16 @@ infinite-scroll.active .scroll-infinite {
bottom: 49px; }
.pane {
position: absolute;
z-index: 1;
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0); }
transform: translate3d(0, 0, 0);
z-index: 1; }
.view {
position: absolute;
z-index: 1; }
.pane, .view {
position: absolute;
top: 0;
right: 0;
bottom: 0;
@@ -2350,7 +2358,7 @@ a.subdued {
position: fixed;
top: 0;
left: 0;
z-index: 10;
z-index: 11;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0); }
@@ -2438,7 +2446,7 @@ a.subdued {
margin-left: 15px;
margin-right: 15px;
width: auto;
z-index: 10;
z-index: 11;
overflow: hidden; }
.action-sheet .button {
display: block;
@@ -2475,6 +2483,13 @@ a.subdued {
.action-sheet-group .button:first-child:last-child {
border-width: 0; }
.action-sheet-open {
pointer-events: none; }
.action-sheet-open.modal-open .modal {
pointer-events: none; }
.action-sheet-open .action-sheet {
pointer-events: auto; }
/**
* Bar (Headers and Footers)
* --------------------------------------------------
@@ -2637,6 +2652,8 @@ a.subdued {
.bar .button.button-clear .icon:before, .bar .button.button-clear.icon:before, .bar .button.button-clear.icon-left:before, .bar .button.button-clear.icon-right:before {
font-size: 32px;
line-height: 32px; }
.bar .button.back-button:active, .bar .button.back-button.active {
opacity: 1; }
.bar .button-bar > .button, .bar .buttons > .button {
min-height: 31px;
line-height: 32px; }
@@ -3008,6 +3025,8 @@ a.subdued {
font-size: 14px;
font-family: "Helvetica Neue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
opacity: 0.7; }
.tab-item:hover {
cursor: pointer; }
.tabs-icon-top .tab-item, .tabs-icon-bottom .tab-item {
font-size: 12px;
@@ -3100,8 +3119,21 @@ a.subdued {
background-color: #fff; }
.menu-content {
-webkit-transform: none;
-moz-transform: none;
transform: none;
box-shadow: -1px 0px 2px rgba(0, 0, 0, 0.2), 1px 0px 2px rgba(0, 0, 0, 0.2); }
.grade-b .menu-content, .grade-c .menu-content {
right: -1px;
left: -1px;
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
border-right: 1px solid #ccc;
border-left: 1px solid #ccc;
box-shadow: none; }
.menu-left {
left: 0; }
@@ -3133,6 +3165,11 @@ a.subdued {
.modal.active {
height: 100%; }
.modal-open {
pointer-events: none; }
.modal-open .modal {
pointer-events: auto; }
/**
* Popups
* --------------------------------------------------
@@ -3469,10 +3506,10 @@ a.item-content {
* By default, if an .item is created out of an <a> or <button>
* then a arrow will be added to the right side of the item.
*/
a.item, button.item {
a.item, button.item, .item a[href].item-content, .item[ng-click] a.item-content {
padding-right: 40px; }
a.item:after, button.item:after {
a.item:after, button.item:after, .item a[href].item-content:after, .item[ng-click] a.item-content:after {
/* By default, both <a> and <button> have right side arrow icons */
display: -webkit-box;
display: -webkit-flex;
@@ -3502,7 +3539,13 @@ a.item:after, button.item:after {
line-height: 1;
speak: none; }
a.item-icon-right:after, button.item-icon-right:after, a.item-button-right:after, button.item-button-right:after {
.grade-b a.item:after, .grade-b button.item:after, .grade-b .item a[href].item-content:after, .grade-b .item[ng-click] a.item-content:after, .grade-c a.item:after, .grade-c button.item:after, .grade-c .item a[href].item-content:after, .grade-c .item[ng-click] a.item-content:after {
-webkit-font-smoothing: none;
font-smoothing: none;
content: '>';
font-family: 'monospace'; }
a.item-icon-right:after, button.item-icon-right:after, a.item-button-right:after, button.item-button-right:after, .item a.item-content:after {
display: none; }
.item-avatar {
@@ -3517,10 +3560,10 @@ a.item-icon-right:after, button.item-icon-right:after, a.item-button-right:after
width: 100%;
border-radius: 4px; }
.item-thumbnail-left {
.item-thumbnail-left, .item-thumbnail-left .item-content {
padding-left: 105px;
min-height: 100px; }
.item-thumbnail-left > img:first-child, .item-thumbnail-left > .item-image {
.item-thumbnail-left > img:first-child, .item-thumbnail-left > .item-image, .item-thumbnail-left .item-content > img:first-child, .item-thumbnail-left .item-content > .item-image {
position: absolute;
top: 10px;
left: 10px;
@@ -3528,10 +3571,13 @@ a.item-icon-right:after, button.item-icon-right:after, a.item-button-right:after
max-height: 80px;
width: 100%; }
.item-thumbnail-right {
.item-thumbnail-left.item-complex {
padding-left: 0; }
.item-thumbnail-right, .item-thumbnail-right .item-content {
padding-right: 105px;
min-height: 100px; }
.item-thumbnail-right > img:first-child, .item-thumbnail-right > .item-image {
.item-thumbnail-right > img:first-child, .item-thumbnail-right > .item-image, .item-thumbnail-right .item-content > img:first-child, .item-thumbnail-right .item-content > .item-image {
position: absolute;
top: 10px;
right: 10px;
@@ -3539,6 +3585,9 @@ a.item-icon-right:after, button.item-icon-right:after, a.item-button-right:after
max-height: 80px;
width: 100%; }
.item-thumbnail-left.item-complex {
padding-right: 0; }
.item-image {
padding: 0;
text-align: center; }
@@ -4050,6 +4099,10 @@ input, button, select, textarea {
.placeholder-icon {
color: #aaa; }
.placeholder-icon:first-child {
padding-right: 6px; }
.placeholder-icon:last-child {
padding-left: 6px; }
.item-stacked-label {
display: block;
@@ -4931,6 +4984,19 @@ a.button {
transform: translate3d(0, 0, 0);
opacity: 1; } }
@-moz-keyframes slideInUp {
0% {
-webkit-transform: translate3d(0, 100%, 0);
-moz-transform: translate3d(0, 100%, 0);
transform: translate3d(0, 100%, 0);
opacity: 0; }
100% {
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
opacity: 1; } }
@-webkit-keyframes slideOutUp {
0% {
-webkit-transform: translate3d(0, 0, 0);
@@ -4944,6 +5010,19 @@ a.button {
transform: translate3d(0, 100%, 0);
opacity: 0; } }
@-moz-keyframes slideOutUp {
0% {
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
opacity: 1; }
100% {
-webkit-transform: translate3d(0, 100%, 0);
-moz-transform: translate3d(0, 100%, 0);
transform: translate3d(0, 100%, 0);
opacity: 0; } }
@-webkit-keyframes slideInFromLeft {
from {
-webkit-transform: translate3d(-100%, 0, 0); }
@@ -5787,12 +5866,22 @@ a.button {
* Utility Classes
* --------------------------------------------------
*/
.hidden, .hide {
.hide {
display: none; }
.opacity-hide {
opacity: 0; }
.grade-b .opacity-hide, .grade-c .opacity-hide {
opacity: 1;
display: none; }
.show {
display: block; }
.opacity-show {
opacity: 1; }
.invisible {
visibility: hidden; }
@@ -5810,6 +5899,18 @@ a.button {
.enable-pointer-events {
pointer-events: auto; }
.disable-user-behavior {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-touch-callout: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-tap-highlight-color: transparent;
-webkit-user-drag: none;
-ms-touch-action: none;
-ms-content-zooming: none; }
.block {
display: block;
clear: both; }
@@ -5951,25 +6052,25 @@ a.button {
* --------------------------------------------------
* Platform specific tweaks when in Cordova.
*/
.platform-ios7:not(.fullscreen) .bar-header {
.platform-ios7.platform-cordova:not(.fullscreen) .bar-header {
height: 64px; }
.platform-ios7:not(.fullscreen) .bar-header.item-input-inset .item-input-wrapper {
.platform-ios7.platform-cordova:not(.fullscreen) .bar-header.item-input-inset .item-input-wrapper {
margin-top: 19px !important; }
.platform-ios7:not(.fullscreen) .bar-header > * {
.platform-ios7.platform-cordova:not(.fullscreen) .bar-header > * {
margin-top: 20px; }
.platform-ios7:not(.fullscreen) .has-header, .platform-ios7:not(.fullscreen) .bar-subheader {
.platform-ios7.platform-cordova:not(.fullscreen) .has-header, .platform-ios7.platform-cordova:not(.fullscreen) .bar-subheader {
top: 64px; }
.platform-ios7:not(.fullscreen) .has-subheader {
.platform-ios7.platform-cordova:not(.fullscreen) .has-subheader {
top: 108px; }
.platform-ios7.status-bar-hide {
margin-bottom: 20px; }
.platform-android .bar-header {
.platform-android.platform-cordova .bar-header {
height: 48px; }
.platform-android .has-header, .platform-android .bar-subheader {
.platform-android.platform-cordova .has-header, .platform-android.platform-cordova .bar-subheader {
top: 48px; }
.platform-android .has-subheader {
.platform-android.platform-cordova .has-subheader {
top: 96px; }
.platform-android .title {
.platform-android.platform-cordova .title {
line-height: 48px; }

View File

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
/**
* @license AngularJS v1.2.10
* @license AngularJS v1.2.12
* (c) 2010-2014 Google, Inc. http://angularjs.org
* License: MIT
*/
@@ -104,35 +104,37 @@ var $sanitizeMinErr = angular.$$minErr('$sanitize');
</table>
</div>
</doc:source>
<doc:scenario>
<doc:protractor>
it('should sanitize the html snippet by default', function() {
expect(using('#bind-html-with-sanitize').element('div').html()).
expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()).
toBe('<p>an html\n<em>click here</em>\nsnippet</p>');
});
it('should inline raw snippet if bound to a trusted value', function() {
expect(using('#bind-html-with-trust').element("div").html()).
expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).
toBe("<p style=\"color:blue\">an html\n" +
"<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" +
"snippet</p>");
});
it('should escape snippet without any filter', function() {
expect(using('#bind-default').element('div').html()).
expect(element(by.css('#bind-default div')).getInnerHtml()).
toBe("&lt;p style=\"color:blue\"&gt;an html\n" +
"&lt;em onmouseover=\"this.textContent='PWN3D!'\"&gt;click here&lt;/em&gt;\n" +
"snippet&lt;/p&gt;");
});
it('should update', function() {
input('snippet').enter('new <b onclick="alert(1)">text</b>');
expect(using('#bind-html-with-sanitize').element('div').html()).toBe('new <b>text</b>');
expect(using('#bind-html-with-trust').element('div').html()).toBe(
element(by.model('snippet')).clear();
element(by.model('snippet')).sendKeys('new <b onclick="alert(1)">text</b>');
expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()).
toBe('new <b>text</b>');
expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).toBe(
'new <b onclick="alert(1)">text</b>');
expect(using('#bind-default').element('div').html()).toBe(
expect(element(by.css('#bind-default div')).getInnerHtml()).toBe(
"new &lt;b onclick=\"alert(1)\"&gt;text&lt;/b&gt;");
});
</doc:scenario>
</doc:protractor>
</doc:example>
*/
function $SanitizeProvider() {
@@ -537,37 +539,38 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
</tr>
</table>
</doc:source>
<doc:scenario>
<doc:protractor>
it('should linkify the snippet with urls', function() {
expect(using('#linky-filter').binding('snippet | linky')).
toBe('Pretty text with some links:&#10;' +
'<a href="http://angularjs.org/">http://angularjs.org/</a>,&#10;' +
'<a href="mailto:us@somewhere.org">us@somewhere.org</a>,&#10;' +
'<a href="mailto:another@somewhere.org">another@somewhere.org</a>,&#10;' +
'and one more: <a href="ftp://127.0.0.1/">ftp://127.0.0.1/</a>.');
expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).
toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' +
'another@somewhere.org, and one more: ftp://127.0.0.1/.');
expect(element.all(by.css('#linky-filter a')).count()).toEqual(4);
});
it ('should not linkify snippet without the linky filter', function() {
expect(using('#escaped-html').binding('snippet')).
toBe("Pretty text with some links:\n" +
"http://angularjs.org/,\n" +
"mailto:us@somewhere.org,\n" +
"another@somewhere.org,\n" +
"and one more: ftp://127.0.0.1/.");
it('should not linkify snippet without the linky filter', function() {
expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()).
toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' +
'another@somewhere.org, and one more: ftp://127.0.0.1/.');
expect(element.all(by.css('#escaped-html a')).count()).toEqual(0);
});
it('should update', function() {
input('snippet').enter('new http://link.');
expect(using('#linky-filter').binding('snippet | linky')).
toBe('new <a href="http://link">http://link</a>.');
expect(using('#escaped-html').binding('snippet')).toBe('new http://link.');
element(by.model('snippet')).clear();
element(by.model('snippet')).sendKeys('new http://link.');
expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).
toBe('new http://link.');
expect(element.all(by.css('#linky-filter a')).count()).toEqual(1);
expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText())
.toBe('new http://link.');
});
it('should work with the target property', function() {
expect(using('#linky-target').binding("snippetWithTarget | linky:'_blank'")).
toBe('<a target="_blank" href="http://angularjs.org/">http://angularjs.org/</a>');
expect(element(by.id('linky-target')).
element(by.binding("snippetWithTarget | linky:'_blank'")).getText()).
toBe('http://angularjs.org/');
expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank');
});
</doc:scenario>
</doc:protractor>
</doc:example>
*/
angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {

View File

@@ -1,5 +1,5 @@
/*
AngularJS v1.2.10
AngularJS v1.2.12
(c) 2010-2014 Google, Inc. http://angularjs.org
License: MIT
*/

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because one or more lines are too long

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because one or more lines are too long

View File

@@ -2,11 +2,11 @@
* Copyright 2014 Drifty Co.
* http://drifty.com/
*
* Ionic, v0.9.25
* Ionic, v0.9.26
* A powerful HTML5 mobile app framework.
* http://ionicframework.com/
*
* By @maxlynch, @helloimben, @adamdbradley <3
* By @maxlynch, @benjsperry, @adamdbradley <3
*
* Licensed under the MIT license. Please see LICENSE for more information.
*
@@ -17,7 +17,7 @@
window.ionic = {
controllers: {},
views: {},
version: '0.9.25'
version: '0.9.26'
};
;
(function(ionic) {
@@ -174,7 +174,7 @@ window.ionic = {
*
* @example
* this.setTranslateX = ionic.animationFrameThrottle(function(x) {
* this.el.style.webkitTransform = 'translate3d(' + x + 'px, 0, 0)';
* this.el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + x + 'px, 0, 0)';
* })
*/
animationFrameThrottle: function(cb) {
@@ -425,23 +425,11 @@ window.ionic = {
// default settings
ionic.Gestures.defaults = {
// add styles and attributes to the element to prevent the browser from doing
// its native behavior. this doesnt prevent the scrolling, but cancels
// the contextmenu, tap highlighting etc
// add css to the element to prevent the browser from doing
// its native behavior. this doesnt prevent the scrolling,
// but cancels the contextmenu, tap highlighting etc
// set to false to disable this
stop_browser_behavior: {
// this also triggers onselectstart=false for IE
userSelect: 'none',
// this makes the element blocking in IE10 >, you could experiment with the value
// see for more options this issue; https://github.com/EightMedia/hammer.js/issues/241
touchAction: 'none',
touchCallout: 'none',
contentZooming: 'none',
userDrag: 'none',
tapHighlightColor: 'rgba(0,0,0,0)'
}
// more settings are defined per gesture at gestures.js
stop_browser_behavior: 'disable-user-behavior'
};
// detect touchevents
@@ -1107,37 +1095,16 @@ window.ionic = {
/**
* stop browser default behavior with css props
* stop browser default behavior with css class
* @param {HtmlElement} element
* @param {Object} css_props
* @param {Object} css_class
*/
stopDefaultBrowserBehavior: function stopDefaultBrowserBehavior(element, css_props) {
var prop,
vendors = ['webkit','khtml','moz','Moz','ms','o',''];
if(!css_props || !element.style) {
return;
}
// with css properties for modern browsers
for(var i = 0; i < vendors.length; i++) {
for(var p in css_props) {
if(css_props.hasOwnProperty(p)) {
prop = p;
// vender prefix at the property
if(vendors[i]) {
prop = vendors[i] + prop.substring(0, 1).toUpperCase() + prop.substring(1);
}
// set the style
element.style[prop] = css_props[p];
}
}
}
// also the disable onselectstart
if(css_props.userSelect == 'none') {
stopDefaultBrowserBehavior: function stopDefaultBrowserBehavior(element, css_class) {
// changed from making many style changes to just adding a preset classname
// less DOM manipulations, less code, and easier to control in the CSS side of things
// hammer.js doesn't come with CSS, but ionic does, which is why we prefer this method
if(element && element.classList) {
element.classList.add(css_class);
element.onselectstart = function() {
return false;
};
@@ -1838,6 +1805,8 @@ window.ionic = {
isReady: false,
isFullScreen: false,
platforms: null,
grade: null,
ua: navigator.userAgent,
ready: function(cb) {
// run through tasks to complete now that the device is ready
@@ -1851,16 +1820,18 @@ window.ionic = {
},
detect: function() {
var i, bodyClass = document.body.className;
ionic.Platform._checkPlatforms();
if(this.platforms.length) {
// only change the body class if we got platform info
var i, bodyClass = document.body.className;
for(i = 0; i < this.platforms.length; i++) {
bodyClass += ' platform-' + this.platforms[i];
}
document.body.className = bodyClass;
// only change the body class if we got platform info
for(i = 0; i < this.platforms.length; i++) {
bodyClass += ' platform-' + this.platforms[i];
}
bodyClass += ' grade-' + this.grade;
document.body.className = bodyClass.trim();
},
device: function() {
@@ -1871,23 +1842,30 @@ window.ionic = {
_checkPlatforms: function(platforms) {
this.platforms = [];
var v = this.version().toString().replace('.', '_');
this.grade = 'a';
if(this.isCordova()) {
this.platforms.push('cordova');
}
if(this.isIOS()) {
this.platforms.push('ios');
this.platforms.push('ios' + v.split('_')[0]);
this.platforms.push('ios' + v);
}
if(this.isIPad()) {
this.platforms.push('ipad');
}
if(this.isAndroid()) {
this.platforms.push('android');
this.platforms.push('android' + v.split('_')[0]);
this.platforms.push('android' + v);
if(this.isCordova()) this.platforms.push('cordova');
if(this.isIPad()) this.platforms.push('ipad');
var platform = this.platform();
if(platform) {
this.platforms.push(platform);
var version = this.version();
if(version) {
var v = version.toString();
if(v.indexOf('.') > 0) {
v = v.replace('.', '_');
} else {
v += '_0';
}
this.platforms.push(platform + v.split('_')[0]);
this.platforms.push(platform + v);
if(this.isAndroid() && version < 4.4) {
this.grade = (version < 4 ? 'c' : 'b');
}
}
}
},
@@ -1896,7 +1874,7 @@ window.ionic = {
return !(!window.cordova && !window.PhoneGap && !window.phonegap);
},
isIPad: function() {
return navigator.userAgent.toLowerCase().indexOf('ipad') >= 0;
return this.ua.toLowerCase().indexOf('ipad') >= 0;
},
isIOS: function() {
return this.is('ios');
@@ -1907,37 +1885,71 @@ window.ionic = {
platform: function() {
// singleton to get the platform name
if(!platformName) this.setPlatform(this.device().platform);
if(platformName === null) this.setPlatform(this.device().platform);
return platformName;
},
setPlatform: function(n) {
platformName = n;
if(typeof n != 'undefined' && n !== null && n.length) {
platformName = n.toLowerCase();
} else if(this.ua.indexOf('Android') > 0) {
platformName = 'android';
} else if(this.ua.indexOf('iPhone') > -1 || this.ua.indexOf('iPad') > -1 || this.ua.indexOf('iPod') > -1) {
platformName = 'ios';
} else {
platformName = 'unknown';
}
},
version: function() {
// singleton to get the platform version
if(!platformVersion) this.setVersion(this.device().version);
if(platformVersion === null) this.setVersion(this.device().version);
return platformVersion;
},
setVersion: function(v) {
if(v) {
if(typeof v != 'undefined' && v !== null) {
v = v.split('.');
platformVersion = parseFloat(v[0] + '.' + (v.length > 1 ? v[1] : 0));
} else {
platformVersion = 0;
v = parseFloat(v[0] + '.' + (v.length > 1 ? v[1] : 0));
if(!isNaN(v)) {
platformVersion = v;
return;
}
}
platformVersion = 0;
// fallback to user-agent checking
var pName = this.platform();
var versionMatch = {
'android': /Android (\d+).(\d+)?/,
'ios': /OS (\d+)_(\d+)?/
};
if(versionMatch[pName]) {
v = this.ua.match( versionMatch[pName] );
if(v.length > 2) {
platformVersion = parseFloat( v[1] + '.' + v[2] );
}
}
},
// Check if the platform is the one detected by cordova
is: function(type) {
type = type.toLowerCase();
// check if it has an array of platforms
if(this.platforms) {
for(var x = 0; x < this.platforms.length; x++) {
if(this.platforms[x] === type) return true;
}
}
// exact match
var pName = this.platform();
if(pName) {
return pName.toLowerCase() === type.toLowerCase();
return pName === type.toLowerCase();
}
// A quick hack for
return navigator.userAgent.toLowerCase().indexOf(type.toLowerCase()) >= 0;
// A quick hack for to check userAgent
return this.ua.toLowerCase().indexOf(type) >= 0;
},
exitApp: function() {
@@ -1984,8 +1996,8 @@ window.ionic = {
};
var platformName, // just the name, like iOS or Android
platformVersion, // a float of the major and minor, like 7.1
var platformName = null, // just the name, like iOS or Android
platformVersion = null, // a float of the major and minor, like 7.1
readyCallbacks = [];
// setup listeners to know when the device is ready to go
@@ -2025,12 +2037,11 @@ window.ionic = {
ionic.CSS = {};
(function() {
var d = document.createElement('div');
var keys = ['webkitTransform', 'transform', '-webkit-transform', 'webkit-transform',
'-moz-transform', 'moz-transform', 'MozTransform', 'mozTransform'];
for(var i = 0; i < keys.length; i++) {
if(d.style[keys[i]] !== undefined) {
if(document.documentElement.style[keys[i]] !== undefined) {
ionic.CSS.TRANSFORM = keys[i];
break;
}
@@ -2089,7 +2100,7 @@ window.ionic = {
if(ele.disabled) return;
console.debug('tapElement', ele.tagName, ele.className);
var c = getCoordinates(e);
@@ -2115,7 +2126,7 @@ window.ionic = {
}
if(target.control) {
console.debug('tapElement, target.control, stop');
return stopEvent(e);
}
};
@@ -2129,7 +2140,7 @@ window.ionic = {
if( isRecentTap(e) ) {
// if a tap in the same area just happened, don't continue
console.debug('tapPolyfill', 'isRecentTap', ele.tagName);
return stopEvent(e);
}
@@ -2157,13 +2168,13 @@ window.ionic = {
if(e.target.control) {
// this is a label that has an associated input
// the native layer will send the actual event, so stop this one
console.debug('preventGhostClick', 'label');
return stopEvent(e);
}
if( isRecentTap(e) ) {
// a tap has already happened at these coordinates recently, ignore this event
console.debug('preventGhostClick', 'isRecentTap', e.target.tagName);
return stopEvent(e);
}
@@ -2250,7 +2261,7 @@ window.ionic = {
var tapCoordinates = {}; // used to remember coordinates to ignore if they happen again quickly
var CLICK_PREVENT_DURATION = 1500; // max milliseconds ghostclicks in the same area should be prevented
var REMOVE_PREVENT_DELAY = 325; // delay after a touchend/mouseup before removing the ghostclick prevent
var REMOVE_PREVENT_DELAY = 375; // delay after a touchend/mouseup before removing the ghostclick prevent
var HIT_RADIUS = 15;
// set global click handler and check if the event should stop or not
@@ -2472,7 +2483,7 @@ function androidKeyboardFix() {
if (rememberedDeviceWidth !== window.innerWidth) {
rememberedDeviceWidth = window.innerWidth;
rememberedDeviceHeight = window.innerHeight;
console.info('orientation change. deviceWidth =', rememberedDeviceWidth, ', deviceHeight =', rememberedDeviceHeight);
//If the height changes, and it's less than before, we have a keyboard open
} else if (rememberedDeviceHeight !== window.innerHeight &&
@@ -2834,6 +2845,9 @@ ionic.views.Scroll = ionic.views.View.inherit({
startX: 0,
startY: 0,
/** The amount to dampen mousewheel events */
wheelDampen: 6,
/** The minimum size the scrollbars scale to while scrolling */
minScrollbarSizeX: 5,
minScrollbarSizeY: 5,
@@ -3201,6 +3215,9 @@ ionic.views.Scroll = ionic.views.View.inherit({
mousedown = false;
}, false);
document.addEventListener("mousewheel", function(e) {
self.scrollBy(e.wheelDeltaX/self.options.wheelDampen, -e.wheelDeltaY/self.options.wheelDampen);
});
}
},
@@ -4749,7 +4766,7 @@ ionic.views.Scroll = ionic.views.View.inherit({
content.classList.remove(ITEM_SLIDING_CLASS);
// Grab the starting X point for the item (for example, so we can tell whether it is open or closed to start)
offsetX = parseFloat(content.style.webkitTransform.replace('translate3d(', '').split(',')[0]) || 0;
offsetX = parseFloat(content.style[ionic.CSS.TRANSFORM].replace('translate3d(', '').split(',')[0]) || 0;
// Grab the buttons
buttons = content.parentNode.querySelector('.' + ITEM_OPTIONS_CLASS);
@@ -4795,7 +4812,7 @@ ionic.views.Scroll = ionic.views.View.inherit({
newX = Math.min(-buttonsWidth, -buttonsWidth + (((e.gesture.deltaX + buttonsWidth) * 0.4)));
}
this._currentDrag.content.style.webkitTransform = 'translate3d(' + newX + 'px, 0, 0)';
this._currentDrag.content.style[ionic.CSS.TRANSFORM] = 'translate3d(' + newX + 'px, 0, 0)';
this._currentDrag.content.style.webkitTransition = 'none';
}
});
@@ -4836,17 +4853,17 @@ ionic.views.Scroll = ionic.views.View.inherit({
// };
ionic.requestAnimationFrame(function() {
// var currentX = parseFloat(_this._currentDrag.content.style.webkitTransform.replace('translate3d(', '').split(',')[0]) || 0;
// var currentX = parseFloat(_this._currentDrag.content.style[ionic.CSS.TRANSFORM].replace('translate3d(', '').split(',')[0]) || 0;
// if(currentX !== restingPoint) {
// _this._currentDrag.content.classList.add(ITEM_SLIDING_CLASS);
// _this._currentDrag.content.addEventListener('webkitTransitionEnd', onRestingAnimationEnd);
// }
if(restingPoint === 0) {
_this._currentDrag.content.style.webkitTransform = '';
_this._currentDrag.content.style[ionic.CSS.TRANSFORM] = '';
} else {
_this._currentDrag.content.style.webkitTransform = 'translate3d(' + restingPoint + 'px, 0, 0)';
_this._currentDrag.content.style[ionic.CSS.TRANSFORM] = 'translate3d(' + restingPoint + 'px, 0, 0)';
}
_this._currentDrag.content.style.webkitTransition = '';
_this._currentDrag.content.style[ionic.CSS.TRANSFORM] = '';
// Kill the current drag
@@ -4870,7 +4887,7 @@ ionic.views.Scroll = ionic.views.View.inherit({
ReorderDrag.prototype._moveElement = function(e) {
var y = (e.gesture.center.pageY - this._currentDrag.elementHeight/2);
this.el.style.webkitTransform = 'translate3d(0, '+y+'px, 0)';
this.el.style[ionic.CSS.TRANSFORM] = 'translate3d(0, '+y+'px, 0)';
};
ReorderDrag.prototype.start = function(e) {
@@ -4878,7 +4895,7 @@ ionic.views.Scroll = ionic.views.View.inherit({
// Grab the starting Y point for the item
var offsetY = this.el.offsetTop;//parseFloat(this.el.style.webkitTransform.replace('translate3d(', '').split(',')[1]) || 0;
var offsetY = this.el.offsetTop;//parseFloat(this.el.style[ionic.CSS.TRANSFORM].replace('translate3d(', '').split(',')[1]) || 0;
var startIndex = ionic.DomUtil.getChildIndex(this.el, this.el.nodeName.toLowerCase());
var elementHeight = this.el.offsetHeight;
@@ -4982,7 +4999,7 @@ ionic.views.Scroll = ionic.views.View.inherit({
// Reposition the element
this.el.classList.remove(ITEM_REORDERING_CLASS);
this.el.style.webkitTransform = '';
this.el.style[ionic.CSS.TRANSFORM] = '';
placeholder.parentNode.insertBefore(this.el, placeholder);
placeholder.parentNode.removeChild(placeholder);
@@ -5446,10 +5463,14 @@ ionic.views.Scroll = ionic.views.View.inherit({
this.isEnabled = isEnabled;
},
bringUp: function() {
this.el.style.zIndex = 0;
if(this.el.style.zIndex !== '0') {
this.el.style.zIndex = '0';
}
},
pushDown: function() {
this.el.style.zIndex = -1;
if(this.el.style.zIndex !== '-1') {
this.el.style.zIndex = '-1';
}
}
});
@@ -5479,10 +5500,10 @@ ionic.views.Scroll = ionic.views.View.inherit({
this.el.classList.add(this.animationClass);
},
getTranslateX: function() {
return parseFloat(this.el.style.webkitTransform.replace('translate3d(', '').split(',')[0]);
return parseFloat(this.el.style[ionic.CSS.TRANSFORM].replace('translate3d(', '').split(',')[0]);
},
setTranslateX: ionic.animationFrameThrottle(function(x) {
this.el.style.webkitTransform = 'translate3d(' + x + 'px, 0, 0)';
this.el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + x + 'px, 0, 0)';
})
});
@@ -5719,7 +5740,7 @@ ionic.views.Slider = ionic.views.View.inherit({
function stop() {
delay = 0;
delay = options.auto || 0;
clearTimeout(interval);
}
@@ -6340,7 +6361,7 @@ ionic.views.TabBar = ionic.views.View.inherit({
} else {
var openPixel = Math.round( (openPercent / 100) * this.track.offsetWidth - (this.handle.offsetWidth) );
openPixel = (openPixel < 1 ? 0 : openPixel);
this.handle.style.webkitTransform = 'translate3d(' + openPixel + 'px,0,0)';
this.handle.style[ionic.CSS.TRANSFORM] = 'translate3d(' + openPixel + 'px,0,0)';
}
}
},
@@ -6351,8 +6372,8 @@ ionic.views.TabBar = ionic.views.View.inherit({
val: function(value) {
if(value === true || value === false) {
if(this.handle.style.webkitTransform !== "") {
this.handle.style.webkitTransform = "";
if(this.handle.style[ionic.CSS.TRANSFORM] !== "") {
this.handle.style[ionic.CSS.TRANSFORM] = "";
}
this.checkbox.checked = value;
this.openPercent = (value ? 100 : 0);

View File

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"version": "0.9.25",
"codename": "quokka",
"date": "2014-02-19",
"time": "16:51:4"
"version": "0.9.26",
"codename": "rabbit",
"date": "2014-02-26",
"time": "19:38:1"
}