blob: 2d8dd2f88545cf054292c8e1374588a8abc8a568 [file] [log] [blame]
/*
* Copyright 2013 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Author: bharathbhushan@google.com (Bharath Bhushan)
#include "net/instaweb/rewriter/public/dom_stats_filter.h"
#include "net/instaweb/rewriter/public/critical_images_finder.h"
#include "net/instaweb/rewriter/public/css_tag_scanner.h"
#include "net/instaweb/rewriter/public/rewrite_driver.h"
#include "net/instaweb/rewriter/public/script_tag_scanner.h"
#include "net/instaweb/rewriter/public/server_context.h"
#include "pagespeed/kernel/base/string_util.h"
#include "pagespeed/kernel/html/html_element.h"
#include "pagespeed/kernel/html/html_name.h"
#include "pagespeed/kernel/http/data_url.h"
#include "pagespeed/kernel/http/google_url.h"
namespace net_instaweb {
DomStatsFilter::DomStatsFilter(RewriteDriver* driver)
: CommonFilter(driver), script_tag_scanner_(driver) {
Clear();
}
DomStatsFilter::~DomStatsFilter() {}
void DomStatsFilter::Clear() {
num_img_tags_ = 0;
num_inlined_img_tags_ = 0;
num_external_css_ = 0;
num_scripts_ = 0;
num_critical_images_used_ = 0;
}
void DomStatsFilter::StartDocumentImpl() {
Clear();
}
void DomStatsFilter::EndElementImpl(HtmlElement* element) {
if (element->keyword() == HtmlName::kImg) {
++num_img_tags_;
HtmlElement::Attribute* src = element->FindAttribute(HtmlName::kSrc);
StringPiece url(src == NULL ? "" : src->DecodedValueOrNull());
if (!url.empty()) {
if (IsDataUrl(url)) {
++num_inlined_img_tags_;
} else {
CriticalImagesFinder* finder =
driver()->server_context()->critical_images_finder();
if (finder->Available(driver()) == CriticalImagesFinder::kAvailable) {
GoogleUrl image_gurl(driver()->base_url(), url);
if (finder->IsHtmlCriticalImage(image_gurl.Spec(), driver())) {
++num_critical_images_used_;
}
}
}
}
} else if (element->keyword() == HtmlName::kLink &&
CssTagScanner::IsStylesheetOrAlternate(
element->AttributeValue(HtmlName::kRel)) &&
element->FindAttribute(HtmlName::kHref) != NULL) {
++num_external_css_;
} else {
HtmlElement::Attribute* src;
if (script_tag_scanner_.ParseScriptElement(element, &src) ==
ScriptTagScanner::kJavaScript) {
++num_scripts_;
}
}
}
} // namespace net_instaweb