Home | History | Annotate | Download | only in app_runtime
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "extensions/browser/api/app_runtime/app_runtime_api.h"
      6 
      7 #include "base/time/time.h"
      8 #include "base/values.h"
      9 #include "extensions/browser/event_router.h"
     10 #include "extensions/browser/extension_prefs.h"
     11 #include "extensions/browser/extension_system.h"
     12 #include "extensions/browser/extensions_browser_client.h"
     13 #include "extensions/browser/granted_file_entry.h"
     14 #include "extensions/common/api/app_runtime.h"
     15 #include "url/gurl.h"
     16 
     17 using content::BrowserContext;
     18 
     19 namespace extensions {
     20 
     21 namespace app_runtime = core_api::app_runtime;
     22 
     23 namespace {
     24 
     25 void DispatchOnEmbedRequestedEventImpl(
     26     const std::string& extension_id,
     27     scoped_ptr<base::DictionaryValue> app_embedding_request_data,
     28     content::BrowserContext* context) {
     29   scoped_ptr<base::ListValue> args(new base::ListValue());
     30   args->Append(app_embedding_request_data.release());
     31   ExtensionSystem* system = ExtensionSystem::Get(context);
     32   scoped_ptr<Event> event(
     33       new Event(app_runtime::OnEmbedRequested::kEventName, args.Pass()));
     34   event->restrict_to_browser_context = context;
     35   system->event_router()->DispatchEventWithLazyListener(extension_id,
     36                                                         event.Pass());
     37 
     38   ExtensionPrefs::Get(context)
     39       ->SetLastLaunchTime(extension_id, base::Time::Now());
     40 }
     41 
     42 void DispatchOnLaunchedEventImpl(const std::string& extension_id,
     43                                  scoped_ptr<base::DictionaryValue> launch_data,
     44                                  BrowserContext* context) {
     45   // "Forced app mode" is true for Chrome OS kiosk mode.
     46   launch_data->SetBoolean(
     47       "isKioskSession",
     48       ExtensionsBrowserClient::Get()->IsRunningInForcedAppMode());
     49   scoped_ptr<base::ListValue> args(new base::ListValue());
     50   args->Append(launch_data.release());
     51   scoped_ptr<Event> event(
     52       new Event(app_runtime::OnLaunched::kEventName, args.Pass()));
     53   event->restrict_to_browser_context = context;
     54   EventRouter::Get(context)
     55       ->DispatchEventWithLazyListener(extension_id, event.Pass());
     56   ExtensionPrefs::Get(context)
     57       ->SetLastLaunchTime(extension_id, base::Time::Now());
     58 }
     59 
     60 }  // namespace
     61 
     62 // static
     63 void AppRuntimeEventRouter::DispatchOnEmbedRequestedEvent(
     64     content::BrowserContext* context,
     65     scoped_ptr<base::DictionaryValue> embed_app_data,
     66     const Extension* extension) {
     67   DispatchOnEmbedRequestedEventImpl(
     68       extension->id(), embed_app_data.Pass(), context);
     69 }
     70 
     71 // static
     72 void AppRuntimeEventRouter::DispatchOnLaunchedEvent(
     73     BrowserContext* context,
     74     const Extension* extension) {
     75   scoped_ptr<base::DictionaryValue> launch_data(new base::DictionaryValue());
     76   DispatchOnLaunchedEventImpl(extension->id(), launch_data.Pass(), context);
     77 }
     78 
     79 // static
     80 void AppRuntimeEventRouter::DispatchOnRestartedEvent(
     81     BrowserContext* context,
     82     const Extension* extension) {
     83   scoped_ptr<base::ListValue> arguments(new base::ListValue());
     84   scoped_ptr<Event> event(
     85       new Event(app_runtime::OnRestarted::kEventName, arguments.Pass()));
     86   event->restrict_to_browser_context = context;
     87   EventRouter::Get(context)
     88       ->DispatchEventToExtension(extension->id(), event.Pass());
     89 }
     90 
     91 // static
     92 void AppRuntimeEventRouter::DispatchOnLaunchedEventWithFileEntries(
     93     BrowserContext* context,
     94     const Extension* extension,
     95     const std::string& handler_id,
     96     const std::vector<std::string>& mime_types,
     97     const std::vector<GrantedFileEntry>& file_entries) {
     98   // TODO(sergeygs): Use the same way of creating an event (using the generated
     99   // boilerplate) as below in DispatchOnLaunchedEventWithUrl.
    100   scoped_ptr<base::DictionaryValue> launch_data(new base::DictionaryValue);
    101   launch_data->SetString("id", handler_id);
    102   scoped_ptr<base::ListValue> items(new base::ListValue);
    103   DCHECK(file_entries.size() == mime_types.size());
    104   for (size_t i = 0; i < file_entries.size(); ++i) {
    105     scoped_ptr<base::DictionaryValue> launch_item(new base::DictionaryValue);
    106     launch_item->SetString("fileSystemId", file_entries[i].filesystem_id);
    107     launch_item->SetString("baseName", file_entries[i].registered_name);
    108     launch_item->SetString("mimeType", mime_types[i]);
    109     launch_item->SetString("entryId", file_entries[i].id);
    110     items->Append(launch_item.release());
    111   }
    112   launch_data->Set("items", items.release());
    113   DispatchOnLaunchedEventImpl(extension->id(), launch_data.Pass(), context);
    114 }
    115 
    116 // static
    117 void AppRuntimeEventRouter::DispatchOnLaunchedEventWithUrl(
    118     BrowserContext* context,
    119     const Extension* extension,
    120     const std::string& handler_id,
    121     const GURL& url,
    122     const GURL& referrer_url) {
    123   app_runtime::LaunchData launch_data;
    124   launch_data.id.reset(new std::string(handler_id));
    125   launch_data.url.reset(new std::string(url.spec()));
    126   launch_data.referrer_url.reset(new std::string(referrer_url.spec()));
    127   DispatchOnLaunchedEventImpl(
    128       extension->id(), launch_data.ToValue().Pass(), context);
    129 }
    130 
    131 }  // namespace extensions
    132