1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/renderer/net/net_error_page_controller.h"
6
7#include "base/strings/string_piece.h"
8#include "chrome/renderer/net/net_error_helper.h"
9#include "content/public/renderer/render_frame.h"
10#include "gin/handle.h"
11#include "gin/object_template_builder.h"
12#include "third_party/WebKit/public/web/WebKit.h"
13#include "third_party/WebKit/public/web/WebLocalFrame.h"
14
15gin::WrapperInfo NetErrorPageController::kWrapperInfo = {
16    gin::kEmbedderNativeGin};
17
18// static
19void NetErrorPageController::Install(content::RenderFrame* render_frame) {
20  v8::Isolate* isolate = blink::mainThreadIsolate();
21  v8::HandleScope handle_scope(isolate);
22  v8::Handle<v8::Context> context =
23      render_frame->GetWebFrame()->mainWorldScriptContext();
24  if (context.IsEmpty())
25    return;
26
27  v8::Context::Scope context_scope(context);
28
29  gin::Handle<NetErrorPageController> controller = gin::CreateHandle(
30      isolate, new NetErrorPageController(render_frame));
31  if (controller.IsEmpty())
32    return;
33
34  v8::Handle<v8::Object> global = context->Global();
35  global->Set(gin::StringToV8(isolate, "errorPageController"),
36              controller.ToV8());
37}
38
39bool NetErrorPageController::LoadStaleButtonClick() {
40  if (!render_frame())
41    return false;
42
43  NetErrorHelper* net_error_helper =
44      content::RenderFrameObserverTracker<NetErrorHelper>::Get(render_frame());
45  DCHECK(net_error_helper);
46  net_error_helper->LoadStaleButtonPressed();
47
48  return true;
49}
50
51bool NetErrorPageController::ReloadButtonClick() {
52  if (!render_frame())
53    return false;
54
55  NetErrorHelper* net_error_helper =
56      content::RenderFrameObserverTracker<NetErrorHelper>::Get(render_frame());
57  DCHECK(net_error_helper);
58  net_error_helper->ReloadButtonPressed();
59
60  return true;
61}
62
63bool NetErrorPageController::DetailsButtonClick() {
64  if (!render_frame())
65    return false;
66
67  NetErrorHelper* net_error_helper =
68      content::RenderFrameObserverTracker<NetErrorHelper>::Get(render_frame());
69  DCHECK(net_error_helper);
70  net_error_helper->MoreButtonPressed();
71
72  return true;
73}
74
75bool NetErrorPageController::TrackClick(const gin::Arguments& args) {
76  if (!render_frame())
77    return false;
78
79  if (!args.PeekNext()->IsInt32())
80    return false;
81
82  NetErrorHelper* net_error_helper =
83      content::RenderFrameObserverTracker<NetErrorHelper>::Get(render_frame());
84  DCHECK(net_error_helper);
85  net_error_helper->TrackClick(args.PeekNext()->Int32Value());
86  return true;
87}
88
89NetErrorPageController::NetErrorPageController(
90    content::RenderFrame* render_frame) : RenderFrameObserver(render_frame) {}
91
92NetErrorPageController::~NetErrorPageController() {}
93
94gin::ObjectTemplateBuilder NetErrorPageController::GetObjectTemplateBuilder(
95    v8::Isolate* isolate) {
96  return gin::Wrappable<NetErrorPageController>::GetObjectTemplateBuilder(
97             isolate)
98      .SetMethod("loadStaleButtonClick",
99                 &NetErrorPageController::LoadStaleButtonClick)
100      .SetMethod("reloadButtonClick",
101                 &NetErrorPageController::ReloadButtonClick)
102      .SetMethod("detailsButtonClick",
103                 &NetErrorPageController::DetailsButtonClick)
104      .SetMethod("trackClick",
105                 &NetErrorPageController::TrackClick);
106}
107
108void NetErrorPageController::OnDestruct() {}
109