Page Speed Optimization Libraries  1.9.32.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
css_flatten_imports_context.h
Go to the documentation of this file.
1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http:///www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
18 
19 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_CSS_FLATTEN_IMPORTS_CONTEXT_H_
20 #define NET_INSTAWEB_REWRITER_PUBLIC_CSS_FLATTEN_IMPORTS_CONTEXT_H_
21 
22 #include "base/logging.h"
23 #include "net/instaweb/rewriter/cached_result.pb.h"
35 #include "pagespeed/kernel/base/basictypes.h"
36 #include "pagespeed/kernel/base/ref_counted_ptr.h"
37 #include "pagespeed/kernel/base/statistics.h"
38 #include "pagespeed/kernel/base/string.h"
39 #include "pagespeed/kernel/base/string_util.h"
40 #include "pagespeed/kernel/base/string_writer.h"
41 #include "pagespeed/kernel/http/content_type.h"
42 
43 namespace net_instaweb {
44 
45 class RewriteContext;
46 
49  public:
51  CssFilter* filter,
52  CssFilter::Context* rewriter,
53  CssHierarchy* hierarchy)
54  : SingleRewriteContext(NULL, parent, NULL ),
55  filter_(filter),
56  rewriter_(rewriter),
57  hierarchy_(hierarchy) {
58  }
59  virtual ~CssFlattenImportsContext() {}
60 
61  virtual GoogleString CacheKeySuffix() const {
66  GoogleString suffix;
67  if (hierarchy_->media().empty()) {
68  suffix = "all";
69  } else {
70  suffix = hierarchy_->media()[0];
71  for (int i = 1, n = hierarchy_->media().size(); i < n; ++i) {
72  StrAppend(&suffix, "_", hierarchy_->media()[i]);
73  }
74  }
75  return suffix;
76  }
77 
78  virtual void RewriteSingle(const ResourcePtr& input_resource,
79  const OutputResourcePtr& output_resource) {
80  input_resource_ = input_resource;
81  output_resource_ = output_resource;
82 
91  RewriteDomainTransformer transformer(&hierarchy_->css_base_url(),
92  &hierarchy_->css_trim_url(),
93  Driver());
96  StringWriter writer(hierarchy_->input_contents_backing_store());
99  if ( Driver()->server_context()->url_namer()->ProxyMode() ||
100  !Driver()->options()->trim_urls_in_css() ||
101  !Driver()->options()->Enabled(RewriteOptions::kLeftTrimUrls)) {
102  transformer.set_trim_urls(false);
103  }
104  if (CssTagScanner::TransformUrls(input_resource_->contents(),
105  &writer,
106  &transformer,
107  Driver()->message_handler())) {
108  hierarchy_->set_input_contents_to_backing_store();
109  hierarchy_->set_input_contents_resolved(true);
110  } else {
111  hierarchy_->set_input_contents(input_resource_->contents());
112  }
113 
114  bool ok = true;
115  GoogleString failure_reason;
116  if (!hierarchy_->Parse()) {
118  ok = false;
119  failure_reason = StrCat("Cannot parse the CSS in ",
120  hierarchy_->url_for_humans());
121  filter_->num_flatten_imports_minify_failed_->Add(1);
122  } else if (!hierarchy_->CheckCharsetOk(input_resource, &failure_reason)) {
123  ok = false;
124  filter_->num_flatten_imports_charset_mismatch_->Add(1);
125  } else {
126  rewriter_->RewriteCssFromNested(this, hierarchy_);
127  }
128 
129  if (!ok) {
130  hierarchy_->set_flattening_succeeded(false);
131  hierarchy_->AddFlatteningFailureReason(failure_reason);
133  } else if (num_nested() > 0) {
134  StartNestedTasks();
135  } else {
136  Harvest();
137  }
138  }
139 
140  void Harvest() {
141  DCHECK_EQ(1, num_output_partitions());
142 
148  hierarchy_->RollUpContents();
149 
151  output_partition(0)->set_inlined_data(hierarchy_->minified_contents());
152 
153  ServerContext* server_context = FindServerContext();
154  server_context->MergeNonCachingResponseHeaders(input_resource_,
155  output_resource_);
156  if (Driver()->Write(ResourceVector(1, input_resource_),
157  hierarchy_->minified_contents(),
158  &kContentTypeCss,
159  input_resource_->charset(),
160  output_resource_.get())) {
162  } else {
164  }
165  }
166 
167  virtual void Render() {
169  if (num_output_partitions() == 1 && output_partition(0)->optimizable()) {
179  if (hierarchy_->minified_contents().empty()) {
180  hierarchy_->set_minified_contents(
181  output_partition(0)->inlined_data());
182  hierarchy_->set_input_contents(hierarchy_->minified_contents());
183  }
184  } else {
190  hierarchy_->set_flattening_succeeded(false);
191  }
192  }
193 
194  virtual const char* id() const {
195  return RewriteOptions::kCssImportFlattenerId;
196  }
197  virtual OutputResourceKind kind() const { return kRewrittenResource; }
198 
199  private:
200  CssFilter* filter_;
201  CssFilter::Context* rewriter_;
202  CssHierarchy* hierarchy_;
203  ResourcePtr input_resource_;
204  OutputResourcePtr output_resource_;
205  DISALLOW_COPY_AND_ASSIGN(CssFlattenImportsContext);
206 };
207 
208 }
209 
210 #endif
RewriteContext * parent()
Allows a nested rewriter to walk up its parent hierarchy.
Definition: rewrite_context.h:266
Context used by CssFilter under async flow.
Definition: css_filter.h:257
void MergeNonCachingResponseHeaders(const ResourcePtr &input, const OutputResourcePtr &output)
Definition: server_context.h:527
virtual void Render()
Definition: css_flatten_imports_context.h:167
Definition: css_tag_scanner.h:110
virtual bool trim_urls_in_css() const
Return false in a subclass if you want to disallow all URL trimming in CSS.
Definition: rewrite_options.h:1936
virtual OutputResourceKind kind() const
Definition: css_flatten_imports_context.h:197
Definition: css_hierarchy.h:64
bool CheckCharsetOk(const ResourcePtr &resource, GoogleString *failure_reason)
int num_output_partitions() const
rewrite went fine
Definition: rewrite_result.h:29
Context used by CssFilter under async flow that flattens .
Definition: css_flatten_imports_context.h:48
virtual void RewriteSingle(const ResourcePtr &input_resource, const OutputResourcePtr &output_resource)
Subclasses of SingleRewriteContext must override this:
Definition: css_flatten_imports_context.h:78
rewrite is impossible or undesirable
Definition: rewrite_result.h:28
void RewriteDone(RewriteResult result, int partition_index)
virtual GoogleString CacheKeySuffix() const
Definition: css_flatten_imports_context.h:61
void Harvest()
Definition: css_flatten_imports_context.h:140
ServerContext * FindServerContext() const
virtual const char * id() const
Returns the filter ID.
Definition: css_flatten_imports_context.h:194
void set_input_contents(const StringPiece input_contents)
Definition: css_hierarchy.h:113
int num_nested() const
Accessors for the nested rewrites.
Definition: rewrite_context.h:305
Definition: server_context.h:101
virtual bool ProxyMode() const
Definition: url_namer.h:84
Definition: rewrite_context.h:144
derived from some input resource URL or URLs.
Definition: output_resource_kind.h:27
Definition: single_rewrite_context.h:36
void RewriteCssFromNested(RewriteContext *parent, CssHierarchy *hierarchy)
Definition: css_filter.h:75
static bool TransformUrls(const StringPiece &contents, Writer *writer, Transformer *transformer, MessageHandler *handler)
const RewriteOptions * options() const
Return the options used for this RewriteDriver.
Definition: rewrite_driver.h:478
CssFlattenImportsContext(RewriteContext *parent, CssFilter *filter, CssFilter::Context *rewriter, CssHierarchy *hierarchy)
Definition: css_flatten_imports_context.h:50
OutputResourceKind
Definition: output_resource_kind.h:26
void AddFlatteningFailureReason(const GoogleString &reason)