1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_apitest.h"
6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/extensions/extension_event_router.h"
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "googleurl/src/gurl.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MessageSender : public NotificationObserver {
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageSender() {
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    registrar_.Add(this, NotificationType::EXTENSION_HOST_DID_STOP_LOADING,
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   NotificationService::AllSources());
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details) {
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ExtensionEventRouter* event_router =
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        Source<Profile>(source).ptr()->GetExtensionEventRouter();
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Sends four messages to the extension. All but the third message sent
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // from the origin http://b.com/ are supposed to arrive.
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    event_router->DispatchEventToRenderers("test.onMessage",
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "[{\"lastMessage\":false,\"data\":\"no restriction\"}]",
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        Source<Profile>(source).ptr(),
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        GURL());
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    event_router->DispatchEventToRenderers("test.onMessage",
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "[{\"lastMessage\":false,\"data\":\"http://a.com/\"}]",
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        Source<Profile>(source).ptr(),
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        GURL("http://a.com/"));
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    event_router->DispatchEventToRenderers("test.onMessage",
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "[{\"lastMessage\":false,\"data\":\"http://b.com/\"}]",
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        Source<Profile>(source).ptr(),
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        GURL("http://b.com/"));
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    event_router->DispatchEventToRenderers("test.onMessage",
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "[{\"lastMessage\":true,\"data\":\"last message\"}]",
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        Source<Profile>(source).ptr(),
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        GURL());
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that message passing between extensions and content scripts works.
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionApiTest, Messaging) {
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_TRUE(StartTestServer());
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(RunExtensionTest("messaging/connect")) << message_;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that message passing from one extension to another works.
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionApiTest, MessagingExternal) {
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(LoadExtension(
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      test_data_dir_.AppendASCII("..").AppendASCII("good")
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    .AppendASCII("Extensions")
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    .AppendASCII("bjafgdebaacbbbecmhlhpofkepfkgcpa")
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    .AppendASCII("1.0")));
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(RunExtensionTest("messaging/connect_external")) << message_;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that messages with event_urls are only passed to extensions with
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// appropriate permissions.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionApiTest, MessagingEventURL) {
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageSender sender;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(RunExtensionTest("messaging/event_url")) << message_;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
76