Page Speed Optimization Libraries  1.11.33.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends 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"
37 #include "pagespeed/kernel/base/basictypes.h"
38 #include "pagespeed/kernel/base/ref_counted_ptr.h"
39 #include "pagespeed/kernel/base/statistics.h"
40 #include "pagespeed/kernel/base/string.h"
41 #include "pagespeed/kernel/base/string_util.h"
42 #include "pagespeed/kernel/base/string_writer.h"
43 #include "pagespeed/kernel/http/content_type.h"
44 
45 namespace net_instaweb {
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  RewriteDriver* driver = Driver();
92  RewriteDomainTransformer transformer(&hierarchy_->css_base_url(),
93  &hierarchy_->css_trim_url(),
94  driver->server_context(),
95  driver->options(),
96  driver->message_handler());
99  StringWriter writer(hierarchy_->input_contents_backing_store());
102  if ( driver->server_context()->url_namer()->ProxyMode() ||
103  !driver->options()->trim_urls_in_css() ||
104  !driver->options()->Enabled(RewriteOptions::kLeftTrimUrls)) {
105  transformer.set_trim_urls(false);
106  }
108  input_resource_->ExtractUncompressedContents(), &writer,
109  &transformer, driver->message_handler())) {
110  hierarchy_->set_input_contents_to_backing_store();
111  hierarchy_->set_input_contents_resolved(true);
112  } else {
113  hierarchy_->set_input_contents(
114  input_resource_->ExtractUncompressedContents());
115  }
116 
117  bool ok = true;
118  GoogleString failure_reason;
119  if (!hierarchy_->Parse()) {
121  ok = false;
122  failure_reason = StrCat("Cannot parse the CSS in ",
123  hierarchy_->url_for_humans());
124  filter_->num_flatten_imports_minify_failed_->Add(1);
125  } else if (!hierarchy_->CheckCharsetOk(input_resource, &failure_reason)) {
126  ok = false;
127  filter_->num_flatten_imports_charset_mismatch_->Add(1);
128  } else {
129  rewriter_->RewriteCssFromNested(this, hierarchy_);
130  }
131 
132  if (!ok) {
133  hierarchy_->set_flattening_succeeded(false);
134  hierarchy_->AddFlatteningFailureReason(failure_reason);
136  } else if (num_nested() > 0) {
137  StartNestedTasks();
138  } else {
139  Harvest();
140  }
141  }
142 
143  void Harvest() {
144  DCHECK_EQ(1, num_output_partitions());
145 
148 
154  hierarchy_->RollUpContents();
155 
157  output_partition(0)->set_inlined_data(hierarchy_->minified_contents());
158 
159  ServerContext* server_context = FindServerContext();
160  server_context->MergeNonCachingResponseHeaders(input_resource_,
161  output_resource_);
162  if (Driver()->Write(ResourceVector(1, input_resource_),
163  hierarchy_->minified_contents(),
164  &kContentTypeCss,
165  input_resource_->charset(),
166  output_resource_.get())) {
168  } else {
170  }
171  }
172 
173  virtual void Render() {
175  if (num_output_partitions() == 1 && output_partition(0)->optimizable()) {
185  if (hierarchy_->minified_contents().empty()) {
186  hierarchy_->set_minified_contents(
187  output_partition(0)->inlined_data());
188  hierarchy_->set_input_contents(hierarchy_->minified_contents());
191  hierarchy_->Parse();
192  }
193  } else {
199  hierarchy_->set_flattening_succeeded(false);
200  }
201  }
202 
203  virtual const char* id() const {
204  return RewriteOptions::kCssImportFlattenerId;
205  }
206  virtual OutputResourceKind kind() const { return kRewrittenResource; }
207 
208  private:
209  CssFilter* filter_;
210  CssFilter::Context* rewriter_;
211  CssHierarchy* hierarchy_;
212  ResourcePtr input_resource_;
213  OutputResourcePtr output_resource_;
214 
215 };
216 
217 }
218 
219 #endif
RewriteContext * parent()
Allows a nested rewriter to walk up its parent hierarchy.
Definition: rewrite_context.h:274
Context used by CssFilter under async flow.
Definition: css_filter.h:255
void MergeNonCachingResponseHeaders(const ResourcePtr &input, const OutputResourcePtr &output)
Definition: server_context.h:513
virtual void Render()
Definition: css_flatten_imports_context.h:173
Definition: css_tag_scanner.h:147
static bool TransformUrls(StringPiece contents, Writer *writer, Transformer *transformer, MessageHandler *handler)
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:2231
virtual OutputResourceKind kind() const
Definition: css_flatten_imports_context.h:206
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:143
ServerContext * FindServerContext() const
virtual const char * id() const
Returns the filter ID.
Definition: css_flatten_imports_context.h:203
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:278
Definition: rewrite_driver.h:98
Definition: server_context.h:100
virtual bool ProxyMode() const
Definition: url_namer.h:82
Definition: rewrite_context.h:146
Derived from some input resource URL or URLs.
Definition: output_resource_kind.h:27
Definition: single_rewrite_context.h:36
static void InheritChildImageInfo(RewriteContext *context)
void RewriteCssFromNested(RewriteContext *parent, CssHierarchy *hierarchy)
Definition: css_filter.h:74
const RewriteOptions * options() const
Return the options used for this RewriteDriver.
Definition: rewrite_driver.h:490
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)