From 430f202718f7311c541a7243870719e2df456f2f Mon Sep 17 00:00:00 2001 From: Pierre Rossi Date: Wed, 20 Nov 2013 13:45:03 +0100 Subject: Ship repacked .pak files We used to wrap various .pak files in qrc files, but it turns out to be very memory inefficient compared to chromium's approach of mmaping those files. Drop the pak->qrc logic and instead add some pure gyp targets to repack the resources. We then install those with qmake and look them up with QLibraryInfo. Change-Id: I6dd3cedf6afa626ed181463911fef8885c9e9add Reviewed-by: Andras Becsi --- src/core/resource_bundle_qt.cpp | 113 ++++------------------------------------ 1 file changed, 11 insertions(+), 102 deletions(-) (limited to 'src/core/resource_bundle_qt.cpp') diff --git a/src/core/resource_bundle_qt.cpp b/src/core/resource_bundle_qt.cpp index 044d00511..ea893d330 100644 --- a/src/core/resource_bundle_qt.cpp +++ b/src/core/resource_bundle_qt.cpp @@ -39,116 +39,25 @@ ** ****************************************************************************/ +#include "base/command_line.h" +#include "content/public/common/content_switches.h" #include "ui/base/resource/resource_bundle.h" -#include "ui/base/resource/data_pack.h" +#include "type_conversion.h" -#include -#include +#include +#include +#include namespace ui { -// ********************* data_pack.cc ********************* -// This is duplicated code originating from data_pack.cc. -// It should instead be moved to a header file and be included -// in both places. - -static const uint32 kFileFormatVersion = 4; -static const size_t kHeaderLength = 2 * sizeof(uint32) + sizeof(uint8); - -#pragma pack(push,2) -struct DataPackEntry { - uint16 resource_id; - uint32 file_offset; - - static int CompareById(const void* void_key, const void* void_entry) { - uint16 key = *reinterpret_cast(void_key); - const DataPackEntry* entry = - reinterpret_cast(void_entry); - if (key < entry->resource_id) { - return -1; - } else if (key > entry->resource_id) { - return 1; - } else { - return 0; - } - } -}; -#pragma pack(pop) -// ******************* data_pack.cc end ******************* - -class UI_EXPORT DataPackQt : public DataPack { - public: - DataPackQt(ui::ScaleFactor scale_factor) - : DataPack(scale_factor) - , m_data(NULL) - , m_resourceCount(0) { } - - virtual ~DataPackQt() { } - - bool LoadFromByteArray(const QByteArray& data) - { - m_data = data; - - if (kHeaderLength > static_cast(m_data.size())) - return false; - - const uint32* ptr = reinterpret_cast(m_data.data()); - uint32 version = ptr[0]; - if (version != kFileFormatVersion) { - LOG(ERROR) << "Bad data pack version: got " << version << ", expected " << kFileFormatVersion; - return false; - } - - m_resourceCount = ptr[1]; - return true; - } - - virtual bool HasResource(uint16 resource_id) const OVERRIDE - { - return !!bsearch(&resource_id, m_data.data() + kHeaderLength, m_resourceCount, sizeof(DataPackEntry), DataPackEntry::CompareById); - } - - virtual bool GetStringPiece(uint16 resource_id, base::StringPiece* data) const OVERRIDE - { - #if defined(__BYTE_ORDER) // Linux check - COMPILE_ASSERT(__BYTE_ORDER == __LITTLE_ENDIAN, datapack_assumes_little_endian); - #elif defined(__BIG_ENDIAN__) // Mac check - #error DataPack assumes little endian - #endif - - const DataPackEntry* target = reinterpret_cast(bsearch(&resource_id, m_data.data() + kHeaderLength, m_resourceCount, sizeof(DataPackEntry), DataPackEntry::CompareById)); - if (!target) - return false; - - const DataPackEntry* next_entry = target + 1; - size_t length = next_entry->file_offset - target->file_offset; - - data->set(m_data.data() + target->file_offset, length); - return true; - } - - private: - QByteArray m_data; - size_t m_resourceCount; - DISALLOW_COPY_AND_ASSIGN(DataPackQt); -}; - - void ResourceBundle::LoadCommonResources() { - QStringList resources; - resources << ":/data/resources.pak" << ":/data/devtools.pak"; - Q_FOREACH (const QString& pak, resources) { - QFile pak_file(pak); - if (!pak_file.open(QIODevice::ReadOnly)) { - qWarning("Resource file %s not loaded", qPrintable(pak)); - continue; - } + // Loading these resources probably only makes sense for the browser process + if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessType)) + return; - scoped_ptr data_pack(new DataPackQt(SCALE_FACTOR_100P)); - if (data_pack->LoadFromByteArray(pak_file.readAll())) - AddDataPack(data_pack.release()); - } + // We repacked the resources we need and installed them. now let chromium mmap that file. + AddDataPackFromPath(base::FilePath(toFilePathString(QLibraryInfo::location(QLibraryInfo::DataPath) % QStringLiteral("/qtwebengine_resources.pak"))) , SCALE_FACTOR_100P); } // As GetLocaleFilePath is excluded for Mac in resource_bundle.cc, -- cgit v1.2.3