// Copyright 2014 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 "athena/extensions/athena_app_delegate_base.h" #include "athena/activity/public/activity.h" #include "athena/activity/public/activity_factory.h" #include "athena/env/public/athena_env.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_delegate.h" #include "extensions/common/constants.h" #include "extensions/grit/extensions_browser_resources.h" #include "ui/aura/window.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/geometry/rect.h" namespace athena { namespace { content::WebContents* OpenURLInActivity(content::BrowserContext* context, const content::OpenURLParams& params) { // Force all links to open in a new activity. Activity* activity = ActivityFactory::Get()->CreateWebActivity( context, base::string16(), params.url); Activity::Show(activity); // TODO(oshima): Get the web cotnents from activity. return NULL; } } // namespace // This is a extra step to open a new Activity when a link is simply clicked // on an app activity (which usually replaces the content). class AthenaAppDelegateBase::NewActivityContentsDelegate : public content::WebContentsDelegate { public: NewActivityContentsDelegate() {} virtual ~NewActivityContentsDelegate() {} // content::WebContentsDelegate: virtual content::WebContents* OpenURLFromTab( content::WebContents* source, const content::OpenURLParams& params) override { if (!source) return NULL; return OpenURLInActivity(source->GetBrowserContext(), params); } private: DISALLOW_COPY_AND_ASSIGN(NewActivityContentsDelegate); }; AthenaAppDelegateBase::AthenaAppDelegateBase() : new_window_contents_delegate_(new NewActivityContentsDelegate) { } AthenaAppDelegateBase::~AthenaAppDelegateBase() { if (!terminating_callback_.is_null()) AthenaEnv::Get()->RemoveTerminatingCallback(terminating_callback_); } void AthenaAppDelegateBase::ResizeWebContents( content::WebContents* web_contents, const gfx::Size& size) { aura::Window* window = web_contents->GetNativeView(); window->SetBounds(gfx::Rect(window->bounds().origin(), size)); } content::WebContents* AthenaAppDelegateBase::OpenURLFromTab( content::BrowserContext* context, content::WebContents* source, const content::OpenURLParams& params) { return OpenURLInActivity(context, params); } void AthenaAppDelegateBase::AddNewContents(content::BrowserContext* context, content::WebContents* new_contents, WindowOpenDisposition disposition, const gfx::Rect& initial_pos, bool user_gesture, bool* was_blocked) { new_contents->SetDelegate(new_window_contents_delegate_.get()); } int AthenaAppDelegateBase::PreferredIconSize() { // TODO(oshima): Find out what to use. return extension_misc::EXTENSION_ICON_SMALL; } bool AthenaAppDelegateBase::IsWebContentsVisible( content::WebContents* web_contents) { return web_contents->GetNativeView()->IsVisible(); } void AthenaAppDelegateBase::SetTerminatingCallback( const base::Closure& callback) { if (!terminating_callback_.is_null()) AthenaEnv::Get()->RemoveTerminatingCallback(terminating_callback_); terminating_callback_ = callback; if (!terminating_callback_.is_null()) AthenaEnv::Get()->AddTerminatingCallback(terminating_callback_); } } // namespace athena