18f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian/*
22fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (c) 2008, 2009, 2011 Google Inc. All rights reserved.
38f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *
48f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Redistribution and use in source and binary forms, with or without
58f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * modification, are permitted provided that the following conditions are
68f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * met:
78f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *
88f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *     * Redistributions of source code must retain the above copyright
98f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * notice, this list of conditions and the following disclaimer.
108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *     * Redistributions in binary form must reproduce the above
118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * copyright notice, this list of conditions and the following disclaimer
128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * in the documentation and/or other materials provided with the
138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * distribution.
148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *     * Neither the name of Google Inc. nor the names of its
158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * contributors may be used to endorse or promote products derived from
168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * this software without specific prior written permission.
178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *
188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian */
308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifndef KURLGooglePrivate_h
328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#define KURLGooglePrivate_h
338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/text/CString.h>
358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <googleurl/src/url_parse.h>
378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <googleurl/src/url_canon.h>
388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiannamespace WebCore {
408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    class KURL;
428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    class TextEncoding;
438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Wraps the internals related to using Google-URL as the backend for KURL.
458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // This maintains the state and has auxiliary functions so that we don't need
468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // to uglify KURL.h while allowing Google-URL to be evaluated.
478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    class KURLGooglePrivate {
488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    public:
498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        KURLGooglePrivate();
508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        KURLGooglePrivate(const url_parse::Parsed&, bool isValid);
512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        KURLGooglePrivate(WTF::HashTableDeletedValueType);
528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // Initializes the object. This will call through the backend initializer
542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // below.
558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        void init(const KURL& base, const String& relative,
568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                  const TextEncoding* queryEncoding);
578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // Backend initializer. The query encoding parameters are optional and can
592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // be 0 (this implies UTF-8). This initializer requires that the object
602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // has just been created and the strings are null. Do not call on an
618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // already-constructed object.
622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        template <typename CHAR>
632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        void init(const KURL& base, const CHAR* rel, int relLength,
648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                  const TextEncoding* queryEncoding);
658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // Does a deep copy to the given output object.
678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        void copyTo(KURLGooglePrivate* dest) const;
688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // Returns the substring of the input identified by the given component.
708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        String componentString(const url_parse::Component&) const;
718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // Replaces the given components, modifying the current URL. The current
738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // URL must be valid.
748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        typedef url_canon::Replacements<url_parse::UTF16Char> Replacements;
758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        void replaceComponents(const Replacements&);
768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // Setters for the data. Using the ASCII version when you know the
788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // data is ASCII will be slightly more efficient. The UTF-8 version
798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // will always be correct if the caller is unsure.
808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        void setUtf8(const CString&);
818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        void setAscii(const CString&);
828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // TODO(brettw) we can support an additional optimization.  Make this
848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // buffer support both optinal Strings and UTF-8 data. This way, we can use
858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // the optimization from the original KURL which uses = with the original
868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // string when canonicalization did not change it. This allows the strings
878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // to share a buffer internally, and saves a malloc.
888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // Getters for the data.
908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        const CString& utf8String() const { return m_utf8; }
918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        const String& string() const;
928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        bool m_isValid;
948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        bool m_protocolInHTTPFamily;
958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        url_parse::Parsed m_parsed; // Indexes into the UTF-8 version of the string.
968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    private:
988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        void initProtocolInHTTPFamily();
998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        CString m_utf8;
1018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // Set to true when the caller set us using the ASCII setter. We can
1038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // be more efficient when we know there is no UTF-8 to worry about.
1048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // This flag is currently always correct, but should be changed to be a
1058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        // hint (see setUtf8).
1068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        bool m_utf8IsASCII;
1078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        mutable bool m_stringIsValid;
1098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        mutable String m_string;
1108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    };
1118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} // namespace WebCore
1138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif
115