1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "athena/extensions/athena_app_delegate_base.h" 6 7 #include "athena/activity/public/activity.h" 8 #include "athena/activity/public/activity_factory.h" 9 #include "athena/env/public/athena_env.h" 10 #include "content/public/browser/web_contents.h" 11 #include "content/public/browser/web_contents_delegate.h" 12 #include "extensions/common/constants.h" 13 #include "extensions/grit/extensions_browser_resources.h" 14 #include "ui/aura/window.h" 15 #include "ui/base/resource/resource_bundle.h" 16 #include "ui/gfx/geometry/rect.h" 17 18 namespace athena { 19 namespace { 20 21 content::WebContents* OpenURLInActivity(content::BrowserContext* context, 22 const content::OpenURLParams& params) { 23 // Force all links to open in a new activity. 24 Activity* activity = ActivityFactory::Get()->CreateWebActivity( 25 context, base::string16(), params.url); 26 Activity::Show(activity); 27 // TODO(oshima): Get the web cotnents from activity. 28 return NULL; 29 } 30 31 } // namespace 32 33 // This is a extra step to open a new Activity when a link is simply clicked 34 // on an app activity (which usually replaces the content). 35 class AthenaAppDelegateBase::NewActivityContentsDelegate 36 : public content::WebContentsDelegate { 37 public: 38 NewActivityContentsDelegate() {} 39 virtual ~NewActivityContentsDelegate() {} 40 41 // content::WebContentsDelegate: 42 virtual content::WebContents* OpenURLFromTab( 43 content::WebContents* source, 44 const content::OpenURLParams& params) OVERRIDE { 45 if (!source) 46 return NULL; 47 return OpenURLInActivity(source->GetBrowserContext(), params); 48 } 49 50 private: 51 DISALLOW_COPY_AND_ASSIGN(NewActivityContentsDelegate); 52 }; 53 54 AthenaAppDelegateBase::AthenaAppDelegateBase() 55 : new_window_contents_delegate_(new NewActivityContentsDelegate) { 56 } 57 58 AthenaAppDelegateBase::~AthenaAppDelegateBase() { 59 if (!terminating_callback_.is_null()) 60 AthenaEnv::Get()->RemoveTerminatingCallback(terminating_callback_); 61 } 62 63 void AthenaAppDelegateBase::ResizeWebContents( 64 content::WebContents* web_contents, 65 const gfx::Size& size) { 66 aura::Window* window = web_contents->GetNativeView(); 67 window->SetBounds(gfx::Rect(window->bounds().origin(), size)); 68 } 69 70 content::WebContents* AthenaAppDelegateBase::OpenURLFromTab( 71 content::BrowserContext* context, 72 content::WebContents* source, 73 const content::OpenURLParams& params) { 74 return OpenURLInActivity(context, params); 75 } 76 77 void AthenaAppDelegateBase::AddNewContents(content::BrowserContext* context, 78 content::WebContents* new_contents, 79 WindowOpenDisposition disposition, 80 const gfx::Rect& initial_pos, 81 bool user_gesture, 82 bool* was_blocked) { 83 new_contents->SetDelegate(new_window_contents_delegate_.get()); 84 } 85 86 int AthenaAppDelegateBase::PreferredIconSize() { 87 // TODO(oshima): Find out what to use. 88 return extension_misc::EXTENSION_ICON_SMALL; 89 } 90 91 bool AthenaAppDelegateBase::IsWebContentsVisible( 92 content::WebContents* web_contents) { 93 return web_contents->GetNativeView()->IsVisible(); 94 } 95 96 void AthenaAppDelegateBase::SetTerminatingCallback( 97 const base::Closure& callback) { 98 if (!terminating_callback_.is_null()) 99 AthenaEnv::Get()->RemoveTerminatingCallback(terminating_callback_); 100 terminating_callback_ = callback; 101 if (!terminating_callback_.is_null()) 102 AthenaEnv::Get()->AddTerminatingCallback(terminating_callback_); 103 } 104 105 } // namespace athena 106