| Index: chrome/browser/ui/app_list/app_list_view_delegate.cc
 | 
| diff --git a/chrome/browser/ui/app_list/app_list_view_delegate.cc b/chrome/browser/ui/app_list/app_list_view_delegate.cc
 | 
| index 25180a0c68ca0417c0f481618745974ab0a27048..7e7a94b65efe7c864bc1d6c9f2d30816f95e35f6 100644
 | 
| --- a/chrome/browser/ui/app_list/app_list_view_delegate.cc
 | 
| +++ b/chrome/browser/ui/app_list/app_list_view_delegate.cc
 | 
| @@ -103,6 +103,29 @@ void PopulateUsers(const ProfileInfoCache& profile_info,
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +// Gets a list of URLs of the custom launcher pages to show in the launcher.
 | 
| +// Returns a URL for each installed launcher page. If --custom-launcher-page is
 | 
| +// specified and valid, also includes that URL.
 | 
| +void GetCustomLauncherPageUrls(std::vector<GURL>* urls) {
 | 
| +  // First, check the command line.
 | 
| +  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
 | 
| +  if (app_list::switches::IsExperimentalAppListEnabled() &&
 | 
| +      command_line->HasSwitch(switches::kCustomLauncherPage)) {
 | 
| +    GURL custom_launcher_page_url(
 | 
| +        command_line->GetSwitchValueASCII(switches::kCustomLauncherPage));
 | 
| +
 | 
| +    if (custom_launcher_page_url.SchemeIs(extensions::kExtensionScheme)) {
 | 
| +      urls->push_back(custom_launcher_page_url);
 | 
| +    } else {
 | 
| +      LOG(ERROR) << "Invalid custom launcher page URL: "
 | 
| +                 << custom_launcher_page_url.possibly_invalid_spec();
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  // TODO(mgiuca): Search the list of installed extensions and add any with a
 | 
| +  // 'launcher_page' attribute in its manifest.
 | 
| +}
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  AppListViewDelegate::AppListViewDelegate(Profile* profile,
 | 
| @@ -148,23 +171,18 @@ AppListViewDelegate::AppListViewDelegate(Profile* profile,
 | 
|    if (service)
 | 
|      service->AddObserver(this);
 | 
|  
 | 
| -  // Set up the custom launcher page. There is currently only a single custom
 | 
| -  // page allowed, which is specified as a command-line flag. In the future,
 | 
| -  // arbitrary extensions may be able to specify their own custom pages.
 | 
| -  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
 | 
| -  if (app_list::switches::IsExperimentalAppListEnabled() &&
 | 
| -      command_line->HasSwitch(switches::kCustomLauncherPage)) {
 | 
| -    GURL custom_launcher_page_url(
 | 
| -        command_line->GetSwitchValueASCII(switches::kCustomLauncherPage));
 | 
| -    if (!custom_launcher_page_url.SchemeIs(extensions::kExtensionScheme)) {
 | 
| -      LOG(ERROR) << "Invalid custom launcher page URL: "
 | 
| -                 << custom_launcher_page_url.possibly_invalid_spec();
 | 
| -    } else {
 | 
| -      std::string extension_id = custom_launcher_page_url.host();
 | 
| -      custom_page_contents_.reset(new apps::CustomLauncherPageContents(
 | 
| -          scoped_ptr<apps::AppDelegate>(new ChromeAppDelegate), extension_id));
 | 
| -      custom_page_contents_->Initialize(profile, custom_launcher_page_url);
 | 
| -    }
 | 
| +  // Set up the custom launcher pages.
 | 
| +  std::vector<GURL> custom_launcher_page_urls;
 | 
| +  GetCustomLauncherPageUrls(&custom_launcher_page_urls);
 | 
| +  for (std::vector<GURL>::const_iterator it = custom_launcher_page_urls.begin();
 | 
| +       it != custom_launcher_page_urls.end();
 | 
| +       ++it) {
 | 
| +    std::string extension_id = it->host();
 | 
| +    apps::CustomLauncherPageContents* page_contents =
 | 
| +        new apps::CustomLauncherPageContents(
 | 
| +            scoped_ptr<apps::AppDelegate>(new ChromeAppDelegate), extension_id);
 | 
| +    page_contents->Initialize(profile, *it);
 | 
| +    custom_page_contents_.push_back(page_contents);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -475,19 +493,25 @@ views::View* AppListViewDelegate::CreateStartPageWebView(
 | 
|    return web_view;
 | 
|  }
 | 
|  
 | 
| -views::View* AppListViewDelegate::CreateCustomPageWebView(
 | 
| +std::vector<views::View*> AppListViewDelegate::CreateCustomPageWebViews(
 | 
|      const gfx::Size& size) {
 | 
| -  if (!custom_page_contents_)
 | 
| -    return NULL;
 | 
| +  std::vector<views::View*> web_views;
 | 
| +
 | 
| +  for (ScopedVector<apps::CustomLauncherPageContents>::const_iterator it =
 | 
| +           custom_page_contents_.begin();
 | 
| +       it != custom_page_contents_.end();
 | 
| +       ++it) {
 | 
| +    content::WebContents* web_contents = (*it)->web_contents();
 | 
| +    // TODO(mgiuca): DCHECK_EQ(profile_, web_contents->GetBrowserContext())
 | 
| +    // after http://crbug.com/392763 resolved.
 | 
| +    views::WebView* web_view =
 | 
| +        new views::WebView(web_contents->GetBrowserContext());
 | 
| +    web_view->SetPreferredSize(size);
 | 
| +    web_view->SetWebContents(web_contents);
 | 
| +    web_views.push_back(web_view);
 | 
| +  }
 | 
|  
 | 
| -  content::WebContents* web_contents = custom_page_contents_->web_contents();
 | 
| -  // TODO(mgiuca): DCHECK_EQ(profile_, web_contents->GetBrowserContext()) after
 | 
| -  // http://crbug.com/392763 resolved.
 | 
| -  views::WebView* web_view =
 | 
| -      new views::WebView(web_contents->GetBrowserContext());
 | 
| -  web_view->SetPreferredSize(size);
 | 
| -  web_view->SetWebContents(web_contents);
 | 
| -  return web_view;
 | 
| +  return web_views;
 | 
|  }
 | 
|  #endif
 | 
|  
 | 
| 
 |