Index: mandoline/tab/frame.cc |
diff --git a/mandoline/tab/frame.cc b/mandoline/tab/frame.cc |
index b120c933e736788cfc79f22abad2e72ac3bb799d..6e1613da576d487f87ea6eb041af82c710e2d25e 100644 |
--- a/mandoline/tab/frame.cc |
+++ b/mandoline/tab/frame.cc |
@@ -171,6 +171,13 @@ void Frame::SetView(mojo::View* view) { |
view_->AddObserver(this); |
} |
+Frame* Frame::GetAncestorWithFrameTreeClient() { |
+ Frame* frame = this; |
+ while (frame && !frame->frame_tree_client_) |
+ frame = frame->parent_; |
+ return frame; |
+} |
+ |
void Frame::BuildFrameTree(std::vector<const Frame*>* frames) const { |
frames->push_back(this); |
for (const Frame* frame : children_) |
@@ -307,13 +314,19 @@ void Frame::OnViewDestroying(mojo::View* view) { |
delete this; |
} |
-void Frame::PostMessageEventToFrame(uint32_t frame_id, MessageEventPtr event) { |
- Frame* target = tree_->root()->FindFrame(frame_id); |
- if (!target || |
- !tree_->delegate_->CanPostMessageEventToFrame(this, target, event.get())) |
+void Frame::PostMessageEventToFrame(uint32_t source_frame_id, |
+ uint32_t target_frame_id, |
+ HTMLMessageEventPtr event) { |
+ Frame* source = tree_->root()->FindFrame(source_frame_id); |
+ Frame* target = tree_->root()->FindFrame(target_frame_id); |
+ if (!target || !source || source == target || !tree_->delegate_ || |
+ !tree_->delegate_->CanPostMessageEventToFrame(source, target, |
+ event.get())) |
return; |
- NOTIMPLEMENTED(); |
+ DCHECK(target->GetAncestorWithFrameTreeClient()); |
+ target->GetAncestorWithFrameTreeClient()->frame_tree_client_->PostMessage( |
+ source_frame_id, target_frame_id, event.Pass()); |
} |
void Frame::LoadingStarted(uint32_t frame_id) { |