1 // Copyright (c) 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. 4 5 #include "chrome/common/custom_handlers/protocol_handler.h" 6 7 #include "base/strings/string_util.h" 8 #include "base/strings/utf_string_conversions.h" 9 #include "net/base/escape.h" 10 11 12 ProtocolHandler::ProtocolHandler(const std::string& protocol, 13 const GURL& url, 14 const base::string16& title) 15 : protocol_(protocol), 16 url_(url), 17 title_(title) { 18 } 19 20 ProtocolHandler ProtocolHandler::CreateProtocolHandler( 21 const std::string& protocol, 22 const GURL& url, 23 const base::string16& title) { 24 std::string lower_protocol = StringToLowerASCII(protocol); 25 return ProtocolHandler(lower_protocol, url, title); 26 } 27 28 ProtocolHandler::ProtocolHandler() { 29 } 30 31 bool ProtocolHandler::IsValidDict(const base::DictionaryValue* value) { 32 return value->HasKey("protocol") && value->HasKey("url") && 33 value->HasKey("title"); 34 } 35 36 bool ProtocolHandler::IsSameOrigin( 37 const ProtocolHandler& handler) const { 38 return handler.url().GetOrigin() == url_.GetOrigin(); 39 } 40 41 const ProtocolHandler& ProtocolHandler::EmptyProtocolHandler() { 42 static const ProtocolHandler* const kEmpty = new ProtocolHandler(); 43 return *kEmpty; 44 } 45 46 ProtocolHandler ProtocolHandler::CreateProtocolHandler( 47 const base::DictionaryValue* value) { 48 if (!IsValidDict(value)) { 49 return EmptyProtocolHandler(); 50 } 51 std::string protocol, url; 52 base::string16 title; 53 value->GetString("protocol", &protocol); 54 value->GetString("url", &url); 55 value->GetString("title", &title); 56 return ProtocolHandler::CreateProtocolHandler(protocol, GURL(url), title); 57 } 58 59 GURL ProtocolHandler::TranslateUrl(const GURL& url) const { 60 std::string translatedUrlSpec(url_.spec()); 61 ReplaceSubstringsAfterOffset(&translatedUrlSpec, 0, "%s", 62 net::EscapeQueryParamValue(url.spec(), true)); 63 return GURL(translatedUrlSpec); 64 } 65 66 base::DictionaryValue* ProtocolHandler::Encode() const { 67 base::DictionaryValue* d = new base::DictionaryValue(); 68 d->Set("protocol", new base::StringValue(protocol_)); 69 d->Set("url", new base::StringValue(url_.spec())); 70 d->Set("title", new base::StringValue(title_)); 71 return d; 72 } 73 74 #if !defined(NDEBUG) 75 std::string ProtocolHandler::ToString() const { 76 return "{ protocol=" + protocol_ + 77 ", url=" + url_.spec() + 78 ", title=" + UTF16ToASCII(title_) + 79 " }"; 80 } 81 #endif 82 83 bool ProtocolHandler::operator==(const ProtocolHandler& other) const { 84 return protocol_ == other.protocol_ && 85 url_ == other.url_ && 86 title_ == other.title_; 87 } 88 89 bool ProtocolHandler::IsEquivalent(const ProtocolHandler& other) const { 90 return protocol_ == other.protocol_ && url_ == other.url_; 91 } 92 93 bool ProtocolHandler::operator<(const ProtocolHandler& other) const { 94 return title_ < other.title_; 95 } 96