diff options
author | sammc@chromium.org <sammc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-15 04:57:14 +0000 |
---|---|---|
committer | sammc@chromium.org <sammc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-15 04:57:14 +0000 |
commit | fb52ada47741872b4add857717c9d79cf23b6704 (patch) | |
tree | cb1aba815ab27a3483b8ffc085651fa9cc2cc37d | |
parent | e6337c04312f67e9229a73f55ef7da1f4c0e0d45 (diff) | |
download | chromium_src-fb52ada47741872b4add857717c9d79cf23b6704.zip chromium_src-fb52ada47741872b4add857717c9d79cf23b6704.tar.gz chromium_src-fb52ada47741872b4add857717c9d79cf23b6704.tar.bz2 |
Remove support for crx-less hosted apps.
BUG=177038
Review URL: https://chromiumcodereview.appspot.com/12518019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@188261 0039d316-1c4b-4281-b951-d872f2087c98
18 files changed, 22 insertions, 272 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 4728eb7..79fad55 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -6159,12 +6159,6 @@ Keep your key file in a safe place. You will need it to create new versions of y Rasterise page before printing. Slower, but may help to resolve issues with some printers </message> </if> - <message name="IDS_FLAGS_CRXLESS_WEB_APPS_NAME" desc="Title of the CRX-less web apps lab"> - CRX-less Web Apps - </message> - <message name="IDS_FLAGS_CRXLESS_WEB_APPS_DESCRIPTION" desc="Description of the CRX-less web apps lab"> - Enables support for installing Chrome apps that are deployed using a manifest file on a webpage, rather than by packaging the manifest and icons into a crx file. - </message> <message name="IDS_FLAGS_TOUCH_OPTIMIZED_UI_NAME" desc="Title of the touch-optimized UI flag." > Touch Optimized UI </message> diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index b8a68f1..422aec9 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc @@ -296,13 +296,6 @@ const Experiment kExperiments[] = { }, #endif // OS_WIN { - "crxless-web-apps", - IDS_FLAGS_CRXLESS_WEB_APPS_NAME, - IDS_FLAGS_CRXLESS_WEB_APPS_DESCRIPTION, - kOsDesktop, - SINGLE_VALUE_TYPE(switches::kEnableCrxlessWebApps) - }, - { "ignore-gpu-blacklist", IDS_FLAGS_IGNORE_GPU_BLACKLIST_NAME, IDS_FLAGS_IGNORE_GPU_BLACKLIST_DESCRIPTION, diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 344cb0d..f3a3a3e 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc @@ -1156,7 +1156,6 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches( switches::kDisableScriptedPrintThrottling, switches::kDumpHistogramsOnExit, switches::kEnableBenchmarking, - switches::kEnableCrxlessWebApps, switches::kEnableExperimentalExtensionApis, switches::kEnableExperimentalFormFilling, switches::kEnableIPCFuzzing, diff --git a/chrome/browser/extensions/convert_web_app_browsertest.cc b/chrome/browser/extensions/convert_web_app_browsertest.cc index 0a4fd97..ee5bad3 100644 --- a/chrome/browser/extensions/convert_web_app_browsertest.cc +++ b/chrome/browser/extensions/convert_web_app_browsertest.cc @@ -4,10 +4,10 @@ #include <string> -#include "base/command_line.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/api/icons/icons_handler.h" @@ -20,6 +20,8 @@ #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_service.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/browser_test_utils.h" namespace extensions { @@ -33,11 +35,6 @@ class ExtensionFromWebAppTest const Extension* installed_extension_; private: - // InProcessBrowserTest - virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { - command_line->AppendSwitch(switches::kEnableCrxlessWebApps); - } - // content::NotificationObserver virtual void Observe(int type, const content::NotificationSource& source, @@ -53,8 +50,14 @@ class ExtensionFromWebAppTest } }; -IN_PROC_BROWSER_TEST_F(ExtensionFromWebAppTest, Basic) { - ASSERT_TRUE(test_server()->Start()); +#if defined(OS_CHROMEOS) +// The Apps tab is not included in the new tab page in Chrome OS. +#define MAYBE_Basic DISABLED_Basic +#else +#define MAYBE_Basic Basic +#endif + +IN_PROC_BROWSER_TEST_F(ExtensionFromWebAppTest, MAYBE_Basic) { browser()->profile()->GetExtensionService()->set_show_extensions_prompts( false); @@ -62,11 +65,14 @@ IN_PROC_BROWSER_TEST_F(ExtensionFromWebAppTest, Basic) { registrar.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, content::NotificationService::AllSources()); - expected_extension_id_ = "fnpgoaochgbdfjndakichfafiocjjpmm"; + expected_extension_id_ = "ffnmbohohhobhkjpfbefbjifapgcmpaa"; ui_test_utils::NavigateToURL( browser(), - test_server()->GetURL( - "files/extensions/convert_web_app/application.html")); + GURL("chrome://newtab")); + EXPECT_TRUE(content::ExecuteScript( + browser()->tab_strip_model()->GetActiveWebContents(), + "chrome.send('generateAppForLink', " + "['http://www.example.com', 'Test application', 0])")); if (!installed_extension_) content::RunMessageLoop(); @@ -74,21 +80,12 @@ IN_PROC_BROWSER_TEST_F(ExtensionFromWebAppTest, Basic) { EXPECT_TRUE(installed_extension_); EXPECT_TRUE(installed_extension_->is_hosted_app()); EXPECT_EQ("Test application", installed_extension_->name()); - EXPECT_EQ("the description is", installed_extension_->description()); - EXPECT_EQ(extension_misc::LAUNCH_PANEL, + EXPECT_EQ("", installed_extension_->description()); + EXPECT_EQ("http://www.example.com/", installed_extension_->launch_web_url()); + EXPECT_EQ(extension_misc::LAUNCH_TAB, installed_extension_->launch_container()); - - ASSERT_EQ(2u, installed_extension_->GetActivePermissions()->apis().size()); - EXPECT_TRUE(installed_extension_->HasAPIPermission( - APIPermission::kGeolocation)); - EXPECT_TRUE(installed_extension_->HasAPIPermission( - APIPermission::kNotification)); - - const ExtensionIconSet& icons = IconsInfo::GetIcons(installed_extension_); - ASSERT_EQ(3u, icons.map().size()); - EXPECT_EQ("icons/16.png", icons.Get(16, ExtensionIconSet::MATCH_EXACTLY)); - EXPECT_EQ("icons/48.png", icons.Get(48, ExtensionIconSet::MATCH_EXACTLY)); - EXPECT_EQ("icons/128.png", icons.Get(128, ExtensionIconSet::MATCH_EXACTLY)); + EXPECT_EQ(0u, installed_extension_->GetActivePermissions()->apis().size()); + EXPECT_EQ(0u, IconsInfo::GetIcons(installed_extension_).map().size()); } } // namespace extensions diff --git a/chrome/browser/extensions/tab_helper.cc b/chrome/browser/extensions/tab_helper.cc index 77a1c3d..7f13125 100644 --- a/chrome/browser/extensions/tab_helper.cc +++ b/chrome/browser/extensions/tab_helper.cc @@ -232,8 +232,6 @@ bool TabHelper::OnMessageReceived(const IPC::Message& message) { IPC_BEGIN_MESSAGE_MAP(TabHelper, message) IPC_MESSAGE_HANDLER(ExtensionHostMsg_DidGetApplicationInfo, OnDidGetApplicationInfo) - IPC_MESSAGE_HANDLER(ExtensionHostMsg_InstallApplication, - OnInstallApplication) IPC_MESSAGE_HANDLER(ExtensionHostMsg_InlineWebstoreInstall, OnInlineWebstoreInstall) IPC_MESSAGE_HANDLER(ExtensionHostMsg_GetAppInstallState, @@ -291,21 +289,6 @@ void TabHelper::OnDidGetApplicationInfo(int32 page_id, #endif } -void TabHelper::OnInstallApplication(const WebApplicationInfo& info) { - Profile* profile = - Profile::FromBrowserContext(web_contents()->GetBrowserContext()); - ExtensionService* extension_service = profile->GetExtensionService(); - if (!extension_service) - return; - - ExtensionInstallPrompt* prompt = NULL; - if (extension_service->show_extensions_prompts()) - prompt = new ExtensionInstallPrompt(web_contents()); - scoped_refptr<CrxInstaller> installer( - CrxInstaller::Create(extension_service, prompt)); - installer->InstallWebApp(info); -} - void TabHelper::OnInlineWebstoreInstall( int install_id, int return_route_id, diff --git a/chrome/browser/extensions/tab_helper.h b/chrome/browser/extensions/tab_helper.h index 14e46f2..b38d84a 100644 --- a/chrome/browser/extensions/tab_helper.h +++ b/chrome/browser/extensions/tab_helper.h @@ -179,7 +179,6 @@ class TabHelper : public content::WebContentsObserver, // Message handlers. void OnDidGetApplicationInfo(int32 page_id, const WebApplicationInfo& info); - void OnInstallApplication(const WebApplicationInfo& info); void OnInlineWebstoreInstall(int install_id, int return_route_id, const std::string& webstore_item_id, diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 7fe7a04..066ace8 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc @@ -462,9 +462,6 @@ const char kEnableComponentCloudPolicy[] = "enable-component-cloud-policy"; // Chrome OS apps list. const char kEnableContacts[] = "enable-contacts"; -// Enables web developers to create apps for Chrome without using crx packages. -const char kEnableCrxlessWebApps[] = "enable-crxless-web-apps"; - // Enables desktop guest mode. const char kEnableDesktopGuestMode[] = "enable-desktop-guest-mode"; diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index f04428f..156a4e74 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h @@ -137,7 +137,6 @@ extern const char kEnableBenchmarking[]; extern const char kEnableCloudPrintProxy[]; extern const char kEnableComponentCloudPolicy[]; extern const char kEnableContacts[]; -extern const char kEnableCrxlessWebApps[]; extern const char kEnableDesktopGuestMode[]; extern const char kEnableDevToolsExperiments[]; extern const char kEnableExperimentalExtensionApis[]; diff --git a/chrome/common/extensions/api/app.json b/chrome/common/extensions/api/app.json index 0d70277..0faef3c 100644 --- a/chrome/common/extensions/api/app.json +++ b/chrome/common/extensions/api/app.json @@ -64,12 +64,6 @@ } }, { - "name": "install", - "description": "TODO", - "type": "function", - "parameters": [] - }, - { "name": "getDetails", "description": "TODO", "type": "function", diff --git a/chrome/common/extensions/extension_messages.h b/chrome/common/extensions/extension_messages.h index 6dde22a..c3eb6fd 100644 --- a/chrome/common/extensions/extension_messages.h +++ b/chrome/common/extensions/extension_messages.h @@ -541,10 +541,6 @@ IPC_MESSAGE_ROUTED2(ExtensionHostMsg_DidGetApplicationInfo, int32 /* page_id */, WebApplicationInfo) -// Sent by the renderer to implement chrome.app.install(). -IPC_MESSAGE_ROUTED1(ExtensionHostMsg_InstallApplication, - WebApplicationInfo) - // Sent by the renderer to implement chrome.webstore.install(). IPC_MESSAGE_ROUTED4(ExtensionHostMsg_InlineWebstoreInstall, int32 /* install id */, diff --git a/chrome/common/extensions/permissions/permission_set.cc b/chrome/common/extensions/permissions/permission_set.cc index 6e76426..380f72a 100644 --- a/chrome/common/extensions/permissions/permission_set.cc +++ b/chrome/common/extensions/permissions/permission_set.cc @@ -67,7 +67,6 @@ const char* kNonPermissionFunctionNames[] = { "app.getDetails", "app.getDetailsForFrame", "app.getIsInstalled", - "app.install", "app.installState", "app.runningState", "management.getPermissionWarningsByManifest", diff --git a/chrome/renderer/extensions/app_bindings.cc b/chrome/renderer/extensions/app_bindings.cc index 87cc04e..2932053 100644 --- a/chrome/renderer/extensions/app_bindings.cc +++ b/chrome/renderer/extensions/app_bindings.cc @@ -60,8 +60,6 @@ AppBindings::AppBindings(Dispatcher* dispatcher, ChromeV8Context* context) ChromeV8ExtensionHandler(context) { RouteFunction("GetIsInstalled", base::Bind(&AppBindings::GetIsInstalled, base::Unretained(this))); - RouteFunction("Install", - base::Bind(&AppBindings::Install, base::Unretained(this))); RouteFunction("GetDetails", base::Bind(&AppBindings::GetDetails, base::Unretained(this))); RouteFunction("GetDetailsForFrame", @@ -82,20 +80,6 @@ v8::Handle<v8::Value> AppBindings::GetIsInstalled( return v8::Boolean::New(result); } -v8::Handle<v8::Value> AppBindings::Install(const v8::Arguments& args) { - content::RenderView* render_view = context_->GetRenderView(); - CHECK(render_view); - - string16 error; - ExtensionHelper* helper = ExtensionHelper::Get(render_view); - if (!helper->InstallWebApplicationUsingDefinitionFile( - context_->web_frame(), &error)) { - v8::ThrowException(v8::String::New(UTF16ToUTF8(error).c_str())); - } - - return v8::Undefined(); -} - v8::Handle<v8::Value> AppBindings::GetDetails( const v8::Arguments& args) { CHECK(context_->web_frame()); diff --git a/chrome/renderer/extensions/app_bindings.h b/chrome/renderer/extensions/app_bindings.h index ce00b4f..5305783 100644 --- a/chrome/renderer/extensions/app_bindings.h +++ b/chrome/renderer/extensions/app_bindings.h @@ -31,7 +31,6 @@ class AppBindings : public ChromeV8Extension, virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; v8::Handle<v8::Value> GetIsInstalled(const v8::Arguments& args); - v8::Handle<v8::Value> Install(const v8::Arguments& args); v8::Handle<v8::Value> GetDetails(const v8::Arguments& args); v8::Handle<v8::Value> GetDetailsForFrame(const v8::Arguments& args); v8::Handle<v8::Value> GetInstallState(const v8::Arguments& args); diff --git a/chrome/renderer/extensions/extension_helper.cc b/chrome/renderer/extensions/extension_helper.cc index 0e50e8a..701b7ce 100644 --- a/chrome/renderer/extensions/extension_helper.cc +++ b/chrome/renderer/extensions/extension_helper.cc @@ -156,53 +156,6 @@ ExtensionHelper::ExtensionHelper(content::RenderView* render_view, ExtensionHelper::~ExtensionHelper() { } -bool ExtensionHelper::InstallWebApplicationUsingDefinitionFile( - WebFrame* frame, string16* error) { - // There is an issue of drive-by installs with the below implementation. A web - // site could force a user to install an app by timing the dialog to come up - // just before the user clicks. - // - // We do show a success UI that allows users to uninstall, but it seems that - // we might still want to put up an infobar before showing the install dialog. - // - // TODO(aa): Figure out this issue before removing the kEnableCrxlessWebApps - // switch. - if (!CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableCrxlessWebApps)) { - *error = ASCIIToUTF16("CRX-less web apps aren't enabled."); - return false; - } - - if (frame != frame->top()) { - *error = ASCIIToUTF16("Applications can only be installed from the top " - "frame."); - return false; - } - - if (pending_app_info_.get()) { - *error = ASCIIToUTF16("An application install is already in progress."); - return false; - } - - pending_app_info_.reset(new WebApplicationInfo()); - if (!web_apps::ParseWebAppFromWebDocument(frame, pending_app_info_.get(), - error)) { - return false; - } - - if (!pending_app_info_->manifest_url.is_valid()) { - *error = ASCIIToUTF16("Web application definition not found or invalid."); - return false; - } - - app_definition_fetcher_.reset(new ResourceFetcher( - pending_app_info_->manifest_url, render_view()->GetWebView()->mainFrame(), - WebURLRequest::TargetIsSubresource, - base::Bind(&ExtensionHelper::DidDownloadApplicationDefinition, - base::Unretained(this)))); - return true; -} - bool ExtensionHelper::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(ExtensionHelper, message) @@ -425,102 +378,6 @@ void ExtensionHelper::OnAppWindowClosed() { chrome_v8_context->CallChromeHiddenMethod("OnAppWindowClosed", 0, NULL, NULL); } -void ExtensionHelper::DidDownloadApplicationDefinition( - const WebKit::WebURLResponse& response, - const std::string& data) { - scoped_ptr<WebApplicationInfo> app_info( - pending_app_info_.release()); - - JSONStringValueSerializer serializer(data); - int error_code = 0; - std::string error_message; - scoped_ptr<Value> result(serializer.Deserialize(&error_code, &error_message)); - if (!result.get()) { - AddMessageToRootConsole( - content::CONSOLE_MESSAGE_LEVEL_ERROR, UTF8ToUTF16(error_message)); - return; - } - - string16 error_message_16; - if (!web_apps::ParseWebAppFromDefinitionFile(result.get(), app_info.get(), - &error_message_16)) { - AddMessageToRootConsole( - content::CONSOLE_MESSAGE_LEVEL_ERROR, error_message_16); - return; - } - - if (!app_info->icons.empty()) { - pending_app_info_.reset(app_info.release()); - pending_app_icon_requests_ = - static_cast<int>(pending_app_info_->icons.size()); - for (size_t i = 0; i < pending_app_info_->icons.size(); ++i) { - app_icon_fetchers_.push_back(linked_ptr<ImageResourceFetcher>( - new ImageResourceFetcher( - pending_app_info_->icons[i].url, - render_view()->GetWebView()->mainFrame(), - static_cast<int>(i), - pending_app_info_->icons[i].width, - WebURLRequest::TargetIsFavicon, - base::Bind( - &ExtensionHelper::DidDownloadApplicationIcon, - base::Unretained(this))))); - } - } else { - Send(new ExtensionHostMsg_InstallApplication(routing_id(), *app_info)); - } -} - -void ExtensionHelper::DidDownloadApplicationIcon(ImageResourceFetcher* fetcher, - const SkBitmap& image) { - pending_app_info_->icons[fetcher->id()].data = image; - - // Remove the image fetcher from our pending list. We're in the callback from - // ImageResourceFetcher, best to delay deletion. - ImageResourceFetcherList::iterator i; - for (i = app_icon_fetchers_.begin(); i != app_icon_fetchers_.end(); ++i) { - if (i->get() == fetcher) { - i->release(); - app_icon_fetchers_.erase(i); - break; - } - } - - // We're in the callback from the ImageResourceFetcher, best to delay - // deletion. - MessageLoop::current()->DeleteSoon(FROM_HERE, fetcher); - - if (--pending_app_icon_requests_ > 0) - return; - - // There is a maximum size of IPC on OS X and Linux that we have run into in - // some situations. We're not sure what it is, but our hypothesis is in the - // neighborhood of 1 MB. - // - // To be on the safe side, we give ourselves 128 KB for just the image data. - // This should be more than enough for 128, 48, and 16 px 32-bit icons. If we - // want to start allowing larger icons (see bug 63406), we'll have to either - // experiment mor ewith this and find the real limit, or else come up with - // some alternative way to transmit the icon data to the browser process. - // - // See also: bug 63729. - const size_t kMaxIconSize = 1024 * 128; - size_t actual_icon_size = 0; - for (size_t i = 0; i < pending_app_info_->icons.size(); ++i) { - size_t current_size = pending_app_info_->icons[i].data.getSize(); - if (current_size > kMaxIconSize - actual_icon_size) { - AddMessageToRootConsole( - content::CONSOLE_MESSAGE_LEVEL_ERROR, - "Icons are too large. Maximum total size for app icons is 128 KB."); - return; - } - actual_icon_size += current_size; - } - - Send(new ExtensionHostMsg_InstallApplication( - routing_id(), *pending_app_info_)); - pending_app_info_.reset(NULL); -} - void ExtensionHelper::AddMessageToRootConsole(ConsoleMessageLevel level, const std::string& message) { AddMessageToRootConsole(level, ASCIIToUTF16(message)); diff --git a/chrome/renderer/extensions/extension_helper.h b/chrome/renderer/extensions/extension_helper.h index 4a6b0b9..a1d934c9 100644 --- a/chrome/renderer/extensions/extension_helper.h +++ b/chrome/renderer/extensions/extension_helper.h @@ -53,13 +53,6 @@ class ExtensionHelper ExtensionHelper(content::RenderView* render_view, Dispatcher* dispatcher); virtual ~ExtensionHelper(); - // Starts installation of the page in the specified frame as a web app. The - // page must link to an external 'definition file'. This is different from - // the 'application shortcuts' feature where we pull the application - // definition out of optional meta tags in the page. - bool InstallWebApplicationUsingDefinitionFile(WebKit::WebFrame* frame, - string16* error); - int tab_id() const { return tab_id_; } int browser_window_id() const { return browser_window_id_; } chrome::ViewType view_type() const { return view_type_; } @@ -106,16 +99,6 @@ class ExtensionHelper const std::string& message); void OnAppWindowClosed(); - // Callback triggered when we finish downloading the application definition - // file. - void DidDownloadApplicationDefinition(const WebKit::WebURLResponse& response, - const std::string& data); - - // Callback triggered after each icon referenced by the application definition - // is downloaded. - void DidDownloadApplicationIcon(webkit_glue::ImageResourceFetcher* fetcher, - const SkBitmap& image); - // Helper to add a logging message to the root frame's console. void AddMessageToRootConsole(content::ConsoleMessageLevel level, const string16& message); diff --git a/chrome/test/data/extensions/convert_web_app/application.html b/chrome/test/data/extensions/convert_web_app/application.html deleted file mode 100644 index bd4b474..0000000 --- a/chrome/test/data/extensions/convert_web_app/application.html +++ /dev/null @@ -1,10 +0,0 @@ -<html> -<head> -<link rel="chrome-application-definition" href="application_definition.json"> -</head> -<body> -<script> -chrome.app.install(); -</script> -</body> -</html> diff --git a/chrome/test/data/extensions/convert_web_app/application_definition.json b/chrome/test/data/extensions/convert_web_app/application_definition.json deleted file mode 100644 index 3bdc0c7..0000000 --- a/chrome/test/data/extensions/convert_web_app/application_definition.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "Test application", - "description": "the description is", - "launch_url": "launch.html", - "launch_container": "panel", - "icons": { - "16": "16.png", - "48": "48.png", - "128": "128.png" - }, - "permissions": ["geolocation", "notifications"] -} diff --git a/chrome/test/data/extensions/platform_apps/restrictions/main.js b/chrome/test/data/extensions/platform_apps/restrictions/main.js index 659399f..6146880 100644 --- a/chrome/test/data/extensions/platform_apps/restrictions/main.js +++ b/chrome/test/data/extensions/platform_apps/restrictions/main.js @@ -159,7 +159,6 @@ chrome.test.runTests([ function testLegacyApis() { if (chrome.app) { assertEq('undefined', typeof(chrome.app.getIsInstalled)); - assertEq('undefined', typeof(chrome.app.install)); assertEq('undefined', typeof(chrome.app.isInstalled)); assertEq('undefined', typeof(chrome.app.getDetails)); assertEq('undefined', typeof(chrome.app.getDetailsForFrame)); |