12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/browser/aw_contents_client_bridge_base.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_view_host.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread; 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::WebContents; 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace android_webview { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const void* kAwContentsClientBridgeBase = &kAwContentsClientBridgeBase; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class is invented so that the UserData registry that we inject the 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AwContentsClientBridgeBase object does not own and destroy it. 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UserData : public base::SupportsUserData::Data { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AwContentsClientBridgeBase* GetContents( 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_contents) { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserData* data = reinterpret_cast<UserData*>( 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetUserData(kAwContentsClientBridgeBase)); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return data ? data->contents_ : NULL; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit UserData(AwContentsClientBridgeBase* ptr) : contents_(ptr) {} 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AwContentsClientBridgeBase* contents_; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserData); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwContentsClientBridgeBase::Associate( 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AwContentsClientBridgeBase* handler) { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->SetUserData(kAwContentsClientBridgeBase, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new UserData(handler)); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwContentsClientBridgeBase* AwContentsClientBridgeBase::FromWebContents( 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents) { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return UserData::GetContents(web_contents); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwContentsClientBridgeBase* AwContentsClientBridgeBase::FromID( 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int render_process_id, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int render_view_id) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::RenderViewHost* rvh = 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderViewHost::FromID(render_process_id, render_view_id); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!rvh) return NULL; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_contents = 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents::FromRenderViewHost(rvh); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return UserData::GetContents(web_contents); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwContentsClientBridgeBase::~AwContentsClientBridgeBase() { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace android_webview 73