| OLD | NEW | 
|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/logging.h" | 5 #include "base/logging.h" | 
| 6 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" | 
| 7 #include "base/numerics/safe_conversions.h" | 7 #include "base/numerics/safe_conversions.h" | 
|  | 8 #include "base/strings/utf_string_conversions.h" | 
| 8 #include "blimp/common/create_blimp_message.h" | 9 #include "blimp/common/create_blimp_message.h" | 
| 9 #include "blimp/common/proto/blimp_message.pb.h" | 10 #include "blimp/common/proto/blimp_message.pb.h" | 
| 10 #include "blimp/common/proto/compositor.pb.h" | 11 #include "blimp/common/proto/compositor.pb.h" | 
| 11 #include "blimp/common/proto/render_widget.pb.h" | 12 #include "blimp/common/proto/render_widget.pb.h" | 
| 12 #include "blimp/engine/feature/engine_render_widget_feature.h" | 13 #include "blimp/engine/feature/engine_render_widget_feature.h" | 
| 13 #include "blimp/net/input_message_generator.h" | 14 #include "blimp/net/input_message_generator.h" | 
| 14 #include "blimp/net/test_common.h" | 15 #include "blimp/net/test_common.h" | 
| 15 #include "content/public/browser/render_widget_host.h" | 16 #include "content/public/browser/render_widget_host.h" | 
| 16 #include "net/base/net_errors.h" | 17 #include "net/base/net_errors.h" | 
| 17 #include "net/base/test_completion_callback.h" | 18 #include "net/base/test_completion_callback.h" | 
| 18 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" | 
| 19 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" | 
| 20 #include "third_party/WebKit/public/web/WebInputEvent.h" | 21 #include "third_party/WebKit/public/web/WebInputEvent.h" | 
|  | 22 #include "ui/base/ime/text_input_client.h" | 
| 21 | 23 | 
| 22 using testing::_; | 24 using testing::_; | 
| 23 using testing::InSequence; | 25 using testing::InSequence; | 
| 24 using testing::Sequence; | 26 using testing::Sequence; | 
| 25 | 27 | 
| 26 namespace blimp { | 28 namespace blimp { | 
| 27 | 29 | 
| 28 namespace { | 30 namespace { | 
| 29 | 31 | 
| 30 class MockHostRenderWidgetMessageDelegate | 32 class MockHostRenderWidgetMessageDelegate | 
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 90   void AddMouseEventCallback(const MouseEventCallback& callback) override {} | 92   void AddMouseEventCallback(const MouseEventCallback& callback) override {} | 
| 91   void RemoveMouseEventCallback(const MouseEventCallback& callback) override {} | 93   void RemoveMouseEventCallback(const MouseEventCallback& callback) override {} | 
| 92   void GetWebScreenInfo(blink::WebScreenInfo* result) override {} | 94   void GetWebScreenInfo(blink::WebScreenInfo* result) override {} | 
| 93   bool GetScreenColorProfile(std::vector<char>* color_profile) override { | 95   bool GetScreenColorProfile(std::vector<char>* color_profile) override { | 
| 94     return false; } | 96     return false; } | 
| 95   void HandleCompositorProto(const std::vector<uint8_t>& proto) override {} | 97   void HandleCompositorProto(const std::vector<uint8_t>& proto) override {} | 
| 96 | 98 | 
| 97   bool Send(IPC::Message* msg) override { return false; } | 99   bool Send(IPC::Message* msg) override { return false; } | 
| 98 }; | 100 }; | 
| 99 | 101 | 
|  | 102 class MockTextInputClient : public ui::TextInputClient { | 
|  | 103   ui::TextInputType text_input_type_; | 
|  | 104 | 
|  | 105  public: | 
|  | 106   MockTextInputClient() : text_input_type_(ui::TEXT_INPUT_TYPE_TEXT) {} | 
|  | 107   ~MockTextInputClient() override {} | 
|  | 108 | 
|  | 109   void SetCompositionText(const ui::CompositionText& composition) override {} | 
|  | 110   void ConfirmCompositionText() override {} | 
|  | 111   void ClearCompositionText() override {} | 
|  | 112   void InsertText(const base::string16& text) override {} | 
|  | 113   void InsertChar(const ui::KeyEvent& event) override {} | 
|  | 114   ui::TextInputType GetTextInputType() const override { | 
|  | 115     return text_input_type_; | 
|  | 116   } | 
|  | 117   ui::TextInputMode GetTextInputMode() const override { | 
|  | 118     return ui::TEXT_INPUT_MODE_DEFAULT; | 
|  | 119   } | 
|  | 120   int GetTextInputFlags() const override { return 0; } | 
|  | 121   bool CanComposeInline() const override { return false; } | 
|  | 122   gfx::Rect GetCaretBounds() const override { return gfx::Rect(); } | 
|  | 123   bool GetCompositionCharacterBounds(uint32_t index, | 
|  | 124                                      gfx::Rect* rect) const override { | 
|  | 125     return false; | 
|  | 126   } | 
|  | 127   bool HasCompositionText() const override { return false; } | 
|  | 128   bool GetTextRange(gfx::Range* range) const override { return false; } | 
|  | 129   bool GetCompositionTextRange(gfx::Range* range) const override { | 
|  | 130     return false; | 
|  | 131   } | 
|  | 132   bool GetSelectionRange(gfx::Range* range) const override { return false; } | 
|  | 133   bool SetSelectionRange(const gfx::Range& range) override { return false; } | 
|  | 134   bool DeleteRange(const gfx::Range& range) override { return false; } | 
|  | 135   void OnInputMethodChanged() override {} | 
|  | 136   bool ChangeTextDirectionAndLayoutAlignment( | 
|  | 137       base::i18n::TextDirection direction) override { | 
|  | 138     return false; | 
|  | 139   } | 
|  | 140   void ExtendSelectionAndDelete(size_t before, size_t after) override {} | 
|  | 141   void EnsureCaretInRect(const gfx::Rect& rect) override {} | 
|  | 142   bool IsEditCommandEnabled(int command_id) override { return false; } | 
|  | 143   void SetEditCommandForNextKeyEvent(int command_id) override {} | 
|  | 144   bool GetTextFromRange(const gfx::Range& range, | 
|  | 145                         base::string16* text) const override { | 
|  | 146     *text = base::string16(base::ASCIIToUTF16("green apple")); | 
|  | 147     return false; | 
|  | 148   } | 
|  | 149 }; | 
|  | 150 | 
| 100 MATCHER_P(CompMsgEquals, contents, "") { | 151 MATCHER_P(CompMsgEquals, contents, "") { | 
| 101   if (contents.size() != arg.size()) | 152   if (contents.size() != arg.size()) | 
| 102     return false; | 153     return false; | 
| 103 | 154 | 
| 104   return memcmp(contents.data(), arg.data(), contents.size()) == 0; | 155   return memcmp(contents.data(), arg.data(), contents.size()) == 0; | 
| 105 } | 156 } | 
| 106 | 157 | 
| 107 MATCHER_P3(BlimpCompMsgEquals, tab_id, rw_id, contents, "") { | 158 MATCHER_P3(BlimpCompMsgEquals, tab_id, rw_id, contents, "") { | 
| 108   if (contents.size() != arg.compositor().payload().size()) | 159   if (contents.size() != arg.compositor().payload().size()) | 
| 109     return false; | 160     return false; | 
| 110 | 161 | 
| 111   if (memcmp(contents.data(), | 162   if (memcmp(contents.data(), | 
| 112              arg.compositor().payload().data(), | 163              arg.compositor().payload().data(), | 
| 113              contents.size()) != 0) { | 164              contents.size()) != 0) { | 
| 114     return false; | 165     return false; | 
| 115   } | 166   } | 
| 116 | 167 | 
| 117   return arg.compositor().render_widget_id() == rw_id && | 168   return arg.compositor().render_widget_id() == rw_id && | 
| 118       arg.target_tab_id() == tab_id; | 169       arg.target_tab_id() == tab_id; | 
| 119 } | 170 } | 
| 120 | 171 | 
| 121 MATCHER_P3(BlimpRWMsgEquals, tab_id, rw_id, message_type, "") { | 172 MATCHER_P3(BlimpRWMsgEquals, tab_id, rw_id, message_type, "") { | 
| 122   return arg.render_widget().render_widget_id() == rw_id && | 173   return arg.render_widget().render_widget_id() == rw_id && | 
| 123       arg.target_tab_id() == tab_id && | 174       arg.target_tab_id() == tab_id && | 
| 124       arg.render_widget().type() == message_type; | 175       arg.render_widget().type() == message_type; | 
| 125 } | 176 } | 
| 126 | 177 | 
|  | 178 MATCHER_P2(BlimpImeMsgEquals, tab_id, message_type, "") { | 
|  | 179   return arg.target_tab_id() == tab_id && arg.ime().type() == message_type; | 
|  | 180 } | 
|  | 181 | 
|  | 182 MATCHER_P5(BlimpImeMsgEquals, | 
|  | 183            tab_id, | 
|  | 184            rwid, | 
|  | 185            message_type, | 
|  | 186            text, | 
|  | 187            text_input_type, | 
|  | 188            "") { | 
|  | 189   return arg.target_tab_id() == tab_id && | 
|  | 190          arg.ime().render_widget_id() == rwid && | 
|  | 191          arg.ime().type() == message_type && | 
|  | 192          arg.ime().ime_text().compare(text) == 0 && | 
|  | 193          arg.ime().text_input_type() == text_input_type; | 
|  | 194 } | 
|  | 195 | 
| 127 void SendInputMessage(BlimpMessageProcessor* processor, | 196 void SendInputMessage(BlimpMessageProcessor* processor, | 
| 128                       int tab_id, | 197                       int tab_id, | 
| 129                       int rw_id) { | 198                       int rw_id) { | 
| 130   blink::WebGestureEvent input_event; | 199   blink::WebGestureEvent input_event; | 
| 131   input_event.type = blink::WebGestureEvent::Type::GestureTap; | 200   input_event.type = blink::WebGestureEvent::Type::GestureTap; | 
| 132 | 201 | 
| 133   InputMessageGenerator generator; | 202   InputMessageGenerator generator; | 
| 134   scoped_ptr<BlimpMessage> message = generator.GenerateMessage(input_event); | 203   scoped_ptr<BlimpMessage> message = generator.GenerateMessage(input_event); | 
| 135   message->set_type(BlimpMessage::INPUT); | 204   message->set_type(BlimpMessage::INPUT); | 
| 136   message->set_target_tab_id(tab_id); | 205   message->set_target_tab_id(tab_id); | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 160  public: | 229  public: | 
| 161   EngineRenderWidgetFeatureTest() {} | 230   EngineRenderWidgetFeatureTest() {} | 
| 162 | 231 | 
| 163   void SetUp() override { | 232   void SetUp() override { | 
| 164     render_widget_message_sender_ = new MockBlimpMessageProcessor; | 233     render_widget_message_sender_ = new MockBlimpMessageProcessor; | 
| 165     feature_.set_render_widget_message_sender( | 234     feature_.set_render_widget_message_sender( | 
| 166         make_scoped_ptr(render_widget_message_sender_)); | 235         make_scoped_ptr(render_widget_message_sender_)); | 
| 167     compositor_message_sender_ = new MockBlimpMessageProcessor; | 236     compositor_message_sender_ = new MockBlimpMessageProcessor; | 
| 168     feature_.set_compositor_message_sender( | 237     feature_.set_compositor_message_sender( | 
| 169         make_scoped_ptr(compositor_message_sender_)); | 238         make_scoped_ptr(compositor_message_sender_)); | 
|  | 239     ime_message_sender_ = new MockBlimpMessageProcessor; | 
|  | 240     feature_.set_ime_message_sender(make_scoped_ptr(ime_message_sender_)); | 
| 170     feature_.SetDelegate(1, &delegate1_); | 241     feature_.SetDelegate(1, &delegate1_); | 
| 171     feature_.SetDelegate(2, &delegate2_); | 242     feature_.SetDelegate(2, &delegate2_); | 
| 172   } | 243   } | 
| 173 | 244 | 
| 174  protected: | 245  protected: | 
| 175   MockBlimpMessageProcessor* render_widget_message_sender_; | 246   MockBlimpMessageProcessor* render_widget_message_sender_; | 
| 176   MockBlimpMessageProcessor* compositor_message_sender_; | 247   MockBlimpMessageProcessor* compositor_message_sender_; | 
|  | 248   MockBlimpMessageProcessor* ime_message_sender_; | 
| 177   MockRenderWidgetHost render_widget_host1_; | 249   MockRenderWidgetHost render_widget_host1_; | 
| 178   MockRenderWidgetHost render_widget_host2_; | 250   MockRenderWidgetHost render_widget_host2_; | 
| 179   MockHostRenderWidgetMessageDelegate delegate1_; | 251   MockHostRenderWidgetMessageDelegate delegate1_; | 
| 180   MockHostRenderWidgetMessageDelegate delegate2_; | 252   MockHostRenderWidgetMessageDelegate delegate2_; | 
|  | 253   MockTextInputClient text_input_client_; | 
| 181   EngineRenderWidgetFeature feature_; | 254   EngineRenderWidgetFeature feature_; | 
| 182 }; | 255 }; | 
| 183 | 256 | 
| 184 TEST_F(EngineRenderWidgetFeatureTest, DelegateCallsOK) { | 257 TEST_F(EngineRenderWidgetFeatureTest, DelegateCallsOK) { | 
| 185   std::vector<uint8_t> payload = { 'd', 'a', 'v', 'i', 'd' }; | 258   std::vector<uint8_t> payload = { 'd', 'a', 'v', 'i', 'd' }; | 
| 186 | 259 | 
| 187   EXPECT_CALL(*render_widget_message_sender_, MockableProcessMessage( | 260   EXPECT_CALL(*render_widget_message_sender_, MockableProcessMessage( | 
| 188       BlimpRWMsgEquals(1, 1, RenderWidgetMessage::CREATED), _)) | 261       BlimpRWMsgEquals(1, 1, RenderWidgetMessage::CREATED), _)) | 
| 189   .Times(1); | 262   .Times(1); | 
| 190   EXPECT_CALL(*render_widget_message_sender_, MockableProcessMessage( | 263   EXPECT_CALL(*render_widget_message_sender_, MockableProcessMessage( | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 206   .Times(1); | 279   .Times(1); | 
| 207 | 280 | 
| 208   feature_.OnRenderWidgetCreated(1, &render_widget_host1_); | 281   feature_.OnRenderWidgetCreated(1, &render_widget_host1_); | 
| 209   feature_.OnRenderWidgetInitialized(1, &render_widget_host1_); | 282   feature_.OnRenderWidgetInitialized(1, &render_widget_host1_); | 
| 210   feature_.OnRenderWidgetCreated(2, &render_widget_host2_); | 283   feature_.OnRenderWidgetCreated(2, &render_widget_host2_); | 
| 211   SendCompositorMessage(&feature_, 1, 1, payload); | 284   SendCompositorMessage(&feature_, 1, 1, payload); | 
| 212   SendInputMessage(&feature_, 1, 1); | 285   SendInputMessage(&feature_, 1, 1); | 
| 213   SendCompositorMessage(&feature_, 2, 2, payload); | 286   SendCompositorMessage(&feature_, 2, 2, payload); | 
| 214 } | 287 } | 
| 215 | 288 | 
|  | 289 TEST_F(EngineRenderWidgetFeatureTest, ImeRequestSentCorrectly) { | 
|  | 290   EXPECT_CALL( | 
|  | 291       *ime_message_sender_, | 
|  | 292       MockableProcessMessage(BlimpImeMsgEquals(2, 1, ImeMessage::SHOW_IME, | 
|  | 293                                                std::string("green apple"), 1), | 
|  | 294                              _)); | 
|  | 295 | 
|  | 296   EXPECT_CALL( | 
|  | 297       *ime_message_sender_, | 
|  | 298       MockableProcessMessage(BlimpImeMsgEquals(2, ImeMessage::HIDE_IME), _)); | 
|  | 299 | 
|  | 300   feature_.OnRenderWidgetCreated(2, &render_widget_host1_); | 
|  | 301   feature_.SendShowImeRequest(2, &render_widget_host1_, &text_input_client_); | 
|  | 302   feature_.SendHideImeRequest(2, &render_widget_host1_); | 
|  | 303 } | 
|  | 304 | 
| 216 TEST_F(EngineRenderWidgetFeatureTest, DropsStaleMessages) { | 305 TEST_F(EngineRenderWidgetFeatureTest, DropsStaleMessages) { | 
| 217   InSequence sequence; | 306   InSequence sequence; | 
| 218   std::vector<uint8_t> payload = { 'f', 'u', 'n' }; | 307   std::vector<uint8_t> payload = { 'f', 'u', 'n' }; | 
| 219   std::vector<uint8_t> new_payload = {'n', 'o', ' ', 'f', 'u', 'n'}; | 308   std::vector<uint8_t> new_payload = {'n', 'o', ' ', 'f', 'u', 'n'}; | 
| 220 | 309 | 
| 221   EXPECT_CALL(*render_widget_message_sender_, | 310   EXPECT_CALL(*render_widget_message_sender_, | 
| 222               MockableProcessMessage( | 311               MockableProcessMessage( | 
| 223                   BlimpRWMsgEquals(1, 1, RenderWidgetMessage::CREATED), _)); | 312                   BlimpRWMsgEquals(1, 1, RenderWidgetMessage::CREATED), _)); | 
| 224   EXPECT_CALL(delegate1_, | 313   EXPECT_CALL(delegate1_, | 
| 225               MockableOnCompositorMessageReceived(&render_widget_host1_, | 314               MockableOnCompositorMessageReceived(&render_widget_host1_, | 
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 278 | 367 | 
| 279   feature_.OnRenderWidgetCreated(1, &render_widget_host1_); | 368   feature_.OnRenderWidgetCreated(1, &render_widget_host1_); | 
| 280   feature_.OnRenderWidgetCreated(2, &render_widget_host2_); | 369   feature_.OnRenderWidgetCreated(2, &render_widget_host2_); | 
| 281   feature_.OnRenderWidgetInitialized(1, &render_widget_host1_); | 370   feature_.OnRenderWidgetInitialized(1, &render_widget_host1_); | 
| 282   feature_.OnRenderWidgetDeleted(2, &render_widget_host2_); | 371   feature_.OnRenderWidgetDeleted(2, &render_widget_host2_); | 
| 283   feature_.SendCompositorMessage(1, &render_widget_host1_, payload); | 372   feature_.SendCompositorMessage(1, &render_widget_host1_, payload); | 
| 284 } | 373 } | 
| 285 | 374 | 
| 286 | 375 | 
| 287 }  // namespace blimp | 376 }  // namespace blimp | 
| OLD | NEW | 
|---|