12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative_content/content_condition.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/test/values_test_util.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative_content/content_constants.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/url_matcher/url_matcher.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "url/gurl.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::ElementsAre; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::HasSubstr; 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using url_matcher::URLMatcher; 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using url_matcher::URLMatcherConditionSet; 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions { 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DeclarativeContentConditionTest, UnknownConditionName) { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLMatcher matcher; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ContentCondition> result = ContentCondition::Create( 308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NULL, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matcher.condition_factory(), 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *base::test::ParseJson( 338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "{\n" 348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) " \"invalid\": \"foobar\",\n" 358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) " \"instanceType\": \"declarativeContent.PageStateMatcher\",\n" 368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "}"), 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_THAT(error, HasSubstr("Unknown condition attribute")); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(matcher.IsEmpty()) << "Errors shouldn't add URL conditions"; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DeclarativeContentConditionTest, WrongPageUrlDatatype) { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLMatcher matcher; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ContentCondition> result = ContentCondition::Create( 488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NULL, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matcher.condition_factory(), 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *base::test::ParseJson( 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "{\n" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"pageUrl\": [],\n" 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"instanceType\": \"declarativeContent.PageStateMatcher\",\n" 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "}"), 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_THAT(error, HasSubstr("invalid type")); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(matcher.IsEmpty()) << "Errors shouldn't add URL conditions"; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DeclarativeContentConditionTest, WrongCssDatatype) { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLMatcher matcher; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ContentCondition> result = ContentCondition::Create( 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NULL, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matcher.condition_factory(), 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *base::test::ParseJson( 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "{\n" 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"css\": \"selector\",\n" 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"instanceType\": \"declarativeContent.PageStateMatcher\",\n" 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "}"), 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_THAT(error, HasSubstr("invalid type")); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(matcher.IsEmpty()) << "Errors shouldn't add URL conditions"; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DeclarativeContentConditionTest, ConditionWithUrlAndCss) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLMatcher matcher; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ContentCondition> result = ContentCondition::Create( 858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NULL, 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matcher.condition_factory(), 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *base::test::ParseJson( 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "{\n" 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"instanceType\": \"declarativeContent.PageStateMatcher\",\n" 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"pageUrl\": {\"hostSuffix\": \"example.com\"},\n" 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"css\": [\"input\"],\n" 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "}"), 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(result); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLMatcherConditionSet::Vector all_new_condition_sets; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result->GetURLMatcherConditionSets(&all_new_condition_sets); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matcher.AddConditionSets(all_new_condition_sets); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(matcher.IsEmpty()); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RendererContentMatchData match_data; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) match_data.css_selectors.insert("input"); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_THAT(matcher.MatchURL(GURL("http://google.com/")), 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ElementsAre(/*empty*/)); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) match_data.page_url_matches = matcher.MatchURL( 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://www.example.com/foobar")); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_THAT(match_data.page_url_matches, 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ElementsAre(result->url_matcher_condition_set_id())); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result->IsFulfilled(match_data)); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) match_data.css_selectors.clear(); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) match_data.css_selectors.insert("body"); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(result->IsFulfilled(match_data)); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 121