summaryrefslogtreecommitdiffstats
path: root/mandoline/tab
diff options
context:
space:
mode:
authorsky <sky@chromium.org>2015-08-11 16:43:04 -0700
committerCommit bot <commit-bot@chromium.org>2015-08-11 23:43:49 +0000
commitd30ec60a76d4a68540771754195f5e49c01bc57a (patch)
tree3f4797276c61c262c038b7976af1825cd4be4cba /mandoline/tab
parent591b117f69bab18f9dc8ade07dfa0e30d7c1e00f (diff)
downloadchromium_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.cc23
-rw-r--r--mandoline/tab/frame.h9
-rw-r--r--mandoline/tab/frame_apptest.cc3
-rw-r--r--mandoline/tab/frame_tree_delegate.h7
-rw-r--r--mandoline/tab/public/interfaces/frame_tree.mojom27
-rw-r--r--mandoline/tab/test_frame_tree_delegate.cc9
-rw-r--r--mandoline/tab/test_frame_tree_delegate.h2
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,