11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright (c) 2012 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_action_manager.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_apitest.h" 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_tab_util.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/test_extension_dir.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/tabs/tab_strip_model.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/extensions/features/feature_channel.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/extension_test_message_listener.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/image/image_skia.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace extensions { 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kDeclarativeContentManifest[] = 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "{\n" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"name\": \"Declarative Content apitest\",\n" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"version\": \"0.1\",\n" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"manifest_version\": 2,\n" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"description\": \n" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"end-to-end browser test for the declarative Content API\",\n" 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"background\": {\n" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"scripts\": [\"background.js\"]\n" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " },\n" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"page_action\": {},\n" 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"permissions\": [\n" 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " \"declarativeContent\"\n" 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " ]\n" 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "}\n"; 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SetIconAPITest : public ExtensionApiTest { 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetIconAPITest() 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Set the channel to "trunk" since declarativeContent is restricted 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // to trunk. 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : current_channel_(chrome::VersionInfo::CHANNEL_UNKNOWN) { 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~SetIconAPITest() {} 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::ScopedCurrentChannel current_channel_; 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestExtensionDir ext_dir_; 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(SetIconAPITest, Overview) { 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ext_dir_.WriteManifest(kDeclarativeContentManifest); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ext_dir_.WriteFile( 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FILE_PATH_LITERAL("background.js"), 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "var declarative = chrome.declarative;\n" 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "\n" 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "var PageStateMatcher = chrome.declarativeContent.PageStateMatcher;\n" 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "var SetIcon = chrome.declarativeContent.SetIcon;\n" 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "\n" 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "var canvas = document.createElement(\'canvas\');\n" 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "var ctx = canvas.getContext(\"2d\");" 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "var imageData = ctx.createImageData(19,19);\n" 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "\n" 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "var rule0 = {\n" 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " conditions: [new PageStateMatcher({\n" 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " pageUrl: {hostPrefix: \"test1\"}})],\n" 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " actions: [new SetIcon({\"imageData\": imageData})]\n" 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "}\n" 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "\n" 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "var testEvent = chrome.declarativeContent.onPageChanged;\n" 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "\n" 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "testEvent.removeRules(undefined, function() {\n" 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " testEvent.addRules([rule0], function() {\n" 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " chrome.test.sendMessage(\"ready\", function(reply) {\n" 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " })\n" 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " });\n" 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "});\n"); 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionTestMessageListener ready("ready", true); 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Extension* extension = LoadExtension(ext_dir_.unpacked_path()); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(extension); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ExtensionAction* page_action = 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionActionManager::Get(browser()->profile())-> 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetPageAction(*extension); 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(page_action); 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(ready.WaitUntilSatisfied()); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::WebContents* const tab = 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->tab_strip_model()->GetWebContentsAt(0); 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int tab_id = ExtensionTabUtil::GetTabId(tab); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // There should be no declarative icon until we navigate to a matched page. 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(page_action->GetDeclarativeIcon(tab_id).bitmap()->empty()); 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NavigateInRenderer(tab, GURL("http://test1/")); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(page_action->GetDeclarativeIcon(tab_id).bitmap()->empty()); 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Navigating to an unmatched page should reset the icon. 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NavigateInRenderer(tab, GURL("http://test2/")); 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(page_action->GetDeclarativeIcon(tab_id).bitmap()->empty()); 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace extensions 97