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"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/render_frame_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)
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid AwContentsClientBridgeBase::Disassociate(
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WebContents* web_contents) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_contents->RemoveUserData(kAwContentsClientBridgeBase);
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwContentsClientBridgeBase* AwContentsClientBridgeBase::FromWebContents(
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* web_contents) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return UserData::GetContents(web_contents);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwContentsClientBridgeBase* AwContentsClientBridgeBase::FromID(
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int render_process_id,
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int render_frame_id) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::RenderFrameHost* rfh =
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::RenderFrameHost::FromID(render_process_id, render_frame_id);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* web_contents =
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::WebContents::FromRenderFrameHost(rfh);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return UserData::GetContents(web_contents);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwContentsClientBridgeBase::~AwContentsClientBridgeBase() {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace android_webview
77