Page Speed Optimization Libraries  1.5.27.2
net/instaweb/rewriter/public/css_flatten_imports_context.h
Go to the documentation of this file.
00001 /*
00002  * Copyright 2012 Google Inc.
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *      http:///www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
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 "base/logging.h"
00023 #include "net/instaweb/http/public/content_type.h"
00024 #include "net/instaweb/rewriter/cached_result.pb.h"
00025 #include "net/instaweb/rewriter/public/css_filter.h"
00026 #include "net/instaweb/rewriter/public/css_hierarchy.h"
00027 #include "net/instaweb/rewriter/public/output_resource_kind.h"
00028 #include "net/instaweb/rewriter/public/resource.h"
00029 #include "net/instaweb/rewriter/public/server_context.h"
00030 #include "net/instaweb/rewriter/public/rewrite_driver.h"
00031 #include "net/instaweb/rewriter/public/rewrite_options.h"
00032 #include "net/instaweb/rewriter/public/rewrite_result.h"
00033 #include "net/instaweb/rewriter/public/single_rewrite_context.h"
00034 #include "net/instaweb/util/public/basictypes.h"
00035 #include "net/instaweb/util/public/ref_counted_ptr.h"
00036 #include "net/instaweb/util/public/statistics.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(RewriteContext* parent,
00048                            CssFilter* filter,
00049                            CssFilter::Context* rewriter,
00050                            CssHierarchy* hierarchy)
00051       : SingleRewriteContext(NULL, parent, NULL ),
00052         filter_(filter),
00053         rewriter_(rewriter),
00054         hierarchy_(hierarchy) {
00055   }
00056   virtual ~CssFlattenImportsContext() {}
00057 
00058   virtual GoogleString CacheKeySuffix() const {
00063     GoogleString suffix;
00064     if (hierarchy_->media().empty()) {
00065       suffix = "all";
00066     } else {
00067       suffix = hierarchy_->media()[0];
00068       for (int i = 1, n = hierarchy_->media().size(); i < n; ++i) {
00069         StrAppend(&suffix, "_", hierarchy_->media()[i]);
00070       }
00071     }
00072     return suffix;
00073   }
00074 
00075   virtual void RewriteSingle(const ResourcePtr& input_resource,
00076                              const OutputResourcePtr& output_resource) {
00077     input_resource_ = input_resource;
00078     output_resource_ = output_resource;
00079     hierarchy_->set_input_contents(input_resource_->contents());
00080 
00081     bool ok = true;
00082     if (!hierarchy_->Parse()) {
00084       ok = false;
00085       filter_->num_flatten_imports_minify_failed_->Add(1);
00086     } else if (!hierarchy_->CheckCharsetOk(input_resource)) {
00087       ok = false;
00088       filter_->num_flatten_imports_charset_mismatch_->Add(1);
00089     } else {
00090       rewriter_->RewriteCssFromNested(this, hierarchy_);
00091     }
00092 
00093     if (!ok) {
00094       hierarchy_->set_flattening_succeeded(false);
00095       RewriteDone(kRewriteFailed, 0);
00096     } else if (num_nested() > 0) {
00097       StartNestedTasks(); 
00098     } else {
00099       Harvest(); 
00100     }
00101   }
00102 
00103   void Harvest() {
00104     DCHECK_EQ(1, num_output_partitions());
00105 
00111     hierarchy_->RollUpContents();
00112 
00114     output_partition(0)->set_inlined_data(hierarchy_->minified_contents());
00115 
00116     ServerContext* server_context = FindServerContext();
00117     server_context->MergeNonCachingResponseHeaders(input_resource_,
00118                                                    output_resource_);
00119     if (Driver()->Write(ResourceVector(1, input_resource_),
00120                         hierarchy_->minified_contents(),
00121                         &kContentTypeCss,
00122                         input_resource_->charset(),
00123                         output_resource_.get())) {
00124       RewriteDone(kRewriteOk, 0);
00125     } else {
00126       RewriteDone(kRewriteFailed, 0);
00127     }
00128   }
00129 
00130   virtual void Render() {
00132     if (num_output_partitions() == 1 && output_partition(0)->optimizable()) {
00142       if (hierarchy_->minified_contents().empty()) {
00143         hierarchy_->set_minified_contents(
00144             output_partition(0)->inlined_data());
00145         hierarchy_->set_input_contents(hierarchy_->minified_contents());
00146       }
00147     } else {
00152       hierarchy_->set_flattening_succeeded(false);
00153     }
00154   }
00155 
00156   virtual const char* id() const {
00157     return RewriteOptions::kCssImportFlattenerId;
00158   }
00159   virtual OutputResourceKind kind() const { return kRewrittenResource; }
00160 
00161  private:
00162   CssFilter* filter_;
00163   CssFilter::Context* rewriter_;
00164   CssHierarchy* hierarchy_;
00165   ResourcePtr input_resource_;
00166   OutputResourcePtr output_resource_;
00167   DISALLOW_COPY_AND_ASSIGN(CssFlattenImportsContext);
00168 };
00169 
00170 }  
00171 
00172 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_CSS_FLATTEN_IMPORTS_CONTEXT_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines