| Index: chrome/browser/views/notifications/balloon_view_host.cc
 | 
| ===================================================================
 | 
| --- chrome/browser/views/notifications/balloon_view_host.cc	(revision 0)
 | 
| +++ chrome/browser/views/notifications/balloon_view_host.cc	(revision 0)
 | 
| @@ -0,0 +1,107 @@
 | 
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#include "chrome/browser/views/notifications/balloon_view_host.h"
 | 
| +
 | 
| +#include "base/string_util.h"
 | 
| +#include "chrome/browser/browser_list.h"
 | 
| +#include "chrome/browser/notifications/balloon.h"
 | 
| +#include "chrome/browser/notifications/notification.h"
 | 
| +#include "chrome/browser/profile.h"
 | 
| +#include "chrome/browser/renderer_host/render_view_host.h"
 | 
| +#include "chrome/browser/renderer_host/render_widget_host_view.h"
 | 
| +#if defined(OS_WIN)
 | 
| +#include "chrome/browser/renderer_host/render_widget_host_view_win.h"
 | 
| +#endif
 | 
| +#include "chrome/browser/renderer_host/site_instance.h"
 | 
| +#include "chrome/common/notification_service.h"
 | 
| +#include "chrome/common/notification_type.h"
 | 
| +#include "chrome/common/renderer_preferences.h"
 | 
| +#include "views/widget/widget.h"
 | 
| +#include "views/widget/widget_win.h"
 | 
| +
 | 
| +BalloonViewHost::BalloonViewHost(Balloon* balloon)
 | 
| +    : balloon_(balloon),
 | 
| +      site_instance_(SiteInstance::CreateSiteInstance(balloon->profile())),
 | 
| +      render_view_host_(NULL),
 | 
| +      should_notify_on_disconnect_(false),
 | 
| +      initialized_(false) {
 | 
| +  DCHECK(balloon_);
 | 
| +}
 | 
| +
 | 
| +void BalloonViewHost::Shutdown() {
 | 
| +  if (render_view_host_) {
 | 
| +    render_view_host_->Shutdown();
 | 
| +    render_view_host_ = NULL;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +RendererPreferences BalloonViewHost::GetRendererPrefs() const {
 | 
| +  // We want links (a.k.a. top_level_requests) to be forwarded to the browser so
 | 
| +  // that we can open them in a new tab rather than in the balloon.
 | 
| +  RendererPreferences prefs = RendererPreferences();
 | 
| +  prefs.browser_handles_top_level_requests = true;
 | 
| +  return prefs;
 | 
| +}
 | 
| +
 | 
| +void BalloonViewHost::RequestOpenURL(const GURL& url,
 | 
| +                                     const GURL& referrer,
 | 
| +                                     WindowOpenDisposition disposition) {
 | 
| +  // Always open a link triggered within the notification balloon in a new tab.
 | 
| +  BrowserList::GetLastActive()->AddTabWithURL(url, referrer,
 | 
| +      PageTransition::LINK, true, 0, 0, GetSiteInstance());
 | 
| +}
 | 
| +
 | 
| +void BalloonViewHost::RendererReady(RenderViewHost* /* render_view_host */) {
 | 
| +  should_notify_on_disconnect_ = true;
 | 
| +  NotificationService::current()->Notify(
 | 
| +      NotificationType::NOTIFY_BALLOON_CONNECTED,
 | 
| +      Source<Balloon>(balloon_), NotificationService::NoDetails());
 | 
| +}
 | 
| +
 | 
| +void BalloonViewHost::RendererGone(RenderViewHost* /* render_view_host */) {
 | 
| +  if (!should_notify_on_disconnect_)
 | 
| +    return;
 | 
| +
 | 
| +  should_notify_on_disconnect_ = false;
 | 
| +  NotificationService::current()->Notify(
 | 
| +      NotificationType::NOTIFY_BALLOON_DISCONNECTED,
 | 
| +      Source<Balloon>(balloon_), NotificationService::NoDetails());
 | 
| +}
 | 
| +
 | 
| +void BalloonViewHost::Init(gfx::NativeView parent_hwnd) {
 | 
| +  DCHECK(!render_view_host_) << "BalloonViewHost already initialized.";
 | 
| +  RenderViewHost* rvh = new RenderViewHost(site_instance_.get(),
 | 
| +                                           this, MSG_ROUTING_NONE);
 | 
| +  render_view_host_ = rvh;
 | 
| +
 | 
| +  // Pointer is owned by the RVH.
 | 
| +  RenderWidgetHostView* view = RenderWidgetHostView::CreateViewForWidget(rvh);
 | 
| +  rvh->set_view(view);
 | 
| +
 | 
| +  // TODO(johnnyg): http://crbug.com/23954.  Need a cross-platform solution.
 | 
| +#if defined(OS_WIN)
 | 
| +  RenderWidgetHostViewWin* view_win =
 | 
| +      static_cast<RenderWidgetHostViewWin*>(view);
 | 
| +
 | 
| +  // Create the HWND.
 | 
| +  HWND hwnd = view_win->Create(parent_hwnd);
 | 
| +  view_win->ShowWindow(SW_SHOW);
 | 
| +  Attach(hwnd);
 | 
| +#else
 | 
| +  NOTIMPLEMENTED();
 | 
| +#endif
 | 
| +
 | 
| +  // Start up the renderer and point it at the balloon contents URL.
 | 
| +  rvh->CreateRenderView();
 | 
| +  rvh->NavigateToURL(balloon_->notification().content_url());
 | 
| +  initialized_ = true;
 | 
| +}
 | 
| +
 | 
| +void BalloonViewHost::ViewHierarchyChanged(bool is_add, views::View* parent,
 | 
| +                                           views::View* child) {
 | 
| +  NativeViewHost::ViewHierarchyChanged(is_add, parent, child);
 | 
| +  if (is_add && GetWidget() && !initialized_)
 | 
| +    Init(GetWidget()->GetNativeView());
 | 
| +}
 | 
| 
 |