/*
 * Copyright 2010 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: mdsteele@google.com (Matthew D. Steele)

#include "net/instaweb/rewriter/public/resource_tag_scanner.h"

#include <cstddef>
#include <memory>
#include <vector>

#include "net/instaweb/rewriter/public/rewrite_driver.h"
#include "net/instaweb/rewriter/public/rewrite_options.h"
#include "net/instaweb/rewriter/public/rewrite_test_base.h"
#include "pagespeed/kernel/base/basictypes.h"
#include "pagespeed/kernel/base/gtest.h"
#include "pagespeed/kernel/base/scoped_ptr.h"
#include "pagespeed/kernel/base/string_util.h"
#include "pagespeed/kernel/html/empty_html_filter.h"
#include "pagespeed/kernel/html/html_element.h"
#include "pagespeed/kernel/http/semantic_type.h"

namespace net_instaweb {

namespace {

typedef std::vector<semantic_type::Category> CategoryVector;

// Helper class to collect all external resources.
class ResourceCollector : public EmptyHtmlFilter {
 public:
  explicit ResourceCollector(StringVector* resources,
                             CategoryVector* resource_category,
                             RewriteDriver* driver)
      : resources_(resources),
        resource_category_(resource_category),
        driver_(driver) {}

  virtual void StartDocument() {
    resources_->clear();
    resource_category_->clear();
  }

  virtual void StartElement(HtmlElement* element) {
    resource_tag_scanner::UrlCategoryVector attributes;
    resource_tag_scanner::ScanElement(element, driver_->options(), &attributes);
    for (int i = 0, n = attributes.size(); i < n; ++i) {
      resources_->push_back(attributes[i].url->DecodedValueOrNull());
      resource_category_->push_back(attributes[i].category);
    }
  }

  virtual const char* Name() const { return "ResourceCollector"; }

 private:
  StringVector* resources_;
  CategoryVector* resource_category_;
  RewriteDriver* driver_;

  DISALLOW_COPY_AND_ASSIGN(ResourceCollector);
};

class ResourceTagScannerTest : public RewriteTestBase {
 protected:
  virtual void SetUp() {
    RewriteTestBase::SetUp();
    collector_.reset(
        new ResourceCollector(
            &resources_, &resource_category_, rewrite_driver()));
    rewrite_driver()->AddFilter(collector_.get());
  }

  virtual bool AddBody() const { return true; }

  StringVector resources_;
  CategoryVector resource_category_;
  scoped_ptr<ResourceCollector> collector_;
};

TEST_F(ResourceTagScannerTest, SimpleScript) {
  ValidateNoChanges(
      "SimpleScript",
      "<script src='myscript.js'></script>\n");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("myscript.js", resources_[0]);
  EXPECT_EQ(semantic_type::kScript, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, EcmaScript) {
  ValidateNoChanges(
      "EcmaScript",
      "<script src='action.as' type='application/ecmascript'></script>\n");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("action.as", resources_[0]);
  EXPECT_EQ(semantic_type::kScript, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, Image) {
  ValidateNoChanges(
      "Image",
      "<img src=\"image.jpg\"/>\n");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("image.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, Prefetch) {
  ValidateNoChanges(
      "Prefetch",
      "<link rel=\"prefetch\" href=\"do_find_prefetch\">\n");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("do_find_prefetch", resources_[0]);
  EXPECT_EQ(semantic_type::kPrefetch, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, NoMediaCss) {
  ValidateNoChanges(
      "NoMediaCss",
      "<link rel=\"stylesheet\" type=\"text/css\" href=\"nomedia.css\">\n");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("nomedia.css", resources_[0]);
  EXPECT_EQ(semantic_type::kStylesheet, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, IdCss) {
  ValidateNoChanges(
      "IdCss",
      "<link rel=stylesheet type=text/css href=id.css id=id>\n");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("id.css", resources_[0]);
  EXPECT_EQ(semantic_type::kStylesheet, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, NoTypeCss) {
  ValidateNoChanges(
      "NoTypeCss",
      "<link rel=stylesheet href=no_type.style>\n");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("no_type.style", resources_[0]);
  EXPECT_EQ(semantic_type::kStylesheet, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, MediaCss) {
  ValidateNoChanges(
      "MediaCss",
      "<link rel=stylesheet type=text/css href=media.css media=print>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("media.css", resources_[0]);
  EXPECT_EQ(semantic_type::kStylesheet, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, Link) {
  ValidateNoChanges(
      "Link",
      "<a href=\"find_link\"/>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("find_link", resources_[0]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, FormAction) {
  ValidateNoChanges(
      "FormAction",
      "<form action=\"find_form_action\"/>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("find_form_action", resources_[0]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, RelCase) {
  ValidateNoChanges(
      "RelCase",
      "<link rel=StyleSheet href='case.css'>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("case.css", resources_[0]);
  EXPECT_EQ(semantic_type::kStylesheet, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, BodyBackground) {
  ValidateNoChanges(
      "BodyBackground",
      "<body background=background_image.jpg>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("background_image.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, FavIcon) {
  ValidateNoChanges(
      "FavIcon",
      "<link rel=icon href=favicon.ico>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("favicon.ico", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, ShortcutIcon) {
  ValidateNoChanges(
      "ShortcutIcon",
      "<link rel='shortcut icon' href=favicon.ico>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("favicon.ico", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, AppleTouchIcon) {
  ValidateNoChanges(
      "AppleTouchIcon",
      "<link rel=apple-touch-icon href=apple-extension.jpg>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("apple-extension.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, AppleTouchIconPrecomposed) {
  ValidateNoChanges(
      "AppleTouchIconPrecomposed",
      "<link rel=apple-touch-icon-precomposed href=apple-extension2.jpg>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("apple-extension2.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, AppleTouchStartup) {
  ValidateNoChanges(
      "AppleTouchStartup",
      "<link rel=apple-touch-startup-image href=apple-extension3.jpg>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("apple-extension3.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, DontFindImage) {
  ValidateNoChanges(
      "DontFindImage",
      "<input src=dont-find-image.jpg>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, DoFindImage) {
  ValidateNoChanges(
      "DoFindImage",
      "<input type=image src=do-find-image.jpg>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("do-find-image.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, ImageNotAction) {
  ValidateNoChanges(
      "ImageNotAction",
      "<input type=IMAGE src=find-image.jpg formaction=do-find-formaction>");
  ASSERT_EQ(static_cast<size_t>(2), resources_.size());
  ASSERT_EQ(static_cast<size_t>(2), resource_category_.size());
  EXPECT_STREQ("find-image.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
  EXPECT_STREQ("do-find-formaction", resources_[1]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[1]);
}

TEST_F(ResourceTagScannerTest, DoFindInputFormaction) {
  ValidateNoChanges(
      "DoFindFormaction",
      "<input formaction=find-formaction>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("find-formaction", resources_[0]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, DoFindButtonFormaction) {
  ValidateNoChanges(
      "DoFindAction",
      "<button formaction=do-find-formaction></button>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("do-find-formaction", resources_[0]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, CommandIcon) {
  ValidateNoChanges(
      "CommandIcon",
      "<command icon=some-icon.jpg></command>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("some-icon.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, DontFindBase) {
  ValidateNoChanges(
      "DontFindBase",
      "<base href=dont-find-base>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, DontFindApplet) {
  ValidateNoChanges(
      "DontFindApplet",
      "<applet codebase=dont-find-applet-codebase></applet>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, DontFindObject) {
  ValidateNoChanges(
      "DontFindObject",
      "<object codebase=dont-find-object-codebase></object>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, Manifest) {
  ValidateNoChanges(
      "Manifest",
      "<html manifest=html-manifest></html>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("html-manifest", resources_[0]);
  EXPECT_EQ(semantic_type::kOtherResource, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, BlockquoteCitation) {
  ValidateNoChanges(
      "BlockquoteCitation",
      "<blockquote cite=blockquote-citation></blockquote>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("blockquote-citation", resources_[0]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, DoFindBodyCitation) {
  ValidateNoChanges(
      "NoBodyCitation",
      "<body cite=do-find-body-citation></body>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("do-find-body-citation", resources_[0]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, QCitation) {
  ValidateNoChanges(
      "QCitation",
      "<q cite=q-citation>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("q-citation", resources_[0]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, InsCitation) {
  ValidateNoChanges(
      "InsCitation",
      "<ins cite=ins-citation></ins>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("ins-citation", resources_[0]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, DelCitation) {
  ValidateNoChanges(
      "DelCitation",
      "<del cite=del-citation></del>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("del-citation", resources_[0]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, AreaLink) {
  ValidateNoChanges(
      "AreaLink",
      "<area href=find-area-link>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("find-area-link", resources_[0]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, ImageAndLongdesc) {
  ValidateNoChanges(
      "ImageAndLongdesc",
      "<img src=find-image longdesc=do-find-longdesc>");
  ASSERT_EQ(static_cast<size_t>(2), resources_.size());
  ASSERT_EQ(static_cast<size_t>(2), resource_category_.size());
  EXPECT_STREQ("find-image", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
  EXPECT_STREQ("do-find-longdesc", resources_[1]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[1]);
}

TEST_F(ResourceTagScannerTest, ImageUrlValuedAttribute) {
  options()->ClearSignatureForTesting();
  options()->AddUrlValuedAttribute("img", "data-src", semantic_type::kImage);
  options()->ComputeSignature();

  // Image tag with both src and data-src.  All attributes get returned.
  ValidateNoChanges(
      "ImageAndDataAndLongdesc",
      "<img src=find-image data-src=img2 longdesc=do-find-longdesc>");
  ASSERT_EQ(static_cast<size_t>(3), resources_.size());
  ASSERT_EQ(static_cast<size_t>(3), resource_category_.size());
  EXPECT_STREQ("find-image", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
  EXPECT_STREQ("img2", resources_[1]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[1]);
  EXPECT_STREQ("do-find-longdesc", resources_[2]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[2]);

  // Image tag without src, but with a data-src.  Both data-src and longdesc
  // attributes get returned.
  ValidateNoChanges(
      "ImageDataAndLongdesc",
      "<img data-src=img2 longdesc=do-find-longdesc>");
  ASSERT_EQ(static_cast<size_t>(2), resources_.size());
  ASSERT_EQ(static_cast<size_t>(2), resource_category_.size());
  EXPECT_STREQ("img2", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
  EXPECT_STREQ("do-find-longdesc", resources_[1]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[1]);
}

TEST_F(ResourceTagScannerTest, ImageUrlValuedAttributeOverride) {
  options()->ClearSignatureForTesting();
  options()->AddUrlValuedAttribute("a", "href", semantic_type::kImage);
  options()->ComputeSignature();

  // Detect the href of this a tag is an image..
  ValidateNoChanges(
      "HrefImage",
      "<a href=find-image>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("find-image", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, DoFindLongdesc) {
  ValidateNoChanges(
      "DoFindLongdesc",
      "<img longdesc=do-find-longdesc>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("do-find-longdesc", resources_[0]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, FrameSrcAndLongdesc) {
  ValidateNoChanges(
      "FrameSrcAndLongdesc",
      "<frame src=find-frame-src longdesc=do-find-longdesc></frame>");
  ASSERT_EQ(static_cast<size_t>(2), resources_.size());
  ASSERT_EQ(static_cast<size_t>(2), resource_category_.size());
  EXPECT_STREQ("find-frame-src", resources_[0]);
  EXPECT_EQ(semantic_type::kOtherResource, resource_category_[0]);
  EXPECT_STREQ("do-find-longdesc", resources_[1]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[1]);
}

TEST_F(ResourceTagScannerTest, IFrameSrcNotLongdesc) {
  ValidateNoChanges(
    "IFrameSrcNotLongdesc",
    "<iframe src=find-iframe-src longdesc=do-find-longdesc></iframe>");
  ASSERT_EQ(static_cast<size_t>(2), resources_.size());
  ASSERT_EQ(static_cast<size_t>(2), resource_category_.size());
  EXPECT_STREQ("find-iframe-src", resources_[0]);
  EXPECT_EQ(semantic_type::kOtherResource, resource_category_[0]);
  EXPECT_STREQ("do-find-longdesc", resources_[1]);
  EXPECT_EQ(semantic_type::kHyperlink, resource_category_[1]);
}

TEST_F(ResourceTagScannerTest, DontFindProfile) {
  ValidateNoChanges(
      "DontFindProfile",
      "<head profile=dont-find-profile></head>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, TrackSrc) {
  ValidateNoChanges(
      "TrackSrc",
      "<track src=track-src>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("track-src", resources_[0]);
  EXPECT_EQ(semantic_type::kOtherResource, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, AudioSrc) {
  ValidateNoChanges(
      "AudioSrc",
      "<audio src=audio-src></audio>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("audio-src", resources_[0]);
  EXPECT_EQ(semantic_type::kOtherResource, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, VideoSrc) {
  ValidateNoChanges(
      "VideoSrc",
      "<video poster=do-find-poster src=find-video-src></video>");
  ASSERT_EQ(static_cast<size_t>(2), resources_.size());
  ASSERT_EQ(static_cast<size_t>(2), resource_category_.size());
  EXPECT_STREQ("do-find-poster", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
  EXPECT_STREQ("find-video-src", resources_[1]);
  EXPECT_EQ(semantic_type::kOtherResource, resource_category_[1]);
}

TEST_F(ResourceTagScannerTest, EmbedSrc) {
  ValidateNoChanges(
      "EmbedSrc",
      "<embed src=embed-src>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("embed-src", resources_[0]);
  EXPECT_EQ(semantic_type::kOtherResource, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, SourceSrc) {
  ValidateNoChanges(
      "SourceSrc",
      "<source src=source-src>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("source-src", resources_[0]);
  EXPECT_EQ(semantic_type::kOtherResource, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, DontFindArchive) {
  ValidateNoChanges(
      "DontFindArchive",
      "<applet archive=archive-unsafe-because-of-codebase></applet>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, DontFindCode) {
  ValidateNoChanges(
      "DontFindCode",
      "<applet code=code-unsafe-because-of-codebase></applet>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, DontFindClassid) {
  ValidateNoChanges(
      "DontFindClassid",
      "<object classid=classid-unsafe-because-of-codebase></object>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, DontFindData) {
  ValidateNoChanges(
      "DontFindData",
      "<object data=data-unsafe-because-of-codebase></object>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, DontFindObjectArchive) {
  ValidateNoChanges(
      "DontFindObjectArchive",
      "<object archive=archive-unsafe-because-of-codebase></object>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, DontFindUsemap) {
  ValidateNoChanges(
      "DontFindUsemap",
      "<img usemap=ignore-img-usemap>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, DontFindImageUsemap) {
  ValidateNoChanges(
      "DontFindImageUsemap",
      "<input type=image usemap=ignore-input-usemap>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, DontFindObjectUsemap) {
  ValidateNoChanges(
      "DontFindObjectUsemap",
      "<object usemap=ignore-object-usemap></object>");
  EXPECT_TRUE(resources_.empty());
  EXPECT_TRUE(resource_category_.empty());
}

TEST_F(ResourceTagScannerTest, TdBackgroundImage) {
  ValidateNoChanges(
      "TdBackgroundImage",
      "<td background=td_background_image.jpg></td>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("td_background_image.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, ThBackgroundImage) {
  ValidateNoChanges(
      "ThBackgroundImage",
      "<th background=th_background_image.jpg></th>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("th_background_image.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, TableBackgroundImage) {
  ValidateNoChanges(
      "TableBackgroundImage",
      "<table background=table_background_image.jpg></table>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("table_background_image.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, TBodyBackgroundImage) {
  ValidateNoChanges(
      "TBodyBackgroundImage",
      "<tbody background=tbody_background_image.jpg></tbody>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("tbody_background_image.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, TFootBackgroundImage) {
  ValidateNoChanges(
      "TFootBackgroundImage",
      "<tfoot background=tfoot_background_image.jpg></tfoot>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("tfoot_background_image.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

TEST_F(ResourceTagScannerTest, THeadBackgroundImage) {
  ValidateNoChanges(
      "THeadBackgroundImage",
      "<thead background=thead_background_image.jpg></thead>");
  ASSERT_EQ(static_cast<size_t>(1), resources_.size());
  ASSERT_EQ(static_cast<size_t>(1), resource_category_.size());
  EXPECT_STREQ("thead_background_image.jpg", resources_[0]);
  EXPECT_EQ(semantic_type::kImage, resource_category_[0]);
}

}  // namespace

}  // namespace net_instaweb
