10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "extensions/renderer/render_view_observer_natives.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/renderer/render_view.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/renderer/render_view_observer.h"
90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "extensions/common/extension_api.h"
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/renderer/script_context.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebFrame.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace extensions {
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Deletes itself when done.
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass LoadWatcher : public content::RenderViewObserver {
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  LoadWatcher(ScriptContext* context,
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              content::RenderView* view,
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              v8::Handle<v8::Function> cb)
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      : content::RenderViewObserver(view), context_(context), callback_(cb) {}
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void DidCreateDocumentElement(blink::WebLocalFrame* frame) OVERRIDE {
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CallbackAndDie(true);
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void DidFailProvisionalLoad(blink::WebLocalFrame* frame,
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                      const blink::WebURLError& error)
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      OVERRIDE {
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CallbackAndDie(false);
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void CallbackAndDie(bool succeeded) {
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v8::Isolate* isolate = context_->isolate();
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    v8::HandleScope handle_scope(isolate);
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    v8::Handle<v8::Value> args[] = {v8::Boolean::New(isolate, succeeded)};
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    context_->CallFunction(callback_.NewHandle(isolate), 1, args);
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    delete this;
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ScriptContext* context_;
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ScopedPersistent<v8::Function> callback_;
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(LoadWatcher);
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
510529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochRenderViewObserverNatives::RenderViewObserverNatives(ScriptContext* context)
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : ObjectBackedNativeHandler(context) {
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RouteFunction("OnDocumentElementCreated",
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                base::Bind(&RenderViewObserverNatives::OnDocumentElementCreated,
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           base::Unretained(this)));
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderViewObserverNatives::OnDocumentElementCreated(
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const v8::FunctionCallbackInfo<v8::Value>& args) {
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(args.Length() == 2);
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(args[0]->IsInt32());
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(args[1]->IsFunction());
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int view_id = args[0]->Int32Value();
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::RenderView* view = content::RenderView::FromRoutingID(view_id);
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!view) {
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    LOG(WARNING) << "No render view found to register LoadWatcher.";
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  new LoadWatcher(context(), view, args[1].As<v8::Function>());
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  args.GetReturnValue().Set(true);
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace extensions
78