Back to index

lightning-sunbird  0.9+nobinonly
JSEvaluator.cpp
Go to the documentation of this file.
00001 /* ***** BEGIN LICENSE BLOCK *****
00002  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00003  *
00004  * The contents of this file are subject to the Mozilla Public License Version
00005  * 1.1 (the "License"); you may not use this file except in compliance with
00006  * the License. You may obtain a copy of the License at
00007  * http://www.mozilla.org/MPL/
00008  *
00009  * Software distributed under the License is distributed on an "AS IS" basis,
00010  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00011  * for the specific language governing rights and limitations under the
00012  * License.
00013  *
00014  * The Original Code is mozilla.org code.
00015  *
00016  * The Initial Developer of the Original Code is
00017  * Netscape Communications Corporation.
00018  * Portions created by the Initial Developer are Copyright (C) 1998
00019  * the Initial Developer. All Rights Reserved.
00020  *
00021  * Contributor(s):
00022  *
00023  * Alternatively, the contents of this file may be used under the terms of
00024  * either of the GNU General Public License Version 2 or later (the "GPL"),
00025  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00026  * in which case the provisions of the GPL or the LGPL are applicable instead
00027  * of those above. If you wish to allow use of your version of this file only
00028  * under the terms of either the GPL or the LGPL, and not to allow others to
00029  * use your version of this file under the terms of the MPL, indicate your
00030  * decision by deleting the provisions above and replace them with the notice
00031  * and other provisions required by the GPL or the LGPL. If you do not delete
00032  * the provisions above, a recipient may use your version of this file under
00033  * the terms of any one of the MPL, the GPL or the LGPL.
00034  *
00035  * ***** END LICENSE BLOCK ***** */
00036 
00037 /*
00038        JSEvaluator.cpp
00039  */
00040 
00041 #include "JSEvaluator.h"
00042 #include "MRJPlugin.h"
00043 #include "MRJSession.h"
00044 #include "MRJMonitor.h"
00045 #include "nsIPluginManager.h"
00046 
00047 #include <string.h>
00048 
00049 extern nsIPluginManager* thePluginManager;
00050 
00051 JSEvaluator::JSEvaluator(MRJPluginInstance* pluginInstance)
00052        :      mPluginInstance(pluginInstance)
00053 {
00054        NS_ADDREF(pluginInstance);
00055        mSession = pluginInstance->getSession();
00056        mJSMonitor = new MRJMonitor(mSession);
00057 }
00058 
00059 JSEvaluator::~JSEvaluator()
00060 {
00061        NS_IF_RELEASE(mPluginInstance);
00062        if (mJSMonitor != NULL)
00063               delete mJSMonitor;
00064 }
00065 
00066 NS_IMPL_ISUPPORTS1(JSEvaluator, nsIPluginStreamListener)
00067 
00068 const char* JSEvaluator::eval(const char* script)
00069 {
00070        JNIEnv* env = mSession->getCurrentEnv();
00071        nsIPluginStreamListener* listener = this;
00072 
00073        mJSMonitor->enter();
00074 
00075        while (mScript != NULL) {
00076               // some other thread is evaluating a script.
00077               mJSMonitor->wait();
00078        }
00079        
00080        // construct a "javascript:" URL from the passed-in script.
00081        const char* kJavaScriptPrefix = "javascript:";
00082        mScript = new char[strlen(kJavaScriptPrefix) + strlen(script) + 1];
00083        if (mScript != NULL) {
00084               strcpy(mScript, kJavaScriptPrefix);
00085               strcat(mScript, script);
00086 
00087               // start an async evaluation of this script.
00088               nsresult result = thePluginManager->GetURL((nsIPluginInstance*)mPluginInstance, mScript, NULL, (nsIPluginStreamListener*)this);
00089               
00090               // default result is NULL, in case JavaScript returns undefined value.
00091               if (mResult != NULL) {
00092                      delete[] mResult;
00093                      mResult = NULL;
00094               }
00095 
00096               // need to block until the result is ready.
00097               mJSMonitor->wait();
00098               
00099               // can now delete the script.
00100               delete[] mScript;
00101               mScript = NULL;
00102        }
00103        
00104        mJSMonitor->notifyAll();
00105        
00106        mJSMonitor->exit();
00107        
00108        return mResult;
00109 }
00110 
00111 NS_METHOD JSEvaluator::OnDataAvailable(nsIPluginStreamInfo* pluginInfo, nsIInputStream* input, PRUint32 length)
00112 {
00113        // hopefully all our data is available.
00114        mResult = new char[length + 1];
00115        if (mResult != NULL) {
00116               if (input->Read(mResult, length, &length) == NS_OK) {
00117                      // We've delayed processing the applet tag, because we
00118                      // don't know the location of the curren document yet.
00119                      mResult[length] = '\0';
00120               }
00121        }
00122        return NS_OK;
00123 }
00124 
00125 NS_METHOD JSEvaluator::OnStopBinding(nsIPluginStreamInfo* pluginInfo, nsresult status)
00126 {
00127        // the stream has been closed, notify any waiting Java threads.
00128        mJSMonitor->notifyAll();
00129        return NS_OK;
00130 }