devote / HTML5-History-API

HTML5 History API expansion for browsers not supporting pushState, replaceState
http://spb-piksel.ru
MIT License
1.02k stars 182 forks source link

Regex parsing the URL is not handing Chrome Apps #87

Closed jarrodek closed 8 years ago

jarrodek commented 8 years ago

Regex defined in history.js in line 416 do not parse chrome-extension:// protocol properly.

Chrome apps don't have history API and for some libraries to work the app need to include a polyfil.

Expected outcome

Function parseURL() returns: _href - without undefined values protocol - is chrome-extension:// host - is not undefined _hostname - is not undefined

Actual outcome

The result variable - after parsing the URL - have following values:

[
  "chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo/!dataimport",
  null,
  null,
  null,
  "chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo/!dataimport",
  null,
  null
]

So in case of my application result of calling this function is:

{
  "_href": "undefined//undefinedchrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo/!dataimport",
  "_host": "undefined",
  "_port": "",
  "_pathname": "chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo/!dataimport",
  "_search": "",
  "_hash": "",
  "_relative": "chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo/!dataimport",
  "_nohash": "chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo/!dataimport",
  "_special": "chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo/!dataimport"
}

Suggested solution

Replace first \w+ in the re regex in referenced line to characters range for all letters and dash: [a-zA-Z\-]+. So the final regex would be: /(?:([a-zA-Z\-]+\:))?(?:\/\/(?:[^@]*@)?([^\/:\?#]+)(?::([0-9]+))?)?([^\?#]*)(?:(\?[^#]+)|\?)?(?:(#.*))?/