| Index: third_party/WebKit/Source/bindings/core/v8/V8StringResource.h | 
| diff --git a/third_party/WebKit/Source/bindings/core/v8/V8StringResource.h b/third_party/WebKit/Source/bindings/core/v8/V8StringResource.h | 
| index 83316f8f6e49a5432c9895c4287c5c0264872e83..028b1cbf4df7c2fd6d21600beddee821a6d3f849 100644 | 
| --- a/third_party/WebKit/Source/bindings/core/v8/V8StringResource.h | 
| +++ b/third_party/WebKit/Source/bindings/core/v8/V8StringResource.h | 
| @@ -31,6 +31,7 @@ | 
| #include "wtf/Allocator.h" | 
| #include "wtf/Threading.h" | 
| #include "wtf/text/AtomicString.h" | 
| +#include "wtf/text/CompressibleString.h" | 
| #include <v8.h> | 
|  | 
| namespace blink { | 
| @@ -62,24 +63,54 @@ public: | 
| v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(memoryConsumption(string)); | 
| } | 
|  | 
| +    explicit WebCoreStringResourceBase(const CompressibleString& string) | 
| +        : m_compressibleString(string) | 
| +    { | 
| +#if ENABLE(ASSERT) | 
| +        m_threadId = WTF::currentThread(); | 
| +#endif | 
| +        ASSERT(!string.isNull()); | 
| +        v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(memoryConsumption(string)); | 
| +    } | 
| + | 
| virtual ~WebCoreStringResourceBase() | 
| { | 
| #if ENABLE(ASSERT) | 
| ASSERT(m_threadId == WTF::currentThread()); | 
| #endif | 
| -        int reducedExternalMemory = -memoryConsumption(m_plainString); | 
| -        if (m_plainString.impl() != m_atomicString.impl() && !m_atomicString.isNull()) | 
| -            reducedExternalMemory -= memoryConsumption(m_atomicString.string()); | 
| +        int reducedExternalMemory = 0; | 
| +        if (LIKELY(m_compressibleString.isNull())) { | 
| +            reducedExternalMemory = -memoryConsumption(m_plainString); | 
| +            if (m_plainString.impl() != m_atomicString.impl() && !m_atomicString.isNull()) | 
| +                reducedExternalMemory -= memoryConsumption(m_atomicString.string()); | 
| +        } else { | 
| +            reducedExternalMemory = -memoryConsumption(m_compressibleString); | 
| +        } | 
| v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(reducedExternalMemory); | 
| + | 
| +        // FIX this! | 
| } | 
|  | 
| -    const String& webcoreString() { return m_plainString; } | 
| +    String webcoreString() | 
| +    { | 
| +        if (!m_compressibleString.isNull()) { | 
| +            ASSERT(m_plainString.isNull()); | 
| +            ASSERT(m_atomicString.isNull()); | 
| +            return m_compressibleString.toString(); | 
| +        } | 
| +        return m_plainString; | 
| +    } | 
|  | 
| -    const AtomicString& atomicString() | 
| +    AtomicString atomicString() | 
| { | 
| #if ENABLE(ASSERT) | 
| ASSERT(m_threadId == WTF::currentThread()); | 
| #endif | 
| +        if (!m_compressibleString.isNull()) { | 
| +            ASSERT(m_plainString.isNull()); | 
| +            ASSERT(m_atomicString.isNull()); | 
| +            return AtomicString(m_compressibleString.toString()); | 
| +        } | 
| if (m_atomicString.isNull()) { | 
| m_atomicString = AtomicString(m_plainString); | 
| ASSERT(!m_atomicString.isNull()); | 
| @@ -89,6 +120,8 @@ public: | 
| return m_atomicString; | 
| } | 
|  | 
| +    const CompressibleString& compressibleString() { return m_compressibleString; } | 
| + | 
| protected: | 
| // A shallow copy of the string. Keeps the string buffer alive until the V8 engine garbage collects it. | 
| String m_plainString; | 
| @@ -99,11 +132,19 @@ protected: | 
| // into that string. | 
| AtomicString m_atomicString; | 
|  | 
| +    CompressibleString m_compressibleString; | 
| + | 
| private: | 
| static int memoryConsumption(const String& string) | 
| { | 
| return string.length() * (string.is8Bit() ? sizeof(LChar) : sizeof(UChar)); | 
| } | 
| + | 
| +    static int memoryConsumption(const CompressibleString& string) | 
| +    { | 
| +        return string.currentSizeInBytes(); | 
| +    } | 
| + | 
| #if ENABLE(ASSERT) | 
| WTF::ThreadIdentifier m_threadId; | 
| #endif | 
| @@ -153,6 +194,51 @@ public: | 
| } | 
| }; | 
|  | 
| +class WebCoreCompressibleStringResource16 final : public WebCoreStringResourceBase, public v8::String::ExternalStringResource { | 
| +    WTF_MAKE_NONCOPYABLE(WebCoreCompressibleStringResource16); | 
| +public: | 
| +    explicit WebCoreCompressibleStringResource16(const CompressibleString& string) | 
| +        : WebCoreStringResourceBase(string) | 
| +    { | 
| +        // ASSERT(m_string); | 
| +        ASSERT(!m_compressibleString.is8Bit()); | 
| +    } | 
| + | 
| +    bool IsCompressible() const override { return true; } | 
| + | 
| +    size_t length() const override | 
| +    { | 
| +        return m_compressibleString.length(); | 
| +    } | 
| + | 
| +    const uint16_t* data() const override | 
| +    { | 
| +        return reinterpret_cast<const uint16_t*>(m_compressibleString.characters16()); | 
| +    } | 
| +}; | 
| + | 
| +class WebCoreCompressibleStringResource8 final : public WebCoreStringResourceBase, public v8::String::ExternalOneByteStringResource { | 
| +    WTF_MAKE_NONCOPYABLE(WebCoreCompressibleStringResource8); | 
| +public: | 
| +    explicit WebCoreCompressibleStringResource8(const CompressibleString& string) | 
| +        : WebCoreStringResourceBase(string) | 
| +    { | 
| +        ASSERT(m_compressibleString.is8Bit()); | 
| +    } | 
| + | 
| +    bool IsCompressible() const override { return true; } | 
| + | 
| +    size_t length() const override | 
| +    { | 
| +        return m_compressibleString.length(); | 
| +    } | 
| + | 
| +    const char* data() const override | 
| +    { | 
| +        return reinterpret_cast<const char*>(m_compressibleString.characters8()); | 
| +    } | 
| +}; | 
| + | 
| enum ExternalMode { | 
| Externalize, | 
| DoNotExternalize | 
|  |