15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/test/plugin/plugin_execute_stream_javascript.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/test/plugin/plugin_client.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace NPAPIClient {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kMaxLength = 4096;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExecuteStreamJavaScript::ExecuteStreamJavaScript(
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NPP id, NPNetscapeFuncs *host_functions)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : PluginTest(id, host_functions) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError ExecuteStreamJavaScript::NewStream(NPMIMEType type, NPStream* stream,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           NPBool seekable, uint16* stype) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_NO_ERROR;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 ExecuteStreamJavaScript::WriteReady(NPStream *stream) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kMaxLength;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 ExecuteStreamJavaScript::Write(NPStream *stream, int32 offset, int32 len,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     void *buffer) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (stream == NULL) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetError("Write got null stream");
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -1;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (len < 0 || len > kMaxLength) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetError("Write got bogus stream chunk size");
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -1;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string javascript("javascript:");
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  javascript.append(static_cast<char*>(buffer), len);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t js_length = javascript.length();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (js_length != static_cast<uint32_t>(js_length)) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetError("Javascript too long.");
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -1;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPString script_string = { javascript.c_str(),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             static_cast<uint32_t>(js_length) };
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObject *window_obj = NULL;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPAPIClient::PluginClient::HostFunctions()->getvalue(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id(), NPNVWindowNPObject, &window_obj);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPVariant unused_result;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPAPIClient::PluginClient::HostFunctions()->evaluate(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id(), window_obj, &script_string, &unused_result);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return len;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPError ExecuteStreamJavaScript::DestroyStream(NPStream *stream,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               NPError reason) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NPERR_NO_ERROR;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace NPAPIClient
66