ember-source 1.10.0.beta.2 → 1.10.0.beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ember-source might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2ce4779f0333c7e85a0d823b69fc37a73a30f7b0
4
- data.tar.gz: 6b3bea7082167799c98c488324aff026c6a7c368
3
+ metadata.gz: a51c8274f4e7cf007f118fedb3b566f30b3b3d0d
4
+ data.tar.gz: 40f6468450908c4c9e0b003faa5a71157ce382db
5
5
  SHA512:
6
- metadata.gz: 29450a4e62a8ebbd813c2e9b02d3ea8e788afcc7dd35fcd4637bcfd09f3e1d193e20bc60018ec3ae97cc225001fe5ec537ea86453f0f63e98adf5295e798b26c
7
- data.tar.gz: 35733741b5d0e3af4521447e11a06851f72845525164e5c91cf333684239d7f6c053841bf30c4677305d35008a8b6da3a3a43878747b28d4424a73635aa99d80
6
+ metadata.gz: f94d74ec51da5db14e2867730b47aca32dd24a84d8598c301750c6425dc69033e2c94a759cf0613c81a406cc48c26aa66b36c32fa42cbac1208b27d95e8992c5
7
+ data.tar.gz: 2d6808249e8c3ddb0013f33f9f004669592e0d649ac7f8377a00ea03903434fe1fe6bbaf9e9e6fa8798be680c9d4f261ff3428d5dcfcbb9c7f3029b3c7929513
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.10.0-beta.2
1
+ 1.10.0-beta.3
@@ -5,7 +5,7 @@
5
5
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
6
6
  * @license Licensed under MIT license
7
7
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
8
- * @version 1.10.0-beta.2
8
+ * @version 1.10.0-beta.3
9
9
  */
10
10
 
11
11
  (function() {
@@ -4852,7 +4852,7 @@ define("ember-metal/core",
4852
4852
 
4853
4853
  @class Ember
4854
4854
  @static
4855
- @version 1.10.0-beta.2
4855
+ @version 1.10.0-beta.3
4856
4856
  */
4857
4857
 
4858
4858
  if ('undefined' === typeof Ember) {
@@ -4879,10 +4879,10 @@ define("ember-metal/core",
4879
4879
  /**
4880
4880
  @property VERSION
4881
4881
  @type String
4882
- @default '1.10.0-beta.2'
4882
+ @default '1.10.0-beta.3'
4883
4883
  @static
4884
4884
  */
4885
- Ember.VERSION = '1.10.0-beta.2';
4885
+ Ember.VERSION = '1.10.0-beta.3';
4886
4886
 
4887
4887
  /**
4888
4888
  Standard environmental variables. You can define these in a global `EmberENV`
@@ -11597,9 +11597,11 @@ define("ember-metal/watch_key",
11597
11597
  var handleMandatorySetter = function handleMandatorySetter(m, obj, keyName) {
11598
11598
  var descriptor = Object.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptor(obj, keyName);
11599
11599
  var configurable = descriptor ? descriptor.configurable : true;
11600
+ var isWritable = descriptor ? descriptor.writable : true;
11601
+ var hasValue = descriptor ? 'value' in descriptor : true;
11600
11602
 
11601
11603
  // this x in Y deopts, so keeping it in this function is better;
11602
- if (configurable && keyName in obj) {
11604
+ if (configurable && isWritable && hasValue && keyName in obj) {
11603
11605
  m.values[keyName] = obj[keyName];
11604
11606
  o_defineProperty(obj, keyName, {
11605
11607
  configurable: true,
@@ -13400,14 +13402,15 @@ define("ember-runtime/computed/reduce_computed_macros",
13400
13402
  The callback method you provide should have the following signature.
13401
13403
  `item` is the current item in the iteration.
13402
13404
  `index` is the integer index of the current item in the iteration.
13405
+ `array` is the dependant array itself.
13403
13406
 
13404
13407
  ```javascript
13405
- function(item, index);
13408
+ function(item, index, array);
13406
13409
  ```
13407
13410
 
13408
13411
  ```javascript
13409
13412
  var Hamster = Ember.Object.extend({
13410
- remainingChores: Ember.computed.filter('chores', function(chore, index) {
13413
+ remainingChores: Ember.computed.filter('chores', function(chore, index, array) {
13411
13414
  return !chore.done;
13412
13415
  })
13413
13416
  });
@@ -13436,7 +13439,7 @@ define("ember-runtime/computed/reduce_computed_macros",
13436
13439
  },
13437
13440
 
13438
13441
  addedItem: function (array, item, changeMeta, instanceMeta) {
13439
- var match = !!callback.call(this, item, changeMeta.index);
13442
+ var match = !!callback.call(this, item, changeMeta.index, changeMeta.arrayChanged);
13440
13443
  var filterIndex = instanceMeta.filteredArrayIndexes.addItem(changeMeta.index, match);
13441
13444
 
13442
13445
  if (match) {
@@ -5,7 +5,7 @@
5
5
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
6
6
  * @license Licensed under MIT license
7
7
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
8
- * @version 1.10.0-beta.2
8
+ * @version 1.10.0-beta.3
9
9
  */
10
10
 
11
11
  (function() {
@@ -114,7 +114,7 @@ define("ember-metal/core",
114
114
 
115
115
  @class Ember
116
116
  @static
117
- @version 1.10.0-beta.2
117
+ @version 1.10.0-beta.3
118
118
  */
119
119
 
120
120
  if ('undefined' === typeof Ember) {
@@ -141,10 +141,10 @@ define("ember-metal/core",
141
141
  /**
142
142
  @property VERSION
143
143
  @type String
144
- @default '1.10.0-beta.2'
144
+ @default '1.10.0-beta.3'
145
145
  @static
146
146
  */
147
- Ember.VERSION = '1.10.0-beta.2';
147
+ Ember.VERSION = '1.10.0-beta.3';
148
148
 
149
149
  /**
150
150
  Standard environmental variables. You can define these in a global `EmberENV`
@@ -681,6 +681,11 @@ define("htmlbars-compiler/fragment-javascript-compiler",
681
681
  var processOpcodes = __dependency1__.processOpcodes;
682
682
  var string = __dependency2__.string;
683
683
 
684
+ var svgNamespace = "http://www.w3.org/2000/svg",
685
+ // http://www.w3.org/html/wg/drafts/html/master/syntax.html#html-integration-point
686
+ svgHTMLIntegrationPoints = {'foreignObject':true, 'desc':true, 'title':true};
687
+
688
+
684
689
  function FragmentJavaScriptCompiler() {
685
690
  this.source = [];
686
691
  this.depth = -1;
@@ -692,6 +697,8 @@ define("htmlbars-compiler/fragment-javascript-compiler",
692
697
  this.source.length = 0;
693
698
  this.depth = -1;
694
699
  this.indent = (options && options.indent) || "";
700
+ this.namespaceFrameStack = [{namespace: null, depth: null}];
701
+ this.domNamespace = null;
695
702
 
696
703
  this.source.push('function build(dom) {\n');
697
704
  processOpcodes(this, opcodes);
@@ -707,7 +714,14 @@ define("htmlbars-compiler/fragment-javascript-compiler",
707
714
 
708
715
  FragmentJavaScriptCompiler.prototype.createElement = function(tagName) {
709
716
  var el = 'el'+(++this.depth);
717
+ if (tagName === 'svg') {
718
+ this.pushNamespaceFrame({namespace: svgNamespace, depth: this.depth});
719
+ }
720
+ this.ensureNamespace();
710
721
  this.source.push(this.indent+' var '+el+' = dom.createElement('+string(tagName)+');\n');
722
+ if (svgHTMLIntegrationPoints[tagName]) {
723
+ this.pushNamespaceFrame({namespace: null, depth: this.depth});
724
+ }
711
725
  };
712
726
 
713
727
  FragmentJavaScriptCompiler.prototype.createText = function(str) {
@@ -727,17 +741,36 @@ define("htmlbars-compiler/fragment-javascript-compiler",
727
741
 
728
742
  FragmentJavaScriptCompiler.prototype.setAttribute = function(name, value) {
729
743
  var el = 'el'+this.depth;
730
- this.source.push(this.indent+' dom.setAttribute('+el+','+string(name)+','+string(value)+');\n');
744
+ this.source.push(this.indent+' dom.setProperty('+el+','+string(name)+','+string(value)+');\n');
731
745
  };
732
746
 
733
747
  FragmentJavaScriptCompiler.prototype.appendChild = function() {
748
+ if (this.depth === this.getCurrentNamespaceFrame().depth) {
749
+ this.popNamespaceFrame();
750
+ }
734
751
  var child = 'el'+(this.depth--);
735
752
  var el = 'el'+this.depth;
736
753
  this.source.push(this.indent+' dom.appendChild('+el+', '+child+');\n');
737
754
  };
738
755
 
739
- FragmentJavaScriptCompiler.prototype.setNamespace = function(namespace) {
740
- this.source.push(this.indent+' dom.setNamespace('+(namespace ? string(namespace) : 'null')+');\n');
756
+ FragmentJavaScriptCompiler.prototype.getCurrentNamespaceFrame = function() {
757
+ return this.namespaceFrameStack[this.namespaceFrameStack.length-1];
758
+ };
759
+
760
+ FragmentJavaScriptCompiler.prototype.pushNamespaceFrame = function(frame) {
761
+ this.namespaceFrameStack.push(frame);
762
+ };
763
+
764
+ FragmentJavaScriptCompiler.prototype.popNamespaceFrame = function() {
765
+ return this.namespaceFrameStack.pop();
766
+ };
767
+
768
+ FragmentJavaScriptCompiler.prototype.ensureNamespace = function() {
769
+ var correctNamespace = this.getCurrentNamespaceFrame().namespace;
770
+ if (this.domNamespace !== correctNamespace) {
771
+ this.source.push(this.indent+' dom.setNamespace('+(correctNamespace ? string(correctNamespace) : 'null')+');\n');
772
+ this.domNamespace = correctNamespace;
773
+ }
741
774
  };
742
775
  });
743
776
  define("htmlbars-compiler/fragment-opcode-compiler",
@@ -819,14 +852,13 @@ define("htmlbars-compiler/hydration-javascript-compiler",
819
852
  "use strict";
820
853
  var processOpcodes = __dependency1__.processOpcodes;
821
854
  var string = __dependency2__.string;
822
- var quoteHash = __dependency2__.hash;
823
855
  var array = __dependency2__.array;
824
856
 
825
857
  function HydrationJavaScriptCompiler() {
826
858
  this.stack = [];
827
859
  this.source = [];
828
860
  this.mustaches = [];
829
- this.parents = ['fragment'];
861
+ this.parents = [['fragment']];
830
862
  this.parentCount = 0;
831
863
  this.morphs = [];
832
864
  this.fragmentProcessing = [];
@@ -842,7 +874,7 @@ define("htmlbars-compiler/hydration-javascript-compiler",
842
874
  this.mustaches.length = 0;
843
875
  this.source.length = 0;
844
876
  this.parents.length = 1;
845
- this.parents[0] = 'fragment';
877
+ this.parents[0] = ['fragment'];
846
878
  this.morphs.length = 0;
847
879
  this.fragmentProcessing.length = 0;
848
880
  this.parentCount = 0;
@@ -904,124 +936,113 @@ define("htmlbars-compiler/hydration-javascript-compiler",
904
936
  }
905
937
  };
906
938
 
939
+ prototype.pushHook = function(name, args) {
940
+ this.hooks[name] = true;
941
+ this.stack.push(name + '(' + args.join(', ') + ')');
942
+ };
943
+
907
944
  prototype.pushGetHook = function(path) {
908
- this.hooks.get = true;
909
- this.stack.push('get(context, ' + string(path) + ', env)');
945
+ this.pushHook('get', [
946
+ 'env',
947
+ 'context',
948
+ string(path)
949
+ ]);
910
950
  };
911
951
 
912
952
  prototype.pushSexprHook = function() {
913
- this.hooks.subexpr = true;
914
- var path = this.stack.pop();
915
- var params = this.stack.pop();
916
- var hash = this.stack.pop();
917
- this.stack.push('subexpr(' + path + ', context, ' + params + ', ' + hash + ', {}, env)');
953
+ this.pushHook('subexpr', [
954
+ 'env',
955
+ 'context',
956
+ this.stack.pop(), // path
957
+ this.stack.pop(), // params
958
+ this.stack.pop() // hash
959
+ ]);
918
960
  };
919
961
 
920
962
  prototype.pushConcatHook = function() {
921
- this.hooks.concat = true;
922
- var parts = this.stack.pop();
923
- this.stack.push('concat(' + parts + ', env)');
924
- };
925
-
926
- prototype.printSetHook = function(name, index) {
927
- this.hooks.set = true;
928
- this.source.push(this.indent + ' set(context, ' + string(name) +', blockArguments[' + index + ']);\n');
929
- };
930
-
931
- prototype.printContentHookForBlockHelper = function(morphNum, templateId, inverseId, blockParamsLength) {
932
- var path = this.stack.pop();
933
- var params = this.stack.pop();
934
- var hash = this.stack.pop();
935
-
936
- var options = [];
937
-
938
- options.push('morph: morph' + morphNum);
939
-
940
- if (templateId !== null) {
941
- options.push('template: child' + templateId);
942
- }
943
-
944
- if (inverseId !== null) {
945
- options.push('inverse: child' + inverseId);
946
- }
947
-
948
- if (blockParamsLength) {
949
- options.push('blockParams: ' + blockParamsLength);
950
- }
951
-
952
- this.printContentHook(morphNum, path, params, hash, options);
963
+ this.pushHook('concat', [
964
+ 'env',
965
+ this.stack.pop() // parts
966
+ ]);
953
967
  };
954
968
 
955
- prototype.printContentHookForInlineHelper = function(morphNum) {
956
- var path = this.stack.pop();
957
- var params = this.stack.pop();
958
- var hash = this.stack.pop();
959
-
960
- var options = [];
961
- options.push('morph: morph' + morphNum);
962
-
963
- this.printContentHook(morphNum, path, params, hash, options);
964
- };
965
-
966
- prototype.printContentHookForAmbiguous = function(morphNum) {
967
- var path = this.stack.pop();
968
-
969
- var options = [];
970
- options.push('morph: morph' + morphNum);
971
-
972
- this.printContentHook(morphNum, path, '[]', '{}', options);
973
- };
974
-
975
- prototype.printContentHook = function(morphNum, path, params, hash, pairs) {
976
- this.hooks.content = true;
977
-
978
- var args = ['morph' + morphNum, path, 'context', params, hash, quoteHash(pairs), 'env'];
979
- this.source.push(this.indent+' content(' + args.join(', ') + ');\n');
980
- };
981
-
982
- prototype.printComponentHook = function(morphNum, templateId, blockParamsLength) {
983
- this.hooks.component = true;
984
-
985
- var path = this.stack.pop();
986
- var hash = this.stack.pop();
987
-
988
- var options = [];
989
-
990
- options.push('morph: morph' + morphNum);
991
-
992
- if (templateId !== null) {
993
- options.push('template: child' + templateId);
994
- }
995
-
996
- if (blockParamsLength) {
997
- options.push('blockParams: ' + blockParamsLength);
998
- }
999
-
1000
- var args = ['morph' + morphNum, path, 'context', hash, quoteHash(options), 'env'];
1001
- this.source.push(this.indent+' component(' + args.join(', ') + ');\n');
969
+ prototype.printHook = function(name, args) {
970
+ this.hooks[name] = true;
971
+ this.source.push(this.indent + ' ' + name + '(' + args.join(', ') + ');\n');
1002
972
  };
1003
973
 
1004
- prototype.printAttributeHook = function(elementNum, quoted) {
1005
- this.hooks.attribute = true;
1006
-
1007
- var name = this.stack.pop();
1008
- var value = this.stack.pop();
1009
-
1010
- this.source.push(this.indent + ' attribute(element' + elementNum + ', ' + name + ', ' + quoted + ', context, ' + value + ', {}, env);\n');
974
+ prototype.printSetHook = function(name, index) {
975
+ this.printHook('set', [
976
+ 'env',
977
+ 'context',
978
+ string(name),
979
+ 'blockArguments[' + index + ']'
980
+ ]);
981
+ };
982
+
983
+ prototype.printBlockHook = function(morphNum, templateId, inverseId) {
984
+ this.printHook('block', [
985
+ 'env',
986
+ 'morph' + morphNum,
987
+ 'context',
988
+ this.stack.pop(), // path
989
+ this.stack.pop(), // params
990
+ this.stack.pop(), // hash
991
+ templateId === null ? 'null' : 'child' + templateId,
992
+ inverseId === null ? 'null' : 'child' + inverseId
993
+ ]);
994
+ };
995
+
996
+ prototype.printInlineHook = function(morphNum) {
997
+ this.printHook('inline', [
998
+ 'env',
999
+ 'morph' + morphNum,
1000
+ 'context',
1001
+ this.stack.pop(), // path
1002
+ this.stack.pop(), // params
1003
+ this.stack.pop() // hash
1004
+ ]);
1005
+ };
1006
+
1007
+ prototype.printContentHook = function(morphNum) {
1008
+ this.printHook('content', [
1009
+ 'env',
1010
+ 'morph' + morphNum,
1011
+ 'context',
1012
+ this.stack.pop() // path
1013
+ ]);
1014
+ };
1015
+
1016
+ prototype.printComponentHook = function(morphNum, templateId) {
1017
+ this.printHook('component', [
1018
+ 'env',
1019
+ 'morph' + morphNum,
1020
+ 'context',
1021
+ this.stack.pop(), // path
1022
+ this.stack.pop(), // attrs
1023
+ templateId === null ? 'null' : 'child' + templateId
1024
+ ]);
1025
+ };
1026
+
1027
+ prototype.printAttributeHook = function(attrMorphNum, elementNum) {
1028
+ this.printHook('attribute', [
1029
+ 'env',
1030
+ 'attrMorph' + attrMorphNum,
1031
+ 'element' + elementNum,
1032
+ this.stack.pop(), // name
1033
+ this.stack.pop() // value
1034
+ ]);
1011
1035
  };
1012
1036
 
1013
1037
  prototype.printElementHook = function(elementNum) {
1014
- this.hooks.element = true;
1015
-
1016
- var path = this.stack.pop();
1017
- var params = this.stack.pop();
1018
- var hash = this.stack.pop();
1019
-
1020
- var options = [];
1021
- options.push('element: element' + elementNum);
1022
-
1023
- var args = ['element' + elementNum, path, 'context', params, hash, quoteHash(options), 'env'];
1024
- this.source.push(this.indent+' element(' + args.join(', ') + ');\n');
1038
+ this.printHook('element', [
1039
+ 'env',
1040
+ 'element' + elementNum,
1041
+ 'context',
1042
+ this.stack.pop(), // path
1043
+ this.stack.pop(), // params
1044
+ this.stack.pop() // hash
1045
+ ]);
1025
1046
  };
1026
1047
 
1027
1048
  prototype.createMorph = function(morphNum, parentPath, startIndex, endIndex, escaped) {
@@ -1037,6 +1058,12 @@ define("htmlbars-compiler/hydration-javascript-compiler",
1037
1058
  this.morphs.push(['morph' + morphNum, morph]);
1038
1059
  };
1039
1060
 
1061
+ prototype.createAttrMorph = function(attrMorphNum, elementNum, name, escaped) {
1062
+ var morphMethod = escaped ? 'createAttrMorph' : 'createUnsafeAttrMorph';
1063
+ var morph = "dom."+morphMethod+"(element"+elementNum+", '"+name+"')";
1064
+ this.morphs.push(['attrMorph' + attrMorphNum, morph]);
1065
+ };
1066
+
1040
1067
  prototype.repairClonedNode = function(blankChildTextNodes, isElementChecked) {
1041
1068
  var parent = this.getParent(),
1042
1069
  processing = 'dom.repairClonedNode('+parent+','+
@@ -1051,11 +1078,14 @@ define("htmlbars-compiler/hydration-javascript-compiler",
1051
1078
  prototype.shareElement = function(elementNum){
1052
1079
  var elementNodesName = "element" + elementNum;
1053
1080
  this.fragmentProcessing.push('var '+elementNodesName+' = '+this.getParent()+';');
1054
- this.parents[this.parents.length-1] = elementNodesName;
1081
+ this.parents[this.parents.length-1] = [elementNodesName];
1055
1082
  };
1056
1083
 
1057
1084
  prototype.consumeParent = function(i) {
1058
- this.parents.push(this.getParent() + '.childNodes[' + i + ']');
1085
+ var newParent = this.lastParent().slice();
1086
+ newParent.push(i);
1087
+
1088
+ this.parents.push(newParent);
1059
1089
  };
1060
1090
 
1061
1091
  prototype.popParent = function() {
@@ -1063,6 +1093,17 @@ define("htmlbars-compiler/hydration-javascript-compiler",
1063
1093
  };
1064
1094
 
1065
1095
  prototype.getParent = function() {
1096
+ var last = this.lastParent().slice();
1097
+ var frag = last.shift();
1098
+
1099
+ if (!last.length) {
1100
+ return frag;
1101
+ }
1102
+
1103
+ return 'dom.childAt(' + frag + ', [' + last.join(', ') + '])';
1104
+ };
1105
+
1106
+ prototype.lastParent = function() {
1066
1107
  return this.parents[this.parents.length-1];
1067
1108
  };
1068
1109
  });
@@ -1099,6 +1140,7 @@ define("htmlbars-compiler/hydration-opcode-compiler",
1099
1140
  this.currentDOMChildIndex = 0;
1100
1141
  this.morphs = [];
1101
1142
  this.morphNum = 0;
1143
+ this.attrMorphNum = 0;
1102
1144
  this.element = null;
1103
1145
  this.elementNum = -1;
1104
1146
  }
@@ -1130,6 +1172,7 @@ define("htmlbars-compiler/hydration-opcode-compiler",
1130
1172
  this.templateId = 0;
1131
1173
  this.currentDOMChildIndex = -1;
1132
1174
  this.morphNum = 0;
1175
+ this.attrMorphNum = 0;
1133
1176
 
1134
1177
  var blockParams = program.blockParams || [];
1135
1178
 
@@ -1191,8 +1234,6 @@ define("htmlbars-compiler/hydration-opcode-compiler",
1191
1234
 
1192
1235
  HydrationOpcodeCompiler.prototype.block = function(block, childIndex, childrenLength) {
1193
1236
  var sexpr = block.sexpr;
1194
- var program = block.program || {};
1195
- var blockParams = program.blockParams || [];
1196
1237
 
1197
1238
  var currentDOMChildIndex = this.currentDOMChildIndex;
1198
1239
  var start = (currentDOMChildIndex < 0) ? null : currentDOMChildIndex;
@@ -1205,7 +1246,7 @@ define("htmlbars-compiler/hydration-opcode-compiler",
1205
1246
  var inverseId = block.inverse === null ? null : this.templateId++;
1206
1247
 
1207
1248
  prepareSexpr(this, sexpr);
1208
- this.opcode('printContentHookForBlockHelper', morphNum, templateId, inverseId, blockParams.length);
1249
+ this.opcode('printBlockHook', morphNum, templateId, inverseId);
1209
1250
  };
1210
1251
 
1211
1252
  HydrationOpcodeCompiler.prototype.component = function(component, childIndex, childrenLength) {
@@ -1244,16 +1285,15 @@ define("htmlbars-compiler/hydration-opcode-compiler",
1244
1285
 
1245
1286
  HydrationOpcodeCompiler.prototype.attribute = function(attr) {
1246
1287
  var value = attr.value;
1247
- var quoted;
1248
-
1288
+ var escaped = true;
1289
+
1249
1290
  // TODO: Introduce context specific AST nodes to avoid switching here.
1250
1291
  if (value.type === 'TextNode') {
1251
1292
  return;
1252
1293
  } else if (value.type === 'MustacheStatement') {
1253
- quoted = false;
1294
+ escaped = value.escaped;
1254
1295
  this.accept(unwrapMustache(value));
1255
1296
  } else if (value.type === 'ConcatStatement') {
1256
- quoted = true;
1257
1297
  prepareParams(this, value.parts);
1258
1298
  this.opcode('pushConcatHook');
1259
1299
  }
@@ -1265,7 +1305,9 @@ define("htmlbars-compiler/hydration-opcode-compiler",
1265
1305
  this.element = null;
1266
1306
  }
1267
1307
 
1268
- this.opcode('printAttributeHook', this.elementNum, value.type === 'ConcatStatement');
1308
+ var attrMorphNum = this.attrMorphNum++;
1309
+ this.opcode('createAttrMorph', attrMorphNum, this.elementNum, attr.name, escaped);
1310
+ this.opcode('printAttributeHook', attrMorphNum, this.elementNum);
1269
1311
  };
1270
1312
 
1271
1313
  HydrationOpcodeCompiler.prototype.elementHelper = function(sexpr) {
@@ -1292,10 +1334,10 @@ define("htmlbars-compiler/hydration-opcode-compiler",
1292
1334
 
1293
1335
  if (isHelper(sexpr)) {
1294
1336
  prepareSexpr(this, sexpr);
1295
- this.opcode('printContentHookForInlineHelper', morphNum);
1337
+ this.opcode('printInlineHook', morphNum);
1296
1338
  } else {
1297
1339
  preparePath(this, sexpr.path);
1298
- this.opcode('printContentHookForAmbiguous', morphNum);
1340
+ this.opcode('printContentHook', morphNum);
1299
1341
  }
1300
1342
  };
1301
1343
 
@@ -1474,16 +1516,26 @@ define("htmlbars-compiler/template-compiler",
1474
1516
  this.getChildTemplateVars(indent + ' ') +
1475
1517
  indent+' return {\n' +
1476
1518
  indent+' isHTMLBars: true,\n' +
1519
+ indent+' blockParams: ' + blockParams.length + ',\n' +
1477
1520
  indent+' cachedFragment: null,\n' +
1521
+ indent+' hasRendered: false,\n' +
1478
1522
  indent+' build: ' + fragmentProgram + ',\n' +
1479
1523
  indent+' render: function render(' + templateSignature + ') {\n' +
1480
1524
  indent+' var dom = env.dom;\n' +
1481
1525
  this.getHydrationHooks(indent + ' ', this.hydrationCompiler.hooks) +
1482
1526
  indent+' dom.detectNamespace(contextualElement);\n' +
1527
+ indent+' var fragment;\n' +
1483
1528
  indent+' if (this.cachedFragment === null) {\n' +
1484
- indent+' this.cachedFragment = this.build(dom);\n' +
1529
+ indent+' fragment = this.build(dom);\n' +
1530
+ indent+' if (this.hasRendered) {\n' +
1531
+ indent+' this.cachedFragment = fragment;\n' +
1532
+ indent+' } else {\n' +
1533
+ indent+' this.hasRendered = true;\n' +
1534
+ indent+' }\n' +
1535
+ indent+' }\n' +
1536
+ indent+' if (this.cachedFragment) {\n' +
1537
+ indent+' fragment = dom.cloneNode(this.cachedFragment, true);\n' +
1485
1538
  indent+' }\n' +
1486
- indent+' var fragment = dom.cloneNode(this.cachedFragment, true);\n' +
1487
1539
  hydrationProgram +
1488
1540
  indent+' return fragment;\n' +
1489
1541
  indent+' }\n' +
@@ -1538,17 +1590,6 @@ define("htmlbars-compiler/template-visitor",
1538
1590
  "use strict";
1539
1591
  var push = Array.prototype.push;
1540
1592
 
1541
- function elementIntroducesNamespace(element, parentElement){
1542
- return (
1543
- // Root element. Those that have a namespace are entered.
1544
- (!parentElement && element.namespaceURI) ||
1545
- // Inner elements to a namespace
1546
- ( parentElement &&
1547
- ( !element.isHTMLIntegrationPoint && parentElement.namespaceURI !== element.namespaceURI )
1548
- )
1549
- );
1550
- }
1551
-
1552
1593
  function Frame() {
1553
1594
  this.parentNode = null;
1554
1595
  this.children = null;
@@ -1669,15 +1710,7 @@ define("htmlbars-compiler/template-visitor",
1669
1710
  parentNode.type === 'Program' && parentFrame.childCount === 1
1670
1711
  ];
1671
1712
 
1672
- var lastNode = parentFrame.childIndex === parentFrame.childCount-1,
1673
- introducesNamespace = elementIntroducesNamespace(element, parentFrame.parentNode);
1674
- if ( !lastNode && introducesNamespace ) {
1675
- elementFrame.actions.push(['setNamespace', [parentNode.namespaceURI]]);
1676
- }
1677
1713
  elementFrame.actions.push(['closeElement', actionArgs]);
1678
- if ( !lastNode && element.isHTMLIntergrationPoint ) {
1679
- elementFrame.actions.push(['setNamespace', []]);
1680
- }
1681
1714
 
1682
1715
  for (var i = element.attributes.length - 1; i >= 0; i--) {
1683
1716
  this.visit(element.attributes[i]);
@@ -1688,14 +1721,8 @@ define("htmlbars-compiler/template-visitor",
1688
1721
  this.visit(element.children[i]);
1689
1722
  }
1690
1723
 
1691
- if ( element.isHTMLIntergrationPoint ) {
1692
- elementFrame.actions.push(['setNamespace', []]);
1693
- }
1694
1724
  elementFrame.actions.push(['openElement', actionArgs.concat([
1695
1725
  elementFrame.mustacheCount, elementFrame.blankChildTextNodes.reverse() ])]);
1696
- if ( introducesNamespace ) {
1697
- elementFrame.actions.push(['setNamespace', [element.namespaceURI]]);
1698
- }
1699
1726
  this.popFrame();
1700
1727
 
1701
1728
  // Propagate the element's frame state to the parent frame
@@ -1863,7 +1890,7 @@ define("htmlbars-syntax/builders",
1863
1890
  __exports__.buildPartial = buildPartial;function buildComment(value) {
1864
1891
  return {
1865
1892
  type: "CommentStatement",
1866
- value: value,
1893
+ value: value
1867
1894
  };
1868
1895
  }
1869
1896
 
@@ -3237,16 +3264,15 @@ define("htmlbars-syntax/handlebars/utils",
3237
3264
  __exports__.appendContextPath = appendContextPath;
3238
3265
  });
3239
3266
  define("htmlbars-syntax/node-handlers",
3240
- ["./builders","./tokens","../htmlbars-util/array-utils","./utils","exports"],
3241
- function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
3267
+ ["./builders","../htmlbars-util/array-utils","./utils","exports"],
3268
+ function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
3242
3269
  "use strict";
3243
3270
  var buildProgram = __dependency1__.buildProgram;
3244
3271
  var buildBlock = __dependency1__.buildBlock;
3245
3272
  var buildHash = __dependency1__.buildHash;
3246
- var Chars = __dependency2__.Chars;
3247
- var forEach = __dependency3__.forEach;
3248
- var appendChild = __dependency4__.appendChild;
3249
- var postprocessProgram = __dependency4__.postprocessProgram;
3273
+ var forEach = __dependency2__.forEach;
3274
+ var appendChild = __dependency3__.appendChild;
3275
+ var postprocessProgram = __dependency3__.postprocessProgram;
3250
3276
 
3251
3277
  var nodeHandlers = {
3252
3278
 
@@ -3282,7 +3308,7 @@ define("htmlbars-syntax/node-handlers",
3282
3308
  delete block.closeStrip;
3283
3309
 
3284
3310
  if (this.tokenizer.state === 'comment') {
3285
- this.tokenizer.token.addChar('{{' + this.sourceForMustache(block) + '}}');
3311
+ this.tokenizer.addChar('{{' + this.sourceForMustache(block) + '}}');
3286
3312
  return;
3287
3313
  }
3288
3314
 
@@ -3302,7 +3328,7 @@ define("htmlbars-syntax/node-handlers",
3302
3328
  delete mustache.strip;
3303
3329
 
3304
3330
  if (this.tokenizer.state === 'comment') {
3305
- this.tokenizer.token.addChar('{{' + this.sourceForMustache(mustache) + '}}');
3331
+ this.tokenizer.addChar('{{' + this.sourceForMustache(mustache) + '}}');
3306
3332
  return;
3307
3333
  }
3308
3334
 
@@ -3380,8 +3406,7 @@ define("htmlbars-syntax/node-handlers",
3380
3406
  function switchToHandlebars(processor) {
3381
3407
  var token = processor.tokenizer.token;
3382
3408
 
3383
- // TODO: Monkey patch Chars.addChar like attributes
3384
- if (token instanceof Chars) {
3409
+ if (token && token.type === 'Chars') {
3385
3410
  processor.acceptToken(token);
3386
3411
  processor.tokenizer.token = null;
3387
3412
  }
@@ -3405,7 +3430,7 @@ define("htmlbars-syntax/node-handlers",
3405
3430
  __exports__["default"] = nodeHandlers;
3406
3431
  });
3407
3432
  define("htmlbars-syntax/parser",
3408
- ["./handlebars/compiler/base","../simple-html-tokenizer","../simple-html-tokenizer/entity-parser","../simple-html-tokenizer/char-refs/full","./node-handlers","./token-handlers","../htmlbars-syntax","exports"],
3433
+ ["./handlebars/compiler/base","./tokenizer","../simple-html-tokenizer/entity-parser","../simple-html-tokenizer/char-refs/full","./node-handlers","./token-handlers","../htmlbars-syntax","exports"],
3409
3434
  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
3410
3435
  "use strict";
3411
3436
  var parse = __dependency1__.parse;
@@ -3522,28 +3547,6 @@ define("htmlbars-syntax/token-handlers",
3522
3547
  voidMap[tagName] = true;
3523
3548
  });
3524
3549
 
3525
- var svgNamespace = "http://www.w3.org/2000/svg",
3526
- // http://www.w3.org/html/wg/drafts/html/master/syntax.html#html-integration-point
3527
- svgHTMLIntegrationPoints = {'foreignObject':true, 'desc':true, 'title':true};
3528
-
3529
- function applyNamespace(tag, element, currentElement){
3530
- if (tag.tagName === 'svg') {
3531
- element.namespaceURI = svgNamespace;
3532
- } else if (
3533
- currentElement.type === 'ElementNode' &&
3534
- currentElement.namespaceURI &&
3535
- !currentElement.isHTMLIntegrationPoint
3536
- ) {
3537
- element.namespaceURI = currentElement.namespaceURI;
3538
- }
3539
- }
3540
-
3541
- function applyHTMLIntegrationPoint(tag, element){
3542
- if (svgHTMLIntegrationPoints[tag.tagName]) {
3543
- element.isHTMLIntegrationPoint = true;
3544
- }
3545
- }
3546
-
3547
3550
  // Except for `mustache`, all tokens are only allowed outside of
3548
3551
  // a start or end tag.
3549
3552
  var tokenHandlers = {
@@ -3566,8 +3569,6 @@ define("htmlbars-syntax/token-handlers",
3566
3569
  end: { line: null, column: null}
3567
3570
  };
3568
3571
 
3569
- applyNamespace(tag, element, this.currentElement());
3570
- applyHTMLIntegrationPoint(tag, element);
3571
3572
  this.elementStack.push(element);
3572
3573
  if (voidMap.hasOwnProperty(tag.tagName) || tag.selfClosing) {
3573
3574
  tokenHandlers.EndTag.call(this, tag);
@@ -3583,39 +3584,38 @@ define("htmlbars-syntax/token-handlers",
3583
3584
  },
3584
3585
 
3585
3586
  MustacheStatement: function(mustache) {
3586
- var state = this.tokenizer.state;
3587
- var token = this.tokenizer.token;
3587
+ var tokenizer = this.tokenizer;
3588
3588
 
3589
- switch(state) {
3589
+ switch(tokenizer.state) {
3590
3590
  // Tag helpers
3591
3591
  case "tagName":
3592
- token.addTagHelper(mustache.sexpr);
3593
- this.tokenizer.state = "beforeAttributeName";
3592
+ tokenizer.addTagHelper(mustache.sexpr);
3593
+ tokenizer.state = "beforeAttributeName";
3594
3594
  return;
3595
3595
  case "beforeAttributeName":
3596
- token.addTagHelper(mustache.sexpr);
3596
+ tokenizer.addTagHelper(mustache.sexpr);
3597
3597
  return;
3598
3598
  case "attributeName":
3599
3599
  case "afterAttributeName":
3600
- this.tokenizer.finalizeAttributeValue();
3601
- token.addTagHelper(mustache.sexpr);
3602
- this.tokenizer.state = "beforeAttributeName";
3600
+ tokenizer.finalizeAttributeValue();
3601
+ tokenizer.addTagHelper(mustache.sexpr);
3602
+ tokenizer.state = "beforeAttributeName";
3603
3603
  return;
3604
3604
  case "afterAttributeValueQuoted":
3605
- token.addTagHelper(mustache.sexpr);
3606
- this.tokenizer.state = "beforeAttributeName";
3605
+ tokenizer.addTagHelper(mustache.sexpr);
3606
+ tokenizer.state = "beforeAttributeName";
3607
3607
  return;
3608
3608
 
3609
3609
  // Attribute values
3610
3610
  case "beforeAttributeValue":
3611
- token.markAttributeQuoted(false);
3612
- token.addToAttributeValue(mustache);
3613
- this.tokenizer.state = 'attributeValueUnquoted';
3611
+ tokenizer.markAttributeQuoted(false);
3612
+ tokenizer.addToAttributeValue(mustache);
3613
+ tokenizer.state = 'attributeValueUnquoted';
3614
3614
  return;
3615
3615
  case "attributeValueDoubleQuoted":
3616
3616
  case "attributeValueSingleQuoted":
3617
3617
  case "attributeValueUnquoted":
3618
- token.addToAttributeValue(mustache);
3618
+ tokenizer.addToAttributeValue(mustache);
3619
3619
  return;
3620
3620
 
3621
3621
  // TODO: Only append child when the tokenizer state makes
@@ -3630,12 +3630,7 @@ define("htmlbars-syntax/token-handlers",
3630
3630
  var parent = this.currentElement();
3631
3631
  var disableComponentGeneration = this.options.disableComponentGeneration === true;
3632
3632
 
3633
- if (element.tag !== tag.tagName) {
3634
- throw new Error(
3635
- "Closing tag `" + tag.tagName + "` (on line " + tag.lastLine + ") " +
3636
- "did not match last open tag `" + element.tag + "` (on line " + element.loc.start.line + ")."
3637
- );
3638
- }
3633
+ validateEndTag(tag, element);
3639
3634
 
3640
3635
  if (disableComponentGeneration || element.tag.indexOf("-") === -1) {
3641
3636
  appendChild(parent, element);
@@ -3651,32 +3646,52 @@ define("htmlbars-syntax/token-handlers",
3651
3646
 
3652
3647
  };
3653
3648
 
3649
+ function validateEndTag(tag, element) {
3650
+ var error;
3651
+
3652
+ if (voidMap[tag.tagName] && element.tag === undefined) {
3653
+ // For void elements, we check element.tag is undefined because endTag is called by the startTag token handler in
3654
+ // the normal case, so checking only voidMap[tag.tagName] would lead to an error being thrown on the opening tag.
3655
+ error = "Invalid end tag " + formatEndTagInfo(tag) + " (void elements cannot have end tags).";
3656
+ } else if (element.tag === undefined) {
3657
+ error = "Closing tag " + formatEndTagInfo(tag) + " without an open tag.";
3658
+ } else if (element.tag !== tag.tagName) {
3659
+ error = "Closing tag " + formatEndTagInfo(tag) + " did not match last open tag `" + element.tag + "` (on line " +
3660
+ element.loc.start.line + ").";
3661
+ }
3662
+
3663
+ if (error) { throw new Error(error); }
3664
+ }
3665
+
3666
+ function formatEndTagInfo(tag) {
3667
+ return "`" + tag.tagName + "` (on line " + tag.lastLine + ")";
3668
+ }
3669
+
3654
3670
  __exports__["default"] = tokenHandlers;
3655
3671
  });
3656
- define("htmlbars-syntax/tokens",
3672
+ define("htmlbars-syntax/tokenizer",
3657
3673
  ["../simple-html-tokenizer","./utils","./builders","exports"],
3658
3674
  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
3659
3675
  "use strict";
3660
- var Chars = __dependency1__.Chars;
3661
- var StartTag = __dependency1__.StartTag;
3662
- var EndTag = __dependency1__.EndTag;
3676
+ var Tokenizer = __dependency1__.Tokenizer;
3663
3677
  var isHelper = __dependency2__.isHelper;
3664
3678
  var builders = __dependency3__["default"];
3665
3679
 
3666
- StartTag.prototype.startAttribute = function(char) {
3680
+ Tokenizer.prototype.createAttribute = function(char) {
3667
3681
  this.currentAttribute = builders.attr(char.toLowerCase(), [], null);
3668
- this.attributes.push(this.currentAttribute);
3682
+ this.token.attributes.push(this.currentAttribute);
3683
+ this.state = 'attributeName';
3669
3684
  };
3670
3685
 
3671
- StartTag.prototype.markAttributeQuoted = function(value) {
3686
+ Tokenizer.prototype.markAttributeQuoted = function(value) {
3672
3687
  this.currentAttribute.quoted = value;
3673
3688
  };
3674
3689
 
3675
- StartTag.prototype.addToAttributeName = function(char) {
3690
+ Tokenizer.prototype.addToAttributeName = function(char) {
3676
3691
  this.currentAttribute.name += char;
3677
3692
  };
3678
3693
 
3679
- StartTag.prototype.addToAttributeValue = function(char) {
3694
+ Tokenizer.prototype.addToAttributeValue = function(char) {
3680
3695
  var value = this.currentAttribute.value;
3681
3696
 
3682
3697
  if (!this.currentAttribute.quoted && value.length > 0 &&
@@ -3702,12 +3717,7 @@ define("htmlbars-syntax/tokens",
3702
3717
  }
3703
3718
  };
3704
3719
 
3705
- StartTag.prototype.finalize = function() {
3706
- this.finalizeAttributeValue();
3707
- return this;
3708
- };
3709
-
3710
- StartTag.prototype.finalizeAttributeValue = function() {
3720
+ Tokenizer.prototype.finalizeAttributeValue = function() {
3711
3721
  if (this.currentAttribute) {
3712
3722
  this.currentAttribute.value = prepareAttributeValue(this.currentAttribute);
3713
3723
  delete this.currentAttribute.quoted;
@@ -3715,8 +3725,8 @@ define("htmlbars-syntax/tokens",
3715
3725
  }
3716
3726
  };
3717
3727
 
3718
- StartTag.prototype.addTagHelper = function(helper) {
3719
- var helpers = this.helpers = this.helpers || [];
3728
+ Tokenizer.prototype.addTagHelper = function(helper) {
3729
+ var helpers = this.token.helpers = this.token.helpers || [];
3720
3730
  helpers.push(helper);
3721
3731
  };
3722
3732
 
@@ -3750,9 +3760,7 @@ define("htmlbars-syntax/tokens",
3750
3760
  }
3751
3761
  }
3752
3762
 
3753
- __exports__.unwrapMustache = unwrapMustache;__exports__.Chars = Chars;
3754
- __exports__.StartTag = StartTag;
3755
- __exports__.EndTag = EndTag;
3763
+ __exports__.unwrapMustache = unwrapMustache;__exports__.Tokenizer = Tokenizer;
3756
3764
  });
3757
3765
  define("htmlbars-syntax/utils",
3758
3766
  ["./builders","exports"],
@@ -6558,39 +6566,50 @@ define("simple-html-tokenizer/tokenizer",
6558
6566
  }
6559
6567
  },
6560
6568
 
6561
- tag: function(Type, char) {
6569
+ createTag: function(Type, char) {
6562
6570
  var lastToken = this.token;
6563
6571
  this.token = new Type(char);
6564
6572
  this.state = 'tagName';
6565
6573
  return lastToken;
6566
6574
  },
6567
6575
 
6576
+ addToTagName: function(char) {
6577
+ this.token.tagName += char;
6578
+ },
6579
+
6568
6580
  selfClosing: function() {
6569
6581
  this.token.selfClosing = true;
6570
6582
  },
6571
6583
 
6572
- attribute: function(char) {
6573
- this.token.startAttribute(char);
6584
+ createAttribute: function(char) {
6585
+ this._currentAttribute = [char.toLowerCase(), "", null];
6586
+ this.token.attributes.push(this._currentAttribute);
6574
6587
  this.state = 'attributeName';
6575
6588
  },
6576
6589
 
6577
6590
  addToAttributeName: function(char) {
6578
- this.token.addToAttributeName(char);
6591
+ this._currentAttribute[0] += char;
6579
6592
  },
6580
6593
 
6581
6594
  markAttributeQuoted: function(value) {
6582
- this.token.markAttributeQuoted(value);
6595
+ this._currentAttribute[2] = value;
6583
6596
  },
6584
6597
 
6585
6598
  finalizeAttributeValue: function() {
6586
- this.token.finalizeAttributeValue();
6599
+ if (this._currentAttribute) {
6600
+ if (this._currentAttribute[2] === null) {
6601
+ this._currentAttribute[2] = false;
6602
+ }
6603
+ this._currentAttribute = undefined;
6604
+ }
6587
6605
  },
6588
6606
 
6589
6607
  addToAttributeValue: function(char) {
6590
- this.token.addToAttributeValue(char);
6608
+ this._currentAttribute[1] = this._currentAttribute[1] || "";
6609
+ this._currentAttribute[1] += char;
6591
6610
  },
6592
6611
 
6593
- commentStart: function() {
6612
+ createComment: function() {
6594
6613
  var lastToken = this.token;
6595
6614
  this.token = new Comment();
6596
6615
  this.state = 'commentStart';
@@ -6598,7 +6617,18 @@ define("simple-html-tokenizer/tokenizer",
6598
6617
  },
6599
6618
 
6600
6619
  addToComment: function(char) {
6601
- this.token.addChar(char);
6620
+ this.addChar(char);
6621
+ },
6622
+
6623
+ addChar: function(char) {
6624
+ this.token.chars += char;
6625
+ },
6626
+
6627
+ finalizeToken: function() {
6628
+ if (this.token.type === 'StartTag') {
6629
+ this.finalizeAttributeValue();
6630
+ }
6631
+ return this.token;
6602
6632
  },
6603
6633
 
6604
6634
  emitData: function() {
@@ -6611,7 +6641,7 @@ define("simple-html-tokenizer/tokenizer",
6611
6641
 
6612
6642
  emitToken: function() {
6613
6643
  this.addLocInfo();
6614
- var lastToken = this.token.finalize();
6644
+ var lastToken = this.finalizeToken();
6615
6645
  this.token = null;
6616
6646
  this.state = 'data';
6617
6647
  return lastToken;
@@ -6623,7 +6653,7 @@ define("simple-html-tokenizer/tokenizer",
6623
6653
  this.markFirst();
6624
6654
  }
6625
6655
 
6626
- this.token.addChar(char);
6656
+ this.addChar(char);
6627
6657
  },
6628
6658
 
6629
6659
  markFirst: function(line, column) {
@@ -6655,7 +6685,6 @@ define("simple-html-tokenizer/tokenizer",
6655
6685
  } else {
6656
6686
  this.column++;
6657
6687
  }
6658
- // console.log(this.state, char);
6659
6688
  return this.states[this.state].call(this, char);
6660
6689
  } else {
6661
6690
  this.addLocInfo(this.line, this.column);
@@ -6682,14 +6711,14 @@ define("simple-html-tokenizer/tokenizer",
6682
6711
  } else if (char === "/") {
6683
6712
  this.state = 'endTagOpen';
6684
6713
  } else if (isAlpha(char)) {
6685
- return this.tag(StartTag, char.toLowerCase());
6714
+ return this.createTag(StartTag, char.toLowerCase());
6686
6715
  }
6687
6716
  },
6688
6717
 
6689
6718
  markupDeclaration: function(char) {
6690
6719
  if (char === "-" && this.input.charAt(this["char"]) === "-") {
6691
6720
  this["char"]++;
6692
- this.commentStart();
6721
+ this.createComment();
6693
6722
  }
6694
6723
  },
6695
6724
 
@@ -6749,7 +6778,7 @@ define("simple-html-tokenizer/tokenizer",
6749
6778
  } else if (char === ">") {
6750
6779
  return this.emitToken();
6751
6780
  } else {
6752
- this.token.addToTagName(char);
6781
+ this.addToTagName(char);
6753
6782
  }
6754
6783
  },
6755
6784
 
@@ -6761,7 +6790,7 @@ define("simple-html-tokenizer/tokenizer",
6761
6790
  } else if (char === ">") {
6762
6791
  return this.emitToken();
6763
6792
  } else {
6764
- this.attribute(char);
6793
+ this.createAttribute(char);
6765
6794
  }
6766
6795
  },
6767
6796
 
@@ -6790,7 +6819,7 @@ define("simple-html-tokenizer/tokenizer",
6790
6819
  return this.emitToken();
6791
6820
  } else {
6792
6821
  this.finalizeAttributeValue();
6793
- this.attribute(char);
6822
+ this.createAttribute(char);
6794
6823
  }
6795
6824
  },
6796
6825
 
@@ -6872,7 +6901,7 @@ define("simple-html-tokenizer/tokenizer",
6872
6901
 
6873
6902
  endTagOpen: function(char) {
6874
6903
  if (isAlpha(char)) {
6875
- this.tag(EndTag, char.toLowerCase());
6904
+ this.createTag(EndTag, char.toLowerCase());
6876
6905
  }
6877
6906
  }
6878
6907
  }
@@ -6889,84 +6918,24 @@ define("simple-html-tokenizer/tokens",
6889
6918
  this.tagName = tagName || '';
6890
6919
  this.attributes = attributes || [];
6891
6920
  this.selfClosing = selfClosing === true;
6892
- this._currentAttribute = undefined;
6893
6921
  }
6894
6922
 
6895
- __exports__.StartTag = StartTag;StartTag.prototype = {
6896
- addToTagName: function(char) {
6897
- this.tagName += char;
6898
- },
6899
-
6900
- startAttribute: function(char) {
6901
- this._currentAttribute = [char.toLowerCase(), "", null];
6902
- this.attributes.push(this._currentAttribute);
6903
- },
6904
-
6905
- addToAttributeName: function(char) {
6906
- this._currentAttribute[0] += char;
6907
- },
6908
-
6909
- markAttributeQuoted: function(value) {
6910
- this._currentAttribute[2] = value;
6911
- },
6912
-
6913
- addToAttributeValue: function(char) {
6914
- this._currentAttribute[1] = this._currentAttribute[1] || "";
6915
- this._currentAttribute[1] += char;
6916
- },
6917
-
6918
- finalizeAttributeValue: function() {
6919
- if (this._currentAttribute) {
6920
- if (this._currentAttribute[2] === null) {
6921
- this._currentAttribute[2] = false;
6922
- }
6923
- this._currentAttribute = undefined;
6924
- }
6925
- },
6926
-
6927
- finalize: function() {
6928
- this.finalizeAttributeValue();
6929
- return this;
6930
- }
6931
- };
6932
-
6933
- function EndTag(tagName) {
6923
+ __exports__.StartTag = StartTag;function EndTag(tagName) {
6934
6924
  this.type = 'EndTag';
6935
6925
  this.tagName = tagName || '';
6936
6926
  }
6937
6927
 
6938
- __exports__.EndTag = EndTag;EndTag.prototype = {
6939
- addToTagName: function(char) {
6940
- this.tagName += char;
6941
- },
6942
- finalize: function () {
6943
- return this;
6944
- }
6945
- };
6946
-
6947
- function Chars(chars) {
6928
+ __exports__.EndTag = EndTag;function Chars(chars) {
6948
6929
  this.type = 'Chars';
6949
6930
  this.chars = chars || "";
6950
6931
  }
6951
6932
 
6952
- __exports__.Chars = Chars;Chars.prototype = {
6953
- addChar: function(char) {
6954
- this.chars += char;
6955
- }
6956
- };
6957
-
6958
- function Comment(chars) {
6933
+ __exports__.Chars = Chars;function Comment(chars) {
6959
6934
  this.type = 'Comment';
6960
6935
  this.chars = chars || '';
6961
6936
  }
6962
6937
 
6963
- __exports__.Comment = Comment;Comment.prototype = {
6964
- addChar: function(char) {
6965
- this.chars += char;
6966
- },
6967
-
6968
- finalize: function() { return this; }
6969
- };
6938
+ __exports__.Comment = Comment;
6970
6939
  });
6971
6940
  define("simple-html-tokenizer/utils",
6972
6941
  ["exports"],