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.
5 #include "chrome/common/custom_handlers/protocol_handler.h"
7 #include "base/strings/string_util.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "net/base/escape.h"
12 ProtocolHandler::ProtocolHandler(const std::string
& protocol
,
14 const base::string16
& title
)
15 : protocol_(protocol
),
20 ProtocolHandler
ProtocolHandler::CreateProtocolHandler(
21 const std::string
& protocol
,
23 const base::string16
& title
) {
24 std::string lower_protocol
= StringToLowerASCII(protocol
);
25 return ProtocolHandler(lower_protocol
, url
, title
);
28 ProtocolHandler::ProtocolHandler() {
31 bool ProtocolHandler::IsValidDict(const base::DictionaryValue
* value
) {
32 return value
->HasKey("protocol") && value
->HasKey("url") &&
33 value
->HasKey("title");
36 bool ProtocolHandler::IsSameOrigin(
37 const ProtocolHandler
& handler
) const {
38 return handler
.url().GetOrigin() == url_
.GetOrigin();
41 const ProtocolHandler
& ProtocolHandler::EmptyProtocolHandler() {
42 static const ProtocolHandler
* const kEmpty
= new ProtocolHandler();
46 ProtocolHandler
ProtocolHandler::CreateProtocolHandler(
47 const base::DictionaryValue
* value
) {
48 if (!IsValidDict(value
)) {
49 return EmptyProtocolHandler();
51 std::string protocol
, url
;
53 value
->GetString("protocol", &protocol
);
54 value
->GetString("url", &url
);
55 value
->GetString("title", &title
);
56 return ProtocolHandler::CreateProtocolHandler(protocol
, GURL(url
), title
);
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
);
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_
));
75 std::string
ProtocolHandler::ToString() const {
76 return "{ protocol=" + protocol_
+
77 ", url=" + url_
.spec() +
78 ", title=" + base::UTF16ToASCII(title_
) +
83 bool ProtocolHandler::operator==(const ProtocolHandler
& other
) const {
84 return protocol_
== other
.protocol_
&&
86 title_
== other
.title_
;
89 bool ProtocolHandler::IsEquivalent(const ProtocolHandler
& other
) const {
90 return protocol_
== other
.protocol_
&& url_
== other
.url_
;
93 bool ProtocolHandler::operator<(const ProtocolHandler
& other
) const {
94 return title_
< other
.title_
;