Reviewed by Anders.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 3 May 2007 16:23:53 +0000 (16:23 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 3 May 2007 16:23:53 +0000 (16:23 +0000)
        - make ICU initialization lazy to speed up application start-up time
          (when it includes an initial webpage load)

        * platform/TextCodecICU.h: Replaced registerEncodingNames and
        registerCodecs with registerBaseEncodingNames, registerBaseCodecs,
        registerExtendedEncodingNames, and registerExtendedCodecs.
        * platform/TextCodecICU.cpp:
        (WebCore::newTextCodecICU): Moved up to the top of the file.
        (WebCore::TextCodecICU::registerBaseEncodingNames): Added. Registers
        just UTF-8.
        (WebCore::TextCodecICU::registerBaseCodecs): Ditto.
        (WebCore::TextCodecICU::registerExtendedEncodingNames): Renamed.
        (WebCore::TextCodecICU::registerExtendedCodecs): Ditto.
        (WebCore::TextCodecICU::createICUConverter): Compare with the name
        "GBK" in a way that does not require extending the maps.

        * platform/TextEncoding.cpp:
        (WebCore::TextEncoding::usesVisualOrdering): Added code so this will
        just return false if we haven't used any extended encoding names yet.
        The result will be correct, and we won't ask for an encoding name that
        will require registering the extended encoding names.
        (WebCore::TextEncoding::isJapanese): Ditto.
        (WebCore::TextEncoding::backslashAsCurrencySymbol): Ditto, but return
        a backslash instead of false.

        * platform/TextEncodingRegistry.h: Added a new function named
         noExtendedTextEncodingNameUsed.
        * platform/TextEncodingRegistry.cpp:
        (WebCore::buildBaseTextCodecMaps): Added. Registers the base encodings,
        including Latin-1 because it's the default, and the UTF encodings.
        (WebCore::extendTextCodecMaps): Added. Registers all the other encodings.
        (WebCore::newTextCodec): Removed the all to buildTextCodecMap because
        we always build the map when making the canonical encoding name.
        (WebCore::atomicCanonicalTextEncodingName): Changed code to build only
        the base maps at first, then extend the maps the first time we run into
        a name we don't know.
        (WebCore::noExtendedTextEncodingNameUsed): Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@21227 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/platform/TextCodecICU.cpp
WebCore/platform/TextCodecICU.h
WebCore/platform/TextEncoding.cpp
WebCore/platform/TextEncodingRegistry.cpp
WebCore/platform/TextEncodingRegistry.h

index c54a334..d1e434e 100644 (file)
@@ -1,3 +1,45 @@
+2007-05-03  Darin Adler  <darin@apple.com>
+
+        Reviewed by Anders.
+
+        - make ICU initialization lazy to speed up application start-up time
+          (when it includes an initial webpage load)
+
+        * platform/TextCodecICU.h: Replaced registerEncodingNames and
+        registerCodecs with registerBaseEncodingNames, registerBaseCodecs,
+        registerExtendedEncodingNames, and registerExtendedCodecs.
+        * platform/TextCodecICU.cpp:
+        (WebCore::newTextCodecICU): Moved up to the top of the file.
+        (WebCore::TextCodecICU::registerBaseEncodingNames): Added. Registers
+        just UTF-8.
+        (WebCore::TextCodecICU::registerBaseCodecs): Ditto.
+        (WebCore::TextCodecICU::registerExtendedEncodingNames): Renamed.
+        (WebCore::TextCodecICU::registerExtendedCodecs): Ditto.
+        (WebCore::TextCodecICU::createICUConverter): Compare with the name
+        "GBK" in a way that does not require extending the maps.
+
+        * platform/TextEncoding.cpp:
+        (WebCore::TextEncoding::usesVisualOrdering): Added code so this will
+        just return false if we haven't used any extended encoding names yet.
+        The result will be correct, and we won't ask for an encoding name that
+        will require registering the extended encoding names.
+        (WebCore::TextEncoding::isJapanese): Ditto.
+        (WebCore::TextEncoding::backslashAsCurrencySymbol): Ditto, but return
+        a backslash instead of false.
+
+        * platform/TextEncodingRegistry.h: Added a new function named
+         noExtendedTextEncodingNameUsed.
+        * platform/TextEncodingRegistry.cpp:
+        (WebCore::buildBaseTextCodecMaps): Added. Registers the base encodings,
+        including Latin-1 because it's the default, and the UTF encodings.
+        (WebCore::extendTextCodecMaps): Added. Registers all the other encodings.
+        (WebCore::newTextCodec): Removed the all to buildTextCodecMap because
+        we always build the map when making the canonical encoding name.
+        (WebCore::atomicCanonicalTextEncodingName): Changed code to build only
+        the base maps at first, then extend the maps the first time we run into
+        a name we don't know.
+        (WebCore::noExtendedTextEncodingNameUsed): Added.
+
 2007-05-03  Mark Rowe  <mrowe@apple.com>
 
         Qt build fix.  In r21185 the Qt version of WebCore::scaleDragImage was
index a679f13..be515cc 100644 (file)
@@ -43,12 +43,27 @@ const size_t ConversionBufferSize = 16384;
     
 static UConverter* cachedConverterICU;
 
+static auto_ptr<TextCodec> newTextCodecICU(const TextEncoding& encoding, const void*)
+{
+    return auto_ptr<TextCodec>(new TextCodecICU(encoding));
+}
+
+void TextCodecICU::registerBaseEncodingNames(EncodingNameRegistrar registrar)
+{
+    registrar("UTF-8", "UTF-8");
+}
+
+void TextCodecICU::registerBaseCodecs(TextCodecRegistrar registrar)
+{
+    registrar("UTF-8", newTextCodecICU, 0);
+}
+
 // FIXME: Registering all the encodings we get from ucnv_getAvailableName
 // includes encodings we don't want or need. For example: UTF16_PlatformEndian,
 // UTF16_OppositeEndian, UTF32_PlatformEndian, UTF32_OppositeEndian, and all
 // the encodings with commas and version numbers.
 
-void TextCodecICU::registerEncodingNames(EncodingNameRegistrar registrar)
+void TextCodecICU::registerExtendedEncodingNames(EncodingNameRegistrar registrar)
 {
     // We register Hebrew with logical ordering using a separate name.
     // Otherwise, this would share the same canonical name as the
@@ -123,12 +138,7 @@ void TextCodecICU::registerEncodingNames(EncodingNameRegistrar registrar)
     registrar("xxbig5", "Big5");
 }
 
-static auto_ptr<TextCodec> newTextCodecICU(const TextEncoding& encoding, const void*)
-{
-    return auto_ptr<TextCodec>(new TextCodecICU(encoding));
-}
-
-void TextCodecICU::registerCodecs(TextCodecRegistrar registrar)
+void TextCodecICU::registerExtendedCodecs(TextCodecRegistrar registrar)
 {
     // See comment above in registerEncodingNames.
     registrar("ISO-8859-8-I", newTextCodecICU, 0);
@@ -172,8 +182,10 @@ void TextCodecICU::createICUConverter() const
 {
     ASSERT(!m_converterICU);
 
+    const char* name = m_encoding.name();
+    m_needsGBKFallbacks = name[0] == 'G' && name[1] == 'B' && name[2] == 'K' && !name[3];
+
     UErrorCode err;
-    m_needsGBKFallbacks = m_encoding == "GBK";
 
     if (cachedConverterICU) {
         err = U_ZERO_ERROR;
index 3705612..c2a30b1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
  * Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com>
  *
  * Redistribution and use in source and binary forms, with or without
@@ -36,8 +36,11 @@ namespace WebCore {
 
     class TextCodecICU : public TextCodec {
     public:
-        static void registerEncodingNames(EncodingNameRegistrar);
-        static void registerCodecs(TextCodecRegistrar);
+        static void registerBaseEncodingNames(EncodingNameRegistrar);
+        static void registerBaseCodecs(TextCodecRegistrar);
+
+        static void registerExtendedEncodingNames(EncodingNameRegistrar);
+        static void registerExtendedCodecs(TextCodecRegistrar);
 
         TextCodecICU(const TextEncoding&);
         virtual ~TextCodecICU();
index beb19e4..ef73adc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
  * Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com>
  *
  * Redistribution and use in source and binary forms, with or without
@@ -110,12 +110,18 @@ CString TextEncoding::encode(const UChar* characters, size_t length, bool allowE
 
 bool TextEncoding::usesVisualOrdering() const
 {
+    if (noExtendedTextEncodingNameUsed())
+        return false;
+
     static const char* const a = atomicCanonicalTextEncodingName("ISO-8859-8");
     return m_name == a;
 }
 
 bool TextEncoding::isJapanese() const
 {
+    if (noExtendedTextEncodingNameUsed())
+        return false;
+
     static HashSet<const char*> set;
     if (set.isEmpty()) {
         addEncodingName(set, "x-mac-japanese");
@@ -138,6 +144,9 @@ bool TextEncoding::isJapanese() const
 
 UChar TextEncoding::backslashAsCurrencySymbol() const
 {
+    if (noExtendedTextEncodingNameUsed())
+        return '\\';
+
     // The text encodings below treat backslash as a currency symbol.
     // See http://blogs.msdn.com/michkap/archive/2005/09/17/469941.aspx for more information.
     static const char* const a = atomicCanonicalTextEncodingName("Shift_JIS_X0213-2000");
index 6d05ab4..f19e18d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -110,6 +110,7 @@ typedef HashMap<const char*, TextCodecFactory> TextCodecMap;
 
 static TextEncodingNameMap* textEncodingNameMap;
 static TextCodecMap* textCodecMap;
+static bool didExtendTextCodecMaps;
 
 #if ERROR_DISABLED
 
@@ -153,44 +154,44 @@ static void addToTextCodecMap(const char* name, NewTextCodecFunction function, c
     textCodecMap->add(encoding.name(), TextCodecFactory(function, additionalData));
 }
 
-void buildTextEncodingNameMap()
+static void buildBaseTextCodecMaps()
 {
+    textCodecMap = new TextCodecMap;
     textEncodingNameMap = new TextEncodingNameMap;
 
-    TextCodecUTF16::registerEncodingNames(addToTextEncodingNameMap);
     TextCodecLatin1::registerEncodingNames(addToTextEncodingNameMap);
+    TextCodecLatin1::registerCodecs(addToTextCodecMap);
+
+    TextCodecUTF16::registerEncodingNames(addToTextEncodingNameMap);
+    TextCodecUTF16::registerCodecs(addToTextCodecMap);
+
 #if USE(ICU_UNICODE)
-    TextCodecICU::registerEncodingNames(addToTextEncodingNameMap);
-#endif
-#if USE(QT4_UNICODE)
-    TextCodecQt::registerEncodingNames(addToTextEncodingNameMap);
-#endif
-#if PLATFORM(MAC)
-    TextCodecMac::registerEncodingNames(addToTextEncodingNameMap);
+    TextCodecICU::registerBaseEncodingNames(addToTextEncodingNameMap);
+    TextCodecICU::registerBaseCodecs(addToTextCodecMap);
 #endif
 }
 
-static void buildTextCodecMap()
+static void extendTextCodecMaps()
 {
-    textCodecMap = new TextCodecMap;
-
-    TextCodecUTF16::registerCodecs(addToTextCodecMap);
-    TextCodecLatin1::registerCodecs(addToTextCodecMap);
 #if USE(ICU_UNICODE)
-    TextCodecICU::registerCodecs(addToTextCodecMap);
+    TextCodecICU::registerExtendedEncodingNames(addToTextEncodingNameMap);
+    TextCodecICU::registerExtendedCodecs(addToTextCodecMap);
 #endif
+
 #if USE(QT4_UNICODE)
+    TextCodecQt::registerEncodingNames(addToTextEncodingNameMap);
     TextCodecQt::registerCodecs(addToTextCodecMap);
 #endif
+
 #if PLATFORM(MAC)
+    TextCodecMac::registerEncodingNames(addToTextEncodingNameMap);
     TextCodecMac::registerCodecs(addToTextCodecMap);
 #endif
 }
 
 std::auto_ptr<TextCodec> newTextCodec(const TextEncoding& encoding)
 {
-    if (!textCodecMap)
-        buildTextCodecMap();
+    ASSERT(textCodecMap);
     TextCodecFactory factory = textCodecMap->get(encoding.name());
     ASSERT(factory.function);
     return factory.function(encoding, factory.additionalData);
@@ -201,7 +202,13 @@ const char* atomicCanonicalTextEncodingName(const char* name)
     if (!name)
         return 0;
     if (!textEncodingNameMap)
-        buildTextEncodingNameMap();
+        buildBaseTextCodecMaps();
+    if (const char* atomicName = textEncodingNameMap->get(name))
+        return atomicName;
+    if (didExtendTextCodecMaps)
+        return 0;
+    extendTextCodecMaps();
+    didExtendTextCodecMaps = true;
     return textEncodingNameMap->get(name);
 }
 
@@ -221,4 +228,9 @@ const char* atomicCanonicalTextEncodingName(const UChar* characters, size_t leng
     return atomicCanonicalTextEncodingName(buffer);
 }
 
+bool noExtendedTextEncodingNameUsed()
+{
+    return !didExtendTextCodecMaps;
+}
+
 } // namespace WebCore
index 6e006a7..5ca2039 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -45,6 +45,9 @@ namespace WebCore {
     const char* atomicCanonicalTextEncodingName(const char* alias);
     const char* atomicCanonicalTextEncodingName(const UChar* aliasCharacters, size_t aliasLength);
 
+    // Only TextEncoding should use this function directly.
+    bool noExtendedTextEncodingNameUsed();
+
 }
 
 #endif // TextEncodingRegistry_h