| // Copyright (c) 2012 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 "content/browser/intents/internal_web_intents_dispatcher.h" |
| |
| #include "content/browser/intents/intent_injector.h" |
| #include "webkit/glue/web_intent_data.h" |
| #include "webkit/glue/web_intent_reply_data.h" |
| |
| using content::WebContents; |
| |
| InternalWebIntentsDispatcher::InternalWebIntentsDispatcher( |
| const webkit_glue::WebIntentData& intent) |
| : intent_(intent), |
| intent_injector_(NULL) {} |
| |
| InternalWebIntentsDispatcher::InternalWebIntentsDispatcher( |
| const webkit_glue::WebIntentData& intent, |
| const ReplyCallback& reply_callback) |
| : intent_(intent), |
| intent_injector_(NULL), |
| reply_callback_(reply_callback) {} |
| |
| InternalWebIntentsDispatcher::~InternalWebIntentsDispatcher() {} |
| |
| const webkit_glue::WebIntentData& InternalWebIntentsDispatcher::GetIntent() { |
| return intent_; |
| } |
| |
| void InternalWebIntentsDispatcher::DispatchIntent( |
| WebContents* destination_contents) { |
| DCHECK(destination_contents); |
| DCHECK(!intent_injector_); |
| intent_injector_ = new IntentInjector(destination_contents); |
| intent_injector_->SetIntent(this, intent_); |
| } |
| |
| void InternalWebIntentsDispatcher::ResetDispatch() { |
| if (intent_injector_) { |
| intent_injector_->Abandon(); |
| intent_injector_ = NULL; |
| } |
| } |
| |
| void InternalWebIntentsDispatcher::SendReplyMessage( |
| webkit_glue::WebIntentReplyType reply_type, |
| const string16& data) { |
| intent_injector_ = NULL; |
| |
| for (size_t i = 0; i < reply_notifiers_.size(); ++i) { |
| if (!reply_notifiers_[i].is_null()) |
| reply_notifiers_[i].Run(reply_type); |
| } |
| |
| // Notify the callback of the reply. |
| if (!reply_callback_.is_null()) |
| reply_callback_.Run(reply_type, data); |
| |
| delete this; |
| } |
| |
| void InternalWebIntentsDispatcher::RegisterReplyNotification( |
| const content::WebIntentsDispatcher::ReplyNotification& closure) { |
| reply_notifiers_.push_back(closure); |
| } |