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 3b7f6c394ca847483967aeea680b931481344c80..0f47d1ba8a321870110aef1455077c583ecc5e11 100644 |
--- a/third_party/WebKit/Source/platform/text/CompressibleString.cpp |
+++ b/third_party/WebKit/Source/platform/text/CompressibleString.cpp |
@@ -5,6 +5,8 @@ |
#include "platform/text/CompressibleString.h" |
#include "platform/Histogram.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" |
@@ -23,7 +25,7 @@ public: |
void add(CompressibleStringImpl* string) |
{ |
- ASSERT(!m_table.contains(string)); |
+ DCHECK(!m_table.contains(string)); |
m_table.add(string); |
} |
@@ -34,7 +36,7 @@ public: |
void remove(CompressibleStringImpl* string) |
{ |
- ASSERT(m_table.contains(string)); |
+ DCHECK(m_table.contains(string)); |
m_table.remove(string); |
} |
@@ -77,7 +79,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); |
@@ -101,17 +105,30 @@ static void recordCompressibleStringCount(CompressibleStringCountType type) |
sringTypeHistogram.count(type); |
} |
-// compressString does nothing but collect UMA so far. |
-// TODO(hajimehoshi): Implement this. |
void CompressibleStringImpl::compressString() |
{ |
recordCompressibleStringCount(StringWasCompressedInBackgroundTab); |
- ASSERT(!isCompressed()); |
- m_isCompressed = true; |
+ DCHECK(!isCompressed()); |
+ DCHECK(!m_compressedData); |
+ DCHECK(!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()); |
esprehn
2016/08/05 23:00:58
ouch this is pretty bad it doubles the memory usag
tasak
2016/08/08 04:47:36
Acknowledged.
|
+ 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,8 +139,28 @@ void CompressibleStringImpl::decompressString() |
// be complex. See also crbug/581266. We will revisit when the situation |
// changes. |
recordCompressibleStringCount(StringWasDecompressed); |
- ASSERT(isCompressed()); |
- m_isCompressed = false; |
+ DCHECK(isCompressed()); |
+ DCHECK(m_compressedData); |
+ DCHECK(m_compressedDataSize); |
+ |
+ std::string in(static_cast<const char*>(m_compressedData), m_compressedDataSize); |
+ std::string out; |
+ compression::GzipUncompress(in, &out); |
esprehn
2016/08/05 23:00:58
ditto
tasak
2016/08/08 04:47:36
Acknowledged.
|
+ |
+ 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; |
+ DCHECK(m_originalLength == m_string.length()); |
} |
} // namespace blink |