Home | History | Annotate | Download | only in pepper
      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
      3 // found in the LICENSE file.
      4 
      5 #include "base/files/file_path.h"
      6 #include "base/strings/utf_string_conversions.h"
      7 #include "content/common/view_messages.h"
      8 #include "content/public/common/file_chooser_params.h"
      9 #include "content/public/test/render_view_test.h"
     10 #include "content/renderer/pepper/mock_renderer_ppapi_host.h"
     11 #include "content/renderer/pepper/pepper_file_chooser_host.h"
     12 #include "content/renderer/render_view_impl.h"
     13 #include "content/test/test_content_client.h"
     14 #include "ppapi/c/pp_errors.h"
     15 #include "ppapi/host/host_message_context.h"
     16 #include "ppapi/host/ppapi_host.h"
     17 #include "ppapi/proxy/ppapi_messages.h"
     18 #include "ppapi/proxy/resource_message_params.h"
     19 #include "ppapi/proxy/resource_message_test_sink.h"
     20 #include "ppapi/shared_impl/ppapi_permissions.h"
     21 #include "ppapi/shared_impl/ppb_file_ref_shared.h"
     22 #include "ppapi/shared_impl/resource_tracker.h"
     23 #include "ppapi/shared_impl/test_globals.h"
     24 #include "testing/gtest/include/gtest/gtest.h"
     25 #include "ui/shell_dialogs/selected_file_info.h"
     26 
     27 namespace content {
     28 
     29 namespace {
     30 
     31 class PepperFileChooserHostTest : public RenderViewTest {
     32  public:
     33   PepperFileChooserHostTest()
     34       : pp_instance_(123456) {}
     35 
     36   virtual void SetUp() {
     37     SetContentClient(&client_);
     38     RenderViewTest::SetUp();
     39 
     40     globals_.GetResourceTracker()->DidCreateInstance(pp_instance_);
     41   }
     42   virtual void TearDown() {
     43     globals_.GetResourceTracker()->DidDeleteInstance(pp_instance_);
     44 
     45     RenderViewTest::TearDown();
     46   }
     47 
     48   PP_Instance pp_instance() const { return pp_instance_; }
     49 
     50  private:
     51   PP_Instance pp_instance_;
     52 
     53   ppapi::TestGlobals globals_;
     54   TestContentClient client_;
     55 };
     56 
     57 // For testing to convert our hardcoded file paths to 8-bit.
     58 std::string FilePathToUTF8(const base::FilePath::StringType& path) {
     59 #if defined(OS_WIN)
     60   return UTF16ToUTF8(path);
     61 #else
     62   return path;
     63 #endif
     64 }
     65 
     66 }  // namespace
     67 
     68 TEST_F(PepperFileChooserHostTest, Show) {
     69   PP_Resource pp_resource = 123;
     70 
     71   MockRendererPpapiHost host(view_, pp_instance());
     72   PepperFileChooserHost chooser(&host, pp_instance(), pp_resource);
     73 
     74   // Say there's a user gesture.
     75   host.set_has_user_gesture(true);
     76 
     77   std::vector<std::string> accept;
     78   accept.push_back("text/plain");
     79   PpapiHostMsg_FileChooser_Show show_msg(false, false, std::string(), accept);
     80 
     81   ppapi::proxy::ResourceMessageCallParams call_params(pp_resource, 0);
     82   ppapi::host::HostMessageContext context(call_params);
     83   int32 result = chooser.OnResourceMessageReceived(show_msg, &context);
     84   EXPECT_EQ(PP_OK_COMPLETIONPENDING, result);
     85 
     86   // The render view should have sent a chooser request to the browser
     87   // (caught by the render thread's test message sink).
     88   const IPC::Message* msg = render_thread_->sink().GetUniqueMessageMatching(
     89       ViewHostMsg_RunFileChooser::ID);
     90   ASSERT_TRUE(msg);
     91   ViewHostMsg_RunFileChooser::Schema::Param call_msg_param;
     92   ASSERT_TRUE(ViewHostMsg_RunFileChooser::Read(msg, &call_msg_param));
     93   const FileChooserParams& chooser_params = call_msg_param.a;
     94 
     95   // Basic validation of request.
     96   EXPECT_EQ(FileChooserParams::Open, chooser_params.mode);
     97   ASSERT_EQ(1u, chooser_params.accept_types.size());
     98   EXPECT_EQ(accept[0], UTF16ToUTF8(chooser_params.accept_types[0]));
     99 
    100   // Send a chooser reply to the render view. Note our reply path has to have a
    101   // path separator so we include both a Unix and a Windows one.
    102   ui::SelectedFileInfo selected_info;
    103   selected_info.display_name = FILE_PATH_LITERAL("Hello, world");
    104   selected_info.local_path = base::FilePath(FILE_PATH_LITERAL("myp\\ath/foo"));
    105   std::vector<ui::SelectedFileInfo> selected_info_vector;
    106   selected_info_vector.push_back(selected_info);
    107   RenderViewImpl* view_impl = static_cast<RenderViewImpl*>(view_);
    108   ViewMsg_RunFileChooserResponse response(view_impl->routing_id(),
    109                                           selected_info_vector);
    110   EXPECT_TRUE(view_impl->OnMessageReceived(response));
    111 
    112   // This should have sent the Pepper reply to our test sink.
    113   ppapi::proxy::ResourceMessageReplyParams reply_params;
    114   IPC::Message reply_msg;
    115   ASSERT_TRUE(host.sink().GetFirstResourceReplyMatching(
    116       PpapiPluginMsg_FileChooser_ShowReply::ID, &reply_params, &reply_msg));
    117 
    118   // Basic validation of reply.
    119   EXPECT_EQ(call_params.sequence(), reply_params.sequence());
    120   EXPECT_EQ(PP_OK, reply_params.result());
    121   PpapiPluginMsg_FileChooser_ShowReply::Schema::Param reply_msg_param;
    122   ASSERT_TRUE(PpapiPluginMsg_FileChooser_ShowReply::Read(&reply_msg,
    123                                                          &reply_msg_param));
    124   const std::vector<ppapi::PPB_FileRef_CreateInfo>& chooser_results =
    125       reply_msg_param.a;
    126   ASSERT_EQ(1u, chooser_results.size());
    127   // Note path is empty because this is an external filesystem.
    128   EXPECT_EQ(std::string(), chooser_results[0].path);
    129   EXPECT_EQ(FilePathToUTF8(selected_info.display_name),
    130             chooser_results[0].name);
    131 }
    132 
    133 TEST_F(PepperFileChooserHostTest, NoUserGesture) {
    134   PP_Resource pp_resource = 123;
    135 
    136   MockRendererPpapiHost host(view_, pp_instance());
    137   PepperFileChooserHost chooser(&host, pp_instance(), pp_resource);
    138 
    139   // Say there's no user gesture.
    140   host.set_has_user_gesture(false);
    141 
    142   std::vector<std::string> accept;
    143   accept.push_back("text/plain");
    144   PpapiHostMsg_FileChooser_Show show_msg(false, false, std::string(), accept);
    145 
    146   ppapi::proxy::ResourceMessageCallParams call_params(pp_resource, 0);
    147   ppapi::host::HostMessageContext context(call_params);
    148   int32 result = chooser.OnResourceMessageReceived(show_msg, &context);
    149   EXPECT_EQ(PP_ERROR_NO_USER_GESTURE, result);
    150 }
    151 
    152 }  // namespace content
    153