protocol_handler.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/custom_handlers/protocol_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProtocolHandler::ProtocolHandler(const std::string& protocol, 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : protocol_(protocol), 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_(url), 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_(title) { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProtocolHandler ProtocolHandler::CreateProtocolHandler( 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& protocol, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string lower_protocol = StringToLowerASCII(protocol); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ProtocolHandler(lower_protocol, url, title); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProtocolHandler::ProtocolHandler() { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ProtocolHandler::IsValidDict(const base::DictionaryValue* value) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->HasKey("protocol") && value->HasKey("url") && 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->HasKey("title"); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProtocolHandler::IsSameOrigin( 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProtocolHandler& handler) const { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handler.url().GetOrigin() == url_.GetOrigin(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ProtocolHandler& ProtocolHandler::EmptyProtocolHandler() { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const ProtocolHandler* const kEmpty = new ProtocolHandler(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *kEmpty; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProtocolHandler ProtocolHandler::CreateProtocolHandler( 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* value) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsValidDict(value)) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return EmptyProtocolHandler(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string protocol, url; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->GetString("protocol", &protocol); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->GetString("url", &url); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->GetString("title", &title); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ProtocolHandler::CreateProtocolHandler(protocol, GURL(url), title); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL ProtocolHandler::TranslateUrl(const GURL& url) const { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string translatedUrlSpec(url_.spec()); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReplaceSubstringsAfterOffset(&translatedUrlSpec, 0, "%s", 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::EscapeQueryParamValue(url.spec(), true)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(translatedUrlSpec); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::DictionaryValue* ProtocolHandler::Encode() const { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* d = new base::DictionaryValue(); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) d->Set("protocol", new base::StringValue(protocol_)); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) d->Set("url", new base::StringValue(url_.spec())); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) d->Set("title", new base::StringValue(title_)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return d; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(NDEBUG) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ProtocolHandler::ToString() const { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "{ protocol=" + protocol_ + 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ", url=" + url_.spec() + 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ", title=" + UTF16ToASCII(title_) + 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }"; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProtocolHandler::operator==(const ProtocolHandler& other) const { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return protocol_ == other.protocol_ && 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_ == other.url_ && 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_ == other.title_; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProtocolHandler::IsEquivalent(const ProtocolHandler& other) const { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return protocol_ == other.protocol_ && url_ == other.url_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProtocolHandler::operator<(const ProtocolHandler& other) const { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title_ < other.title_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 96