From 5b1c277a3bb570817b185650255ba2e212907a10 Mon Sep 17 00:00:00 2001 From: Matthew Beale Date: Sat, 31 Jan 2015 10:44:56 -0500 Subject: [PATCH 1/4] [BUGFIX beta] IE10 and IE9 fixes. normalizeProperty expects lowercase prop name --- .../tests/attr_nodes/data_test.js | 2 +- ...ng_reflection_test.js => property_test.js} | 14 ++------- .../tests/attr_nodes/svg_test.js | 2 +- .../tests/helpers/bind_attr_test.js | 2 +- packages/ember-runtime/tests/ext/rsvp_test.js | 1 - .../ember-views/lib/system/render_buffer.js | 2 +- packages/ember-views/lib/views/view.js | 4 ++- .../ember-views/tests/views/select_test.js | 29 ++++++++++--------- .../views/view/attribute_bindings_test.js | 8 ++--- 9 files changed, 30 insertions(+), 34 deletions(-) rename packages/ember-htmlbars/tests/attr_nodes/{nonmatching_reflection_test.js => property_test.js} (73%) diff --git a/packages/ember-htmlbars/tests/attr_nodes/data_test.js b/packages/ember-htmlbars/tests/attr_nodes/data_test.js index b8f62ee3c22..52dfc931fb1 100644 --- a/packages/ember-htmlbars/tests/attr_nodes/data_test.js +++ b/packages/ember-htmlbars/tests/attr_nodes/data_test.js @@ -125,7 +125,7 @@ if (Ember.FEATURES.isEnabled('ember-htmlbars-attribute-syntax')) { }); runAppend(view); - equalInnerHTML(view.element, '
Hi!
', "attribute is output"); + equal(view.element.firstChild.getAttribute('data-name'), '"" data-foo="blah"', "attribute is output"); }); test("path is output", function() { diff --git a/packages/ember-htmlbars/tests/attr_nodes/nonmatching_reflection_test.js b/packages/ember-htmlbars/tests/attr_nodes/property_test.js similarity index 73% rename from packages/ember-htmlbars/tests/attr_nodes/nonmatching_reflection_test.js rename to packages/ember-htmlbars/tests/attr_nodes/property_test.js index fb617332212..4ff6b743a85 100644 --- a/packages/ember-htmlbars/tests/attr_nodes/nonmatching_reflection_test.js +++ b/packages/ember-htmlbars/tests/attr_nodes/property_test.js @@ -1,7 +1,6 @@ import EmberView from "ember-views/views/view"; import run from "ember-metal/run_loop"; import compile from "ember-template-compiler/system/compile"; -import { equalInnerHTML } from "htmlbars-test-helpers"; var view; @@ -19,7 +18,7 @@ function canSetFalsyMaxLength() { if (Ember.FEATURES.isEnabled('ember-htmlbars-attribute-syntax')) { // jscs:disable validateIndentation -QUnit.module("ember-htmlbars: nonmatching reflection", { +QUnit.module("ember-htmlbars: property", { teardown: function() { if (view) { run(view, view.destroy); @@ -32,13 +31,11 @@ test("maxlength sets the property and attribute", function() { context: { length: 5 }, template: compile("") }); - appendView(view); - equalInnerHTML(view.element, '', "attribute is output"); + appendView(view); equal(view.element.firstChild.maxLength, 5); Ember.run(view, view.set, 'context.length', 1); - equalInnerHTML(view.element, '', "attribute is modified by property setting"); equal(view.element.firstChild.maxLength, 1); }); @@ -47,20 +44,15 @@ test("quoted maxlength sets the property and attribute", function() { context: { length: 5 }, template: compile("") }); - appendView(view); - equalInnerHTML(view.element, '', "attribute is output"); + appendView(view); equal(view.element.firstChild.maxLength, '5'); if (canSetFalsyMaxLength()) { Ember.run(view, view.set, 'context.length', null); - - equalInnerHTML(view.element, '', "attribute is output"); equal(view.element.firstChild.maxLength, 0); } else { Ember.run(view, view.set, 'context.length', 1); - - equalInnerHTML(view.element, '', "attribute is output"); equal(view.element.firstChild.maxLength, 1); } }); diff --git a/packages/ember-htmlbars/tests/attr_nodes/svg_test.js b/packages/ember-htmlbars/tests/attr_nodes/svg_test.js index 8ea73cd969b..d91140fa969 100644 --- a/packages/ember-htmlbars/tests/attr_nodes/svg_test.js +++ b/packages/ember-htmlbars/tests/attr_nodes/svg_test.js @@ -31,7 +31,7 @@ test("unquoted viewBox property is output", function() { equalInnerHTML(view.element, '', "attribute is output"); Ember.run(view, view.set, 'context.viewBoxString', null); - equalInnerHTML(view.element, '', "attribute is removed"); + equal(view.element.getAttribute('svg'), null, "attribute is removed"); }); test("quoted viewBox property is output", function() { diff --git a/packages/ember-htmlbars/tests/helpers/bind_attr_test.js b/packages/ember-htmlbars/tests/helpers/bind_attr_test.js index 946200cc0f9..1d34acd2be0 100644 --- a/packages/ember-htmlbars/tests/helpers/bind_attr_test.js +++ b/packages/ember-htmlbars/tests/helpers/bind_attr_test.js @@ -336,7 +336,7 @@ test("should be able to bind class attribute via a truthy property with {{bind-a set(view, 'isNumber', 0); }); - equalInnerHTML(view.element.firstChild.className, undefined, 'removes class'); + ok(view.element.firstChild.className !== 'is-truthy', 'removes class'); }); test("should be able to bind class to view attribute with {{bind-attr}}", function() { diff --git a/packages/ember-runtime/tests/ext/rsvp_test.js b/packages/ember-runtime/tests/ext/rsvp_test.js index 028329c3efa..3284a173f60 100644 --- a/packages/ember-runtime/tests/ext/rsvp_test.js +++ b/packages/ember-runtime/tests/ext/rsvp_test.js @@ -153,7 +153,6 @@ test('rejections where the errorThrown is a string should wrap the sting in an e try { Ember.testing = false; Ember.onerror = function(error) { - console.log('error', error); equal(error.message, actualError, 'expected the real error on the jqXHR'); equal(error.__reason_with_error_thrown__, jqXHR, 'also retains a helpful reference to the rejection reason'); }; diff --git a/packages/ember-views/lib/system/render_buffer.js b/packages/ember-views/lib/system/render_buffer.js index b157452b3f7..d2ccc078906 100644 --- a/packages/ember-views/lib/system/render_buffer.js +++ b/packages/ember-views/lib/system/render_buffer.js @@ -492,7 +492,7 @@ RenderBuffer.prototype = { if (props) { for (prop in props) { - var normalizedCase = normalizeProperty(element, prop) || prop; + var normalizedCase = normalizeProperty(element, prop.toLowerCase()) || prop; this.dom.setPropertyStrict(element, normalizedCase, props[prop]); } diff --git a/packages/ember-views/lib/views/view.js b/packages/ember-views/lib/views/view.js index 5541850e33d..4bba7389719 100644 --- a/packages/ember-views/lib/views/view.js +++ b/packages/ember-views/lib/views/view.js @@ -58,6 +58,7 @@ import { isStream } from "ember-metal/streams/utils"; import sanitizeAttributeValue from "ember-views/system/sanitize_attribute_value"; +import { normalizeProperty } from "morph/dom-helper/prop"; function K() { return this; } @@ -1252,7 +1253,8 @@ var View = CoreView.extend({ attributeValue = get(this, property); - View.applyAttributeBindings(this.renderer._dom, elem, attributeName, attributeValue); + var normalizedName = normalizeProperty(elem, attributeName.toLowerCase()) || attributeName; + View.applyAttributeBindings(this.renderer._dom, elem, normalizedName, attributeValue); }; this.registerObserver(this, property, observer); diff --git a/packages/ember-views/tests/views/select_test.js b/packages/ember-views/tests/views/select_test.js index 4bf27004af3..7126260bfa4 100644 --- a/packages/ember-views/tests/views/select_test.js +++ b/packages/ember-views/tests/views/select_test.js @@ -51,23 +51,26 @@ test("should begin disabled if the disabled attribute is true", function() { ok(select.$().is(":disabled")); }); -test("should begin required if the required attribute is true", function() { - select.set('required', true); - append(); +// Browsers before IE10 do not support the required property. +if (document && ('required' in document.createElement('input'))) { + test("should begin required if the required attribute is true", function() { + select.set('required', true); + append(); - ok(select.element.required, 'required property is truthy'); -}); + ok(select.element.required, 'required property is truthy'); + }); -test("should become required if the required attribute is changed", function() { - append(); - ok(!select.element.required, 'required property is falsy'); + test("should become required if the required attribute is changed", function() { + append(); + ok(!select.element.required, 'required property is falsy'); - run(function() { select.set('required', true); }); - ok(select.element.required, 'required property is truthy'); + run(function() { select.set('required', true); }); + ok(select.element.required, 'required property is truthy'); - run(function() { select.set('required', false); }); - ok(!select.element.required, 'required property is falsy'); -}); + run(function() { select.set('required', false); }); + ok(!select.element.required, 'required property is falsy'); + }); +} test("should become disabled if the disabled attribute is changed", function() { append(); diff --git a/packages/ember-views/tests/views/view/attribute_bindings_test.js b/packages/ember-views/tests/views/view/attribute_bindings_test.js index 5d8f2317f07..243c48f311f 100644 --- a/packages/ember-views/tests/views/view/attribute_bindings_test.js +++ b/packages/ember-views/tests/views/view/attribute_bindings_test.js @@ -59,17 +59,17 @@ test("should render attribute bindings", function() { test("should normalize case for attribute bindings", function() { view = EmberView.create({ - tagName: 'form', - attributeBindings: ['novalidate'], + tagName: 'input', + attributeBindings: ['disAbled'], - novalidate: true // intentionally lowercase + disAbled: true }); run(function() { view.createElement(); }); - ok(view.$().prop('noValidate'), "sets property with correct case"); + ok(view.$().prop('disabled'), "sets property with correct case"); }); test("should update attribute bindings", function() { From 6ff9deae59dbdbd0ef9f9b11ff5e915e177bb017 Mon Sep 17 00:00:00 2001 From: Matthew Beale Date: Sat, 31 Jan 2015 12:46:47 -0500 Subject: [PATCH 2/4] [BUGFIX beta] IE8 defineProperties fix --- packages/ember-metal/lib/platform/create.js | 5 ++++- packages/ember-views/tests/views/text_field_test.js | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/ember-metal/lib/platform/create.js b/packages/ember-metal/lib/platform/create.js index 8bb696b0a50..67a56ef29fb 100644 --- a/packages/ember-metal/lib/platform/create.js +++ b/packages/ember-metal/lib/platform/create.js @@ -2,6 +2,9 @@ // https://bugs.webkit.org/show_bug.cgi?id=138038 is fixed // // REMOVE_USE_STRICT: true +// + +import defineProperties from 'ember-metal/platform/define_properties'; /** @class platform @@ -87,7 +90,7 @@ if (!(Object.create && !Object.create(null).hasOwnProperty)) { } if (properties !== undefined) { - Object.defineProperties(object, properties); + defineProperties(object, properties); } return object; diff --git a/packages/ember-views/tests/views/text_field_test.js b/packages/ember-views/tests/views/text_field_test.js index ce1aaa5e5cd..7aa61d23039 100644 --- a/packages/ember-views/tests/views/text_field_test.js +++ b/packages/ember-views/tests/views/text_field_test.js @@ -79,7 +79,7 @@ QUnit.module("Ember.TextField", { } }); -test("should become disabled if the disabled attribute is true", function() { +test("should become disabled if the disabled attribute is true before append", function() { textField.set('disabled', true); append(); From a6dab37729df663d76947273ea73d189ea923eff Mon Sep 17 00:00:00 2001 From: Matthew Beale Date: Sat, 31 Jan 2015 13:23:06 -0500 Subject: [PATCH 3/4] [BUGFIX beta] Don't render default layout for text_field --- packages/ember-views/lib/views/text_field.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/ember-views/lib/views/text_field.js b/packages/ember-views/lib/views/text_field.js index b25e3f4d32d..4a7ad04e1c5 100644 --- a/packages/ember-views/lib/views/text_field.js +++ b/packages/ember-views/lib/views/text_field.js @@ -54,6 +54,8 @@ export default Component.extend(TextSupport, { 'width' ], + defaultLayout: null, + /** The `value` attribute of the input element. As the user inputs text, this property is updated live. From 2936e227e2a6c75ddd9203304acdb5a4453d5a37 Mon Sep 17 00:00:00 2001 From: Matthew Beale Date: Sat, 31 Jan 2015 15:14:10 -0500 Subject: [PATCH 4/4] [BUGFIX beta] skip error-causing sanitization tests in IE8 --- .../ember-htmlbars/tests/attr_nodes/sanitized_test.js | 8 ++++++++ .../tests/helpers/sanitized_bind_attr_test.js | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/packages/ember-htmlbars/tests/attr_nodes/sanitized_test.js b/packages/ember-htmlbars/tests/attr_nodes/sanitized_test.js index 17f1cf1564f..6f3372f43ce 100644 --- a/packages/ember-htmlbars/tests/attr_nodes/sanitized_test.js +++ b/packages/ember-htmlbars/tests/attr_nodes/sanitized_test.js @@ -4,6 +4,7 @@ import EmberView from "ember-views/views/view"; import compile from "ember-template-compiler/system/compile"; import { SafeString } from "ember-htmlbars/utils/string"; import { runAppend, runDestroy } from "ember-runtime/tests/utils"; +import environment from "ember-metal/environment"; var view; @@ -34,6 +35,9 @@ var badTags = [ quotedTemplate: compile(""), multipartTemplate: compile("") }, { tag: 'iframe', attr: 'src', + // Setting an iframe with a bad protocol results in the browser + // being redirected. in IE8. Skip the iframe tests on that platform. + skip: (environment.hasDOM && document.documentMode && document.documentMode <= 8), unquotedTemplate: compile(""), quotedTemplate: compile(""), multipartTemplate: compile("") } @@ -43,6 +47,10 @@ for (var i=0, l=badTags.length; i') }, { tag: 'body', attr: 'background', + // IE8 crashes when setting background with + // a javascript: protocol + skip: (environment.hasDOM && document.documentMode && document.documentMode <= 8), template: compile('') }, { tag: 'link', attr: 'href', template: compile('') }, @@ -31,6 +35,10 @@ for (var i=0, l=badTags.length; i