00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_CSS_FLATTEN_IMPORTS_CONTEXT_H_
00020 #define NET_INSTAWEB_REWRITER_PUBLIC_CSS_FLATTEN_IMPORTS_CONTEXT_H_
00021
00022 #include "net/instaweb/rewriter/public/css_filter.h"
00023
00024 #include "base/logging.h"
00025 #include "net/instaweb/http/public/content_type.h"
00026 #include "net/instaweb/rewriter/cached_result.pb.h"
00027 #include "net/instaweb/rewriter/public/css_hierarchy.h"
00028 #include "net/instaweb/rewriter/public/output_resource_kind.h"
00029 #include "net/instaweb/rewriter/public/resource.h"
00030 #include "net/instaweb/rewriter/public/resource_manager.h"
00031 #include "net/instaweb/rewriter/public/rewrite_driver.h"
00032 #include "net/instaweb/rewriter/public/rewrite_options.h"
00033 #include "net/instaweb/rewriter/public/rewrite_result.h"
00034 #include "net/instaweb/rewriter/public/single_rewrite_context.h"
00035 #include "net/instaweb/util/public/basictypes.h"
00036 #include "net/instaweb/util/public/ref_counted_ptr.h"
00037 #include "net/instaweb/util/public/string.h"
00038 #include "net/instaweb/util/public/string_util.h"
00039
00040 namespace net_instaweb {
00041
00042 class RewriteContext;
00043
00045 class CssFlattenImportsContext : public SingleRewriteContext {
00046 public:
00047 CssFlattenImportsContext(RewriteDriver* driver,
00048 RewriteContext* parent,
00049 CssFilter::Context* rewriter,
00050 CssHierarchy* hierarchy)
00051 : SingleRewriteContext(driver, parent, NULL ),
00052 rewriter_(rewriter),
00053 hierarchy_(hierarchy) {
00054 }
00055 virtual ~CssFlattenImportsContext() {}
00056
00057 virtual GoogleString CacheKeySuffix() const {
00062 GoogleString suffix;
00063 if (hierarchy_->media().empty()) {
00064 suffix = "all";
00065 } else {
00066 suffix = hierarchy_->media()[0];
00067 for (int i = 1, n = hierarchy_->media().size(); i < n; ++i) {
00068 StrAppend(&suffix, "_", hierarchy_->media()[i]);
00069 }
00070 }
00071 return suffix;
00072 }
00073
00074 virtual void RewriteSingle(const ResourcePtr& input_resource,
00075 const OutputResourcePtr& output_resource) {
00076 input_resource_ = input_resource;
00077 output_resource_ = output_resource;
00078 hierarchy_->set_input_contents(input_resource_->contents());
00079
00080 bool ok = true;
00081 if (!hierarchy_->Parse()) {
00083 ok = false;
00084 } else if (!hierarchy_->CheckCharsetOk(input_resource)) {
00085 ok = false;
00086 } else {
00087 rewriter_->RewriteCssFromNested(this, hierarchy_);
00088 }
00089
00090 if (!ok) {
00091 hierarchy_->set_flattening_succeeded(false);
00092 RewriteDone(kRewriteFailed, 0);
00093 } else if (num_nested() > 0) {
00094 StartNestedTasks();
00095 } else {
00096 Harvest();
00097 }
00098 }
00099
00100 void Harvest() {
00101 DCHECK_EQ(1, num_output_partitions());
00102
00108 hierarchy_->RollUpContents();
00109
00111 output_partition(0)->set_inlined_data(hierarchy_->minified_contents());
00112
00113 ResourceManager* manager = Manager();
00114 manager->MergeNonCachingResponseHeaders(input_resource_, output_resource_);
00115 if (manager->Write(ResourceVector(1, input_resource_),
00116 hierarchy_->minified_contents(),
00117 &kContentTypeCss,
00118 input_resource_->charset(),
00119 output_resource_.get(),
00120 Driver()->message_handler())) {
00121 RewriteDone(kRewriteOk, 0);
00122 } else {
00123 RewriteDone(kRewriteFailed, 0);
00124 }
00125 }
00126
00127 virtual void Render() {
00129 if (num_output_partitions() == 1 && output_partition(0)->optimizable()) {
00139 if (hierarchy_->minified_contents().empty()) {
00140 hierarchy_->set_minified_contents(
00141 output_partition(0)->inlined_data());
00142 hierarchy_->set_input_contents(hierarchy_->minified_contents());
00143 }
00144 } else {
00145 hierarchy_->set_flattening_succeeded(false);
00146 }
00147 }
00148
00149 virtual const char* id() const {
00150 return RewriteOptions::kCssImportFlattenerId;
00151 }
00152 virtual OutputResourceKind kind() const { return kRewrittenResource; }
00153
00154 private:
00155 CssFilter::Context* rewriter_;
00156 CssHierarchy* hierarchy_;
00157 ResourcePtr input_resource_;
00158 OutputResourcePtr output_resource_;
00159 DISALLOW_COPY_AND_ASSIGN(CssFlattenImportsContext);
00160 };
00161
00162 }
00163
00164 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_CSS_FLATTEN_IMPORTS_CONTEXT_H_