Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1973)

Unified Diff: chrome/renderer/extensions/app_bindings.cc

Issue 10174001: Add an API for hosted apps to check their install and running states. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/extensions/app_bindings.cc
diff --git a/chrome/renderer/extensions/app_bindings.cc b/chrome/renderer/extensions/app_bindings.cc
index 40857d9633ff19c8b8bb5dd797c82c2b9da8c16d..adf72db538deda15a3c0b30b5d1176a3fe1ade15 100644
--- a/chrome/renderer/extensions/app_bindings.cc
+++ b/chrome/renderer/extensions/app_bindings.cc
@@ -69,6 +69,10 @@ AppBindings::AppBindings(ExtensionDispatcher* dispatcher,
base::Bind(&AppBindings::GetDetailsForFrame, base::Unretained(this)));
RouteFunction("GetAppNotifyChannel",
base::Bind(&AppBindings::GetAppNotifyChannel, base::Unretained(this)));
+ RouteFunction("GetInstallState",
+ base::Bind(&AppBindings::GetInstallState, base::Unretained(this)));
+ RouteFunction("GetRunningState",
+ base::Bind(&AppBindings::GetRunningState, base::Unretained(this)));
}
v8::Handle<v8::Value> AppBindings::GetIsInstalled(
@@ -184,10 +188,69 @@ v8::Handle<v8::Value> AppBindings::GetAppNotifyChannel(
return v8::Undefined();
}
+v8::Handle<v8::Value> AppBindings::GetInstallState(const v8::Arguments& args) {
+ // Get the callbackId.
+ int callback_id = 0;
+ if (args.Length() == 1) {
+ if (!args[0]->IsInt32()) {
+ v8::ThrowException(v8::String::New(kInvalidCallbackIdError));
+ return v8::Undefined();
+ }
+ callback_id = args[0]->Int32Value();
+ }
+
+ content::RenderView* render_view = context_->GetRenderView();
+ CHECK(render_view);
+
+ Send(new ExtensionHostMsg_GetAppInstallState(
+ render_view->GetRoutingID(), context_->web_frame()->document().url(),
+ GetRoutingID(), callback_id));
+ return v8::Undefined();
+}
+
+v8::Handle<v8::Value> AppBindings::GetRunningState(const v8::Arguments& args) {
+ // To distinguish between ready_to_run and cannot_run states, we need the top
+ // level frame.
+ const WebFrame* parent_frame = context_->web_frame();
+ while (parent_frame->parent())
+ parent_frame = parent_frame->parent();
+
+ const ExtensionSet* extensions = extension_dispatcher_->extensions();
+ const char* state = NULL;
+
+ // The app associated with the top level frame.
+ const Extension* parent_app = extensions->GetHostedAppByURL(
+ ExtensionURLInfo(parent_frame->document().url()));
+
+ // The app associated with this frame.
+ const Extension* this_app = extensions->GetHostedAppByURL(
+ ExtensionURLInfo(context_->web_frame()->document().url()));
+
+ if (!this_app || !parent_app) {
+ state = extension_misc::kAppStateCannotRun;
+ return v8::String::New(state);
miket_OOO 2012/04/24 00:04:48 Just for clarity, can you move state's declaration
jstritar 2012/04/24 00:11:59 Done.
+ }
+
+ if (extension_dispatcher_->IsExtensionActive(parent_app->id())) {
+ if (parent_app == this_app)
+ state = extension_misc::kAppStateRunning;
+ else
+ state = extension_misc::kAppStateCannotRun;
+ } else if (parent_app == this_app) {
+ state = extension_misc::kAppStateReadyToRun;
+ } else {
+ state = extension_misc::kAppStateCannotRun;
+ }
+
+ return v8::String::New(state);
+}
+
bool AppBindings::OnMessageReceived(const IPC::Message& message) {
IPC_BEGIN_MESSAGE_MAP(AppBindings, message)
IPC_MESSAGE_HANDLER(ExtensionMsg_GetAppNotifyChannelResponse,
OnGetAppNotifyChannelResponse)
+ IPC_MESSAGE_HANDLER(ExtensionMsg_GetAppInstallStateResponse,
+ OnAppInstallStateResponse)
IPC_MESSAGE_UNHANDLED(CHECK(false) << "Unhandled IPC message")
IPC_END_MESSAGE_MAP()
return true;
@@ -204,3 +267,14 @@ void AppBindings::OnGetAppNotifyChannelResponse(
CHECK(context_->CallChromeHiddenMethod("app.onGetAppNotifyChannelResponse",
arraysize(argv), argv, NULL));
}
+
+void AppBindings::OnAppInstallStateResponse(
+ const std::string& state, int callback_id) {
+ v8::HandleScope handle_scope;
+ v8::Context::Scope context_scope(context_->v8_context());
+ v8::Handle<v8::Value> argv[2];
+ argv[0] = v8::String::New(state.c_str());
+ argv[1] = v8::Integer::New(callback_id);
+ CHECK(context_->CallChromeHiddenMethod("app.onInstallStateResponse",
+ arraysize(argv), argv, NULL));
+}
« no previous file with comments | « chrome/renderer/extensions/app_bindings.h ('k') | chrome/renderer/resources/extensions/app_custom_bindings.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698