15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/generic_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_ui.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenericHandler::GenericHandler() {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenericHandler::~GenericHandler() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GenericHandler::RegisterMessages() {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("navigateToUrl",
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&GenericHandler::HandleNavigateToUrl, base::Unretained(this)));
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void GenericHandler::HandleNavigateToUrl(const base::ListValue* args) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url_string;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string target_string;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double button;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool alt_key;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ctrl_key;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool meta_key;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool shift_key;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(args->GetString(0, &url_string));
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(args->GetString(1, &target_string));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(args->GetDouble(2, &button));
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(args->GetBoolean(3, &alt_key));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(args->GetBoolean(4, &ctrl_key));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(args->GetBoolean(5, &meta_key));
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(args->GetBoolean(6, &shift_key));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(button == 0.0 || button == 1.0);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool middle_button = (button == 1.0);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WindowOpenDisposition disposition = ui::DispositionFromClick(
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      middle_button, alt_key, ctrl_key, meta_key, shift_key);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (disposition == CURRENT_TAB && target_string == "_blank")
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disposition = NEW_FOREGROUND_TAB;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_ui()->GetWebContents()->OpenURL(OpenURLParams(GURL(url_string),
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                    Referrer(),
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                    disposition,
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                    ui::PAGE_TRANSITION_LINK,
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                    false));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This may delete us!
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
63