@@ -55,14 +55,27 @@ CSSOM.parse = function parse(token) {
5555
5656 var atKeyframesRegExp = / @ ( - (?: \w + - ) + ) ? k e y f r a m e s / g;
5757
58+ var lineNumber = 1 ,
59+ charNumber = 0 ,
60+ parseError = function ( msg ) {
61+ var err = new Error ( msg + ' at Line ' + lineNumber + ', char ' + charNumber , null , lineNumber ) ;
62+ err . line = lineNumber ;
63+ err . char = charNumber ;
64+ err . styleSheet = styleSheet ;
65+ throw err ;
66+ } ;
67+
68+
5869 for ( var character ; character = token . charAt ( i ) ; i ++ ) {
5970
6071 switch ( character ) {
6172
73+ case "\n" :
74+ lineNumber += 1 ;
75+ charNumber = 0 ;
6276 case " " :
6377 case "\t" :
6478 case "\r" :
65- case "\n" :
6679 case "\f" :
6780 if ( SIGNIFICANT_WHITESPACE [ state ] ) {
6881 buffer += character ;
@@ -73,7 +86,7 @@ CSSOM.parse = function parse(token) {
7386 case '"' :
7487 index = token . indexOf ( '"' , i + 1 ) + 1 ;
7588 if ( ! index ) {
76- throw '" is missing' ;
89+ parseError ( 'Unmatched "' ) ;
7790 }
7891 buffer += token . slice ( i , index ) ;
7992 i = index - 1 ;
@@ -90,7 +103,7 @@ CSSOM.parse = function parse(token) {
90103 case "'" :
91104 index = token . indexOf ( "'" , i + 1 ) + 1 ;
92105 if ( ! index ) {
93- throw "' is missing" ;
106+ parseError ( "Unmatched '" ) ;
94107 }
95108 buffer += token . slice ( i , index ) ;
96109 i = index - 1 ;
@@ -110,7 +123,7 @@ CSSOM.parse = function parse(token) {
110123 i += 2 ;
111124 index = token . indexOf ( "*/" , i ) ;
112125 if ( index === - 1 ) {
113- throw new SyntaxError ( "Missing */" ) ;
126+ parseError ( "Missing */" ) ;
114127 } else {
115128 i = index + 1 ;
116129 }
@@ -214,7 +227,7 @@ CSSOM.parse = function parse(token) {
214227 if ( state === 'value' ) {
215228 index = token . indexOf ( ')' , i + 1 ) ;
216229 if ( index === - 1 ) {
217- throw i + ': unclosed "("';
230+ parseError ( 'Unmatched "("') ;
218231 }
219232 buffer += token . slice ( i , index + 1 ) ;
220233 i = index ;
@@ -283,7 +296,7 @@ CSSOM.parse = function parse(token) {
283296 case "selector" :
284297 // End of media rule.
285298 if ( ! parentRule ) {
286- throw "unexpected }";
299+ parseError ( "Unexpected }") ;
287300 }
288301 currentScope . __ends = i + 1 ;
289302 // Nesting rules aren't supported yet
@@ -316,6 +329,8 @@ CSSOM.parse = function parse(token) {
316329 buffer += character ;
317330 break ;
318331 }
332+
333+ charNumber += 1 ;
319334 }
320335
321336 return styleSheet ;
0 commit comments