| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/test/test_timeouts.h" | 6 #include "base/test/test_timeouts.h" |
| 7 #include "base/threading/platform_thread.h" | 7 #include "base/threading/platform_thread.h" |
| 8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
| 9 #include "chrome/app/chrome_command_ids.h" | 9 #include "chrome/app/chrome_command_ids.h" |
| 10 #include "chrome/browser/automation/automation_util.h" | 10 #include "chrome/browser/automation/automation_util.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "chrome/browser/ui/extensions/shell_window.h" | 26 #include "chrome/browser/ui/extensions/shell_window.h" |
| 27 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 27 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 28 #include "chrome/browser/ui/web_contents_modal_dialog_manager.h" | 28 #include "chrome/browser/ui/web_contents_modal_dialog_manager.h" |
| 29 #include "chrome/common/chrome_notification_types.h" | 29 #include "chrome/common/chrome_notification_types.h" |
| 30 #include "chrome/common/url_constants.h" | 30 #include "chrome/common/url_constants.h" |
| 31 #include "chrome/test/base/ui_test_utils.h" | 31 #include "chrome/test/base/ui_test_utils.h" |
| 32 #include "content/public/browser/devtools_agent_host.h" | 32 #include "content/public/browser/devtools_agent_host.h" |
| 33 #include "content/public/browser/render_process_host.h" | 33 #include "content/public/browser/render_process_host.h" |
| 34 #include "content/public/browser/render_widget_host_view.h" | 34 #include "content/public/browser/render_widget_host_view.h" |
| 35 #include "content/public/browser/web_contents_view.h" | 35 #include "content/public/browser/web_contents_view.h" |
| 36 #include "content/public/browser/web_intents_dispatcher.h" | |
| 37 #include "content/public/test/test_utils.h" | 36 #include "content/public/test/test_utils.h" |
| 38 #include "googleurl/src/gurl.h" | 37 #include "googleurl/src/gurl.h" |
| 39 #include "webkit/glue/web_intent_data.h" | |
| 40 | 38 |
| 41 using content::WebContents; | 39 using content::WebContents; |
| 42 | 40 |
| 43 namespace extensions { | 41 namespace extensions { |
| 44 | 42 |
| 45 namespace { | 43 namespace { |
| 46 | 44 |
| 47 // Non-abstract RenderViewContextMenu class. | 45 // Non-abstract RenderViewContextMenu class. |
| 48 class PlatformAppContextMenu : public RenderViewContextMenu { | 46 class PlatformAppContextMenu : public RenderViewContextMenu { |
| 49 public: | 47 public: |
| 50 PlatformAppContextMenu(WebContents* web_contents, | 48 PlatformAppContextMenu(WebContents* web_contents, |
| 51 const content::ContextMenuParams& params) | 49 const content::ContextMenuParams& params) |
| 52 : RenderViewContextMenu(web_contents, params) {} | 50 : RenderViewContextMenu(web_contents, params) {} |
| 53 | 51 |
| 54 bool HasCommandWithId(int command_id) { | 52 bool HasCommandWithId(int command_id) { |
| 55 return menu_model_.GetIndexOfCommandId(command_id) != -1; | 53 return menu_model_.GetIndexOfCommandId(command_id) != -1; |
| 56 } | 54 } |
| 57 | 55 |
| 58 protected: | 56 protected: |
| 59 // RenderViewContextMenu implementation. | 57 // RenderViewContextMenu implementation. |
| 60 virtual bool GetAcceleratorForCommandId( | 58 virtual bool GetAcceleratorForCommandId( |
| 61 int command_id, | 59 int command_id, |
| 62 ui::Accelerator* accelerator) OVERRIDE { | 60 ui::Accelerator* accelerator) OVERRIDE { |
| 63 return false; | 61 return false; |
| 64 } | 62 } |
| 65 virtual void PlatformInit() OVERRIDE {} | 63 virtual void PlatformInit() OVERRIDE {} |
| 66 virtual void PlatformCancel() OVERRIDE {} | 64 virtual void PlatformCancel() OVERRIDE {} |
| 67 }; | 65 }; |
| 68 | 66 |
| 69 #if defined(ENABLE_WEB_INTENTS) | |
| 70 // State holder for the LaunchReply test. This provides an WebIntentsDispatcher | |
| 71 // that will, when used to launch a Web Intent, will return its reply via this | |
| 72 // class. The result may then be waited on via WaitUntilReply(). | |
| 73 class LaunchReplyHandler { | |
| 74 public: | |
| 75 explicit LaunchReplyHandler(webkit_glue::WebIntentData& data) | |
| 76 : data_(data), | |
| 77 replied_(false), | |
| 78 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | |
| 79 intents_dispatcher_ = content::WebIntentsDispatcher::Create(data); | |
| 80 intents_dispatcher_->RegisterReplyNotification(base::Bind( | |
| 81 &LaunchReplyHandler::OnReply, weak_ptr_factory_.GetWeakPtr())); | |
| 82 } | |
| 83 | |
| 84 content::WebIntentsDispatcher* intents_dispatcher() { | |
| 85 return intents_dispatcher_; | |
| 86 } | |
| 87 | |
| 88 // Waits until a reply to this Web Intent is provided via the | |
| 89 // WebIntentsDispatcher. | |
| 90 bool WaitUntilReply() { | |
| 91 if (replied_) | |
| 92 return true; | |
| 93 waiting_ = true; | |
| 94 content::RunMessageLoop(); | |
| 95 waiting_ = false; | |
| 96 return replied_; | |
| 97 } | |
| 98 | |
| 99 private: | |
| 100 void OnReply(webkit_glue::WebIntentReplyType reply) { | |
| 101 // Note that the ReplyNotification registered on WebIntentsDispatcher does | |
| 102 // not include the result data: this is reserved for the source page (which | |
| 103 // we don't care about). | |
| 104 replied_ = true; | |
| 105 if (waiting_) | |
| 106 MessageLoopForUI::current()->Quit(); | |
| 107 } | |
| 108 | |
| 109 webkit_glue::WebIntentData data_; | |
| 110 bool replied_; | |
| 111 bool waiting_; | |
| 112 content::WebIntentsDispatcher* intents_dispatcher_; | |
| 113 base::WeakPtrFactory<LaunchReplyHandler> weak_ptr_factory_; | |
| 114 }; | |
| 115 #endif | |
| 116 | |
| 117 // This class keeps track of tabs as they are added to the browser. It will be | 67 // This class keeps track of tabs as they are added to the browser. It will be |
| 118 // "done" (i.e. won't block on Wait()) once |observations| tabs have been added. | 68 // "done" (i.e. won't block on Wait()) once |observations| tabs have been added. |
| 119 class TabsAddedNotificationObserver | 69 class TabsAddedNotificationObserver |
| 120 : public content::WindowedNotificationObserver { | 70 : public content::WindowedNotificationObserver { |
| 121 public: | 71 public: |
| 122 explicit TabsAddedNotificationObserver(size_t observations) | 72 explicit TabsAddedNotificationObserver(size_t observations) |
| 123 : content::WindowedNotificationObserver( | 73 : content::WindowedNotificationObserver( |
| 124 chrome::NOTIFICATION_TAB_ADDED, | 74 chrome::NOTIFICATION_TAB_ADDED, |
| 125 content::NotificationService::AllSources()), | 75 content::NotificationService::AllSources()), |
| 126 observations_(observations) { | 76 observations_(observations) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 155 const Extension* extension = LoadAndLaunchPlatformApp("minimal"); | 105 const Extension* extension = LoadAndLaunchPlatformApp("minimal"); |
| 156 ShellWindow* window = CreateShellWindow(extension); | 106 ShellWindow* window = CreateShellWindow(extension); |
| 157 CloseShellWindow(window); | 107 CloseShellWindow(window); |
| 158 } | 108 } |
| 159 | 109 |
| 160 // Tests that platform apps received the "launch" event when launched. | 110 // Tests that platform apps received the "launch" event when launched. |
| 161 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, OnLaunchedEvent) { | 111 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, OnLaunchedEvent) { |
| 162 ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch")) << message_; | 112 ASSERT_TRUE(RunPlatformAppTest("platform_apps/launch")) << message_; |
| 163 } | 113 } |
| 164 | 114 |
| 165 #if defined(ENABLE_WEB_INTENTS) | |
| 166 // Tests that platform apps can reply to "launch" events that contain a Web | |
| 167 // Intent. This test does not test the mechanics of invoking a Web Intent | |
| 168 // from a source page, and short-circuits to LaunchPlatformAppWithWebIntent. | |
| 169 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, LaunchReply) { | |
| 170 FilePath path = test_data_dir_.AppendASCII("platform_apps/launch_reply"); | |
| 171 const extensions::Extension* extension = LoadExtension(path); | |
| 172 ASSERT_TRUE(extension) << "Failed to load extension."; | |
| 173 | |
| 174 webkit_glue::WebIntentData data( | |
| 175 UTF8ToUTF16("http://webintents.org/view"), | |
| 176 UTF8ToUTF16("text/plain"), | |
| 177 UTF8ToUTF16("irrelevant unserialized string data")); | |
| 178 LaunchReplyHandler handler(data); | |
| 179 | |
| 180 // Navigate to a boring page: we don't care what it is, but we require some | |
| 181 // source WebContents to launch the Web Intent "from". | |
| 182 ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); | |
| 183 WebContents* web_contents = | |
| 184 browser()->tab_strip_model()->GetActiveWebContents(); | |
| 185 ASSERT_TRUE(web_contents); | |
| 186 | |
| 187 extensions::LaunchPlatformAppWithWebIntent( | |
| 188 browser()->profile(), | |
| 189 extension, | |
| 190 handler.intents_dispatcher(), | |
| 191 web_contents); | |
| 192 | |
| 193 ASSERT_TRUE(handler.WaitUntilReply()); | |
| 194 } | |
| 195 #endif | |
| 196 | |
| 197 // Tests that platform apps cannot use certain disabled window properties, but | 115 // Tests that platform apps cannot use certain disabled window properties, but |
| 198 // can override them and then use them. | 116 // can override them and then use them. |
| 199 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, DisabledWindowProperties) { | 117 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, DisabledWindowProperties) { |
| 200 ASSERT_TRUE(RunPlatformAppTest("platform_apps/disabled_window_properties")) | 118 ASSERT_TRUE(RunPlatformAppTest("platform_apps/disabled_window_properties")) |
| 201 << message_; | 119 << message_; |
| 202 } | 120 } |
| 203 | 121 |
| 204 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, EmptyContextMenu) { | 122 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, EmptyContextMenu) { |
| 205 ExtensionTestMessageListener launched_listener("Launched", false); | 123 ExtensionTestMessageListener launched_listener("Launched", false); |
| 206 LoadAndLaunchPlatformApp("minimal"); | 124 LoadAndLaunchPlatformApp("minimal"); |
| (...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 922 #define MAYBE_WebContentsHasFocus WebContentsHasFocus | 840 #define MAYBE_WebContentsHasFocus WebContentsHasFocus |
| 923 #endif | 841 #endif |
| 924 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, MAYBE_WebContentsHasFocus) { | 842 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, MAYBE_WebContentsHasFocus) { |
| 925 const Extension* extension = LoadAndLaunchPlatformApp("minimal"); | 843 const Extension* extension = LoadAndLaunchPlatformApp("minimal"); |
| 926 ShellWindow* window = CreateShellWindow(extension); | 844 ShellWindow* window = CreateShellWindow(extension); |
| 927 EXPECT_TRUE(window->web_contents()->GetRenderWidgetHostView()->HasFocus()); | 845 EXPECT_TRUE(window->web_contents()->GetRenderWidgetHostView()->HasFocus()); |
| 928 CloseShellWindow(window); | 846 CloseShellWindow(window); |
| 929 } | 847 } |
| 930 | 848 |
| 931 } // namespace extensions | 849 } // namespace extensions |
| OLD | NEW |