diff options
author | tmartino <tmartino@chromium.org> | 2015-11-12 11:38:08 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-12 19:39:11 +0000 |
commit | 5788cd432cc28372aa85a57cd7a66e6b6699db74 (patch) | |
tree | 282c81b7469ea77f9cbd07070c76b2bf22d327f8 /chrome/browser/search/local_files_ntp_source.cc | |
parent | ffef597947e7fa4ca0be41af547c89e3b394387b (diff) | |
download | chromium_src-5788cd432cc28372aa85a57cd7a66e6b6699db74.zip chromium_src-5788cd432cc28372aa85a57cd7a66e6b6699db74.tar.gz chromium_src-5788cd432cc28372aa85a57cd7a66e6b6699db74.tar.bz2 |
Enabling included files when reloading local NTP with --local-ntp-reload.
Review URL: https://codereview.chromium.org/1376243005
Cr-Commit-Position: refs/heads/master@{#359357}
Diffstat (limited to 'chrome/browser/search/local_files_ntp_source.cc')
-rw-r--r-- | chrome/browser/search/local_files_ntp_source.cc | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/chrome/browser/search/local_files_ntp_source.cc b/chrome/browser/search/local_files_ntp_source.cc index cb017d9..16350a4 100644 --- a/chrome/browser/search/local_files_ntp_source.cc +++ b/chrome/browser/search/local_files_ntp_source.cc @@ -16,11 +16,16 @@ #include "chrome/common/url_constants.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/url_data_source.h" +#include "third_party/re2/re2/re2.h" +#include "third_party/re2/re2/stringpiece.h" namespace { const char kBasePath[] = "chrome/browser/resources/local_ntp"; +// Matches lines of form '<include src="foo">' and captures 'foo'. +const char kInlineResourceRegex[] = "<include.*?src\\=[\"'](.+?)[\"'].*?>"; + void CallbackWithLoadedResource( const std::string& origin, const content::URLDataSource::GotDataCallback& callback, @@ -47,6 +52,53 @@ std::string ReadFileAndReturn(const base::FilePath& path) { namespace local_ntp { +void FlattenLocalInclude( + const content::URLDataSource::GotDataCallback& callback, + std::string topLevelResource, + base::RefCountedMemory* inlineResource); + +// Helper method invoked by both CheckLocalIncludes and FlattenLocalInclude. +// Checks for any <include> directives; if any are found, loads the associated +// file and calls FlattenLocalInclude with the result. Otherwise, processing +// is done, and so the original callback is invoked. +void CheckLocalIncludesHelper( + const content::URLDataSource::GotDataCallback& callback, + std::string& resource) { + std::string filename; + re2::StringPiece resourceWrapper(resource); + if (re2::RE2::FindAndConsume(&resourceWrapper, kInlineResourceRegex, + &filename)) { + content::URLDataSource::GotDataCallback wrapper = + base::Bind(&FlattenLocalInclude, callback, resource); + SendLocalFileResource(filename, wrapper); + } else { + callback.Run(base::RefCountedString::TakeString(&resource)); + } +} + +// Wrapper around the above helper function for use as a callback. Processes +// local files to inline any files indicated by an <include> directive. +void CheckLocalIncludes( + const content::URLDataSource::GotDataCallback& callback, + base::RefCountedMemory* resource) { + std::string resourceAsStr(resource->front_as<char>(), resource->size()); + CheckLocalIncludesHelper(callback, resourceAsStr); +} + +// Replaces the first <include> directive found with the given file contents. +// Afterwards, re-invokes CheckLocalIncludesHelper to handle any subsequent +// <include>s, including those which may have been added by the newly-inlined +// resource. +void FlattenLocalInclude( + const content::URLDataSource::GotDataCallback& callback, + std::string topLevelResource, + base::RefCountedMemory* inlineResource) { + std::string inlineAsStr(inlineResource->front_as<char>(), + inlineResource->size()); + re2::RE2::Replace(&topLevelResource, kInlineResourceRegex, inlineAsStr); + CheckLocalIncludesHelper(callback, topLevelResource); +} + void SendLocalFileResource( const std::string& path, const content::URLDataSource::GotDataCallback& callback) { @@ -60,10 +112,12 @@ void SendLocalFileResourceWithOrigin( base::FilePath fullpath; PathService::Get(base::DIR_SOURCE_ROOT, &fullpath); fullpath = fullpath.AppendASCII(kBasePath).AppendASCII(path); + content::URLDataSource::GotDataCallback wrapper = + base::Bind(&CheckLocalIncludes, callback); base::PostTaskAndReplyWithResult( content::BrowserThread::GetBlockingPool(), FROM_HERE, base::Bind(&ReadFileAndReturn, fullpath), - base::Bind(&CallbackWithLoadedResource, origin, callback)); + base::Bind(&CallbackWithLoadedResource, origin, wrapper)); } } // namespace local_ntp |