Commit 40cae065 authored by Devlin Cronin's avatar Devlin Cronin Committed by Commit Bot

[Extensions + Apps] Create Apps API Set

Create a place for Chrome App APIs to go, and move the chrome.browser
API there. This is the first API moved from Chrome Apps into the apps-
specific directory. This involves a number of steps:
- Create a chrome/common/apps/platform_apps/ directory, and create
  ChromeAppsAPIProvider and ChromeAppsAPIPermissions. The APIProvider
  is then registered with the singleton ExtensionsClient to provide
  information about the Chrome Apps APIs to the extension system.
- Create chrome/common/apps/platform_apps/api. This includes the API
  schema definitions (right now, just browser.idl), the features files
  (_api_features.json and _permission_features.json), and the BUILD.gn
  to generate the C++ types and JSON API strings. Types are generated
  in the apps:: namespace, instead of the extensions:: namespace. They
  are similarly generated into chrome/common/apps/platform_apps/api
  instead of chrome/common/extensions/api.
- Add a ChromeAppsBrowserAPIProvider to register the app-related
  ExtensionFunctions with the Extensions system.
- Move the browser API implementation (browser_api.*) to
  chrome/browser/apps/platform_apps/api/browser/, and consume the
  generated types.
- Register the new API location with the docserver so that it can look
  up the API schemas, and bump the docserver version.

With this, we have all the pieces necessary to continue moving App-
specific APIs en masse to the App-specific directories, and begin to
carve out the dependency from the extensions system.

Bug: 877240

Change-Id: If3eba512c24ef3d1c27ed5ff3f215f56eb13a818
Reviewed-on: https://chromium-review.googlesource.com/1187129
Commit-Queue: Devlin <rdevlin.cronin@chromium.org>
Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Reviewed-by: default avatarIstiaque Ahmed <lazyboy@chromium.org>
Reviewed-by: default avatarKaran Bhatia <karandeepb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#589598}
parent 28254a4c
...@@ -20,6 +20,8 @@ source_set("platform_apps") { ...@@ -20,6 +20,8 @@ source_set("platform_apps") {
"app_window_registry_util.h", "app_window_registry_util.h",
"browser_context_keyed_service_factories.cc", "browser_context_keyed_service_factories.cc",
"browser_context_keyed_service_factories.h", "browser_context_keyed_service_factories.h",
"chrome_apps_browser_api_provider.cc",
"chrome_apps_browser_api_provider.h",
"install_chrome_app.cc", "install_chrome_app.cc",
"install_chrome_app.h", "install_chrome_app.h",
"platform_app_launch.cc", "platform_app_launch.cc",
...@@ -36,6 +38,9 @@ source_set("platform_apps") { ...@@ -36,6 +38,9 @@ source_set("platform_apps") {
public_deps = [ public_deps = [
"//apps", "//apps",
"//chrome/browser/apps/platform_apps/api",
"//chrome/browser/apps/platform_apps/api:api_registration",
"//chrome/common/apps/platform_apps/api",
] ]
deps = [ deps = [
......
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//chrome/common/apps/platform_apps/api/api_sources.gni")
import("//extensions/buildflags/buildflags.gni")
import("//tools/json_schema_compiler/json_schema_api.gni")
assert(enable_extensions)
function_registration("api_registration") {
sources = chrome_apps_api_schema_files
impl_dir = "//chrome/browser/apps/platform_apps/api"
configs = [ "//build/config:precompiled_headers" ]
bundle_name = "ChromeApps"
root_namespace = apps_api_root_namespace
deps = [
"//extensions/browser",
]
}
source_set("api") {
sources = [
"browser/browser_api.cc",
"browser/browser_api.h",
]
deps = [
"//chrome/browser/extensions",
"//chrome/common/apps/platform_apps/api",
"//extensions/browser",
]
}
...@@ -2,29 +2,32 @@ ...@@ -2,29 +2,32 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome/browser/extensions/api/browser/browser_api.h" #include "chrome/browser/apps/platform_apps/api/browser/browser_api.h"
#include <memory>
#include <string>
#include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/common/extensions/api/browser.h" #include "chrome/common/apps/platform_apps/api/browser.h"
namespace extensions { namespace apps {
namespace api { namespace api {
BrowserOpenTabFunction::~BrowserOpenTabFunction() { BrowserOpenTabFunction::~BrowserOpenTabFunction() {}
}
ExtensionFunction::ResponseAction BrowserOpenTabFunction::Run() { ExtensionFunction::ResponseAction BrowserOpenTabFunction::Run() {
std::unique_ptr<browser::OpenTab::Params> params( std::unique_ptr<browser::OpenTab::Params> params(
browser::OpenTab::Params::Create(*args_)); browser::OpenTab::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get()); EXTENSION_FUNCTION_VALIDATE(params.get());
ExtensionTabUtil::OpenTabParams options; extensions::ExtensionTabUtil::OpenTabParams options;
options.create_browser_if_needed = true; options.create_browser_if_needed = true;
options.url.reset(new std::string(params->options.url)); options.url.reset(new std::string(params->options.url));
std::string error; std::string error;
std::unique_ptr<base::DictionaryValue> result( std::unique_ptr<base::DictionaryValue> result(
ExtensionTabUtil::OpenTab(this, options, user_gesture(), &error)); extensions::ExtensionTabUtil::OpenTab(this, options, user_gesture(),
&error));
if (!result) if (!result)
return RespondNow(Error(error)); return RespondNow(Error(error));
...@@ -32,4 +35,4 @@ ExtensionFunction::ResponseAction BrowserOpenTabFunction::Run() { ...@@ -32,4 +35,4 @@ ExtensionFunction::ResponseAction BrowserOpenTabFunction::Run() {
} }
} // namespace api } // namespace api
} // namespace extensions } // namespace apps
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef CHROME_BROWSER_EXTENSIONS_API_BROWSER_BROWSER_API_H_ #ifndef CHROME_BROWSER_APPS_PLATFORM_APPS_API_BROWSER_BROWSER_API_H_
#define CHROME_BROWSER_EXTENSIONS_API_BROWSER_BROWSER_API_H_ #define CHROME_BROWSER_APPS_PLATFORM_APPS_API_BROWSER_BROWSER_API_H_
#include "extensions/browser/extension_function.h" #include "extensions/browser/extension_function.h"
namespace extensions { namespace apps {
namespace api { namespace api {
class BrowserOpenTabFunction : public UIThreadExtensionFunction { class BrowserOpenTabFunction : public UIThreadExtensionFunction {
...@@ -21,6 +21,6 @@ class BrowserOpenTabFunction : public UIThreadExtensionFunction { ...@@ -21,6 +21,6 @@ class BrowserOpenTabFunction : public UIThreadExtensionFunction {
}; };
} // namespace api } // namespace api
} // namespace extensions } // namespace apps
#endif // CHROME_BROWSER_EXTENSIONS_API_BROWSER_BROWSER_API_H_ #endif // CHROME_BROWSER_APPS_PLATFORM_APPS_API_BROWSER_BROWSER_API_H_
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/apps/platform_apps/api/browser/browser_api.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h"
#include "extensions/test/result_catcher.h"
#include "extensions/test/test_extension_dir.h"
#include "net/dns/mock_host_resolver.h"
#include "url/gurl.h"
namespace apps {
namespace {
class AppsBrowserApiTest : public extensions::ExtensionApiTest {
public:
AppsBrowserApiTest() = default;
~AppsBrowserApiTest() override = default;
// extensions::ExtensionApiTest:
void SetUpOnMainThread() override {
extensions::ExtensionApiTest::SetUpOnMainThread();
host_resolver()->AddRule("*", "127.0.0.1");
ASSERT_TRUE(StartEmbeddedTestServer());
}
private:
DISALLOW_COPY_AND_ASSIGN(AppsBrowserApiTest);
};
} // namespace
IN_PROC_BROWSER_TEST_F(AppsBrowserApiTest, OpenTab) {
extensions::TestExtensionDir test_dir;
test_dir.WriteManifest(
R"({
"name": "Browser API test",
"version": "2.0",
"manifest_version": 2,
"permissions": ["browser"],
"app": {
"background": {
"scripts": ["background.js"]
}
}
})");
test_dir.WriteFile(FILE_PATH_LITERAL("background.js"),
R"(chrome.test.getConfig((config) => {
const url =
`http://example.com:${config.testServer.port}/simple.html`;
chrome.test.runTests([
function() {
chrome.test.assertTrue(!!chrome);
chrome.test.assertTrue(!!chrome.browser);
chrome.test.assertTrue(!!chrome.browser.openTab);
chrome.browser.openTab({url: url}, function() {
chrome.test.assertNoLastError();
chrome.test.succeed();
});
}
]);
});)");
extensions::ResultCatcher result_catcher;
EXPECT_EQ(1, browser()->tab_strip_model()->count());
ASSERT_TRUE(LoadExtension(test_dir.UnpackedPath()));
EXPECT_TRUE(result_catcher.GetNextResult()) << result_catcher.message();
EXPECT_EQ(2, browser()->tab_strip_model()->count());
EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
EXPECT_EQ(embedded_test_server()->GetURL("example.com", "/simple.html"),
web_contents->GetLastCommittedURL());
}
} // namespace apps
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/apps/platform_apps/chrome_apps_browser_api_provider.h"
#include "chrome/browser/apps/platform_apps/api/generated_api_registration.h"
namespace apps {
ChromeAppsBrowserAPIProvider::ChromeAppsBrowserAPIProvider() = default;
ChromeAppsBrowserAPIProvider::~ChromeAppsBrowserAPIProvider() = default;
void ChromeAppsBrowserAPIProvider::RegisterExtensionFunctions(
ExtensionFunctionRegistry* registry) {
apps::api::ChromeAppsGeneratedFunctionRegistry::RegisterAll(registry);
}
} // namespace apps
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_APPS_PLATFORM_APPS_CHROME_APPS_BROWSER_API_PROVIDER_H_
#define CHROME_BROWSER_APPS_PLATFORM_APPS_CHROME_APPS_BROWSER_API_PROVIDER_H_
#include "base/macros.h"
#include "extensions/browser/extensions_browser_api_provider.h"
namespace apps {
class ChromeAppsBrowserAPIProvider
: public extensions::ExtensionsBrowserAPIProvider {
public:
ChromeAppsBrowserAPIProvider();
~ChromeAppsBrowserAPIProvider() override;
// extensions::ExtensionsBrowserAPIProvider:
void RegisterExtensionFunctions(ExtensionFunctionRegistry* registry) override;
private:
DISALLOW_COPY_AND_ASSIGN(ChromeAppsBrowserAPIProvider);
};
} // namespace apps
#endif // CHROME_BROWSER_APPS_PLATFORM_APPS_CHROME_APPS_BROWSER_API_PROVIDER_H_
...@@ -166,6 +166,7 @@ ...@@ -166,6 +166,7 @@
#endif #endif
#if BUILDFLAG(ENABLE_EXTENSIONS) #if BUILDFLAG(ENABLE_EXTENSIONS)
#include "chrome/browser/apps/platform_apps/chrome_apps_browser_api_provider.h"
#include "chrome/browser/extensions/chrome_extensions_browser_client.h" #include "chrome/browser/extensions/chrome_extensions_browser_client.h"
#include "chrome/browser/extensions/event_router_forwarder.h" #include "chrome/browser/extensions/event_router_forwarder.h"
#include "chrome/browser/media_galleries/media_file_system_registry.h" #include "chrome/browser/media_galleries/media_file_system_registry.h"
...@@ -265,6 +266,8 @@ void BrowserProcessImpl::Init() { ...@@ -265,6 +266,8 @@ void BrowserProcessImpl::Init() {
extensions_browser_client_ = extensions_browser_client_ =
std::make_unique<extensions::ChromeExtensionsBrowserClient>(); std::make_unique<extensions::ChromeExtensionsBrowserClient>();
extensions_browser_client_->AddAPIProvider(
std::make_unique<apps::ChromeAppsBrowserAPIProvider>());
extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get()); extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get());
#endif #endif
......
...@@ -75,8 +75,6 @@ jumbo_static_library("extensions") { ...@@ -75,8 +75,6 @@ jumbo_static_library("extensions") {
"api/braille_display_private/braille_display_private_api.h", "api/braille_display_private/braille_display_private_api.h",
"api/braille_display_private/stub_braille_controller.cc", "api/braille_display_private/stub_braille_controller.cc",
"api/braille_display_private/stub_braille_controller.h", "api/braille_display_private/stub_braille_controller.h",
"api/browser/browser_api.cc",
"api/browser/browser_api.h",
"api/browsing_data/browsing_data_api.cc", "api/browsing_data/browsing_data_api.cc",
"api/browsing_data/browsing_data_api.h", "api/browsing_data/browsing_data_api.h",
"api/chrome_device_permissions_prompt.h", "api/chrome_device_permissions_prompt.h",
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#include <string>
#include "base/strings/stringprintf.h"
#include "base/values.h"
#include "chrome/browser/extensions/api/browser/browser_api.h"
#include "chrome/browser/extensions/extension_function_test_utils.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "extensions/common/extension_builder.h"
namespace extensions {
namespace utils = extension_function_test_utils;
namespace {
class BrowserApiTest : public InProcessBrowserTest {
};
}
IN_PROC_BROWSER_TEST_F(BrowserApiTest, OpenTab) {
std::string url = "about:blank";
scoped_refptr<api::BrowserOpenTabFunction> function =
new api::BrowserOpenTabFunction();
scoped_refptr<Extension> extension(ExtensionBuilder("Test").Build());
function->set_extension(extension.get());
base::Value* result = utils::RunFunctionAndReturnSingleResult(
function.get(),
base::StringPrintf("[{\"url\":\"%s\"}]", url.c_str()),
browser());
// result is currently NULL on success.
EXPECT_FALSE(result);
}
} // namespace extensions
...@@ -373,6 +373,7 @@ static_library("common") { ...@@ -373,6 +373,7 @@ static_library("common") {
"initialize_extensions_client.cc", "initialize_extensions_client.cc",
"initialize_extensions_client.h", "initialize_extensions_client.h",
] ]
deps += [ "//chrome/common/apps/platform_apps" ]
public_deps += [ public_deps += [
"//chrome/common/extensions:mojo_bindings", "//chrome/common/extensions:mojo_bindings",
"//chrome/common/extensions/api", "//chrome/common/extensions/api",
......
file://apps/OWNERS
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//extensions/buildflags/buildflags.gni")
assert(enable_extensions,
"Cannot depend on chrome apps because enable_extensions=false.")
source_set("platform_apps") {
sources = [
"chrome_apps_api_permissions.cc",
"chrome_apps_api_permissions.h",
"chrome_apps_api_provider.cc",
"chrome_apps_api_provider.h",
]
deps = [
"//chrome/common:resources_grit",
"//chrome/common/apps/platform_apps/api",
"//chrome/common/apps/platform_apps/api:apps_features",
"//extensions/common",
]
}
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//build/config/features.gni")
import("//chrome/common/apps/platform_apps/api/api_sources.gni")
import("//extensions/buildflags/buildflags.gni")
import("//tools/json_schema_compiler/json_features.gni")
import("//tools/json_schema_compiler/json_schema_api.gni")
assert(enable_extensions)
################################################################################
# Public Targets
group("api") {
public_deps = [
":generated_api_json_strings",
":generated_api_types",
"//extensions/buildflags",
]
}
group("apps_features") {
public_deps = [
":api_features",
":permission_features",
]
}
################################################################################
# Private Targets
generated_json_strings("generated_api_json_strings") {
sources = chrome_apps_api_schema_files
bundle_name = "ChromeApps"
root_namespace = apps_api_root_namespace
deps = [
"//base",
"//extensions/buildflags",
]
visibility = [ ":api" ]
}
generated_types("generated_api_types") {
sources = chrome_apps_api_schema_files
root_namespace = apps_api_root_namespace
deps = [
"//base",
"//extensions/buildflags",
]
visibility = [ ":api" ]
}
json_features("api_features") {
feature_type = "APIFeature"
method_name = "AddChromeAppsAPIFeatures"
sources = [
"_api_features.json",
]
visibility = [ ":apps_features" ]
}
json_features("permission_features") {
feature_type = "PermissionFeature"
method_name = "AddChromeAppsPermissionFeatures"
sources = [
"_permission_features.json",
]
visibility = [ ":apps_features" ]
}
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This features file defines Chrome Apps APIs implemented under src/chrome.
// See chrome/common/extensions/api/_features.md to understand this file, as
// well as feature.h, simple_feature.h, and feature_provider.h.
{
"browser": {
"dependencies": ["permission:browser"],
"contexts": ["blessed_extension"]
}
}
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This features file defines Chrome Apps APIs implemented under src/chrome.
// See chrome/common/extensions/api/_features.md to understand this file, as
// well as feature.h, simple_feature.h, and feature_provider.h.
{
"browser": {
"channel": "stable",
"extension_types": ["platform_app"]
}
}
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
chrome_apps_api_schema_files_ = [ "browser.idl" ]
chrome_apps_api_schema_files =
get_path_info(chrome_apps_api_schema_files_, "abspath")
apps_api_root_namespace = "apps::api::%(namespace)s"
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/common/apps/platform_apps/chrome_apps_api_permissions.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/stl_util.h"
#include "extensions/common/permissions/api_permission.h"
namespace apps {
ChromeAppsAPIPermissions::ChromeAppsAPIPermissions() = default;
ChromeAppsAPIPermissions::~ChromeAppsAPIPermissions() = default;
std::vector<std::unique_ptr<extensions::APIPermissionInfo>>
ChromeAppsAPIPermissions::GetAllPermissions() const {
// WARNING: If you are modifying a permission message in this list, be sure to
// add the corresponding permission message rule to
// ChromePermissionMessageProvider::GetPermissionMessages as well.
static constexpr extensions::APIPermissionInfo::InitInfo
permissions_to_register[] = {
{extensions::APIPermission::kBrowser, "browser"},
};
std::vector<std::unique_ptr<extensions::APIPermissionInfo>> permissions;
permissions.reserve(base::size(permissions_to_register));
for (const auto& permission : permissions_to_register) {
// NOTE: Using base::WrapUnique() because APIPermissionsInfo ctor is
// private.
permissions.push_back(
base::WrapUnique(new extensions::APIPermissionInfo(permission)));
}
return permissions;
}
} // namespace apps
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_COMMON_APPS_PLATFORM_APPS_CHROME_APPS_API_PERMISSIONS_H_
#define CHROME_COMMON_APPS_PLATFORM_APPS_CHROME_APPS_API_PERMISSIONS_H_
#include <memory>
#include <vector>
#include "base/macros.h"
#include "extensions/common/permissions/permissions_provider.h"
namespace apps {
// A PermissionsProvider responsible for Chrome App API Permissions.
class ChromeAppsAPIPermissions : public extensions::PermissionsProvider {
public:
ChromeAppsAPIPermissions();
~ChromeAppsAPIPermissions() override;
// extensions::PermissionsProvider:
std::vector<std::unique_ptr<extensions::APIPermissionInfo>>
GetAllPermissions() const override;
private:
DISALLOW_COPY_AND_ASSIGN(ChromeAppsAPIPermissions);
};
} // namespace apps
#endif // CHROME_COMMON_APPS_PLATFORM_APPS_CHROME_APPS_API_PERMISSIONS_H_
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/common/apps/platform_apps/chrome_apps_api_provider.h"
#include "chrome/common/apps/platform_apps/api/api_features.h"
#include "chrome/common/apps/platform_apps/api/generated_schemas.h"
#include "chrome/common/apps/platform_apps/api/permission_features.h"
#include "chrome/grit/common_resources.h"
#include "extensions/common/alias.h"
#include "extensions/common/features/json_feature_provider_source.h"
#include "extensions/common/permissions/permissions_info.h"
namespace apps {
ChromeAppsAPIProvider::ChromeAppsAPIProvider() {}
ChromeAppsAPIProvider::~ChromeAppsAPIProvider() = default;
void ChromeAppsAPIProvider::AddAPIFeatures(
extensions::FeatureProvider* provider) {
AddChromeAppsAPIFeatures(provider);
}
void ChromeAppsAPIProvider::AddManifestFeatures(
extensions::FeatureProvider* provider) {
// No Chrome-apps-specific manifest features (yet).
}
void ChromeAppsAPIProvider::AddPermissionFeatures(
extensions::FeatureProvider* provider) {
AddChromeAppsPermissionFeatures(provider);
}
void ChromeAppsAPIProvider::AddBehaviorFeatures(
extensions::FeatureProvider* provider) {
// No Chrome-apps-specific manifest features.
}
void ChromeAppsAPIProvider::AddAPIJSONSources(
extensions::JSONFeatureProviderSource* json_source) {
json_source->LoadJSON(IDR_CHROME_APP_API_FEATURES);
}
bool ChromeAppsAPIProvider::IsAPISchemaGenerated(const std::string& name) {
return api::ChromeAppsGeneratedSchemas::IsGenerated(name);
}
base::StringPiece ChromeAppsAPIProvider::GetAPISchema(const std::string& name) {
return api::ChromeAppsGeneratedSchemas::Get(name);
}
void ChromeAppsAPIProvider::AddPermissionsProviders(
extensions::PermissionsInfo* permissions_info) {
permissions_info->AddProvider(api_permissions_, {});
}
void ChromeAppsAPIProvider::RegisterManifestHandlers() {
// No apps-specific manifest handlers (yet).
}
} // namespace apps
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_COMMON_APPS_PLATFORM_APPS_CHROME_APPS_API_PROVIDER_H_
#define CHROME_COMMON_APPS_PLATFORM_APPS_CHROME_APPS_API_PROVIDER_H_
#include "chrome/common/apps/platform_apps/chrome_apps_api_permissions.h"
#include "extensions/common/extensions_api_provider.h"
namespace apps {
class ChromeAppsAPIProvider : public extensions::ExtensionsAPIProvider {
public:
ChromeAppsAPIProvider();
~ChromeAppsAPIProvider() override;
// ExtensionsAPIProvider:
void AddAPIFeatures(extensions::FeatureProvider* provider) override;
void AddManifestFeatures(extensions::FeatureProvider* provider) override;
void AddPermissionFeatures(extensions::FeatureProvider* provider) override;
void AddBehaviorFeatures(extensions::FeatureProvider* provider) override;
void AddAPIJSONSources(
extensions::JSONFeatureProviderSource* json_source) override;
bool IsAPISchemaGenerated(const std::string& name) override;
base::StringPiece GetAPISchema(const std::string& name) override;
void AddPermissionsProviders(
extensions::PermissionsInfo* permissions_info) override;
void RegisterManifestHandlers() override;
private:
const ChromeAppsAPIPermissions api_permissions_;
DISALLOW_COPY_AND_ASSIGN(ChromeAppsAPIProvider);
};
} // namespace apps
#endif // CHROME_COMMON_APPS_PLATFORM_APPS_CHROME_APPS_API_PROVIDER_H_
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
<release seq="1"> <release seq="1">
<includes> <includes>
<include name="IDR_CHROME_EXTENSION_API_FEATURES" file="extensions\api\_api_features.json" type="BINDATA" /> <include name="IDR_CHROME_EXTENSION_API_FEATURES" file="extensions\api\_api_features.json" type="BINDATA" />
<include name="IDR_CHROME_APP_API_FEATURES" file="apps\platform_apps\api\_api_features.json" type="BINDATA" />
</includes> </includes>
</release> </release>
</grit> </grit>
...@@ -172,10 +172,6 @@ ...@@ -172,10 +172,6 @@
"dependencies": ["permission:brailleDisplayPrivate"], "dependencies": ["permission:brailleDisplayPrivate"],
"contexts": ["blessed_extension"] "contexts": ["blessed_extension"]
}, },
"browser": {
"dependencies": ["permission:browser"],
"contexts": ["blessed_extension"]
},
"browserAction": { "browserAction": {
"dependencies": ["manifest:browser_action"], "dependencies": ["manifest:browser_action"],
"contexts": ["blessed_extension"] "contexts": ["blessed_extension"]
......
...@@ -93,10 +93,6 @@ ...@@ -93,10 +93,6 @@
"extension_types": ["extension", "legacy_packaged_app", "platform_app"], "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
"location": "component" "location": "component"
}, },
"browser": {
"channel": "stable",
"extension_types": ["platform_app"]
},
"browsingData": { "browsingData": {
"channel": "stable", "channel": "stable",
"extension_types": ["extension", "legacy_packaged_app"] "extension_types": ["extension", "legacy_packaged_app"]
......
...@@ -22,7 +22,6 @@ schema_sources_ = [ ...@@ -22,7 +22,6 @@ schema_sources_ = [
"bookmark_manager_private.json", "bookmark_manager_private.json",
"bookmarks.json", "bookmarks.json",
"braille_display_private.idl", "braille_display_private.idl",
"browser.idl",
"chrome_web_view_internal.json", "chrome_web_view_internal.json",
"command_line_private.json", "command_line_private.json",
"content_settings.json", "content_settings.json",
......
application: chrome-apps-doc application: chrome-apps-doc
version: 3-58-0 version: 3-59-0
runtime: python27 runtime: python27
api_version: 1 api_version: 1
threadsafe: false threadsafe: false
......
...@@ -9,25 +9,31 @@ from posixpath import join ...@@ -9,25 +9,31 @@ from posixpath import join
EXTENSIONS = 'extensions/common/' EXTENSIONS = 'extensions/common/'
CHROME_EXTENSIONS = 'chrome/common/extensions/' CHROME_EXTENSIONS = 'chrome/common/extensions/'
CHROME_APPS = 'chrome/common/apps/platform_apps/'
BROWSER_EXTENSIONS = 'extensions/browser/' BROWSER_EXTENSIONS = 'extensions/browser/'
BROWSER_CHROME_EXTENSIONS = 'chrome/browser/extensions/' BROWSER_CHROME_EXTENSIONS = 'chrome/browser/extensions/'
BROWSER_CHROME_APPS = 'chrome/browser/apps/platform_apps/'
EXTENSIONS_API = join(EXTENSIONS, 'api/') EXTENSIONS_API = join(EXTENSIONS, 'api/')
CHROME_API = join(CHROME_EXTENSIONS, 'api/') CHROME_API = join(CHROME_EXTENSIONS, 'api/')
CHROME_APPS_API = join(CHROME_APPS, 'api/')
BROWSER_EXTENSIONS_API = join(BROWSER_EXTENSIONS, 'api/') BROWSER_EXTENSIONS_API = join(BROWSER_EXTENSIONS, 'api/')
BROWSER_CHROME_API = join(BROWSER_CHROME_EXTENSIONS, 'api/') BROWSER_CHROME_API = join(BROWSER_CHROME_EXTENSIONS, 'api/')
BROWSER_CHROME_APPS_API = join(BROWSER_CHROME_APPS, 'api/')
# Note: This determines search order when APIs are resolved in the filesystem. # Note: This determines search order when APIs are resolved in the filesystem.
API_PATHS = ( API_PATHS = (
CHROME_API, CHROME_API,
EXTENSIONS_API, EXTENSIONS_API,
CHROME_APPS_API,
) )
BROWSER_API_PATHS = ( BROWSER_API_PATHS = (
BROWSER_CHROME_API, BROWSER_CHROME_API,
BROWSER_EXTENSIONS_API BROWSER_EXTENSIONS_API,
BROWSER_CHROME_APPS_API,
) )
DOCS = join(CHROME_EXTENSIONS, 'docs/') DOCS = join(CHROME_EXTENSIONS, 'docs/')
......
...@@ -14,6 +14,19 @@ from test_file_system import TestFileSystem ...@@ -14,6 +14,19 @@ from test_file_system import TestFileSystem
_TEST_FS = { _TEST_FS = {
'chrome': { 'chrome': {
'browser': { 'browser': {
'apps': {
'platform_apps': {
'OWNERS': '\n'.join([
'# Apps owners.',
'apps@owner.tld'
]),
'api': {
'an_app_api': {
'an_app_api.cc': ''
}
}
}
},
'extensions': { 'extensions': {
'OWNERS': '\n'.join([ 'OWNERS': '\n'.join([
'# Core owners.', '# Core owners.',
...@@ -154,6 +167,12 @@ class OwnersDataSourceTest(unittest.TestCase): ...@@ -154,6 +167,12 @@ class OwnersDataSourceTest(unittest.TestCase):
'notes': 'Hallo!', 'notes': 'Hallo!',
'id': 'a_different_api' 'id': 'a_different_api'
}, },
{
'apiName': 'an_app_api',
'owners': [],
'notes': 'Use one of the Core Extensions/Apps Owners.',
'id': 'an_app_api',
},
{ {
'apiName': 'another_api', 'apiName': 'another_api',
'owners': [], 'owners': [],
......
...@@ -218,7 +218,6 @@ ChromeAPIPermissions::GetAllPermissions() const { ...@@ -218,7 +218,6 @@ ChromeAPIPermissions::GetAllPermissions() const {
&CreateAPIPermission<MediaGalleriesPermission>}, &CreateAPIPermission<MediaGalleriesPermission>},
{APIPermission::kPointerLock, "pointerLock"}, {APIPermission::kPointerLock, "pointerLock"},
{APIPermission::kCastStreaming, "cast.streaming"}, {APIPermission::kCastStreaming, "cast.streaming"},
{APIPermission::kBrowser, "browser"},
{APIPermission::kLauncherSearchProvider, "launcherSearchProvider"}, {APIPermission::kLauncherSearchProvider, "launcherSearchProvider"},
// Settings override permissions. // Settings override permissions.
......
...@@ -4,7 +4,10 @@ ...@@ -4,7 +4,10 @@
#include "chrome/common/initialize_extensions_client.h" #include "chrome/common/initialize_extensions_client.h"
#include <memory>
#include "base/no_destructor.h" #include "base/no_destructor.h"
#include "chrome/common/apps/platform_apps/chrome_apps_api_provider.h"
#include "chrome/common/extensions/chrome_extensions_client.h" #include "chrome/common/extensions/chrome_extensions_client.h"
#include "extensions/common/extensions_client.h" #include "extensions/common/extensions_client.h"
...@@ -16,6 +19,8 @@ void EnsureExtensionsClientInitialized() { ...@@ -16,6 +19,8 @@ void EnsureExtensionsClientInitialized() {
if (!initialized) { if (!initialized) {
initialized = true; initialized = true;
extensions_client->AddAPIProvider(
std::make_unique<apps::ChromeAppsAPIProvider>());
extensions::ExtensionsClient::Set(extensions_client.get()); extensions::ExtensionsClient::Set(extensions_client.get());
} }
......
...@@ -1200,6 +1200,7 @@ test("browser_tests") { ...@@ -1200,6 +1200,7 @@ test("browser_tests") {
if (enable_extensions) { if (enable_extensions) {
sources += [ sources += [
"../browser/accessibility/accessibility_extension_api_browsertest.cc", "../browser/accessibility/accessibility_extension_api_browsertest.cc",
"../browser/apps/platform_apps/api/browser/browser_apitest.cc",
"../browser/apps/platform_apps/app_browsertest_util.cc", "../browser/apps/platform_apps/app_browsertest_util.cc",
"../browser/apps/platform_apps/app_browsertest_util.h", "../browser/apps/platform_apps/app_browsertest_util.h",
"../browser/extensions/active_tab_apitest.cc", "../browser/extensions/active_tab_apitest.cc",
...@@ -1215,7 +1216,6 @@ test("browser_tests") { ...@@ -1215,7 +1216,6 @@ test("browser_tests") {
"../browser/extensions/api/braille_display_private/braille_display_private_apitest.cc", "../browser/extensions/api/braille_display_private/braille_display_private_apitest.cc",
"../browser/extensions/api/braille_display_private/mock_braille_controller.cc", "../browser/extensions/api/braille_display_private/mock_braille_controller.cc",
"../browser/extensions/api/braille_display_private/mock_braille_controller.h", "../browser/extensions/api/braille_display_private/mock_braille_controller.h",
"../browser/extensions/api/browser/browser_apitest.cc",
"../browser/extensions/api/browsing_data/browsing_data_test.cc", "../browser/extensions/api/browsing_data/browsing_data_test.cc",
"../browser/extensions/api/cast_streaming/cast_streaming_apitest.cc", "../browser/extensions/api/cast_streaming/cast_streaming_apitest.cc",
"../browser/extensions/api/command_line_private/command_line_private_apitest.cc", "../browser/extensions/api/command_line_private/command_line_private_apitest.cc",
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#endif #endif
#if BUILDFLAG(ENABLE_EXTENSIONS) #if BUILDFLAG(ENABLE_EXTENSIONS)
#include "chrome/browser/apps/platform_apps/chrome_apps_browser_api_provider.h"
#include "chrome/browser/extensions/chrome_extensions_browser_client.h" #include "chrome/browser/extensions/chrome_extensions_browser_client.h"
#include "chrome/browser/media_galleries/media_file_system_registry.h" #include "chrome/browser/media_galleries/media_file_system_registry.h"
#include "chrome/browser/ui/apps/chrome_app_window_client.h" #include "chrome/browser/ui/apps/chrome_app_window_client.h"
...@@ -97,6 +98,8 @@ TestingBrowserProcess::TestingBrowserProcess() ...@@ -97,6 +98,8 @@ TestingBrowserProcess::TestingBrowserProcess()
#if BUILDFLAG(ENABLE_EXTENSIONS) #if BUILDFLAG(ENABLE_EXTENSIONS)
extensions_browser_client_.reset( extensions_browser_client_.reset(
new extensions::ChromeExtensionsBrowserClient); new extensions::ChromeExtensionsBrowserClient);
extensions_browser_client_->AddAPIProvider(
std::make_unique<apps::ChromeAppsBrowserAPIProvider>());
extensions::AppWindowClient::Set(ChromeAppWindowClient::GetInstance()); extensions::AppWindowClient::Set(ChromeAppWindowClient::GetInstance());
extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get()); extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get());
#endif #endif
......
...@@ -14,6 +14,10 @@ ...@@ -14,6 +14,10 @@
#include "base/pickle.h" #include "base/pickle.h"
#include "base/values.h" #include "base/values.h"
namespace apps {
class ChromeAppsAPIPermissions;
}
namespace extensions { namespace extensions {
class PermissionIDSet; class PermissionIDSet;
...@@ -420,6 +424,7 @@ class APIPermissionInfo { ...@@ -420,6 +424,7 @@ class APIPermissionInfo {
// Instances should only be constructed from within a PermissionsProvider. // Instances should only be constructed from within a PermissionsProvider.
friend class CastAPIPermissions; friend class CastAPIPermissions;
friend class ChromeAPIPermissions; friend class ChromeAPIPermissions;
friend class apps::ChromeAppsAPIPermissions;
friend class ExtensionsAPIPermissions; friend class ExtensionsAPIPermissions;
// Implementations of APIPermission will want to get the permission message, // Implementations of APIPermission will want to get the permission message,
// but this class's implementation should be hidden from everyone else. // but this class's implementation should be hidden from everyone else.
......
...@@ -22,6 +22,8 @@ class PermissionsProvider { ...@@ -22,6 +22,8 @@ class PermissionsProvider {
// Returns all the known permissions. // Returns all the known permissions.
virtual std::vector<std::unique_ptr<APIPermissionInfo>> GetAllPermissions() virtual std::vector<std::unique_ptr<APIPermissionInfo>> GetAllPermissions()
const = 0; const = 0;
virtual ~PermissionsProvider() {}
}; };
} // namespace extensions } // namespace extensions
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment