15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/runtime/runtime_api.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <utility> 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/logging.h" 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/values.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/event_router.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_process_manager.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/lazy_background_task_queue.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/updater/extension_updater.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/background_info.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 28b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/common/omaha_query_params/omaha_query_params.h" 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/child_process_security_policy.h" 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/notification_service.h" 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "extensions/common/error_utils.h" 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "webkit/browser/fileapi/isolated_context.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)namespace GetPlatformInfo = extensions::api::runtime::GetPlatformInfo; 38b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOnStartupEvent[] = "runtime.onStartup"; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOnInstalledEvent[] = "runtime.onInstalled"; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOnUpdateAvailableEvent[] = "runtime.onUpdateAvailable"; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kOnBrowserUpdateAvailableEvent[] = 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "runtime.onBrowserUpdateAvailable"; 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kOnRestartRequiredEvent[] = "runtime.onRestartRequired"; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNoBackgroundPageError[] = "You do not have a background page."; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPageLoadError[] = "Background page failed to load."; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstallReason[] = "reason"; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstallReasonChromeUpdate[] = "chrome_update"; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstallReasonUpdate[] = "update"; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstallReasonInstall[] = "install"; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstallPreviousVersion[] = "previousVersion"; 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kInvalidUrlError[] = "Invalid URL."; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kUpdatesDisabledError[] = "Autoupdate is not enabled."; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kUpdateFound[] = "update_available"; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kUpdateNotFound[] = "no_update"; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kUpdateThrottled[] = "throttled"; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// A preference key storing the url loaded when an extension is uninstalled. 63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kUninstallUrl[] = "uninstall_url"; 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// The name of the directory to be returned by getPackageDirectoryEntry. This 667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// particular value does not matter to user code, but is chosen for consistency 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// with the equivalent Pepper API. 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kPackageDirectoryPath[] = "crxfs"; 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void DispatchOnStartupEventImpl( 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool first_call, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionHost* host) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A NULL host from the LazyBackgroundTaskQueue means the page failed to 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // load. Give up. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!host && !first_call) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't send onStartup events to incognito profiles. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile->IsOffTheRecord()) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (g_browser_process->IsShuttingDown() || 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !g_browser_process->profile_manager()->IsValidProfile(profile)) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSystem* system = ExtensionSystem::Get(profile); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!system) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is a persistent background page, we want to wait for it to load 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (it might not be ready, since this is startup). But only enqueue once. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it fails to load the first time, don't bother trying again. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system->extension_service()->extensions()->GetByID(extension_id); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension && BackgroundInfo::HasPersistentBackgroundPage(extension) && 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_call && 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system->lazy_background_task_queue()-> 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShouldEnqueueTask(profile, extension)) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system->lazy_background_task_queue()->AddPendingTask( 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile, extension_id, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DispatchOnStartupEventImpl, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile, extension_id, false)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::ListValue> event_args(new base::ListValue()); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Event> event(new Event(kOnStartupEvent, event_args.Pass())); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) system->event_router()->DispatchEventToExtension(extension_id, event.Pass()); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SetUninstallUrl(ExtensionPrefs* prefs, 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& extension_id, 114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& url_string) { 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) prefs->UpdateExtensionPref(extension_id, 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kUninstallUrl, 117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Value::CreateStringValue(url_string)); 118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)std::string GetUninstallUrl(ExtensionPrefs* prefs, 121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& extension_id) { 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string url_string; 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) prefs->ReadPrefAsString(extension_id, kUninstallUrl, &url_string); 124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return url_string; 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RuntimeEventRouter::DispatchOnStartupEvent( 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, const std::string& extension_id) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchOnStartupEventImpl(profile, extension_id, true, NULL); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RuntimeEventRouter::DispatchOnInstalledEvent( 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Version& old_version, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool chrome_updated) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSystem* system = ExtensionSystem::Get(profile); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!system) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::ListValue> event_args(new base::ListValue()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* info = new base::DictionaryValue(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_args->Append(info); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old_version.IsValid()) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->SetString(kInstallReason, kInstallReasonUpdate); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->SetString(kInstallPreviousVersion, old_version.GetString()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (chrome_updated) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->SetString(kInstallReason, kInstallReasonChromeUpdate); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->SetString(kInstallReason, kInstallReasonInstall); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(system->event_router()); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Event> event(new Event(kOnInstalledEvent, event_args.Pass())); 158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch system->event_router()->DispatchEventWithLazyListener(extension_id, 159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch event.Pass()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RuntimeEventRouter::DispatchOnUpdateAvailableEvent( 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::DictionaryValue* manifest) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSystem* system = ExtensionSystem::Get(profile); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!system) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::ListValue> args(new base::ListValue); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args->Append(manifest->DeepCopy()); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(system->event_router()); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Event> event(new Event(kOnUpdateAvailableEvent, args.Pass())); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) system->event_router()->DispatchEventToExtension(extension_id, event.Pass()); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RuntimeEventRouter::DispatchOnBrowserUpdateAvailableEvent( 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile) { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionSystem* system = ExtensionSystem::Get(profile); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!system) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::ListValue> args(new base::ListValue); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(system->event_router()); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Event> event(new Event(kOnBrowserUpdateAvailableEvent, 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args.Pass())); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) system->event_router()->BroadcastEvent(event.Pass()); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RuntimeEventRouter::DispatchOnRestartRequiredEvent( 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Profile* profile, 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& app_id, 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch api::runtime::OnRestartRequired::Reason reason) { 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExtensionSystem* system = ExtensionSystem::Get(profile); 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!system) 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<Event> event( 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new Event(kOnRestartRequiredEvent, 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch api::runtime::OnRestartRequired::Create(reason))); 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(system->event_router()); 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch system->event_router()->DispatchEventToExtension(app_id, event.Pass()); 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RuntimeEventRouter::OnExtensionUninstalled( 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Profile* profile, 21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string& extension_id) { 21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL uninstall_url(GetUninstallUrl(ExtensionPrefs::Get(profile), 215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension_id)); 21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (uninstall_url.is_empty()) 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Browser* browser = chrome::FindLastActiveWithProfile(profile, 22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::GetActiveDesktop()); 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!browser) 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) browser = new Browser(Browser::CreateParams(profile, 22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::GetActiveDesktop())); 22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::NavigateParams params(browser, uninstall_url, 22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::PAGE_TRANSITION_CLIENT_REDIRECT); 22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.disposition = NEW_FOREGROUND_TAB; 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.user_gesture = false; 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::Navigate(¶ms); 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif // defined(ENABLE_EXTENSIONS) 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RuntimeGetBackgroundPageFunction::RunImpl() { 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionSystem* system = ExtensionSystem::Get(profile()); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionHost* host = system->process_manager()-> 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetBackgroundHostForExtension(extension_id()); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (system->lazy_background_task_queue()->ShouldEnqueueTask( 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile(), GetExtension())) { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) system->lazy_background_task_queue()->AddPendingTask( 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile(), extension_id(), 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&RuntimeGetBackgroundPageFunction::OnPageLoaded, this)); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (host) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPageLoaded(host); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = kNoBackgroundPageError; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RuntimeGetBackgroundPageFunction::OnPageLoaded(ExtensionHost* host) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponse(true); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = kPageLoadError; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponse(false); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool RuntimeSetUninstallUrlFunction::RunImpl() { 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string url_string; 26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url_string)); 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GURL url(url_string); 26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!url.is_valid()) { 26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_ = ErrorUtils::FormatErrorMessage(kInvalidUrlError, url_string); 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetUninstallUrl(ExtensionPrefs::Get(profile()), extension_id(), url_string); 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RuntimeReloadFunction::RunImpl() { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can't call ReloadExtension directly, since when this method finishes 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it tries to decrease the reference count for the extension, which fails 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the extension has already been reloaded; so instead we post a task. 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionService::ReloadExtension, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->GetExtensionService()->AsWeakPtr(), 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_id())); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RuntimeRequestUpdateCheckFunction::RuntimeRequestUpdateCheckFunction() { 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UPDATE_FOUND, 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::AllSources()); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RuntimeRequestUpdateCheckFunction::RunImpl() { 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionSystem* system = ExtensionSystem::Get(profile()); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = system->extension_service(); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionUpdater* updater = service->updater(); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!updater) { 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_ = kUpdatesDisabledError; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_reply_ = false; 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!updater->CheckExtensionSoon(extension_id(), base::Bind( 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &RuntimeRequestUpdateCheckFunction::CheckComplete, this))) { 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_reply_ = true; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetResult(new base::StringValue(kUpdateThrottled)); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RuntimeRequestUpdateCheckFunction::CheckComplete() { 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (did_reply_) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_reply_ = true; 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Since no UPDATE_FOUND notification was seen, this generally would mean 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that no update is found, but a previous update check might have already 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // queued up an update, so check for that here to make sure we return the 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // right value. 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionSystem* system = ExtensionSystem::Get(profile()); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = system->extension_service(); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* update = service->GetPendingExtensionUpdate(extension_id()); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (update) { 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReplyUpdateFound(update->VersionString()); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetResult(new base::StringValue(kUpdateNotFound)); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RuntimeRequestUpdateCheckFunction::Observe( 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int type, 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) { 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (did_reply_) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(type == chrome::NOTIFICATION_EXTENSION_UPDATE_FOUND); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef const std::pair<std::string, Version> UpdateDetails; 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& id = content::Details<UpdateDetails>(details)->first; 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Version& version = content::Details<UpdateDetails>(details)->second; 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (id == extension_id()) { 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReplyUpdateFound(version.GetString()); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RuntimeRequestUpdateCheckFunction::ReplyUpdateFound( 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version) { 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_reply_ = true; 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) results_.reset(new base::ListValue); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) results_->AppendString(kUpdateFound); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* details = new base::DictionaryValue; 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) results_->Append(details); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) details->SetString("version", version); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 359b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool RuntimeGetPlatformInfoFunction::RunImpl() { 360b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GetPlatformInfo::Results::PlatformInfo info; 361b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 362b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const char* os = chrome::OmahaQueryParams::getOS(); 363b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (strcmp(os, "mac") == 0) { 364b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) info.os = GetPlatformInfo::Results::PlatformInfo::OS_MAC_; 365b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else if (strcmp(os, "win") == 0) { 366b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) info.os = GetPlatformInfo::Results::PlatformInfo::OS_WIN_; 367b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else if (strcmp(os, "android") == 0) { 368b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) info.os = GetPlatformInfo::Results::PlatformInfo::OS_ANDROID_; 369b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else if (strcmp(os, "cros") == 0) { 370b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) info.os = GetPlatformInfo::Results::PlatformInfo::OS_CROS_; 371b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else if (strcmp(os, "linux") == 0) { 372b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) info.os = GetPlatformInfo::Results::PlatformInfo::OS_LINUX_; 373b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else if (strcmp(os, "openbsd") == 0) { 374b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) info.os = GetPlatformInfo::Results::PlatformInfo::OS_OPENBSD_; 375b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 376b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) NOTREACHED(); 377b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return false; 378b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 379b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 380b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const char* arch = chrome::OmahaQueryParams::getArch(); 381b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (strcmp(arch, "arm") == 0) { 382b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) info.arch = GetPlatformInfo::Results::PlatformInfo::ARCH_ARM; 383b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else if (strcmp(arch, "x86") == 0) { 384b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) info.arch = GetPlatformInfo::Results::PlatformInfo::ARCH_X86_32; 385b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else if (strcmp(arch, "x64") == 0) { 386b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) info.arch = GetPlatformInfo::Results::PlatformInfo::ARCH_X86_64; 387b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 388b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) NOTREACHED(); 389b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return false; 390b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 391b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 392b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const char* nacl_arch = chrome::OmahaQueryParams::getNaclArch(); 393b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (strcmp(nacl_arch, "arm") == 0) { 394b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) info.nacl_arch = GetPlatformInfo::Results::PlatformInfo::NACL_ARCH_ARM; 395b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else if (strcmp(nacl_arch, "x86-32") == 0) { 396b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) info.nacl_arch = GetPlatformInfo::Results::PlatformInfo::NACL_ARCH_X86_32; 397b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else if (strcmp(nacl_arch, "x86-64") == 0) { 398b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) info.nacl_arch = GetPlatformInfo::Results::PlatformInfo::NACL_ARCH_X86_64; 399b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 400b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) NOTREACHED(); 401b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return false; 402b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 403b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 404b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) results_ = GetPlatformInfo::Results::Create(info); 405b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return true; 406b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 407b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool RuntimeGetPackageDirectoryEntryFunction::RunImpl() { 4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fileapi::IsolatedContext* isolated_context = 4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fileapi::IsolatedContext::GetInstance(); 4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(isolated_context); 4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string relative_path = kPackageDirectoryPath; 4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::FilePath path = extension_->path(); 4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string filesystem_id = isolated_context->RegisterFileSystemForPath( 4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fileapi::kFileSystemTypeNativeLocal, path, &relative_path); 4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int renderer_id = render_view_host_->GetProcess()->GetID(); 4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content::ChildProcessSecurityPolicy* policy = 4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content::ChildProcessSecurityPolicy::GetInstance(); 4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) policy->GrantReadFileSystem(renderer_id, filesystem_id); 422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* dict = new base::DictionaryValue(); 4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SetResult(dict); 4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dict->SetString("fileSystemId", filesystem_id); 4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dict->SetString("baseName", relative_path); 4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 430