1 // Copyright (c) 2012 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 "chrome/browser/notifications/balloon.h" 6 7 #include "base/logging.h" 8 #include "chrome/browser/extensions/extension_service.h" 9 #include "chrome/browser/notifications/balloon_collection.h" 10 #include "chrome/browser/notifications/notification.h" 11 #include "chrome/browser/profiles/profile.h" 12 #include "ui/gfx/rect.h" 13 #include "ui/gfx/size.h" 14 15 #if !defined(OS_WIN) && !defined(USE_AURA) 16 // static 17 int BalloonView::GetHorizontalMargin() { 18 // TODO: implement for linux (non-aura) and mac. 19 return 0; 20 } 21 #endif 22 23 Balloon::Balloon(const Notification& notification, Profile* profile, 24 BalloonCollection* collection) 25 : profile_(profile), 26 notification_(new Notification(notification)), 27 collection_(collection) { 28 } 29 30 Balloon::~Balloon() { 31 } 32 33 void Balloon::SetPosition(const gfx::Point& upper_left, bool reposition) { 34 position_ = upper_left; 35 if (reposition && balloon_view_.get()) 36 balloon_view_->RepositionToBalloon(); 37 } 38 39 void Balloon::ResizeDueToAutoResize(const gfx::Size& size) { 40 collection_->ResizeBalloon(this, size); 41 } 42 43 void Balloon::set_view(BalloonView* balloon_view) { 44 balloon_view_.reset(balloon_view); 45 } 46 47 void Balloon::Show() { 48 notification_->Display(); 49 if (balloon_view_.get()) { 50 balloon_view_->Show(this); 51 balloon_view_->RepositionToBalloon(); 52 } 53 } 54 55 void Balloon::Update(const Notification& notification) { 56 notification_->Close(false); 57 notification_.reset(new Notification(notification)); 58 notification_->Display(); 59 if (balloon_view_.get()) { 60 balloon_view_->Update(); 61 } 62 } 63 64 void Balloon::OnClick() { 65 notification_->Click(); 66 } 67 68 void Balloon::OnClose(bool by_user) { 69 notification_->Close(by_user); 70 collection_->OnBalloonClosed(this); 71 } 72 73 void Balloon::OnButtonClick(int button_index) { 74 notification_->ButtonClick(button_index); 75 } 76 77 void Balloon::CloseByScript() { 78 // A user-initiated close begins with the view and then closes this object; 79 // we simulate that with a script-initiated close but pass |by_user|=false. 80 DCHECK(balloon_view_.get()); 81 balloon_view_->Close(false); 82 } 83 84 std::string Balloon::GetExtensionId() { 85 const ExtensionService* service = profile()->GetExtensionService(); 86 const extensions::Extension* extension = 87 service->extensions()->GetExtensionOrAppByURL( 88 notification().origin_url()); 89 return extension ? extension->id() : std::string(); 90 } 91