1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <cstring>
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/dev/ppb_memory_dev.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/pp_errors.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/ppb_image_data.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/proxy/pdf_resource.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/proxy/ppapi_proxy_test.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/proxy/ppb_image_data_proxy.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/proxy/serialized_handle.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/shared_impl/proxy_lock.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_var.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/shared_impl/var.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/thunk/thunk.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ppapi {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace proxy {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef PluginProxyTest PDFResourceTest;
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PDFResourceTest, GetLocalizedString) {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const PPB_PDF* pdf_iface = thunk::GetPPB_PDF_Thunk();
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string expected_string = "hello";
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PpapiPluginMsg_PDF_GetLocalizedStringReply reply_msg(expected_string);
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceSyncCallHandler handler(
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &sink(),
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PpapiHostMsg_PDF_GetLocalizedString::ID,
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PP_OK,
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      reply_msg);
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sink().AddFilter(&handler);
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PP_Var var = pdf_iface->GetLocalizedString(
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pp_instance(), PP_RESOURCESTRING_PDFGETPASSWORD);
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ProxyAutoLock lock;
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ScopedPPVar release_var(ScopedPPVar::PassRef(), var);
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StringVar* string_var = StringVar::FromPPVar(var);
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(string_var != NULL);
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string actual_string = string_var->value();
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(PpapiHostMsg_PDF_GetLocalizedString::ID,
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              handler.last_handled_msg().type());
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(expected_string, actual_string);
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Remove the filter or it will be destroyed before the sink() is destroyed.
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sink().RemoveFilter(&handler);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PDFResourceTest, SearchString) {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ProxyAutoLock lock;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Instantiate a resource explicitly so we can specify the locale.
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<PDFResource> pdf_resource(
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new PDFResource(Connection(&sink(), &sink()), pp_instance()));
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pdf_resource->SetLocaleForTest("en-US");
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 input;
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 term;
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::UTF8ToUTF16("abcdefabcdef", 12, &input);
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::UTF8ToUTF16("bc", 2, &term);
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PP_PrivateFindResult* results;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int count = 0;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pdf_resource->SearchString(
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      reinterpret_cast<const unsigned short*>(input.c_str()),
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      reinterpret_cast<const unsigned short*>(term.c_str()),
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      true,
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &results,
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &count);
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(2, count);
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(1, results[0].start_index);
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(2, results[0].length);
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(7, results[1].start_index);
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(2, results[1].length);
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const PPB_Memory_Dev* memory_iface = thunk::GetPPB_Memory_Dev_0_1_Thunk();
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  memory_iface->MemFree(results);
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PDFResourceTest, DidStartLoading) {
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const PPB_PDF* pdf_iface = thunk::GetPPB_PDF_Thunk();
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pdf_iface->DidStartLoading(pp_instance());
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceMessageCallParams params;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  IPC::Message msg;
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(sink().GetFirstResourceCallMatching(
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PpapiHostMsg_PDF_DidStartLoading::ID, &params, &msg));
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PDFResourceTest, DidStopLoading) {
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const PPB_PDF* pdf_iface = thunk::GetPPB_PDF_Thunk();
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pdf_iface->DidStopLoading(pp_instance());
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceMessageCallParams params;
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  IPC::Message msg;
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(sink().GetFirstResourceCallMatching(
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PpapiHostMsg_PDF_DidStopLoading::ID, &params, &msg));
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PDFResourceTest, SetContentRestriction) {
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const PPB_PDF* pdf_iface = thunk::GetPPB_PDF_Thunk();
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int restrictions = 5;
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pdf_iface->SetContentRestriction(pp_instance(), restrictions);
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceMessageCallParams params;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  IPC::Message msg;
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(sink().GetFirstResourceCallMatching(
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PpapiHostMsg_PDF_SetContentRestriction::ID, &params, &msg));
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PDFResourceTest, HasUnsupportedFeature) {
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const PPB_PDF* pdf_iface = thunk::GetPPB_PDF_Thunk();
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pdf_iface->HasUnsupportedFeature(pp_instance());
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceMessageCallParams params;
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  IPC::Message msg;
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(sink().GetFirstResourceCallMatching(
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PpapiHostMsg_PDF_HasUnsupportedFeature::ID, &params, &msg));
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PDFResourceTest, Print) {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const PPB_PDF* pdf_iface = thunk::GetPPB_PDF_Thunk();
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pdf_iface->Print(pp_instance());
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceMessageCallParams params;
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  IPC::Message msg;
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(sink().GetFirstResourceCallMatching(
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PpapiHostMsg_PDF_Print::ID, &params, &msg));
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PDFResourceTest, SaveAs) {
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const PPB_PDF* pdf_iface = thunk::GetPPB_PDF_Thunk();
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pdf_iface->SaveAs(pp_instance());
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceMessageCallParams params;
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  IPC::Message msg;
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(sink().GetFirstResourceCallMatching(
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PpapiHostMsg_PDF_SaveAs::ID, &params, &msg));
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PDFResourceTest, GetResourceImageForScale) {
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const PPB_PDF* pdf_iface = thunk::GetPPB_PDF_Thunk();
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HostResource expected_resource;
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected_resource.SetHostResource(pp_instance(), 5);
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PP_ImageDataDesc expected_desc = {
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PP_IMAGEDATAFORMAT_BGRA_PREMUL,
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { 5, 10 },
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      20,
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedHandle serialized_handle(SerializedHandle::SHARED_MEMORY);
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PpapiPluginMsg_PDF_GetResourceImageReply reply_msg(expected_resource,
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                                     expected_desc);
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceSyncCallHandler handler(
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &sink(),
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PpapiHostMsg_PDF_GetResourceImage::ID,
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PP_OK,
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      reply_msg);
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  handler.set_serialized_handle(&serialized_handle);
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sink().AddFilter(&handler);
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PP_Resource resource = pdf_iface->GetResourceImageForScale(pp_instance(),
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PP_RESOURCEIMAGE_PDF_BUTTON_FTP, 1.0f);
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ProxyAutoLock lock;
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PluginResourceTracker* resource_tracker =
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        static_cast<PluginResourceTracker*>(
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            PluginGlobals::Get()->GetResourceTracker());
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Resource* resource_object = resource_tracker->GetResource(resource);
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ImageData* image_data_object = static_cast<ImageData*>(resource_object);
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PP_ImageDataDesc actual_desc = image_data_object->desc();
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(expected_desc.format, actual_desc.format);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(expected_desc.size.width, actual_desc.size.width);
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(expected_desc.size.height, actual_desc.size.height);
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(expected_desc.stride, actual_desc.stride);
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(resource_tracker->PluginResourceForHostResource(
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        expected_resource), resource);
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    resource_tracker->ReleaseResource(resource);
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Remove the filter or it will be destroyed before the sink() is destroyed.
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sink().RemoveFilter(&handler);
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace proxy
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace ppapi
207