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 #1288

Closed
wants to merge 21 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
161f16b
chore(travis): cleanup the configuration
vicb Jul 31, 2014
4aaf08e
chore(travis): run test on IE10, IE11, Safari6 and Safari7
vicb Aug 5, 2014
4da505c
fix(ShadowDomComponentFactory): Make Windows & Linux return the same …
vicb Aug 1, 2014
0a9b283
refactor(Cookies): code cleanup
vicb Aug 1, 2014
1d38284
fix(Cookies): fix for IE and Safari
vicb Aug 4, 2014
0a202d0
test(http): disable a flaky expectation
vicb Aug 1, 2014
0ccafd9
refactor(NgEvent): code cleanup
vicb Aug 4, 2014
58f9afb
text(NgEvent): fix the mousewheel event on IE & Safari
vicb Aug 4, 2014
6d46d13
chore(pubspec.yaml): add the browser_detect package
vicb Aug 4, 2014
b25473e
test(ng_form_spec): fix an expectation
vicb Aug 4, 2014
7f324b5
test(ng_form_spec): Fix a failing test on IE
vicb Aug 4, 2014
f706c29
refactor(ng_model_spec): code cleanup
vicb Aug 4, 2014
046e29d
test(ng_model_spec): el.selectionStart and el.selectionEnd are handle…
vicb Aug 4, 2014
3e61ea7
test(WebPlatform): disable web components tests when shim is needed
vicb Aug 4, 2014
7abab38
test(NgModel): fix input type=color default value
vicb Aug 4, 2014
729e69a
refactor(InputSelect): code cleanup
vicb Aug 4, 2014
b7fecc0
fix(ng_model_select): IE has its own way of handling options
vicb Aug 5, 2014
7b5b703
test(select multiple): Need to explicitely select option on IE
vicb Aug 5, 2014
759742b
test(number inputs): Safari6 keep the previous value on invalid input
vicb Aug 5, 2014
166581f
test: fix broken Safari 6 animation bugs
matsko Aug 30, 2014
afbb13c
test: add missing argument type
vicb Sep 4, 2014
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
13 changes: 6 additions & 7 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,25 @@ env:
- JOB=unit-stable
CHANNEL=stable
TESTS=dart2js
BROWSERS=SL_Chrome,SL_Firefox
BROWSERS=SL_Chrome,SL_Firefox,SL_IE10,SL_IE11,SL_Safari6,SL_Safari7
- JOB=unit-dev
CHANNEL=dev
TESTS=dart2js
BROWSERS=SL_Chrome,SL_Firefox
BROWSERS=SL_Chrome,SL_Firefox,SL_IE10,SL_IE11,SL_Safari6,SL_Safari7
- JOB=e2e-g3stable
CHANNEL=stable
BROWSERS=DartiumWithWebPlatform,SL_Chrome
BROWSERS=DartiumWithWebPlatform,SL_Chrome,SL_Firefox,SL_IE10,SL_IE11,SL_Safari6,SL_Safari7
USE_G3=YES
- JOB=e2e-stable
CHANNEL=stable
BROWSERS=DartiumWithWebPlatform,SL_Chrome
BROWSERS=DartiumWithWebPlatform,SL_Chrome,SL_Firefox,SL_IE10,SL_IE11,SL_Safari6,SL_Safari7
- JOB=e2e-dev
CHANNEL=dev
BROWSERS=DartiumWithWebPlatform,SL_Chrome
BROWSERS=DartiumWithWebPlatform,SL_Chrome,SL_Firefox,SL_IE10,SL_IE11,SL_Safari6,SL_Safari7
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