Page Speed Optimization Libraries
1.5.27.2
|
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_