blob: 380711eb8fe597b139be79dc934ecb4c1f189cac [file] [log] [blame]
// Copyright 2020 The Cobalt Authors. All Rights Reserved.
//
// 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.
#include "cobalt/dom/html_link_element.h"
#include "base/message_loop/message_loop.h"
#include "cobalt/cssom/testing/mock_css_parser.h"
#include "cobalt/dom/document.h"
#include "cobalt/dom/dom_stat_tracker.h"
#include "cobalt/dom/testing/stub_environment_settings.h"
#include "cobalt/dom/window.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using ::testing::NiceMock;
namespace cobalt {
namespace dom {
class HTMLLinkElementMock : public HTMLLinkElement {
public:
explicit HTMLLinkElementMock(Document* document)
: HTMLLinkElement(document) {}
void Obtain() { obtained_ = true; }
bool obtained_ = false;
bool obtained() { return obtained_; }
};
class DocumentMock : public Document {
public:
explicit DocumentMock(HTMLElementContext* context) : Document(context) {}
scoped_refptr<HTMLLinkElementMock> CreateElement(
const std::string& local_name) {
return scoped_refptr<HTMLLinkElementMock>(new HTMLLinkElementMock(this));
}
};
class HtmlLinkElementTest : public ::testing::Test {
protected:
HtmlLinkElementTest()
: dom_stat_tracker_(new DomStatTracker("HtmlLinkElementTest")),
html_element_context_(&environment_settings_, NULL, NULL, &css_parser_,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, dom_stat_tracker_.get(),
"", base::kApplicationStateStarted, NULL),
document_(new DocumentMock(&html_element_context_)),
message_loop_(base::MessageLoop::TYPE_DEFAULT) {}
scoped_refptr<DocumentMock> document() { return document_; }
scoped_refptr<HTMLLinkElementMock> CreateDocumentWithLinkElement(
std::string rel = "");
private:
std::unique_ptr<DomStatTracker> dom_stat_tracker_;
testing::StubEnvironmentSettings environment_settings_;
NiceMock<cssom::testing::MockCSSParser> css_parser_;
HTMLElementContext html_element_context_;
scoped_refptr<DocumentMock> document_;
base::MessageLoop message_loop_;
};
scoped_refptr<HTMLLinkElementMock>
HtmlLinkElementTest::CreateDocumentWithLinkElement(std::string rel) {
scoped_refptr<HTMLLinkElementMock> element_ =
document_->CreateElement("link");
if (!rel.empty()) {
element_->SetAttribute("rel", rel);
}
document_->AppendChild(element_);
return element_;
}
TEST_F(HtmlLinkElementTest, StylesheetRelAttribute) {
scoped_refptr<HTMLLinkElementMock> el =
CreateDocumentWithLinkElement("stylesheet");
EXPECT_TRUE(el->obtained());
}
TEST_F(HtmlLinkElementTest, SplashScreenRelAttribute) {
scoped_refptr<HTMLLinkElementMock> el =
CreateDocumentWithLinkElement("splashscreen");
EXPECT_TRUE(el->obtained());
el = CreateDocumentWithLinkElement("music_splashscreen");
EXPECT_TRUE(el->obtained());
el = CreateDocumentWithLinkElement("music-_\\2_splashscreen");
EXPECT_TRUE(el->obtained());
}
TEST_F(HtmlLinkElementTest, BadSplashScreenRelAttribute) {
scoped_refptr<HTMLLinkElementMock> el =
CreateDocumentWithLinkElement("bad*_splashscreen");
EXPECT_FALSE(el->obtained());
el = CreateDocumentWithLinkElement("badsplashscreen");
EXPECT_FALSE(el->obtained());
el = CreateDocumentWithLinkElement("splashscreen_bad");
EXPECT_FALSE(el->obtained());
}
} // namespace dom
} // namespace cobalt