Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: lib/basedomain.js

Issue 4544964214128640: Issue 1841 - Replaced URI class with built-in URL objects (Closed)
Patch Set: Created Jan. 21, 2015, 7:54 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | lib/url.js » ('j') | lib/url.js » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /*! 1 /*!
2 * Parts of original code from ipv6.js <https://github.com/beaugunderson/javascr ipt-ipv6> 2 * Parts of original code from ipv6.js <https://github.com/beaugunderson/javascr ipt-ipv6>
3 * Copyright 2011 Beau Gunderson 3 * Copyright 2011 Beau Gunderson
4 * Available under MIT license <http://mths.be/mit> 4 * Available under MIT license <http://mths.be/mit>
5 */ 5 */
6 6
7 const RE_V4 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|0x[0-9a-f][0-9a-f]?|0 [0-7]{3})\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|0x[0-9a-f][0-9a-f]?|0[0-7 ]{3})$/i; 7 const RE_V4 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|0x[0-9a-f][0-9a-f]?|0 [0-7]{3})\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|0x[0-9a-f][0-9a-f]?|0[0-7 ]{3})$/i;
8 const RE_V4_HEX = /^0x([0-9a-f]{8})$/i; 8 const RE_V4_HEX = /^0x([0-9a-f]{8})$/i;
9 const RE_V4_NUMERIC = /^[0-9]+$/; 9 const RE_V4_NUMERIC = /^[0-9]+$/;
10 const RE_V4inV6 = /(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2 [0-4][0-9]|[01]?[0-9][0-9]?)$/; 10 const RE_V4inV6 = /(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2 [0-4][0-9]|[01]?[0-9][0-9]?)$/;
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 } 135 }
136 136
137 /** 137 /**
138 * Extracts host name from a URL. 138 * Extracts host name from a URL.
139 */ 139 */
140 function extractHostFromURL(/**String*/ url) 140 function extractHostFromURL(/**String*/ url)
141 { 141 {
142 if (url && extractHostFromURL._lastURL == url) 142 if (url && extractHostFromURL._lastURL == url)
143 return extractHostFromURL._lastDomain; 143 return extractHostFromURL._lastDomain;
144 144
145 var host = ""; 145 var host = new URL(url).hostname;
Wladimir Palant 2015/01/21 15:33:44 It's probably better to keep try..catch here - new
kzar 2015/01/21 15:39:28 Oh dang, sad I missed that. I tested new URL("") b
Sebastian Noack 2015/01/21 15:58:04 This code is matter to be removed. In the furutre,
Sebastian Noack 2015/01/21 15:59:20 For reference, the reason this check where previou
146 try
147 {
148 host = new URI(url).host;
149 }
150 catch (e)
151 {
152 // Keep the empty string for invalid URIs.
153 }
154
155 extractHostFromURL._lastURL = url; 146 extractHostFromURL._lastURL = url;
156 extractHostFromURL._lastDomain = host; 147 extractHostFromURL._lastDomain = host;
157 return host; 148 return host;
158 } 149 }
159 150
160 /** 151 /**
161 * Extracts host name from the URL of the given frame. If the URL don't have hos t 152 * Extracts host name from the URL of the given frame. If the URL don't have hos t
162 * information (like about:blank or data: URLs) it falls back to the parent fram e. 153 * information (like about:blank or data: URLs) it falls back to the parent fram e.
163 */ 154 */
164 function extractHostFromFrame(frame) 155 function extractHostFromFrame(frame)
165 { 156 {
166 var host = extractHostFromURL(frame.url); 157 var host = extractHostFromURL(frame.url);
167 if (!host) 158 if (!host)
168 { 159 {
169 var parentFrame = frame.parent; 160 var parentFrame = frame.parent;
170 if (parentFrame) 161 if (parentFrame)
171 return extractHostFromFrame(parentFrame); 162 return extractHostFromFrame(parentFrame);
172 } 163 }
173 return host; 164 return host;
174 } 165 }
175 166
176 /** 167 /**
177 * Strips the fragment from a URL. 168 * Strips the fragment from a URL.
178 */ 169 */
179 function stripFragmentFromURL(/**String*/ url) 170 function stripFragmentFromURL(/**String*/ url)
180 { 171 {
181 return url.replace(/#.*/, ""); 172 return url.replace(/#.*/, "");
182 } 173 }
183
184 /**
185 * Parses URLs and provides an interface similar to nsIURI in Gecko, see
186 * https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIURI.
187 * TODO: Make sure the parsing actually works the same as nsStandardURL.
188 * @constructor
189 */
190 function URI(/**String*/ spec)
191 {
192 this.spec = spec;
193 this._schemeEnd = spec.indexOf(":");
194 if (this._schemeEnd < 0)
195 throw new Error("Invalid URI scheme");
196
197 if (spec.substr(this._schemeEnd + 1, 2) != "//")
198 throw new Error("Unexpected URI structure");
199
200 this._hostPortStart = this._schemeEnd + 3;
201 if (this._hostPortStart == spec.length)
202 throw new Error("Empty URI host");
203
204 this._hostPortEnd = spec.indexOf("/", this._hostPortStart);
205 if (this._hostPortEnd < 0)
206 {
207 var queryIndex = spec.indexOf("?", this._hostPortStart);
208 var fragmentIndex = spec.indexOf("#", this._hostPortStart);
209 if (queryIndex >= 0 && fragmentIndex >= 0)
210 this._hostPortEnd = Math.min(queryIndex, fragmentIndex);
211 else if (queryIndex >= 0)
212 this._hostPortEnd = queryIndex;
213 else if (fragmentIndex >= 0)
214 this._hostPortEnd = fragmentIndex;
215 else
216 this._hostPortEnd = spec.length;
217 }
218
219 var authEnd = spec.indexOf("@", this._hostPortStart);
220 if (authEnd >= 0 && authEnd < this._hostPortEnd)
221 this._hostPortStart = authEnd + 1;
222
223 this._portStart = -1;
224 this._hostEnd = spec.indexOf("]", this._hostPortStart + 1);
225 if (spec[this._hostPortStart] == "[" && this._hostEnd >= 0 && this._hostEnd < this._hostPortEnd)
226 {
227 // The host is an IPv6 literal
228 this._hostStart = this._hostPortStart + 1;
229 if (spec[this._hostEnd + 1] == ":")
230 this._portStart = this._hostEnd + 2;
231 }
232 else
233 {
234 this._hostStart = this._hostPortStart;
235 this._hostEnd = spec.indexOf(":", this._hostStart);
236 if (this._hostEnd >= 0 && this._hostEnd < this._hostPortEnd)
237 this._portStart = this._hostEnd + 1;
238 else
239 this._hostEnd = this._hostPortEnd;
240 }
241 }
242 URI.prototype =
243 {
244 spec: null,
245 get scheme()
246 {
247 return this.spec.substring(0, this._schemeEnd).toLowerCase();
248 },
249 get host()
250 {
251 return this.spec.substring(this._hostStart, this._hostEnd);
252 },
253 get asciiHost()
254 {
255 var host = this.host;
256 if (/^[\x00-\x7F]+$/.test(host))
257 return host;
258 else
259 return punycode.toASCII(host);
260 },
261 get hostPort()
262 {
263 return this.spec.substring(this._hostPortStart, this._hostPortEnd);
264 },
265 get port()
266 {
267 if (this._portStart < 0)
268 return -1;
269 else
270 return parseInt(this.spec.substring(this._portStart, this._hostPortEnd), 1 0);
271 },
272 get path()
273 {
274 return this.spec.substring(this._hostPortEnd);
275 },
276 get prePath()
277 {
278 return this.spec.substring(0, this._hostPortEnd);
279 }
280 };
OLDNEW
« no previous file with comments | « no previous file | lib/url.js » ('j') | lib/url.js » ('J')

Powered by Google App Engine
This is Rietveld