Index: third_party/WebKit/Source/platform/text/CompressibleString.cpp |
diff --git a/third_party/WebKit/Source/platform/text/CompressibleString.cpp b/third_party/WebKit/Source/platform/text/CompressibleString.cpp |
index 38e6c09f41e1978f53a41ac1f73072b8307fd3ce..c40e344a4d7d3834ea88cd25ebdb5671b4c0f758 100644 |
--- a/third_party/WebKit/Source/platform/text/CompressibleString.cpp |
+++ b/third_party/WebKit/Source/platform/text/CompressibleString.cpp |
@@ -5,6 +5,7 @@ |
#include "platform/text/CompressibleString.h" |
#include "public/platform/Platform.h" |
+#include "third_party/zlib/google/compression_utils.h" |
#include "wtf/Assertions.h" |
#include "wtf/WTFThreadData.h" |
#include "wtf/text/WTFString.h" |
@@ -77,7 +78,9 @@ void CompressibleStringImpl::compressAll() |
CompressibleStringImpl::CompressibleStringImpl(PassRefPtr<StringImpl> impl) |
: m_string(impl) |
- , m_isCompressed(false) |
+ , m_originalLength(m_string.length()) |
+ , m_compressedData(nullptr) |
+ , m_compressedDataSize(0) |
{ |
if (originalContentSizeInBytes() > CompressibleStringImplSizeThrehold) |
compressibleStringTable().add(this); |
@@ -100,17 +103,30 @@ static void recordCompressibleStringCount(CompressibleStringCountType type) |
Platform::current()->histogramEnumeration("Memory.CompressibleStringCount", type, CompressibleStringCountTypeMax + 1); |
} |
-// compressString does nothing but collect UMA so far. |
-// TODO(hajimehoshi): Implement this. |
void CompressibleStringImpl::compressString() |
{ |
recordCompressibleStringCount(StringWasCompressedInBackgroundTab); |
ASSERT(!isCompressed()); |
- m_isCompressed = true; |
+ ASSERT(!m_compressedData); |
+ ASSERT(!m_compressedDataSize); |
+ |
+ // TODO(hajimehoshi): Now components offers funcitons accepting only |
+ // std::strings. This is not efficient. We should offer char* version. |
+ std::string in, out; |
+ if (m_string.is8Bit()) { |
+ in = std::string(reinterpret_cast<const char*>(m_string.characters8()), originalContentSizeInBytes()); |
+ m_string = emptyString(); |
+ } else { |
+ in = std::string(reinterpret_cast<const char*>(m_string.characters16()), originalContentSizeInBytes()); |
+ m_string = emptyString16Bit(); |
+ } |
+ compression::GzipCompress(in, &out); |
+ |
+ m_compressedData = WTF::Partitions::fastMalloc(out.size(), "CompressibleString"); |
+ memcpy(m_compressedData, out.c_str(), out.size()); |
+ m_compressedDataSize = out.size(); |
} |
-// decompressString does nothing but collect UMA so far. |
-// TODO(hajimehoshi): Implement this. |
void CompressibleStringImpl::decompressString() |
{ |
// TODO(hajimehoshi): We wanted to tell whether decompressing in a |
@@ -122,7 +138,27 @@ void CompressibleStringImpl::decompressString() |
// changes. |
recordCompressibleStringCount(StringWasDecompressed); |
ASSERT(isCompressed()); |
- m_isCompressed = false; |
+ ASSERT(m_compressedData); |
+ ASSERT(m_compressedDataSize); |
+ |
+ std::string in(static_cast<const char*>(m_compressedData), m_compressedDataSize); |
+ std::string out; |
+ compression::GzipUncompress(in, &out); |
+ |
+ if (is8Bit()) { |
+ LChar* data = nullptr; |
+ m_string = StringImpl::createUninitialized(out.size() / sizeof(LChar), data); |
+ memcpy(data, out.c_str(), out.size()); |
+ } else { |
+ UChar* data = nullptr; |
+ m_string = StringImpl::createUninitialized(out.size() / sizeof(UChar), data); |
+ memcpy(data, out.c_str(), out.size()); |
+ } |
+ |
+ WTF::Partitions::fastFree(m_compressedData); |
+ m_compressedData = nullptr; |
+ m_compressedDataSize = 0; |
+ ASSERT(m_originalLength == m_string.length()); |
} |
} // namespace blink |