15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/command_line.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/plugin_service.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h" 24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/123851 : test flakily fails on win. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PluginLoadUnload DISABLED_PluginLoadUnload 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#elif defined(OS_MACOSX) && defined(ADDRESS_SANITIZER) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ExtensionBrowserTest.PluginLoadUnload started failing after the switch to 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// dynamic ASan runtime library on Mac. See http://crbug.com/234591. 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_PluginLoadUnload DISABLED_PluginLoadUnload 36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#elif defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) 37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Timing out on ARM linux http://crbug.com/238460 38b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#define MAYBE_PluginLoadUnload DISABLED_PluginLoadUnload 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PluginLoadUnload PluginLoadUnload 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that a renderer's plugin list is properly updated when we load and 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unload an extension that contains a plugin. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, MAYBE_PluginLoadUnload) { 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!content::PluginService::GetInstance()->NPAPIPluginsSupported()) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile()->GetPrefs()->SetBoolean(prefs::kPluginsAlwaysAuthorize, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extension_dir = 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir_.AppendASCII("uitest").AppendASCII("plugins"); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::FilePathToFileURL(extension_dir.AppendASCII("test.html"))); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With no extensions, the plugin should not be loaded. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = false; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, "testPluginWorks()", &result)); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(result); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = extensions::ExtensionSystem::Get( 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile())->extension_service(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->set_show_extensions_prompts(false); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = service->extensions()->size(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension(extension_dir); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size_before + 1, service->extensions()->size()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now the plugin should be in the cache. 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, "testPluginWorks()", &result)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't allow extension plugins to run on ChromeOS. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(result); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size_before + 1, service->extensions()->size()); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnloadExtension(extension->id()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size_before, service->extensions()->size()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now the plugin should be unloaded, and the page should be broken. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, "testPluginWorks()", &result)); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(result); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we reload the extension and page, it should work again. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtension(extension_dir)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size_before + 1, service->extensions()->size()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &browser()->tab_strip_model()->GetActiveWebContents()-> 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController())); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::Reload(browser(), CURRENT_TAB); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, "testPluginWorks()", &result)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't allow extension plugins to run on ChromeOS. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(result); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) && defined(ADDRESS_SANITIZER) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ExtensionBrowserTest.PluginPrivate started failing after the switch to 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// dynamic ASan runtime library on Mac. See http://crbug.com/234591. 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_PluginPrivate DISABLED_PluginPrivate 118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#elif defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) 119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Timing out on ARM linux http://crbug.com/238467 120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#define MAYBE_PluginPrivate DISABLED_PluginPrivate 121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#elif defined(OS_WIN) && defined(ARCH_CPU_X86_64) 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_PluginPrivate DISABLED_PluginPrivate 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_PluginPrivate PluginPrivate 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that private extension plugins are only visible to the extension. 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, MAYBE_PluginPrivate) { 129ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 130ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 132ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 133ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 134ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 135ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!content::PluginService::GetInstance()->NPAPIPluginsSupported()) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile()->GetPrefs()->SetBoolean(prefs::kPluginsAlwaysAuthorize, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extension_dir = 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir_.AppendASCII("uitest").AppendASCII("plugins_private"); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = extensions::ExtensionSystem::Get( 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile())->extension_service(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->set_show_extensions_prompts(false); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = service->extensions()->size(); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension(extension_dir); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size_before + 1, service->extensions()->size()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load the test page through the extension URL, and the plugin should work. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->GetResourceURL("test.html")); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = false; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, "testPluginWorks()", &result)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't allow extension plugins to run on ChromeOS. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(result); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(bauerb): This might wrongly fail if the plug-in takes too long 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to load. Extension-private plug-ins don't appear in navigator.plugins, so 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we can't check for the plug-in in Javascript. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Regression test for http://crbug.com/131811: The plug-in should be 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // whitelisted for the extension (and only for the extension), so it should be 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loaded even if content settings are set to block plug-ins. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting( 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_BLOCK); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, "testPluginWorks()", &result)); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't allow extension plugins to run on ChromeOS. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(result); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now load it through a file URL. The plugin should not load. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::FilePathToFileURL(extension_dir.AppendASCII("test.html"))); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, "testPluginWorks()", &result)); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(result); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 190