@@ -48,6 +48,8 @@ function RuleSet(name, match_rule, default_off) {
4848 }
4949}
5050
51+ var dom_parser = Cc [ "@mozilla.org/xmlextras/domparser;1" ] . createInstance ( Ci . nsIDOMParser ) ;
52+
5153RuleSet . prototype = {
5254 _apply : function ( urispec ) {
5355 // return null if it does not apply
@@ -228,52 +230,52 @@ const RuleWriter = {
228230 }
229231
230232 sstream . close ( ) ;
231- fstream . close ( ) ;
233+ fstream . close ( ) ;
234+ // XXX: With DOMParser, we probably do not need to throw away the XML
235+ // declaration anymore nowadays.
232236 data = data . replace ( / < \? x m l [ ^ > ] * \? > / , "" ) ;
233237 try {
234- data = data . replace ( / < \? x m l [ ^ > ] * \? > / , "" ) ;
235- var xmlrulesets = XML ( data ) ;
238+ var xmlrulesets = dom_parser . parseFromString ( data , "text/xml" ) ;
236239 } catch ( e ) { // file has been corrupted; XXX: handle error differently
237240 this . log ( WARN , "Error in XML file: " + file . path + "\n" + e ) ;
238241 return null ;
239242 }
240243 this . parseXmlRulesets ( xmlrulesets , rule_store , file ) ;
241244 } ,
242245
243- parseXmlRulesets : function ( xmlblob , rule_store , file ) {
244- // Iterate over all the <ruleset>...</ruleset> elements in the file, and
245- // add them to the rule_store HTTPSRules object.
246- if ( xmlblob . @name != xmlblob . @nonexistantthing ) {
247- // The root of the XML tree has a name, which means it should be single a ruleset...
248- this . parseOneRuleset ( xmlblob , rule_store , file ) ;
246+
247+ parseXmlRulesets : function ( xmldom , rule_store , file ) {
248+ // XML input files can either be a <ruleset> in a file, or a
249+ // <rulesetlibrary> with many <rulesets> inside it (the latter form exists
250+ // because ZIP does a much better job of compressing it).
251+ if ( xmldom . documentElement . nodeName == "ruleset" ) {
252+ // This is a single ruleset.
253+ this . parseOneRuleset ( xmldom . documentElement , rule_store , file ) ;
249254 } else {
250- // The root of the XML tree should be a <rulesetlibrary> with many
251- // <ruleset> children
252- var lngth = xmlblob . ruleset . length ( ) ; // premature optimisation
255+ // The root of the XML tree is assumed to look like a <rulesetlibrary>
256+ var lngth = xmldom . documentElement . getElementsByTagName ( "ruleset" ) . length ; // premature optimisation
253257 if ( lngth == 0 && ( file . path . search ( "00README" ) == - 1 ) )
254258 this . log ( WARN , "Probable <rulesetlibrary> with no <rulesets> in "
255- + file . path + "\n" + xmlblob ) ;
259+ + file . path + "\n" + xmldom ) ;
256260 for ( var j = 0 ; j < lngth ; j ++ )
257- this . parseOneRuleset ( xmlblob . ruleset [ j ] , rule_store , file ) ;
261+ this . parseOneRuleset ( xmldom . getElementsByTagName ( " ruleset" ) [ j ] , rule_store , file ) ;
258262 }
259263 } ,
260264
261265 parseOneRuleset : function ( xmlruleset , rule_store , file ) {
262- // Extract an xmlrulset into the rulestore
263- this . log ( DBUG , "Parsing " + xmlruleset . @name + " from " + file . path ) ;
264-
265- if ( xmlruleset . @name == xmlruleset . @nonexistantthing ) {
266+ // Extract an xmlruleset into the rulestore
267+ if ( ! xmlruleset . getAttribute ( "name" ) ) {
266268 this . log ( WARN , "This blob: '" + xmlruleset + "' is not a ruleset\n" ) ;
267269 return null ;
268270 }
269271
270- var match_rl = null ;
271- var dflt_off = null ;
272- if ( xmlruleset . @ match_rule . length ( ) > 0 ) match_rl = xmlruleset . @ match_rule ;
273- if ( xmlruleset . @ default_off . length ( ) > 0 ) dflt_off = xmlruleset . @ default_off ;
274- var rs = new RuleSet ( xmlruleset . @ name , match_rl , dflt_off ) ;
272+ this . log ( DBUG , "Parsing " + xmlruleset . getAttribute ( "name" ) + " from " + file . path ) ;
273+
274+ var match_rl = xmlruleset . getAttribute ( " match_rule" ) ;
275+ var dflt_off = xmlruleset . getAttribute ( " default_off" ) ;
276+ var rs = new RuleSet ( xmlruleset . getAttribute ( " name" ) , xmlruleset . getAttribute ( "f" ) , match_rl , dflt_off ) ;
275277
276- if ( xmlruleset . target . length ( ) == 0 ) {
278+ if ( xmlruleset . getElementsByTagName ( " target" ) . length == 0 ) {
277279 var msg = "Error: As of v0.3.0, XML rulesets require a target domain entry," ;
278280 msg = msg + "\nbut " + file . path + " is missing one." ;
279281 this . log ( WARN , msg ) ;
@@ -289,8 +291,8 @@ const RuleWriter = {
289291
290292 // add this ruleset into HTTPSRules.targets with all of the applicable
291293 // target host indexes
292- for ( var i = 0 ; i < xmlruleset . target . length ( ) ; i ++ ) {
293- var host = xmlruleset . target [ i ] . @ host ;
294+ for ( var i = 0 ; i < xmlruleset . getElementsByTagName ( " target" ) . length ; i ++ ) {
295+ var host = xmlruleset . getElementsByTagName ( " target" ) [ i ] . getAttribute ( " host" ) ;
294296 if ( ! host ) {
295297 this . log ( WARN , "<target> missing host in " + file . path ) ;
296298 return null ;
@@ -300,20 +302,20 @@ const RuleWriter = {
300302 rule_store . targets [ host ] . push ( rs ) ;
301303 }
302304
303- for ( var i = 0 ; i < xmlruleset . exclusion . length ( ) ; i ++ ) {
304- var exclusion = new Exclusion ( xmlruleset . exclusion [ i ] . @ pattern ) ;
305+ for ( var i = 0 ; i < xmlruleset . getElementsByTagName ( " exclusion" ) . length ; i ++ ) {
306+ var exclusion = new Exclusion ( xmlruleset . getElementsByTagName ( " exclusion" ) [ i ] . getAttribute ( " pattern" ) ) ;
305307 rs . exclusions . push ( exclusion ) ;
306308 }
307309
308- for ( var i = 0 ; i < xmlruleset . rule . length ( ) ; i ++ ) {
309- var rule = new Rule ( xmlruleset . rule [ i ] . @ from ,
310- xmlruleset . rule [ i ] . @ to ) ;
310+ for ( var i = 0 ; i < xmlruleset . getElementsByTagName ( " rule" ) . length ; i ++ ) {
311+ var rule = new Rule ( xmlruleset . getElementsByTagName ( " rule" ) [ i ] . getAttribute ( " from" ) ,
312+ xmlruleset . getElementsByTagName ( " rule" ) [ i ] . getAttribute ( "to" ) ) ;
311313 rs . rules . push ( rule ) ;
312314 }
313315
314- for ( var i = 0 ; i < xmlruleset . securecookie . length ( ) ; i ++ ) {
315- var c_rule = new CookieRule ( xmlruleset . securecookie [ i ] . @ host ,
316- xmlruleset . securecookie [ i ] . @ name ) ;
316+ for ( var i = 0 ; i < xmlruleset . getElementsByTagName ( " securecookie" ) . length ; i ++ ) {
317+ var c_rule = new CookieRule ( xmlruleset . getElementsByTagName ( " securecookie" ) [ i ] . getAttribute ( " host" ) ,
318+ xmlruleset . getElementsByTagName ( " securecookie" ) [ i ] . getAttribute ( " name" ) ) ;
317319 rs . cookierules . push ( c_rule ) ;
318320 this . log ( DBUG , "Cookie rule " + c_rule . host + " " + c_rule . name ) ;
319321 }
0 commit comments