14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/webui/app_list/start_page_ui.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/files/file_path.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/ref_counted_memory.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/sys_info.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/webui/app_list/start_page_handler.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/url_constants.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/web_ui.h" 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/web_ui_data_source.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/extension_system.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/common/extension.h" 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "grit/browser_resources.h" 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace app_list { 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_CHROMEOS) 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char* kHotwordFilePrefixes[] = { 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "hotword_", 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "_platform_specific/", 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void LoadModelData(const base::FilePath& base_dir, 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& path, 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const content::WebUIDataSource::GotDataCallback& callback) { 35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Will be owned by |callback|. 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<base::RefCountedString> data(new base::RefCountedString()); 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::ReadFileToString(base_dir.AppendASCII(path), &(data->data())); 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback.Run(data.get()); 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool HandleHotwordFilesResourceFilter( 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Profile* profile, 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& path, 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const content::WebUIDataSource::GotDataCallback& callback) { 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ExtensionService* service = 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const extensions::Extension* extension = 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) service->GetExtensionById(extension_misc::kHotwordExtensionId, false); 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!extension) 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (size_t i = 0; i < arraysize(kHotwordFilePrefixes); ++i) { 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (path.find(kHotwordFilePrefixes[i]) == 0) { 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserThread::PostTask( 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserThread::FILE, 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FROM_HERE, 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&LoadModelData, extension->path(), path, callback)); 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // OS_CHROMEOS 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)StartPageUI::StartPageUI(content::WebUI* web_ui) 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : content::WebUIController(web_ui) { 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) web_ui->AddMessageHandler(new StartPageHandler); 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) InitDataSource(); 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)StartPageUI::~StartPageUI() {} 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void StartPageUI::InitDataSource() { 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<content::WebUIDataSource> source( 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::WebUIDataSource::Create(chrome::kChromeUIAppListStartPageHost)); 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) source->SetUseJsonJSFormatV2(); 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) source->SetJsonPath("strings.js"); 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) source->AddResourcePath("start_page.css", IDR_APP_LIST_START_PAGE_CSS); 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) source->AddResourcePath("start_page.js", IDR_APP_LIST_START_PAGE_JS); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source->AddResourcePath("hotword_nacl.nmf", IDR_APP_LIST_HOTWORD_NACL_NMF); 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) source->SetDefaultResource(IDR_APP_LIST_START_PAGE_HTML); 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_CHROMEOS) 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) source->OverrideContentSecurityPolicyObjectSrc("object-src 'self' data:;"); 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (base::SysInfo::IsRunningOnChromeOS()) 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) source->SetRequestFilter(base::Bind(&HandleHotwordFilesResourceFilter, 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Profile::FromWebUI(web_ui()))); 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::WebUIDataSource::Add(Profile::FromWebUI(web_ui()), source.release()); 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace app_list 99