Home | History | Annotate | Download | only in web
      1 /*
      2  * Copyright (C) 2010, 2013 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #include "WebWorkerBase.h"
     32 #include "core/dom/CrossThreadTask.h"
     33 #include "core/platform/CrossThreadCopier.h"
     34 #include "core/workers/WorkerGlobalScope.h"
     35 
     36 namespace WebKit {
     37 
     38 // Base class for worker thread bridges. This class adds an observer to
     39 // WorkerGlobalScope so that it doesn't try to use deleted pointers when
     40 // WorkerGlobalScope is destroyed.
     41 class WorkerAllowMainThreadBridgeBase : public ThreadSafeRefCounted<WorkerAllowMainThreadBridgeBase> {
     42     WTF_MAKE_NONCOPYABLE(WorkerAllowMainThreadBridgeBase);
     43 public:
     44     WorkerAllowMainThreadBridgeBase(WebCore::WorkerGlobalScope*, WebWorkerBase*);
     45 
     46     virtual ~WorkerAllowMainThreadBridgeBase()
     47     {
     48     }
     49 
     50     // This class is passed across threads, so subclasses if it should make sure
     51     // any string fields are copied.
     52     class AllowParams {
     53     public:
     54         AllowParams(const String& mode)
     55             : m_mode(mode.isolatedCopy())
     56         {
     57         }
     58 
     59         virtual ~AllowParams()
     60         {
     61         }
     62 
     63         String m_mode;
     64     };
     65 
     66     // These methods are invoked on the worker context.
     67     void cancel()
     68     {
     69         MutexLocker locker(m_mutex);
     70         m_webWorkerBase = 0;
     71     }
     72 
     73     bool result()
     74     {
     75         return m_result;
     76     }
     77 
     78     virtual bool allowOnMainThread(WebCommonWorkerClient*, AllowParams*) = 0;
     79 
     80 protected:
     81     void postTaskToMainThread(PassOwnPtr<AllowParams>);
     82 
     83 private:
     84     static void allowTask(WebCore::ScriptExecutionContext*, PassOwnPtr<AllowParams>, PassRefPtr<WorkerAllowMainThreadBridgeBase>);
     85     static void didComplete(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerAllowMainThreadBridgeBase>, bool);
     86 
     87     Mutex m_mutex;
     88     WebWorkerBase* m_webWorkerBase;
     89     WebCore::WorkerGlobalScope::Observer* m_workerGlobalScopeObserver;
     90     bool m_result;
     91 };
     92 
     93 } // namespace WebKit
     94 
     95