10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/* 20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2009 Google Inc. All rights reserved. 30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Redistribution and use in source and binary forms, with or without 50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * modification, are permitted provided that the following conditions are 60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * met: 70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * * Redistributions of source code must retain the above copyright 90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * notice, this list of conditions and the following disclaimer. 100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * * Redistributions in binary form must reproduce the above 110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * copyright notice, this list of conditions and the following disclaimer 120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * in the documentation and/or other materials provided with the 130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * distribution. 140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * * Neither the name of Google Inc. nor the names of its 150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * contributors may be used to endorse or promote products derived from 160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * this software without specific prior written permission. 170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */ 300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef OwnHandle_h 320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#define OwnHandle_h 330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <v8.h> 350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebCore { 370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch template<typename T> 390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class OwnHandle { 400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch public: 410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch OwnHandle() { } 420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch explicit OwnHandle(v8::Handle<T> handle) : m_handle(v8::Persistent<T>::New(handle)) { } 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ~OwnHandle() { clear(); } 440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Handle<T> get() const { return m_handle; } 460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void set(v8::Handle<T> handle) { clear(); m_handle = v8::Persistent<T>::New(handle); } 470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Note: This is clear in the OwnPtr sense, not the v8::Handle sense. 490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void clear() 500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (m_handle.IsEmpty()) 520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_handle.IsWeak()) 54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_handle.ClearWeak(); 550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_handle.Dispose(); 560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_handle.Clear(); 570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Make the underlying handle weak. The client doesn't get a callback, 600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // we just make the handle empty. 610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void makeWeak() 620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (m_handle.IsEmpty()) 640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_handle.MakeWeak(this, &OwnHandle<T>::weakCallback); 660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch private: 690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void weakCallback(v8::Persistent<v8::Value> object, void* ownHandle) 700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch OwnHandle<T>* handle = static_cast<OwnHandle<T>*>(ownHandle); 720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch handle->clear(); 730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Persistent<T> m_handle; 760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch }; 770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebCore 790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif // OwnHandle_h 81