Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Running the test suite on more platforms (with IE disabled) #1464

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,9 @@ env:
CHANNEL=dev
BROWSERS=DartiumWithWebPlatform,SL_Chrome
global:
- FIREFOX_VERSION="30.0"
- CHROME_VERSION="35.0"
- secure: AKoqpZ699egF0i4uT/FQ5b4jIc0h+KVbhtVCql0uFxwFIl2HjOYgDayrUCAf6USfpW0LghZxJJhBamWOl/505eNSe9HvEd8JLg/to+1Fo9xi9llsu5ehmNH31/5pue4EvsrVuEap1qqL6/BNwI2cAryayU0p5tV0g8gL5h4IxG8=
- LOGS_DIR=/tmp/angular-build/logs
# Sauce
- BROWSER_PROVIDER_READY_FILE=/tmp/sauce-connect-ready
- SAUCE_USERNAME=angular-ci
- SAUCE_ACCESS_KEY=9b988f434ff8-fbca-8aa4-4ae3-35442987
Expand Down
22 changes: 22 additions & 0 deletions karma.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,28 @@ module.exports = function(config) {
browserName: 'firefox',
version: '30'
},
'SL_Safari6': {
base: 'SauceLabs',
browserName: 'safari',
version: '6'
},
'SL_Safari7': {
base: 'SauceLabs',
browserName: 'safari',
version: '7'
},
'SL_IE10': {
base: 'SauceLabs',
browserName: 'internet explorer',
platform: 'Windows 8',
version: '10'
},
'SL_IE11': {
base: 'SauceLabs',
browserName: 'internet explorer',
platform: 'Windows 8.1',
version: '11'
},
DartiumWithWebPlatform: {
base: 'Dartium',
flags: ['--enable-experimental-web-platform-features'] }
Expand Down
106 changes: 46 additions & 60 deletions lib/core_dom/cookies.dart
Original file line number Diff line number Diff line change
@@ -1,53 +1,44 @@
part of angular.core.dom_internal;

/**
* This class provides low-level acces to the browser's cookies.
* It is not meant to be used directly by applications. Instead
* use the Cookies service.
*
*/
* This class provides low-level access to the browser's cookies. It is not meant to be used
* directly by applications. Use the [Cookies] service instead.
*/
@Injectable()
class BrowserCookies {
String cookiePath = '/';

ExceptionHandler _exceptionHandler;
dom.Document _document;

var lastCookies = {};
var lastCookieString = '';
var cookiePath;
var baseElement;
var _lastCookies = <String, String>{};
var _lastCookieString = '';
var _baseElement;

BrowserCookies(this._exceptionHandler) {
// Injecting document produces the error 'Caught Compile-time error during mirrored execution:
// <'file:///mnt/data/b/build/slave/dartium-lucid32-full-trunk/build/src/out/Release/gen/blink/
// bindings/dart/dart/html/Document.dart': Error: line 7 pos 3: expression must be a compile-time constant
// @ DocsEditable '
// I have not had time to debug it yet.
_document = dom.document;

var baseElementList = _document.getElementsByName('base');
if (baseElementList.isEmpty) return;
baseElement = baseElementList.first;
_baseElement = baseElementList.first;
cookiePath = _baseHref();
}

var URL_PROTOCOL = new RegExp(r'^https?\:\/\/[^\/]*');
_baseHref() {
var href = baseElement != null ? baseElement.attr('href') : null;
final URL_PROTOCOL = new RegExp(r'^https?\:\/\/[^\/]*');

String _baseHref() {
var href = _baseElement != null ? _baseElement.attr('href') : null;
return href != null ? href.replace(URL_PROTOCOL, '') : '';
}

// NOTE(deboer): This is sub-optimal, see dartbug.com/14281
_unescape(s) => Uri.decodeFull(s);
_escape(s) =>
Uri.encodeFull(s)
.replaceAll('=', '%3D')
.replaceAll(';', '%3B');

_updateLastCookies() {
if (_document.cookie != lastCookieString) {
lastCookieString = _document.cookie;
List<String> cookieArray = lastCookieString.split("; ");
lastCookies = {};
String _unescape(s) => Uri.decodeFull(s);

String _escape(s) => Uri.encodeFull(s).replaceAll('=', '%3D').replaceAll(';', '%3B');

Map<String, String> _updateLastCookies() {
if (_document.cookie != _lastCookieString) {
_lastCookieString = _document.cookie;
List<String> cookieArray = _lastCookieString.split("; ");
_lastCookies = {};

// The first value that is seen for a cookie is the most specific one.
// Values for the same cookie name that follow are for less specific paths.
Expand All @@ -56,64 +47,59 @@ class BrowserCookies {
var index = cookie.indexOf('=');
if (index > 0) { //ignore nameless cookies
var name = _unescape(cookie.substring(0, index));
lastCookies[name] = _unescape(cookie.substring(index + 1));
_lastCookies[name] = _unescape(cookie.substring(index + 1));
}
});
}
return lastCookies;
return _lastCookies;
}

/**
* Returns a cookie.
*/
operator[](key) => _updateLastCookies()[key];
/// Return a cookie by name
String operator[](key) => _updateLastCookies()[key];

/**
* Sets a cookie. Setting a cookie to [null] deletes the cookie.
*/
operator[]=(name, value) {
if (identical(value, null)) {
/// Sets a cookie. Setting a cookie to [null] deletes the cookie.
void operator[]=(name, value) {
if (value == null) {
_document.cookie = "${_escape(name)}=;path=$cookiePath;expires=Thu, 01 Jan 1970 00:00:00 GMT";
} else {
if (value is String) {
var cookieLength = (_document.cookie = "${_escape(name)}=${_escape(value)};path=$cookiePath").length + 1;
var cookie = "${_escape(name)}=${_escape(value)};path=$cookiePath";
_document.cookie = cookie;
var cookieLength = cookie.length + 1;

// per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:
// - 300 cookies
// - 20 cookies per unique domain
// - 4096 bytes per cookie
if (cookieLength > 4096) {
_exceptionHandler("Cookie '$name' possibly not set or overflowed because it was " +
"too large ($cookieLength > 4096 bytes)!", null);
"too large ($cookieLength > 4096 bytes)!", null);
}
}
}
}

get all => _updateLastCookies();
Map<String, String> get all => _updateLastCookies();
}

/**
* Cookies service
*/
/// Handling of browser cookies
@Injectable()
class Cookies {
BrowserCookies _browserCookies;

Cookies(this._browserCookies);

/**
* Returns the value of given cookie key
*/
operator[](name) => this._browserCookies[name];
/// Returns the value of given cookie key
String operator[](name) => _browserCookies[name];

/**
* Sets a value for given cookie key
*/
operator[]=(name, value) => this._browserCookies[name] = value;
/// Sets a value for given cookie key
void operator[]=(name, value) {
_browserCookies[name] = value;
}

/**
* Remove given cookie
*/
remove(name) => this._browserCookies[name] = null;
/// Remove given cookie
void remove(name) {
_browserCookies[name] = null;
}
}

130 changes: 59 additions & 71 deletions lib/directive/ng_events.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
part of angular.directive;

// NOTE(deboer): onXX functions are now typed as 'var' instead of 'Getter'
// to work-around https://code.google.com/p/dart/issues/detail?id=13519

/**
* Allows you to specify custom behavior for DOM UI events such as mouse,
* keyboard and touch events.
Expand Down Expand Up @@ -128,82 +125,73 @@ part of angular.directive;
@Decorator(selector: '[ng-touchmove]', map: const {'ng-touchmove': '&onTouchMove'})
@Decorator(selector: '[ng-touchstart]', map: const {'ng-touchstart': '&onTouchStart'})
@Decorator(selector: '[ng-transitionend]', map: const {'ng-transitionend': '&onTransitionEnd'})

class NgEvent {
// Is it better to use a map of listeners or have 29 properties on this
// object? One would pretty much only assign to one or two of those
// properties. I'm opting for the map since it's less boilerplate code.
var listeners = new HashMap();
final dom.Element element;
final Scope scope;
// Is it better to use a map of listeners or have 29 properties on this object? One would pretty
// much only assign to one or two of those properties. I'm opting for the map since it's less
// boilerplate code.
var listeners = new HashMap<int, BoundExpression>();
final dom.Element _element;
final Scope _scope;

NgEvent(this.element, this.scope);
NgEvent(this._element, this._scope);

// NOTE: Do not use the element.on['some_event'].listen(...) syntax. Doing so
// has two downsides:
// - it loses the event typing
// - some DOM events may have multiple platform-dependent event names
// under the covers. The standard Stream getters you will get the
// platform specific event name automatically but you're on your own if
// you use the on[] syntax. This also applies to $dom_addEventListener.
// Ref: http://api.dartlang.org/docs/releases/latest/dart_html/Events.html
initListener(var stream, var handler) {
void _initListener(stream, BoundExpression handler) {
int key = stream.hashCode;
if (!listeners.containsKey(key)) {
listeners[key] = handler;
stream.listen((event) => handler({r"$event": event}));
}
}

set onAbort(value) => initListener(element.onAbort, value);
set onBeforeCopy(value) => initListener(element.onBeforeCopy, value);
set onBeforeCut(value) => initListener(element.onBeforeCut, value);
set onBeforePaste(value) => initListener(element.onBeforePaste, value);
set onBlur(value) => initListener(element.onBlur, value);
set onChange(value) => initListener(element.onChange, value);
set onClick(value) => initListener(element.onClick, value);
set onContextMenu(value) => initListener(element.onContextMenu, value);
set onCopy(value) => initListener(element.onCopy, value);
set onCut(value) => initListener(element.onCut, value);
set onDoubleClick(value) => initListener(element.onDoubleClick, value);
set onDrag(value) => initListener(element.onDrag, value);
set onDragEnd(value) => initListener(element.onDragEnd, value);
set onDragEnter(value) => initListener(element.onDragEnter, value);
set onDragLeave(value) => initListener(element.onDragLeave, value);
set onDragOver(value) => initListener(element.onDragOver, value);
set onDragStart(value) => initListener(element.onDragStart, value);
set onDrop(value) => initListener(element.onDrop, value);
set onError(value) => initListener(element.onError, value);
set onFocus(value) => initListener(element.onFocus, value);
set onFullscreenChange(value) => initListener(element.onFullscreenChange, value);
set onFullscreenError(value) => initListener(element.onFullscreenError, value);
set onInput(value) => initListener(element.onInput, value);
set onInvalid(value) => initListener(element.onInvalid, value);
set onKeyDown(value) => initListener(element.onKeyDown, value);
set onKeyPress(value) => initListener(element.onKeyPress, value);
set onKeyUp(value) => initListener(element.onKeyUp, value);
set onLoad(value) => initListener(element.onLoad, value);
set onMouseDown(value) => initListener(element.onMouseDown, value);
set onMouseEnter(value) => initListener(element.onMouseEnter, value);
set onMouseLeave(value) => initListener(element.onMouseLeave, value);
set onMouseMove(value) => initListener(element.onMouseMove, value);
set onMouseOut(value) => initListener(element.onMouseOut, value);
set onMouseOver(value) => initListener(element.onMouseOver, value);
set onMouseUp(value) => initListener(element.onMouseUp, value);
set onMouseWheel(value) => initListener(element.onMouseWheel, value);
set onPaste(value) => initListener(element.onPaste, value);
set onReset(value) => initListener(element.onReset, value);
set onScroll(value) => initListener(element.onScroll, value);
set onSearch(value) => initListener(element.onSearch, value);
set onSelect(value) => initListener(element.onSelect, value);
set onSelectStart(value) => initListener(element.onSelectStart, value);
// set onSpeechChange(value) => initListener(element.onSpeechChange, value);
set onSubmit(value) => initListener(element.onSubmit, value);
set onTouchCancel(value) => initListener(element.onTouchCancel, value);
set onTouchEnd(value) => initListener(element.onTouchEnd, value);
set onTouchEnter(value) => initListener(element.onTouchEnter, value);
set onTouchLeave(value) => initListener(element.onTouchLeave, value);
set onTouchMove(value) => initListener(element.onTouchMove, value);
set onTouchStart(value) => initListener(element.onTouchStart, value);
set onTransitionEnd(value) => initListener(element.onTransitionEnd, value);
void set onAbort(value) => _initListener(_element.onAbort, value);
void set onBeforeCopy(value) => _initListener(_element.onBeforeCopy, value);
void set onBeforeCut(value) => _initListener(_element.onBeforeCut, value);
void set onBeforePaste(value) => _initListener(_element.onBeforePaste, value);
void set onBlur(value) => _initListener(_element.onBlur, value);
void set onChange(value) => _initListener(_element.onChange, value);
void set onClick(value) => _initListener(_element.onClick, value);
void set onContextMenu(value) => _initListener(_element.onContextMenu, value);
void set onCopy(value) => _initListener(_element.onCopy, value);
void set onCut(value) => _initListener(_element.onCut, value);
void set onDoubleClick(value) => _initListener(_element.onDoubleClick, value);
void set onDrag(value) => _initListener(_element.onDrag, value);
void set onDragEnd(value) => _initListener(_element.onDragEnd, value);
void set onDragEnter(value) => _initListener(_element.onDragEnter, value);
void set onDragLeave(value) => _initListener(_element.onDragLeave, value);
void set onDragOver(value) => _initListener(_element.onDragOver, value);
void set onDragStart(value) => _initListener(_element.onDragStart, value);
void set onDrop(value) => _initListener(_element.onDrop, value);
void set onError(value) => _initListener(_element.onError, value);
void set onFocus(value) => _initListener(_element.onFocus, value);
void set onFullscreenChange(value) => _initListener(_element.onFullscreenChange, value);
void set onFullscreenError(value) => _initListener(_element.onFullscreenError, value);
void set onInput(value) => _initListener(_element.onInput, value);
void set onInvalid(value) => _initListener(_element.onInvalid, value);
void set onKeyDown(value) => _initListener(_element.onKeyDown, value);
void set onKeyPress(value) => _initListener(_element.onKeyPress, value);
void set onKeyUp(value) => _initListener(_element.onKeyUp, value);
void set onLoad(value) => _initListener(_element.onLoad, value);
void set onMouseDown(value) => _initListener(_element.onMouseDown, value);
void set onMouseEnter(value) => _initListener(_element.onMouseEnter, value);
void set onMouseLeave(value) => _initListener(_element.onMouseLeave, value);
void set onMouseMove(value) => _initListener(_element.onMouseMove, value);
void set onMouseOut(value) => _initListener(_element.onMouseOut, value);
void set onMouseOver(value) => _initListener(_element.onMouseOver, value);
void set onMouseUp(value) => _initListener(_element.onMouseUp, value);
void set onMouseWheel(value) => _initListener(_element.onMouseWheel, value);
void set onPaste(value) => _initListener(_element.onPaste, value);
void set onReset(value) => _initListener(_element.onReset, value);
void set onScroll(value) => _initListener(_element.onScroll, value);
void set onSearch(value) => _initListener(_element.onSearch, value);
void set onSelect(value) => _initListener(_element.onSelect, value);
void set onSelectStart(value) => _initListener(_element.onSelectStart, value);
// void set onSpeechChange(value) => initListener(element.onSpeechChange, value);
void set onSubmit(value) => _initListener(_element.onSubmit, value);
void set onTouchCancel(value) => _initListener(_element.onTouchCancel, value);
void set onTouchEnd(value) => _initListener(_element.onTouchEnd, value);
void set onTouchEnter(value) => _initListener(_element.onTouchEnter, value);
void set onTouchLeave(value) => _initListener(_element.onTouchLeave, value);
void set onTouchMove(value) => _initListener(_element.onTouchMove, value);
void set onTouchStart(value) => _initListener(_element.onTouchStart, value);
void set onTransitionEnd(value) => _initListener(_element.onTransitionEnd, value);
}
Loading