tab_helper.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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/tab_helper.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/logging.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/string_util.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_log.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative/rules_registry_service.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative_content/content_rules_registry.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/crx_installer.h" 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/error_console/error_console.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action_manager.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_tab_util.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/favicon_downloader.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/image_loader.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/page_action_controller.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/script_executor.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/webstore_inline_installer.h" 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/extensions/webstore_inline_installer_factory.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_id.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_tab_helper.h" 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/shell_integration.h" 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h" 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/web_applications/web_app_ui.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_applications/web_app.h" 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/extensions/chrome_extension_messages.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_icon_set.h" 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_launch_info.h" 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/icons_handler.h" 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/render_messages.h" 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/url_constants.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/frame_navigate_params.h" 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "extensions/browser/extension_error.h" 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry.h" 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/common/extension_messages.h" 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h" 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "extensions/common/extension_urls.h" 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h" 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "skia/ext/image_operations.h" 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "skia/ext/platform_canvas.h" 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/color_analysis.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DEFINE_WEB_CONTENTS_USER_DATA_KEY(extensions::TabHelper); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::ScriptExecutionObserver::ScriptExecutionObserver( 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabHelper* tab_helper) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : tab_helper_(tab_helper) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper_->AddScriptExecutionObserver(this); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::ScriptExecutionObserver::ScriptExecutionObserver() 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : tab_helper_(NULL) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::ScriptExecutionObserver::~ScriptExecutionObserver() { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tab_helper_) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper_->RemoveScriptExecutionObserver(this); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::map<int, SkBitmap> TabHelper::ConstrainBitmapsToSizes( 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<SkBitmap>& bitmaps, 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::set<int>& sizes) { 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<int, SkBitmap> output_bitmaps; 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<int, SkBitmap> ordered_bitmaps; 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::vector<SkBitmap>::const_iterator it = bitmaps.begin(); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != bitmaps.end(); ++it) { 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(it->width() == it->height()); 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ordered_bitmaps[it->width()] = *it; 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<int>::const_iterator sizes_it = sizes.begin(); 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<int, SkBitmap>::const_iterator bitmaps_it = ordered_bitmaps.begin(); 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) while (sizes_it != sizes.end() && bitmaps_it != ordered_bitmaps.end()) { 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int size = *sizes_it; 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Find the closest not-smaller bitmap. 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bitmaps_it = ordered_bitmaps.lower_bound(size); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++sizes_it; 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Ensure the bitmap is valid and smaller than the next allowed size. 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (bitmaps_it != ordered_bitmaps.end() && 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (sizes_it == sizes.end() || bitmaps_it->second.width() < *sizes_it)) { 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Resize the bitmap if it does not exactly match the desired size. 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) output_bitmaps[size] = bitmaps_it->second.width() == size 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ? bitmaps_it->second 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : skia::ImageOperations::Resize( 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bitmaps_it->second, skia::ImageOperations::RESIZE_LANCZOS3, 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size, size); 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return output_bitmaps; 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TabHelper::GenerateContainerIcon(std::map<int, SkBitmap>* bitmaps, 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int output_size) { 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<int, SkBitmap>::const_iterator it = 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bitmaps->lower_bound(output_size); 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Do nothing if there is no icon smaller than the desired size or there is 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // already an icon of |output_size|. 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (it == bitmaps->begin() || bitmaps->count(output_size)) 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) --it; 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This is the biggest icon smaller than |output_size|. 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const SkBitmap& base_icon = it->second; 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const size_t kBorderRadius = 5; 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const size_t kColorStripHeight = 3; 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const SkColor kBorderColor = 0xFFD5D5D5; 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const SkColor kBackgroundColor = 0xFFFFFFFF; 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Create a separate canvas for the color strip. 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkBitmap color_strip_bitmap; 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) color_strip_bitmap.allocN32Pixels(output_size, output_size); 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkCanvas color_strip_canvas(color_strip_bitmap); 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) color_strip_canvas.clear(SK_ColorTRANSPARENT); 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Draw a rounded rect of the |base_icon|'s dominant color. 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SkPaint color_strip_paint; 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) color_strip_paint.setFlags(SkPaint::kAntiAlias_Flag); 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) color_strip_paint.setColor( 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) color_utils::CalculateKMeanColorOfBitmap(base_icon)); 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) color_strip_canvas.drawRoundRect(SkRect::MakeWH(output_size, output_size), 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kBorderRadius, 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kBorderRadius, 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) color_strip_paint); 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Erase the top of the rounded rect to leave a color strip. 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SkPaint clear_paint; 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) clear_paint.setColor(SK_ColorTRANSPARENT); 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) clear_paint.setXfermodeMode(SkXfermode::kSrc_Mode); 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) color_strip_canvas.drawRect( 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SkRect::MakeWH(output_size, output_size - kColorStripHeight), 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) clear_paint); 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Draw each element to an output canvas. 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkBitmap generated_icon; 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) generated_icon.allocN32Pixels(output_size, output_size); 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkCanvas generated_icon_canvas(generated_icon); 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) generated_icon_canvas.clear(SK_ColorTRANSPARENT); 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Draw the background. 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SkPaint background_paint; 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) background_paint.setColor(kBackgroundColor); 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) background_paint.setFlags(SkPaint::kAntiAlias_Flag); 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) generated_icon_canvas.drawRoundRect(SkRect::MakeWH(output_size, output_size), 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kBorderRadius, 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kBorderRadius, 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) background_paint); 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Draw the color strip. 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) generated_icon_canvas.drawBitmap(color_strip_bitmap, 0, 0); 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Draw the border. 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SkPaint border_paint; 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) border_paint.setColor(kBorderColor); 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) border_paint.setStyle(SkPaint::kStroke_Style); 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) border_paint.setFlags(SkPaint::kAntiAlias_Flag); 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) generated_icon_canvas.drawRoundRect(SkRect::MakeWH(output_size, output_size), 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kBorderRadius, 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kBorderRadius, 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) border_paint); 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Draw the centered base icon to the output canvas. 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) generated_icon_canvas.drawBitmap(base_icon, 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) (output_size - base_icon.width()) / 2, 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) (output_size - base_icon.height()) / 2); 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) generated_icon.deepCopyTo(&(*bitmaps)[output_size]); 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::TabHelper(content::WebContents* web_contents) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : content::WebContentsObserver(web_contents), 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_(NULL), 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_function_dispatcher_( 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext()), this), 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_web_app_action_(NONE), 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) script_executor_(new ScriptExecutor(web_contents, 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &script_execution_observers_)), 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) location_bar_controller_(new PageActionController(web_contents)), 2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) image_loader_ptr_factory_(this), 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) webstore_inline_installer_factory_(new WebstoreInlineInstallerFactory()) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The ActiveTabPermissionManager requires a session ID; ensure this 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents has one. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper::CreateForWebContents(web_contents); 22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (web_contents->GetRenderViewHost()) 22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetTabId(web_contents->GetRenderViewHost()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_tab_permission_granter_.reset(new ActiveTabPermissionGranter( 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionID::IdForTab(web_contents), 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext()))); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If more classes need to listen to global content script activity, then 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a separate routing class with an observer interface should be written. 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_ = Profile::FromBrowserContext(web_contents->GetBrowserContext()); 23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddScriptExecutionObserver(ActivityLog::GetInstance(profile_)); 23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_contents->GetController())); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Add(this, 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::NOTIFICATION_CRX_INSTALLER_DONE, 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::Source<CrxInstaller>(NULL)); 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) registrar_.Add(this, 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::NOTIFICATION_EXTENSION_INSTALL_ERROR, 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::~TabHelper() { 25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveScriptExecutionObserver(ActivityLog::GetInstance(profile_)); 25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::CreateApplicationShortcuts() { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CanCreateApplicationShortcuts()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetController().GetLastCommittedEntry(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_web_app_action_ = CREATE_SHORTCUT; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start fetching web app info for CreateApplicationShortcut dialog and show 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the dialog when the data is available in OnDidGetApplicationInfo. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetApplicationInfo(entry->GetPageID()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TabHelper::CreateHostedAppFromWebContents() { 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(CanCreateApplicationShortcuts()); 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigationEntry* entry = 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_contents()->GetController().GetLastCommittedEntry(); 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!entry) 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pending_web_app_action_ = CREATE_HOSTED_APP; 283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Start fetching web app info for CreateApplicationShortcut dialog and show 285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the dialog when the data is available in OnDidGetApplicationInfo. 286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetApplicationInfo(entry->GetPageID()); 287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabHelper::CanCreateApplicationShortcuts() const { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_app::IsValidUrl(web_contents()->GetURL()) && 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_web_app_action_ == NONE; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetExtensionApp(const Extension* extension) { 299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!extension || AppLaunchInfo::GetFullLaunchURL(extension).is_valid()); 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extension_app_ == extension) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_ = extension; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtensionAppIcon(extension_app_); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<TabHelper>(this), 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetExtensionAppById(const std::string& extension_app_id) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetExtension(extension_app_id); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExtensionApp(extension); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetExtensionAppIconById(const std::string& extension_app_id) { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetExtension(extension_app_id); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtensionAppIcon(extension); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap* TabHelper::GetExtensionAppIcon() { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_app_icon_.empty()) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &extension_app_icon_; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::RenderViewCreated(RenderViewHost* render_view_host) { 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetTabId(render_view_host); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::DidNavigateMainFrame( 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::LoadCommittedDetails& details, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::FrameNavigateParams& params) { 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (ExtensionSystem::Get(profile_)->extension_service() && 341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)) { 342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)->content_rules_registry()-> 343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DidNavigateMainFrame(web_contents(), details, params); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(ENABLE_EXTENSIONS) 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* service = profile->GetExtensionService(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switches::kEnableStreamlinedHostedApps)) { 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_ANDROID) 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (browser && browser->is_app()) { 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetExtensionApp(service->GetInstalledExtension( 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_app::GetExtensionIdFromApplicationName(browser->app_name()))); 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateExtensionAppIcon(service->GetInstalledExtensionByUrl(params.url)); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateExtensionAppIcon(service->GetInstalledExtensionByUrl(params.url)); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (details.is_in_page) 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionActionManager* extension_action_manager = 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionActionManager::Get(profile); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ExtensionSet::const_iterator it = service->extensions()->begin(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != service->extensions()->end(); ++it) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionAction* browser_action = 3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension_action_manager->GetBrowserAction(*it->get()); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_action) { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_action->ClearAllValuesForTab(SessionID::IdForTab(web_contents())); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<ExtensionAction>(browser_action), 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabHelper::OnMessageReceived(const IPC::Message& message) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(TabHelper, message) 390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeExtensionHostMsg_DidGetApplicationInfo, 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidGetApplicationInfo) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_InlineWebstoreInstall, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnInlineWebstoreInstall) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_GetAppInstallState, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetAppInstallState); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_ContentScriptsExecuting, 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentScriptsExecuting) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_OnWatchedPageChange, 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnWatchedPageChange) 40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DetailedConsoleMessageAdded, 40258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OnDetailedConsoleMessageAdded) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TabHelper::CreateHostedApp() { 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Add urls from the WebApplicationInfo. 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<GURL> web_app_info_icon_urls; 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::vector<WebApplicationInfo::IconInfo>::const_iterator it = 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_app_info_.icons.begin(); 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != web_app_info_.icons.end(); ++it) { 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (it->url.is_valid()) 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_app_info_icon_urls.push_back(it->url); 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) favicon_downloader_.reset( 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new FaviconDownloader(web_contents(), 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_app_info_icon_urls, 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&TabHelper::FinishCreateHostedApp, 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this)))); 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) favicon_downloader_->Start(); 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(calamity): Move hosted app generation into its own file. 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TabHelper::FinishCreateHostedApp( 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool success, 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::map<GURL, std::vector<SkBitmap> >& bitmaps) { 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The tab has navigated away during the icon download. Cancel the hosted app 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // creation. 4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!success) { 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) favicon_downloader_.reset(); 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (web_app_info_.app_url.is_empty()) 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_app_info_.app_url = web_contents()->GetURL(); 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (web_app_info_.title.empty()) 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_app_info_.title = web_contents()->GetTitle(); 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (web_app_info_.title.empty()) 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_app_info_.title = base::UTF8ToUTF16(web_app_info_.app_url.spec()); 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Add the downloaded icons. Extensions only allow certain icon sizes. First 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // populate icons that match the allowed sizes exactly and then downscale 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // remaining icons to the closest allowed size that doesn't yet have an icon. 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<int> allowed_sizes( 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::kExtensionIconSizes, 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::kExtensionIconSizes + 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::kNumExtensionIconSizes); 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<SkBitmap> downloaded_icons; 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (FaviconDownloader::FaviconMap::const_iterator map_it = bitmaps.begin(); 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) map_it != bitmaps.end(); ++map_it) { 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::vector<SkBitmap>::const_iterator bitmap_it = 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) map_it->second.begin(); 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bitmap_it != map_it->second.end(); ++bitmap_it) { 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (bitmap_it->empty() || bitmap_it->width() != bitmap_it->height()) 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) continue; 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) downloaded_icons.push_back(*bitmap_it); 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If there are icons that don't match the accepted icon sizes, find the 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // closest bigger icon to the accepted sizes and resize the icon to it. An 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // icon will be resized and used for at most one size. 4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<int, SkBitmap> resized_bitmaps( 4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TabHelper::ConstrainBitmapsToSizes(downloaded_icons, 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) allowed_sizes)); 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Generate container icons from smaller icons. 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int kIconSizesToGenerate[] = { 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::EXTENSION_ICON_SMALL, 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::EXTENSION_ICON_MEDIUM, 4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::set<int> generate_sizes( 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kIconSizesToGenerate, 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kIconSizesToGenerate + arraysize(kIconSizesToGenerate)); 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only generate icons if larger icons don't exist. This means the app 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // launcher and the taskbar will do their best downsizing large icons and 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // these container icons are only generated as a last resort against upscaling 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // a smaller icon. 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (resized_bitmaps.lower_bound(*generate_sizes.rbegin()) == 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resized_bitmaps.end()) { 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Generate these from biggest to smallest so we don't end up with 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // concentric container icons. 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::set<int>::const_reverse_iterator it = generate_sizes.rbegin(); 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != generate_sizes.rend(); ++it) { 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TabHelper::GenerateContainerIcon(&resized_bitmaps, *it); 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Populate a the icon data into the WebApplicationInfo we are using to 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // install the bookmark app. 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::map<int, SkBitmap>::const_iterator resized_bitmaps_it = 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resized_bitmaps.begin(); 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resized_bitmaps_it != resized_bitmaps.end(); ++resized_bitmaps_it) { 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebApplicationInfo::IconInfo icon_info; 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) icon_info.data = resized_bitmaps_it->second; 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) icon_info.width = icon_info.data.width(); 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) icon_info.height = icon_info.data.height(); 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_app_info_.icons.push_back(icon_info); 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Install the app. 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* profile = 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<extensions::CrxInstaller> installer( 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::CrxInstaller::CreateSilent(profile->GetExtensionService())); 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) installer->set_error_on_unsupported_requirements(true); 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) installer->InstallWebApp(web_app_info_); 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) favicon_downloader_.reset(); 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::DidCloneToNewWebContents(WebContents* old_web_contents, 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_web_contents) { 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the WebContents that this is attached to is cloned, give the new clone 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a TabHelper and copy state over. 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateForWebContents(new_web_contents); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabHelper* new_helper = FromWebContents(new_web_contents); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_helper->SetExtensionApp(extension_app()); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_helper->extension_app_icon_ = extension_app_icon_; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnDidGetApplicationInfo(int32 page_id, 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebApplicationInfo& info) { 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Android does not implement BrowserWindow. 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) && !defined(OS_ANDROID) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_app_info_ = info; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetController().GetLastCommittedEntry(); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry || (entry->GetPageID() != page_id)) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (pending_web_app_action_) { 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CREATE_SHORTCUT: { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ShowCreateWebAppShortcutsDialog( 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetView()->GetTopLevelNativeWindow(), 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case CREATE_HOSTED_APP: { 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateHostedApp(); 548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) break; 549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UPDATE_SHORTCUT: { 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_app::UpdateShortcutForTabContents(web_contents()); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The hosted app action will be cleared once the installation completes or 560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // fails. 561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (pending_web_app_action_ != CREATE_HOSTED_APP) 562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pending_web_app_action_ = NONE; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnInlineWebstoreInstall( 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int install_id, 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int return_route_id, 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& webstore_item_id, 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& requestor_url) { 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebstoreStandaloneInstaller::Callback callback = 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabHelper::OnInlineInstallComplete, base::Unretained(this), 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_id, return_route_id); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<WebstoreInlineInstaller> installer( 5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) webstore_inline_installer_factory_->CreateInstaller( 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents(), 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webstore_item_id, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requestor_url, 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback)); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer->BeginInstall(); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnGetAppInstallState(const GURL& requestor_url, 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int return_route_id, 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int callback_id) { 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionRegistry* registry = 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionRegistry::Get(web_contents()->GetBrowserContext()); 5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ExtensionSet& extensions = registry->enabled_extensions(); 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ExtensionSet& disabled_extensions = registry->disabled_extensions(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string state; 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extensions.GetHostedAppByURL(requestor_url)) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = extension_misc::kAppStateInstalled; 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (disabled_extensions.GetHostedAppByURL(requestor_url)) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = extension_misc::kAppStateDisabled; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = extension_misc::kAppStateNotInstalled; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ExtensionMsg_GetAppInstallStateResponse( 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return_route_id, state, callback_id)); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnRequest(const ExtensionHostMsg_Request_Params& request) { 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_dispatcher_.Dispatch(request, 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetRenderViewHost()); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnContentScriptsExecuting( 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScriptExecutionObserver::ExecutingScriptsMap& executing_scripts_map, 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 on_page_id, 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& on_url) { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(ScriptExecutionObserver, script_execution_observers_, 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnScriptsExecuted(web_contents(), 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) executing_scripts_map, 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_page_id, 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_url)); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TabHelper::OnWatchedPageChange( 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& css_selectors) { 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (ExtensionSystem::Get(profile_)->extension_service() && 623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)) { 624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)->content_rules_registry()->Apply( 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents(), css_selectors); 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(ENABLE_EXTENSIONS) 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TabHelper::OnDetailedConsoleMessageAdded( 63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::string16& message, 63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::string16& source, 63358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const StackTrace& stack_trace, 63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int32 severity_level) { 63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (IsSourceFromAnExtension(source)) { 6360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); 63758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ErrorConsole::Get(profile_)->ReportError( 63858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<ExtensionError>(new RuntimeError( 639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extension_app_ ? extension_app_->id() : std::string(), 64058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) profile_->IsOffTheRecord(), 64158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) source, 64258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) message, 64358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) stack_trace, 64458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) web_contents() ? 64558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) web_contents()->GetLastCommittedURL() : GURL::EmptyGURL(), 6460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) static_cast<logging::LogSeverity>(severity_level), 6470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) rvh->GetRoutingID(), 6480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) rvh->GetProcess()->GetID()))); 64958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 65058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 65158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Extension* TabHelper::GetExtension(const std::string& extension_app_id) { 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_app_id.empty()) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* extension_service = profile->GetExtensionService(); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension_service || !extension_service->is_ready()) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_service->GetExtensionById(extension_app_id, false); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::UpdateExtensionAppIcon(const Extension* extension) { 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_icon_.reset(); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure previously enqueued callbacks are ignored. 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_loader_ptr_factory_.InvalidateWeakPtrs(); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enqueue OnImageLoaded callback. 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) { 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ImageLoader* loader = extensions::ImageLoader::Get(profile); 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loader->LoadImageAsync( 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension, 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IconsInfo::GetIconResource(extension, 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::EXTENSION_ICON_SMALL, 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionIconSet::MATCH_BIGGER), 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(extension_misc::EXTENSION_ICON_SMALL, 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::EXTENSION_ICON_SMALL), 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&TabHelper::OnImageLoaded, 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_loader_ptr_factory_.GetWeakPtr())); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetAppIcon(const SkBitmap& app_icon) { 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_icon_ = app_icon; 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->NotifyNavigationStateChanged(content::INVALIDATE_TYPE_TITLE); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TabHelper::SetWebstoreInlineInstallerFactoryForTests( 6954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebstoreInlineInstallerFactory* factory) { 6964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) webstore_inline_installer_factory_.reset(factory); 6974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 6984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TabHelper::OnImageLoaded(const gfx::Image& image) { 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!image.IsEmpty()) { 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_icon_ = *image.ToSkBitmap(); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->NotifyNavigationStateChanged(content::INVALIDATE_TYPE_TAB); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowController* TabHelper::GetExtensionWindowController() const { 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ExtensionTabUtil::GetWindowControllerOfTab(web_contents()); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnInlineInstallComplete(int install_id, 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int return_route_id, 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& error) { 7147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Send(new ExtensionMsg_InlineWebstoreInstallResponse( 7157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return_route_id, install_id, success, success ? std::string() : error)); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* TabHelper::GetAssociatedWebContents() const { 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_contents(); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::GetApplicationInfo(int32 page_id) { 723a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new ChromeExtensionMsg_GetApplicationInfo(routing_id(), page_id)); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::Observe(int type, 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (type) { 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case content::NOTIFICATION_LOAD_STOP: { 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NavigationController& controller = 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *content::Source<NavigationController>(source).ptr(); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(controller.GetWebContents(), web_contents()); 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_web_app_action_ == UPDATE_SHORTCUT) { 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Schedule a shortcut update when web application info is available if 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // last committed entry is not NULL. Last committed entry could be NULL 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when an interstitial page is injected (e.g. bad https certificate, 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // malware site etc). When this happens, we abort the shortcut update. 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationEntry* entry = controller.GetLastCommittedEntry(); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (entry) 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetApplicationInfo(entry->GetPageID()); 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_web_app_action_ = NONE; 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case chrome::NOTIFICATION_CRX_INSTALLER_DONE: { 749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (pending_web_app_action_ != CREATE_HOSTED_APP) 750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pending_web_app_action_ = NONE; 753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const Extension* extension = 755f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::Details<const Extension>(details).ptr(); 7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!extension || 7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppLaunchInfo::GetLaunchWebURL(extension) != web_app_info_.app_url) 758f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 759f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChromeLauncherController::instance()->PinAppWithID(extension->id()); 7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 764f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Android does not implement browser_finder.cc. 765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(OS_ANDROID) 766f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Browser* browser = 767f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::FindBrowserWithWebContents(web_contents()); 768f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (browser) { 7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->window()->ShowBookmarkAppBubble(web_app_info_, 7705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension->id()); 771f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 774f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_INSTALL_ERROR: { 775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (pending_web_app_action_ == CREATE_HOSTED_APP) 776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pending_web_app_action_ = NONE; 777f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) break; 778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TabHelper::SetTabId(RenderViewHost* render_view_host) { 78390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) render_view_host->Send( 78490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new ExtensionMsg_SetTabId(render_view_host->GetRoutingID(), 78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SessionID::IdForTab(web_contents()))); 78690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 78790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 789