1// Copyright (c) 2010 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 "content/test/plugin/plugin_get_javascript_url2_test.h" 6 7#include "base/basictypes.h" 8 9// url for "self". 10#define SELF_URL "javascript:window.location+\"\"" 11// The identifier for the self url stream. 12#define SELF_URL_STREAM_ID 1 13 14// The maximum chunk size of stream data. 15#define STREAM_CHUNK 197 16 17namespace NPAPIClient { 18 19ExecuteGetJavascriptUrl2Test::ExecuteGetJavascriptUrl2Test( 20 NPP id, NPNetscapeFuncs *host_functions) 21 : PluginTest(id, host_functions), 22 test_started_(false) { 23} 24 25NPError ExecuteGetJavascriptUrl2Test::SetWindow(NPWindow* pNPWindow) { 26#if !defined(OS_MACOSX) 27 if (pNPWindow->window == NULL) 28 return NPERR_NO_ERROR; 29#endif 30 31 if (!test_started_) { 32 std::string url = SELF_URL; 33 HostFunctions()->geturlnotify(id(), url.c_str(), "_self", 34 reinterpret_cast<void*>(SELF_URL_STREAM_ID)); 35 test_started_ = true; 36 } 37 return NPERR_NO_ERROR; 38} 39 40NPError ExecuteGetJavascriptUrl2Test::NewStream(NPMIMEType type, NPStream* stream, 41 NPBool seekable, uint16* stype) { 42 if (stream == NULL) { 43 SetError("NewStream got null stream"); 44 return NPERR_INVALID_PARAM; 45 } 46 47 COMPILE_ASSERT(sizeof(unsigned long) <= sizeof(stream->notifyData), 48 cast_validity_check); 49 unsigned long stream_id = reinterpret_cast<unsigned long>(stream->notifyData); 50 switch (stream_id) { 51 case SELF_URL_STREAM_ID: 52 break; 53 default: 54 SetError("Unexpected NewStream callback"); 55 break; 56 } 57 return NPERR_NO_ERROR; 58} 59 60int32 ExecuteGetJavascriptUrl2Test::WriteReady(NPStream *stream) { 61 return STREAM_CHUNK; 62} 63 64int32 ExecuteGetJavascriptUrl2Test::Write(NPStream *stream, int32 offset, int32 len, 65 void *buffer) { 66 if (stream == NULL) { 67 SetError("Write got null stream"); 68 return -1; 69 } 70 if (len < 0 || len > STREAM_CHUNK) { 71 SetError("Write got bogus stream chunk size"); 72 return -1; 73 } 74 75 COMPILE_ASSERT(sizeof(unsigned long) <= sizeof(stream->notifyData), 76 cast_validity_check); 77 unsigned long stream_id = reinterpret_cast<unsigned long>(stream->notifyData); 78 switch (stream_id) { 79 case SELF_URL_STREAM_ID: 80 self_url_.append(static_cast<char*>(buffer), len); 81 break; 82 default: 83 SetError("Unexpected write callback"); 84 break; 85 } 86 // Pretend that we took all the data. 87 return len; 88} 89 90 91NPError ExecuteGetJavascriptUrl2Test::DestroyStream(NPStream *stream, NPError reason) { 92 if (stream == NULL) { 93 SetError("NewStream got null stream"); 94 return NPERR_INVALID_PARAM; 95 } 96 97 COMPILE_ASSERT(sizeof(unsigned long) <= sizeof(stream->notifyData), 98 cast_validity_check); 99 unsigned long stream_id = reinterpret_cast<unsigned long>(stream->notifyData); 100 switch (stream_id) { 101 case SELF_URL_STREAM_ID: 102 // don't care 103 break; 104 default: 105 SetError("Unexpected NewStream callback"); 106 break; 107 } 108 return NPERR_NO_ERROR; 109} 110 111void ExecuteGetJavascriptUrl2Test::URLNotify(const char* url, NPReason reason, void* data) { 112 COMPILE_ASSERT(sizeof(unsigned long) <= sizeof(data), 113 cast_validity_check); 114 115 unsigned long stream_id = reinterpret_cast<unsigned long>(data); 116 switch (stream_id) { 117 case SELF_URL_STREAM_ID: 118 if (strcmp(url, SELF_URL) != 0) 119 SetError("URLNotify reported incorrect url for SELF_URL"); 120 if (self_url_.empty()) 121 SetError("Failed to obtain window location."); 122 SignalTestCompleted(); 123 break; 124 default: 125 SetError("Unexpected NewStream callback"); 126 break; 127 } 128} 129 130} // namespace NPAPIClient 131