| 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..3a9ceaf233ad0a70701bbfe90cb963b291cbbf4d 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,58 @@ 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();
|
| +
|
| + ExtensionURLInfo strict_url(parent_frame->document().securityOrigin(),
|
| + context_->web_frame()->document().url());
|
| +
|
| + const ExtensionSet* extensions = extension_dispatcher_->extensions();
|
| + const Extension* extension = extensions->GetExtensionOrAppByURL(strict_url);
|
| + const char* state = NULL;
|
| +
|
| + if (extension) {
|
| + if (extension_dispatcher_->IsExtensionActive(extension->id()))
|
| + state = extension_misc::kAppStateRunning;
|
| + else
|
| + 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 +256,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));
|
| +}
|
|
|