| Index: third_party/WebKit/Source/bindings/core/v8/V8ValueCache.h
 | 
| diff --git a/third_party/WebKit/Source/bindings/core/v8/V8ValueCache.h b/third_party/WebKit/Source/bindings/core/v8/V8ValueCache.h
 | 
| index 3bc2e00a289657813f6d9724aad46ce8651f8fc3..5f202e5120c5ab7b48ec78b6514d154bb497c1cc 100644
 | 
| --- a/third_party/WebKit/Source/bindings/core/v8/V8ValueCache.h
 | 
| +++ b/third_party/WebKit/Source/bindings/core/v8/V8ValueCache.h
 | 
| @@ -33,6 +33,7 @@
 | 
|  #include "wtf/Noncopyable.h"
 | 
|  #include "wtf/RefPtr.h"
 | 
|  #include "wtf/text/AtomicString.h"
 | 
| +#include "wtf/text/CompressibleString.h"
 | 
|  #include "wtf/text/WTFString.h"
 | 
|  #include <v8.h>
 | 
|  
 | 
| @@ -64,21 +65,57 @@ public:
 | 
|      static void DisposeWeak(const v8::WeakCallbackInfo<WeakCallbackDataType>&);
 | 
|  };
 | 
|  
 | 
| +class CompressibleStringCacheMapTraits : public V8GlobalValueMapTraits<CompressibleStringImpl*, v8::String, v8::kWeakWithParameter> {
 | 
| +    STATIC_ONLY(CompressibleStringCacheMapTraits);
 | 
| +public:
 | 
| +    // Weak traits:
 | 
| +    typedef CompressibleStringImpl WeakCallbackDataType;
 | 
| +    typedef v8::GlobalValueMap<CompressibleStringImpl*, v8::String, CompressibleStringCacheMapTraits> MapType;
 | 
| +
 | 
| +    static WeakCallbackDataType* WeakCallbackParameter(
 | 
| +        MapType* map, CompressibleStringImpl* key, v8::Local<v8::String>& value) { return key; }
 | 
| +    static void DisposeCallbackData(WeakCallbackDataType* callbackData) { }
 | 
| +
 | 
| +    static MapType* MapFromWeakCallbackInfo(
 | 
| +        const v8::WeakCallbackInfo<WeakCallbackDataType>&);
 | 
| +
 | 
| +    static CompressibleStringImpl* KeyFromWeakCallbackInfo(
 | 
| +        const v8::WeakCallbackInfo<WeakCallbackDataType>& data)
 | 
| +    {
 | 
| +        return data.GetParameter();
 | 
| +    }
 | 
| +
 | 
| +    static void OnWeakCallback(const v8::WeakCallbackInfo<WeakCallbackDataType>&);
 | 
| +
 | 
| +    static void Dispose(v8::Isolate*, v8::Global<v8::String> value, CompressibleStringImpl* key);
 | 
| +    static void DisposeWeak(const v8::WeakCallbackInfo<WeakCallbackDataType>&);
 | 
| +};
 | 
|  
 | 
|  class CORE_EXPORT StringCache {
 | 
|      USING_FAST_MALLOC(StringCache);
 | 
|      WTF_MAKE_NONCOPYABLE(StringCache);
 | 
|  public:
 | 
| -    explicit StringCache(v8::Isolate* isolate) : m_stringCache(isolate) { }
 | 
| +    explicit StringCache(v8::Isolate* isolate)
 | 
| +        : m_stringCache(isolate)
 | 
| +        , m_compressibleStringCache(isolate)
 | 
| +    {
 | 
| +    }
 | 
|  
 | 
|      v8::Local<v8::String> v8ExternalString(v8::Isolate* isolate, StringImpl* stringImpl)
 | 
|      {
 | 
| +        // Note that the last CompressibleString is not cached.
 | 
|          ASSERT(stringImpl);
 | 
|          if (m_lastStringImpl.get() == stringImpl)
 | 
|              return m_lastV8String.NewLocal(isolate);
 | 
|          return v8ExternalStringSlow(isolate, stringImpl);
 | 
|      }
 | 
|  
 | 
| +    v8::Local<v8::String> v8ExternalString(v8::Isolate* isolate, const CompressibleString& string)
 | 
| +    {
 | 
| +        ASSERT(!string.isNull());
 | 
| +        return v8ExternalStringSlow(isolate, string);
 | 
| +    }
 | 
| +
 | 
|      void setReturnValueFromString(v8::ReturnValue<v8::Value> returnValue, StringImpl* stringImpl)
 | 
|      {
 | 
|          ASSERT(stringImpl);
 | 
| @@ -91,16 +128,21 @@ public:
 | 
|      void dispose();
 | 
|  
 | 
|      friend class StringCacheMapTraits;
 | 
| +    friend class CompressibleStringCacheMapTraits;
 | 
|  
 | 
|  private:
 | 
|      v8::Local<v8::String> v8ExternalStringSlow(v8::Isolate*, StringImpl*);
 | 
| +    v8::Local<v8::String> v8ExternalStringSlow(v8::Isolate*, const CompressibleString&);
 | 
|      void setReturnValueFromStringSlow(v8::ReturnValue<v8::Value>, StringImpl*);
 | 
|      v8::Local<v8::String> createStringAndInsertIntoCache(v8::Isolate*, StringImpl*);
 | 
| +    v8::Local<v8::String> createStringAndInsertIntoCache(v8::Isolate*, const CompressibleString&);
 | 
|      void InvalidateLastString();
 | 
|  
 | 
|      StringCacheMapTraits::MapType m_stringCache;
 | 
|      StringCacheMapTraits::MapType::PersistentValueReference m_lastV8String;
 | 
|  
 | 
| +    CompressibleStringCacheMapTraits::MapType m_compressibleStringCache;
 | 
| +
 | 
|      // Note: RefPtr is a must as we cache by StringImpl* equality, not identity
 | 
|      // hence lastStringImpl might be not a key of the cache (in sense of identity)
 | 
|      // and hence it's not refed on addition.
 | 
| 
 |