diff options
author | sky <sky@chromium.org> | 2015-08-11 16:43:04 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-11 23:43:49 +0000 |
commit | d30ec60a76d4a68540771754195f5e49c01bc57a (patch) | |
tree | 3f4797276c61c262c038b7976af1825cd4be4cba /mandoline/tab | |
parent | 591b117f69bab18f9dc8ade07dfa0e30d7c1e00f (diff) | |
download | chromium_src-d30ec60a76d4a68540771754195f5e49c01bc57a.zip chromium_src-d30ec60a76d4a68540771754195f5e49c01bc57a.tar.gz chromium_src-d30ec60a76d4a68540771754195f5e49c01bc57a.tar.bz2 |
Connects PostMessage() for OOPIFs
BUG=479172,490221
TEST=none
R=fsamuel@chromium.org
Review URL: https://codereview.chromium.org/1270313006
Cr-Commit-Position: refs/heads/master@{#342939}
Diffstat (limited to 'mandoline/tab')
-rw-r--r-- | mandoline/tab/frame.cc | 23 | ||||
-rw-r--r-- | mandoline/tab/frame.h | 9 | ||||
-rw-r--r-- | mandoline/tab/frame_apptest.cc | 3 | ||||
-rw-r--r-- | mandoline/tab/frame_tree_delegate.h | 7 | ||||
-rw-r--r-- | mandoline/tab/public/interfaces/frame_tree.mojom | 27 | ||||
-rw-r--r-- | mandoline/tab/test_frame_tree_delegate.cc | 9 | ||||
-rw-r--r-- | mandoline/tab/test_frame_tree_delegate.h | 2 |
7 files changed, 62 insertions, 18 deletions
diff --git a/mandoline/tab/frame.cc b/mandoline/tab/frame.cc index b120c93..6e1613d 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) { diff --git a/mandoline/tab/frame.h b/mandoline/tab/frame.h index 8d051fe..7848767 100644 --- a/mandoline/tab/frame.h +++ b/mandoline/tab/frame.h @@ -103,6 +103,10 @@ class Frame : public mojo::ViewObserver, public FrameTreeServer { void SetView(mojo::View* view); + // Returns the first ancestor (starting at |this|) that has a + // FrameTreeClient. + Frame* GetAncestorWithFrameTreeClient(); + // Adds this to |frames| and recurses through the children calling the // same function. void BuildFrameTree(std::vector<const Frame*>* frames) const; @@ -138,8 +142,9 @@ class Frame : public mojo::ViewObserver, public FrameTreeServer { void OnViewDestroying(mojo::View* view) override; // FrameTreeServer: - void PostMessageEventToFrame(uint32_t frame_id, - MessageEventPtr event) override; + void PostMessageEventToFrame(uint32_t source_frame_id, + uint32_t target_frame_id, + HTMLMessageEventPtr event) override; void LoadingStarted(uint32_t frame_id) override; void LoadingStopped(uint32_t frame_id) override; void ProgressChanged(uint32_t frame_id, double progress) override; diff --git a/mandoline/tab/frame_apptest.cc b/mandoline/tab/frame_apptest.cc index 32685a7..8d7c746 100644 --- a/mandoline/tab/frame_apptest.cc +++ b/mandoline/tab/frame_apptest.cc @@ -153,6 +153,9 @@ class TestFrameTreeClient : public FrameTreeClient { void OnFrameClientPropertyChanged(uint32_t frame_id, const mojo::String& name, mojo::Array<uint8_t> new_data) override {} + void PostMessage(uint32_t source_frame_id, + uint32_t target_frame_id, + HTMLMessageEventPtr event) override {} private: int connect_count_; diff --git a/mandoline/tab/frame_tree_delegate.h b/mandoline/tab/frame_tree_delegate.h index 6562bd8..b72446a 100644 --- a/mandoline/tab/frame_tree_delegate.h +++ b/mandoline/tab/frame_tree_delegate.h @@ -11,13 +11,16 @@ namespace mandoline { class Frame; -class MessageEvent; +class HTMLMessageEvent; class FrameTreeDelegate { public: + // Returns whether a request to post a message from |source| to |target| + // is allowed. |source| and |target| are never null. virtual bool CanPostMessageEventToFrame(const Frame* source, const Frame* target, - MessageEvent* event) = 0; + HTMLMessageEvent* event) = 0; + virtual void LoadingStateChanged(bool loading) = 0; virtual void ProgressChanged(double progress) = 0; diff --git a/mandoline/tab/public/interfaces/frame_tree.mojom b/mandoline/tab/public/interfaces/frame_tree.mojom index f49612c..245c521 100644 --- a/mandoline/tab/public/interfaces/frame_tree.mojom +++ b/mandoline/tab/public/interfaces/frame_tree.mojom @@ -48,13 +48,28 @@ struct FrameData { map<string, array<uint8>>? client_properties; }; -struct MessageEvent { - // TODO(sky): add details. +// TODO(sky): decide which bits of this make sense for all frames, and move the +// html specific parts into properties. +struct HTMLMessageEvent { + // The serialized script value. + array<uint8>? data; + + // The origin of the source frame. + string source_origin; + + // The origin for the message's target. + string? target_origin; + + // TODO(sky): these two are not implemented. Figure out what they should be. + // Information about the MessagePorts this message contains. + // IPC_STRUCT_MEMBER(std::vector<content::TransferredMessagePort>, message_ports) + // IPC_STRUCT_MEMBER(std::vector<int>, new_routing_ids) }; interface FrameTreeServer { - // TODO(sky): make these real. - PostMessageEventToFrame(uint32 frame_id, MessageEvent event); + PostMessageEventToFrame(uint32 source_frame_id, + uint32 target_frame_id, + HTMLMessageEvent event); // Notifies the server that a load has started or stopped in this frame. // When loading is started, progress is reset to 0, but when loading is @@ -108,4 +123,8 @@ interface FrameTreeClient { OnFrameClientPropertyChanged(uint32 frame_id, string name, array<uint8>? new_value); + + PostMessage(uint32 source_frame_id, + uint32 target_frame_id, + HTMLMessageEvent event); }; diff --git a/mandoline/tab/test_frame_tree_delegate.cc b/mandoline/tab/test_frame_tree_delegate.cc index 2f26e40..045a1b6 100644 --- a/mandoline/tab/test_frame_tree_delegate.cc +++ b/mandoline/tab/test_frame_tree_delegate.cc @@ -10,10 +10,11 @@ TestFrameTreeDelegate::TestFrameTreeDelegate() {} TestFrameTreeDelegate::~TestFrameTreeDelegate() {} -bool TestFrameTreeDelegate::CanPostMessageEventToFrame(const Frame* source, - const Frame* target, - MessageEvent* event) { - return false; +bool TestFrameTreeDelegate::CanPostMessageEventToFrame( + const Frame* source, + const Frame* target, + HTMLMessageEvent* event) { + return true; } void TestFrameTreeDelegate::LoadingStateChanged(bool loading) {} diff --git a/mandoline/tab/test_frame_tree_delegate.h b/mandoline/tab/test_frame_tree_delegate.h index 5b8c24a..d7ea74e 100644 --- a/mandoline/tab/test_frame_tree_delegate.h +++ b/mandoline/tab/test_frame_tree_delegate.h @@ -18,7 +18,7 @@ class TestFrameTreeDelegate : public FrameTreeDelegate { // TestFrameTreeDelegate: bool CanPostMessageEventToFrame(const Frame* source, const Frame* target, - MessageEvent* event) override; + HTMLMessageEvent* event) override; void LoadingStateChanged(bool loading) override; void ProgressChanged(double progress) override; void RequestNavigate(Frame* source, |