Roll src/third_party/WebKit d9c6159:8139f33 (svn 201974:201975)
[chromium-blink-merge.git] / net / base / mac / url_conversions.mm
blob3171c6fde6538a6051f218c3e585478dcd82f7db
1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #import "net/base/mac/url_conversions.h"
7 #import <Foundation/Foundation.h>
9 #include "base/mac/scoped_nsobject.h"
10 #include "net/base/escape.h"
11 #include "url/gurl.h"
12 #include "url/url_canon.h"
14 namespace net {
16 NSURL* NSURLWithGURL(const GURL& url) {
17   if (!url.is_valid())
18     return nil;
20   // NSURL strictly enforces RFC 1738 which requires that certain characters
21   // are always encoded. These characters are: "<", ">", """, "#", "%", "{",
22   // "}", "|", "\", "^", "~", "[", "]", and "`".
23   //
24   // GURL leaves some of these characters unencoded in the path, query, and
25   // ref. This function manually encodes those components, and then passes the
26   // result to NSURL.
27   GURL::Replacements replacements;
28   std::string escaped_path = EscapeNSURLPrecursor(url.path());
29   std::string escaped_query = EscapeNSURLPrecursor(url.query());
30   std::string escaped_ref = EscapeNSURLPrecursor(url.ref());
31   if (!escaped_path.empty()) {
32     replacements.SetPath(escaped_path.c_str(),
33                          url::Component(0, escaped_path.size()));
34   }
35   if (!escaped_query.empty()) {
36     replacements.SetQuery(escaped_query.c_str(),
37                           url::Component(0, escaped_query.size()));
38   }
39   if (!escaped_ref.empty()) {
40     replacements.SetRef(escaped_ref.c_str(),
41                         url::Component(0, escaped_ref.size()));
42   }
43   GURL escaped_url = url.ReplaceComponents(replacements);
45   base::scoped_nsobject<NSString> escaped_url_string(
46       [[NSString alloc] initWithUTF8String:escaped_url.spec().c_str()]);
47   return [NSURL URLWithString:escaped_url_string];
50 GURL GURLWithNSURL(NSURL* url) {
51   if (url)
52     return GURL([[url absoluteString] UTF8String]);
53   return GURL();
56 }  // namespace net