| Index: chrome/browser/ui/webui/extensions/extension_settings_handler.cc | 
| diff --git a/chrome/browser/ui/webui/extensions/extension_settings_handler.cc b/chrome/browser/ui/webui/extensions/extension_settings_handler.cc | 
| index 80fb6d1b34165ea197db641249d609c643f4dfd3..9a28f0c5a609b5bba9f57a666c6f578a08ee1c9a 100644 | 
| --- a/chrome/browser/ui/webui/extensions/extension_settings_handler.cc | 
| +++ b/chrome/browser/ui/webui/extensions/extension_settings_handler.cc | 
| @@ -50,6 +50,7 @@ | 
| #include "chrome/browser/ui/webui/extensions/extension_basic_info.h" | 
| #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" | 
| #include "chrome/common/chrome_version_info.h" | 
| +#include "chrome/common/extensions/api/developer_private.h" | 
| #include "chrome/common/extensions/features/feature_channel.h" | 
| #include "chrome/common/pref_names.h" | 
| #include "chrome/common/url_constants.h" | 
| @@ -67,8 +68,6 @@ | 
| #include "content/public/browser/web_ui.h" | 
| #include "content/public/browser/web_ui_data_source.h" | 
| #include "extensions/browser/api/device_permissions_manager.h" | 
| -#include "extensions/browser/app_window/app_window.h" | 
| -#include "extensions/browser/app_window/app_window_registry.h" | 
| #include "extensions/browser/blacklist_state.h" | 
| #include "extensions/browser/extension_error.h" | 
| #include "extensions/browser/extension_host.h" | 
| @@ -77,7 +76,6 @@ | 
| #include "extensions/browser/lazy_background_task_queue.h" | 
| #include "extensions/browser/management_policy.h" | 
| #include "extensions/browser/pref_names.h" | 
| -#include "extensions/browser/view_type_utils.h" | 
| #include "extensions/browser/warning_set.h" | 
| #include "extensions/common/constants.h" | 
| #include "extensions/common/extension.h" | 
| @@ -110,18 +108,6 @@ const char kAppsDeveloperToolsExtensionId[] = | 
|  | 
| namespace extensions { | 
|  | 
| -ExtensionPage::ExtensionPage(const GURL& url, | 
| -                             int render_process_id, | 
| -                             int render_view_id, | 
| -                             bool incognito, | 
| -                             bool generated_background_page) | 
| -    : url(url), | 
| -      render_process_id(render_process_id), | 
| -      render_view_id(render_view_id), | 
| -      incognito(incognito), | 
| -      generated_background_page(generated_background_page) { | 
| -} | 
| - | 
| // The install prompt is not necessarily modal (e.g. Mac, Linux Unity). This | 
| // means that the user can navigate while the dialog is up, causing the dialog | 
| // handler to outlive the ExtensionSettingsHandler. That's a problem because the | 
| @@ -218,7 +204,7 @@ void ExtensionSettingsHandler::RegisterProfilePrefs( | 
|  | 
| base::DictionaryValue* ExtensionSettingsHandler::CreateExtensionDetailValue( | 
| const Extension* extension, | 
| -    const std::vector<ExtensionPage>& pages, | 
| +    const InspectableViewsFinder::ViewList& views, | 
| const WarningService* warning_service) { | 
| // The items which are to be written into app_dict are also described in | 
| // chrome/browser/resources/extensions/extension_list.js in @typedef for | 
| @@ -398,25 +384,10 @@ base::DictionaryValue* ExtensionSettingsHandler::CreateExtensionDetailValue( | 
| } | 
|  | 
| // Add views | 
| -  base::ListValue* views = new base::ListValue; | 
| -  for (std::vector<ExtensionPage>::const_iterator iter = pages.begin(); | 
| -       iter != pages.end(); ++iter) { | 
| -    base::DictionaryValue* view_value = new base::DictionaryValue; | 
| -    if (iter->url.scheme() == kExtensionScheme) { | 
| -      // No leading slash. | 
| -      view_value->SetString("path", iter->url.path().substr(1)); | 
| -    } else { | 
| -      // For live pages, use the full URL. | 
| -      view_value->SetString("path", iter->url.spec()); | 
| -    } | 
| -    view_value->SetInteger("renderViewId", iter->render_view_id); | 
| -    view_value->SetInteger("renderProcessId", iter->render_process_id); | 
| -    view_value->SetBoolean("incognito", iter->incognito); | 
| -    view_value->SetBoolean("generatedBackgroundPage", | 
| -                           iter->generated_background_page); | 
| -    views->Append(view_value); | 
| -  } | 
| -  extension_data->Set("views", views); | 
| +  base::ListValue* views_value = new base::ListValue; | 
| +  for (const InspectableViewsFinder::View& view : views) | 
| +    views_value->Append(view->ToValue().release()); | 
| +  extension_data->Set("views", views_value); | 
| ExtensionActionManager* extension_action_manager = | 
| ExtensionActionManager::Get(extension_service_->profile()); | 
| extension_data->SetBoolean( | 
| @@ -904,12 +875,13 @@ void ExtensionSettingsHandler::HandleRequestExtensionsData( | 
|  | 
| ExtensionRegistry* registry = ExtensionRegistry::Get(profile); | 
| const ExtensionSet& enabled_set = registry->enabled_extensions(); | 
| +  InspectableViewsFinder views_finder(profile, deleting_rvh_); | 
| for (ExtensionSet::const_iterator extension = enabled_set.begin(); | 
| extension != enabled_set.end(); ++extension) { | 
| if (ui_util::ShouldDisplayInExtensionSettings(extension->get(), profile)) { | 
| extensions_list->Append(CreateExtensionDetailValue( | 
| extension->get(), | 
| -          GetInspectablePagesForExtension(extension->get(), true), | 
| +          views_finder.GetViewsForExtension(**extension, true), | 
| warnings)); | 
| } | 
| } | 
| @@ -919,18 +891,17 @@ void ExtensionSettingsHandler::HandleRequestExtensionsData( | 
| if (ui_util::ShouldDisplayInExtensionSettings(extension->get(), profile)) { | 
| extensions_list->Append(CreateExtensionDetailValue( | 
| extension->get(), | 
| -          GetInspectablePagesForExtension(extension->get(), false), | 
| +          views_finder.GetViewsForExtension(**extension, false), | 
| warnings)); | 
| } | 
| } | 
| const ExtensionSet& terminated_set = registry->terminated_extensions(); | 
| -  std::vector<ExtensionPage> empty_pages; | 
| for (ExtensionSet::const_iterator extension = terminated_set.begin(); | 
| extension != terminated_set.end(); ++extension) { | 
| if (ui_util::ShouldDisplayInExtensionSettings(extension->get(), profile)) { | 
| extensions_list->Append(CreateExtensionDetailValue( | 
| extension->get(), | 
| -          empty_pages,  // Terminated process has no active pages. | 
| +          InspectableViewsFinder::ViewList(),  // No views for terminated. | 
| warnings)); | 
| } | 
| } | 
| @@ -1211,122 +1182,6 @@ void ExtensionSettingsHandler::MaybeRegisterForNotifications() { | 
| ExtensionManagementFactory::GetForBrowserContext(profile)); | 
| } | 
|  | 
| -std::vector<ExtensionPage> | 
| -ExtensionSettingsHandler::GetInspectablePagesForExtension( | 
| -    const Extension* extension, bool extension_is_enabled) { | 
| -  std::vector<ExtensionPage> result; | 
| - | 
| -  // Get the extension process's active views. | 
| -  extensions::ProcessManager* process_manager = | 
| -      ProcessManager::Get(extension_service_->profile()); | 
| -  GetInspectablePagesForExtensionProcess( | 
| -      extension, | 
| -      process_manager->GetRenderViewHostsForExtension(extension->id()), | 
| -      &result); | 
| - | 
| -  // Get app window views | 
| -  GetAppWindowPagesForExtensionProfile( | 
| -      extension, extension_service_->profile(), &result); | 
| - | 
| -  // Include a link to start the lazy background page, if applicable. | 
| -  if (BackgroundInfo::HasLazyBackgroundPage(extension) && | 
| -      extension_is_enabled && | 
| -      !process_manager->GetBackgroundHostForExtension(extension->id())) { | 
| -    result.push_back(ExtensionPage( | 
| -        BackgroundInfo::GetBackgroundURL(extension), | 
| -        -1, | 
| -        -1, | 
| -        false, | 
| -        BackgroundInfo::HasGeneratedBackgroundPage(extension))); | 
| -  } | 
| - | 
| -  // Repeat for the incognito process, if applicable. Don't try to get | 
| -  // app windows for incognito processes. | 
| -  if (extension_service_->profile()->HasOffTheRecordProfile() && | 
| -      IncognitoInfo::IsSplitMode(extension) && | 
| -      util::IsIncognitoEnabled(extension->id(), | 
| -                               extension_service_->profile())) { | 
| -    extensions::ProcessManager* process_manager = ProcessManager::Get( | 
| -        extension_service_->profile()->GetOffTheRecordProfile()); | 
| -    GetInspectablePagesForExtensionProcess( | 
| -        extension, | 
| -        process_manager->GetRenderViewHostsForExtension(extension->id()), | 
| -        &result); | 
| - | 
| -    if (BackgroundInfo::HasLazyBackgroundPage(extension) && | 
| -        extension_is_enabled && | 
| -        !process_manager->GetBackgroundHostForExtension(extension->id())) { | 
| -      result.push_back(ExtensionPage( | 
| -          BackgroundInfo::GetBackgroundURL(extension), | 
| -          -1, | 
| -          -1, | 
| -          true, | 
| -          BackgroundInfo::HasGeneratedBackgroundPage(extension))); | 
| -    } | 
| -  } | 
| - | 
| -  return result; | 
| -} | 
| - | 
| -void ExtensionSettingsHandler::GetInspectablePagesForExtensionProcess( | 
| -    const Extension* extension, | 
| -    const std::set<RenderViewHost*>& views, | 
| -    std::vector<ExtensionPage>* result) { | 
| -  bool has_generated_background_page = | 
| -      BackgroundInfo::HasGeneratedBackgroundPage(extension); | 
| -  for (std::set<RenderViewHost*>::const_iterator iter = views.begin(); | 
| -       iter != views.end(); ++iter) { | 
| -    RenderViewHost* host = *iter; | 
| -    WebContents* web_contents = WebContents::FromRenderViewHost(host); | 
| -    ViewType host_type = GetViewType(web_contents); | 
| -    if (host == deleting_rvh_ || | 
| -        VIEW_TYPE_EXTENSION_POPUP == host_type || | 
| -        VIEW_TYPE_EXTENSION_DIALOG == host_type) | 
| -      continue; | 
| - | 
| -    GURL url = web_contents->GetURL(); | 
| -    content::RenderProcessHost* process = host->GetProcess(); | 
| -    bool is_background_page = | 
| -        (url == BackgroundInfo::GetBackgroundURL(extension)); | 
| -    result->push_back( | 
| -        ExtensionPage(url, | 
| -                      process->GetID(), | 
| -                      host->GetRoutingID(), | 
| -                      process->GetBrowserContext()->IsOffTheRecord(), | 
| -                      is_background_page && has_generated_background_page)); | 
| -  } | 
| -} | 
| - | 
| -void ExtensionSettingsHandler::GetAppWindowPagesForExtensionProfile( | 
| -    const Extension* extension, | 
| -    Profile* profile, | 
| -    std::vector<ExtensionPage>* result) { | 
| -  AppWindowRegistry* registry = AppWindowRegistry::Get(profile); | 
| -  if (!registry) return; | 
| - | 
| -  const AppWindowRegistry::AppWindowList windows = | 
| -      registry->GetAppWindowsForApp(extension->id()); | 
| - | 
| -  bool has_generated_background_page = | 
| -      BackgroundInfo::HasGeneratedBackgroundPage(extension); | 
| -  for (AppWindowRegistry::const_iterator it = windows.begin(); | 
| -       it != windows.end(); | 
| -       ++it) { | 
| -    WebContents* web_contents = (*it)->web_contents(); | 
| -    RenderViewHost* host = web_contents->GetRenderViewHost(); | 
| -    content::RenderProcessHost* process = host->GetProcess(); | 
| - | 
| -    bool is_background_page = | 
| -        (web_contents->GetURL() == BackgroundInfo::GetBackgroundURL(extension)); | 
| -    result->push_back( | 
| -        ExtensionPage(web_contents->GetURL(), | 
| -                      process->GetID(), | 
| -                      host->GetRoutingID(), | 
| -                      process->GetBrowserContext()->IsOffTheRecord(), | 
| -                      is_background_page && has_generated_background_page)); | 
| -  } | 
| -} | 
| - | 
| void ExtensionSettingsHandler::OnReinstallComplete( | 
| bool success, | 
| const std::string& error, | 
|  |