Page Speed Optimization Libraries  1.3.25.1
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* manager = FindServerContext();
00117     manager->MergeNonCachingResponseHeaders(input_resource_, output_resource_);
00118     if (Driver()->Write(ResourceVector(1, input_resource_),
00119                         hierarchy_->minified_contents(),
00120                         &kContentTypeCss,
00121                         input_resource_->charset(),
00122                         output_resource_.get())) {
00123       RewriteDone(kRewriteOk, 0);
00124     } else {
00125       RewriteDone(kRewriteFailed, 0);
00126     }
00127   }
00128 
00129   virtual void Render() {
00131     if (num_output_partitions() == 1 && output_partition(0)->optimizable()) {
00141       if (hierarchy_->minified_contents().empty()) {
00142         hierarchy_->set_minified_contents(
00143             output_partition(0)->inlined_data());
00144         hierarchy_->set_input_contents(hierarchy_->minified_contents());
00145       }
00146     } else {
00151       hierarchy_->set_flattening_succeeded(false);
00152     }
00153   }
00154 
00155   virtual const char* id() const {
00156     return RewriteOptions::kCssImportFlattenerId;
00157   }
00158   virtual OutputResourceKind kind() const { return kRewrittenResource; }
00159 
00160  private:
00161   CssFilter* filter_;
00162   CssFilter::Context* rewriter_;
00163   CssHierarchy* hierarchy_;
00164   ResourcePtr input_resource_;
00165   OutputResourcePtr output_resource_;
00166   DISALLOW_COPY_AND_ASSIGN(CssFlattenImportsContext);
00167 };
00168 
00169 }  
00170 
00171 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_CSS_FLATTEN_IMPORTS_CONTEXT_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines