| Index: chrome/browser/search/local_files_ntp_source.cc
|
| diff --git a/chrome/browser/search/local_files_ntp_source.cc b/chrome/browser/search/local_files_ntp_source.cc
|
| index cb017d975a5e618650ac27595448b077d998f7c5..1bd8de5d709f8b55ac5ea11d529fa60f2e42aec5 100644
|
| --- a/chrome/browser/search/local_files_ntp_source.cc
|
| +++ b/chrome/browser/search/local_files_ntp_source.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "chrome/browser/search/local_files_ntp_source.h"
|
|
|
| +#if !defined(GOOGLE_CHROME_BUILD) && !defined(OS_IOS)
|
| +
|
| #include "base/bind.h"
|
| #include "base/files/file_path.h"
|
| #include "base/files/file_util.h"
|
| @@ -16,11 +18,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 +54,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 +114,14 @@ 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
|
| +
|
| +#endif // !defined(GOOGLE_CHROME_BUILD) && !defined(OS_IOS)
|
|
|