| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/browser/api/printer_provider/printer_provider_api.h" | 5 #include "extensions/browser/api/printer_provider/printer_provider_api.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 | 259 |
| 260 // PrinterProviderInternalAPIObserver implementation: | 260 // PrinterProviderInternalAPIObserver implementation: |
| 261 void OnGetPrintersResult( | 261 void OnGetPrintersResult( |
| 262 const Extension* extension, | 262 const Extension* extension, |
| 263 int request_id, | 263 int request_id, |
| 264 const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) | 264 const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) |
| 265 override; | 265 override; |
| 266 void OnGetCapabilityResult(const Extension* extension, | 266 void OnGetCapabilityResult(const Extension* extension, |
| 267 int request_id, | 267 int request_id, |
| 268 const base::DictionaryValue& result) override; | 268 const base::DictionaryValue& result) override; |
| 269 void OnPrintResult( | 269 void OnPrintResult(const Extension* extension, |
| 270 const Extension* extension, | 270 int request_id, |
| 271 int request_id, | 271 api::printer_provider_internal::PrintError error) override; |
| 272 core_api::printer_provider_internal::PrintError error) override; | |
| 273 void OnGetUsbPrinterInfoResult( | 272 void OnGetUsbPrinterInfoResult( |
| 274 const Extension* extension, | 273 const Extension* extension, |
| 275 int request_id, | 274 int request_id, |
| 276 const core_api::printer_provider::PrinterInfo* printer_info) override; | 275 const api::printer_provider::PrinterInfo* printer_info) override; |
| 277 | 276 |
| 278 // ExtensionRegistryObserver implementation: | 277 // ExtensionRegistryObserver implementation: |
| 279 void OnExtensionUnloaded(content::BrowserContext* browser_context, | 278 void OnExtensionUnloaded(content::BrowserContext* browser_context, |
| 280 const Extension* extension, | 279 const Extension* extension, |
| 281 UnloadedExtensionInfo::Reason reason) override; | 280 UnloadedExtensionInfo::Reason reason) override; |
| 282 | 281 |
| 283 // Called before chrome.printerProvider.onGetPrintersRequested event is | 282 // Called before chrome.printerProvider.onGetPrintersRequested event is |
| 284 // dispatched to an extension. It returns whether the extension is interested | 283 // dispatched to an extension. It returns whether the extension is interested |
| 285 // in the event. If the extension listens to the event, it's added to the set | 284 // in the event. If the extension listens to the event, it's added to the set |
| 286 // of |request| sources. |request| is |GetPrintersRequest| object associated | 285 // of |request| sources. |request| is |GetPrintersRequest| object associated |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context)); | 503 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context)); |
| 505 } | 504 } |
| 506 | 505 |
| 507 PrinterProviderAPIImpl::~PrinterProviderAPIImpl() { | 506 PrinterProviderAPIImpl::~PrinterProviderAPIImpl() { |
| 508 } | 507 } |
| 509 | 508 |
| 510 void PrinterProviderAPIImpl::DispatchGetPrintersRequested( | 509 void PrinterProviderAPIImpl::DispatchGetPrintersRequested( |
| 511 const GetPrintersCallback& callback) { | 510 const GetPrintersCallback& callback) { |
| 512 EventRouter* event_router = EventRouter::Get(browser_context_); | 511 EventRouter* event_router = EventRouter::Get(browser_context_); |
| 513 if (!event_router->HasEventListener( | 512 if (!event_router->HasEventListener( |
| 514 core_api::printer_provider::OnGetPrintersRequested::kEventName)) { | 513 api::printer_provider::OnGetPrintersRequested::kEventName)) { |
| 515 callback.Run(base::ListValue(), true /* done */); | 514 callback.Run(base::ListValue(), true /* done */); |
| 516 return; | 515 return; |
| 517 } | 516 } |
| 518 | 517 |
| 519 // |pending_get_printers_requests_| take ownership of |request| which gets | 518 // |pending_get_printers_requests_| take ownership of |request| which gets |
| 520 // NULLed out. Save the pointer before passing it to the requests, as it will | 519 // NULLed out. Save the pointer before passing it to the requests, as it will |
| 521 // be needed later on. | 520 // be needed later on. |
| 522 int request_id = pending_get_printers_requests_.Add(callback); | 521 int request_id = pending_get_printers_requests_.Add(callback); |
| 523 | 522 |
| 524 scoped_ptr<base::ListValue> internal_args(new base::ListValue); | 523 scoped_ptr<base::ListValue> internal_args(new base::ListValue); |
| 525 // Request id is not part of the public API, but it will be massaged out in | 524 // Request id is not part of the public API, but it will be massaged out in |
| 526 // custom bindings. | 525 // custom bindings. |
| 527 internal_args->AppendInteger(request_id); | 526 internal_args->AppendInteger(request_id); |
| 528 | 527 |
| 529 scoped_ptr<Event> event( | 528 scoped_ptr<Event> event( |
| 530 new Event(events::UNKNOWN, | 529 new Event(events::UNKNOWN, |
| 531 core_api::printer_provider::OnGetPrintersRequested::kEventName, | 530 api::printer_provider::OnGetPrintersRequested::kEventName, |
| 532 internal_args.Pass())); | 531 internal_args.Pass())); |
| 533 // This callback is called synchronously during |BroadcastEvent|, so | 532 // This callback is called synchronously during |BroadcastEvent|, so |
| 534 // Unretained is safe. | 533 // Unretained is safe. |
| 535 event->will_dispatch_callback = | 534 event->will_dispatch_callback = |
| 536 base::Bind(&PrinterProviderAPIImpl::WillRequestPrinters, | 535 base::Bind(&PrinterProviderAPIImpl::WillRequestPrinters, |
| 537 base::Unretained(this), request_id); | 536 base::Unretained(this), request_id); |
| 538 | 537 |
| 539 event_router->BroadcastEvent(event.Pass()); | 538 event_router->BroadcastEvent(event.Pass()); |
| 540 } | 539 } |
| 541 | 540 |
| 542 void PrinterProviderAPIImpl::DispatchGetCapabilityRequested( | 541 void PrinterProviderAPIImpl::DispatchGetCapabilityRequested( |
| 543 const std::string& printer_id, | 542 const std::string& printer_id, |
| 544 const PrinterProviderAPI::GetCapabilityCallback& callback) { | 543 const PrinterProviderAPI::GetCapabilityCallback& callback) { |
| 545 std::string extension_id; | 544 std::string extension_id; |
| 546 std::string internal_printer_id; | 545 std::string internal_printer_id; |
| 547 if (!ParsePrinterId(printer_id, &extension_id, &internal_printer_id)) { | 546 if (!ParsePrinterId(printer_id, &extension_id, &internal_printer_id)) { |
| 548 callback.Run(base::DictionaryValue()); | 547 callback.Run(base::DictionaryValue()); |
| 549 return; | 548 return; |
| 550 } | 549 } |
| 551 | 550 |
| 552 EventRouter* event_router = EventRouter::Get(browser_context_); | 551 EventRouter* event_router = EventRouter::Get(browser_context_); |
| 553 if (!event_router->ExtensionHasEventListener( | 552 if (!event_router->ExtensionHasEventListener( |
| 554 extension_id, | 553 extension_id, |
| 555 core_api::printer_provider::OnGetCapabilityRequested::kEventName)) { | 554 api::printer_provider::OnGetCapabilityRequested::kEventName)) { |
| 556 callback.Run(base::DictionaryValue()); | 555 callback.Run(base::DictionaryValue()); |
| 557 return; | 556 return; |
| 558 } | 557 } |
| 559 | 558 |
| 560 int request_id = pending_capability_requests_[extension_id].Add(callback); | 559 int request_id = pending_capability_requests_[extension_id].Add(callback); |
| 561 | 560 |
| 562 scoped_ptr<base::ListValue> internal_args(new base::ListValue); | 561 scoped_ptr<base::ListValue> internal_args(new base::ListValue); |
| 563 // Request id is not part of the public API, but it will be massaged out in | 562 // Request id is not part of the public API, but it will be massaged out in |
| 564 // custom bindings. | 563 // custom bindings. |
| 565 internal_args->AppendInteger(request_id); | 564 internal_args->AppendInteger(request_id); |
| 566 internal_args->AppendString(internal_printer_id); | 565 internal_args->AppendString(internal_printer_id); |
| 567 | 566 |
| 568 scoped_ptr<Event> event(new Event( | 567 scoped_ptr<Event> event( |
| 569 events::UNKNOWN, | 568 new Event(events::UNKNOWN, |
| 570 core_api::printer_provider::OnGetCapabilityRequested::kEventName, | 569 api::printer_provider::OnGetCapabilityRequested::kEventName, |
| 571 internal_args.Pass())); | 570 internal_args.Pass())); |
| 572 | 571 |
| 573 event_router->DispatchEventToExtension(extension_id, event.Pass()); | 572 event_router->DispatchEventToExtension(extension_id, event.Pass()); |
| 574 } | 573 } |
| 575 | 574 |
| 576 void PrinterProviderAPIImpl::DispatchPrintRequested( | 575 void PrinterProviderAPIImpl::DispatchPrintRequested( |
| 577 const PrinterProviderPrintJob& job, | 576 const PrinterProviderPrintJob& job, |
| 578 const PrinterProviderAPI::PrintCallback& callback) { | 577 const PrinterProviderAPI::PrintCallback& callback) { |
| 579 std::string extension_id; | 578 std::string extension_id; |
| 580 std::string internal_printer_id; | 579 std::string internal_printer_id; |
| 581 if (!ParsePrinterId(job.printer_id, &extension_id, &internal_printer_id)) { | 580 if (!ParsePrinterId(job.printer_id, &extension_id, &internal_printer_id)) { |
| 582 callback.Run(false, PrinterProviderAPI::GetDefaultPrintError()); | 581 callback.Run(false, PrinterProviderAPI::GetDefaultPrintError()); |
| 583 return; | 582 return; |
| 584 } | 583 } |
| 585 | 584 |
| 586 EventRouter* event_router = EventRouter::Get(browser_context_); | 585 EventRouter* event_router = EventRouter::Get(browser_context_); |
| 587 if (!event_router->ExtensionHasEventListener( | 586 if (!event_router->ExtensionHasEventListener( |
| 588 extension_id, | 587 extension_id, api::printer_provider::OnPrintRequested::kEventName)) { |
| 589 core_api::printer_provider::OnPrintRequested::kEventName)) { | |
| 590 callback.Run(false, PrinterProviderAPI::GetDefaultPrintError()); | 588 callback.Run(false, PrinterProviderAPI::GetDefaultPrintError()); |
| 591 return; | 589 return; |
| 592 } | 590 } |
| 593 | 591 |
| 594 core_api::printer_provider::PrintJob print_job; | 592 api::printer_provider::PrintJob print_job; |
| 595 print_job.printer_id = internal_printer_id; | 593 print_job.printer_id = internal_printer_id; |
| 596 | 594 |
| 597 JSONStringValueDeserializer deserializer(job.ticket_json); | 595 JSONStringValueDeserializer deserializer(job.ticket_json); |
| 598 scoped_ptr<base::Value> ticket_value(deserializer.Deserialize(NULL, NULL)); | 596 scoped_ptr<base::Value> ticket_value(deserializer.Deserialize(NULL, NULL)); |
| 599 if (!ticket_value || | 597 if (!ticket_value || |
| 600 !core_api::printer_provider::PrintJob::Ticket::Populate( | 598 !api::printer_provider::PrintJob::Ticket::Populate(*ticket_value, |
| 601 *ticket_value, &print_job.ticket)) { | 599 &print_job.ticket)) { |
| 602 callback.Run(false, | 600 callback.Run(false, api::printer_provider::ToString( |
| 603 core_api::printer_provider::ToString( | 601 api::printer_provider::PRINT_ERROR_INVALID_TICKET)); |
| 604 core_api::printer_provider::PRINT_ERROR_INVALID_TICKET)); | |
| 605 return; | 602 return; |
| 606 } | 603 } |
| 607 | 604 |
| 608 print_job.content_type = job.content_type; | 605 print_job.content_type = job.content_type; |
| 609 print_job.title = base::UTF16ToUTF8(job.job_title); | 606 print_job.title = base::UTF16ToUTF8(job.job_title); |
| 610 int request_id = pending_print_requests_[extension_id].Add(job, callback); | 607 int request_id = pending_print_requests_[extension_id].Add(job, callback); |
| 611 | 608 |
| 612 scoped_ptr<base::ListValue> internal_args(new base::ListValue); | 609 scoped_ptr<base::ListValue> internal_args(new base::ListValue); |
| 613 // Request id is not part of the public API and it will be massaged out in | 610 // Request id is not part of the public API and it will be massaged out in |
| 614 // custom bindings. | 611 // custom bindings. |
| 615 internal_args->AppendInteger(request_id); | 612 internal_args->AppendInteger(request_id); |
| 616 internal_args->Append(print_job.ToValue().release()); | 613 internal_args->Append(print_job.ToValue().release()); |
| 617 scoped_ptr<Event> event(new Event( | 614 scoped_ptr<Event> event(new Event( |
| 618 events::UNKNOWN, core_api::printer_provider::OnPrintRequested::kEventName, | 615 events::UNKNOWN, api::printer_provider::OnPrintRequested::kEventName, |
| 619 internal_args.Pass())); | 616 internal_args.Pass())); |
| 620 event_router->DispatchEventToExtension(extension_id, event.Pass()); | 617 event_router->DispatchEventToExtension(extension_id, event.Pass()); |
| 621 } | 618 } |
| 622 | 619 |
| 623 const PrinterProviderPrintJob* PrinterProviderAPIImpl::GetPrintJob( | 620 const PrinterProviderPrintJob* PrinterProviderAPIImpl::GetPrintJob( |
| 624 const Extension* extension, | 621 const Extension* extension, |
| 625 int request_id) const { | 622 int request_id) const { |
| 626 auto it = pending_print_requests_.find(extension->id()); | 623 auto it = pending_print_requests_.find(extension->id()); |
| 627 if (it == pending_print_requests_.end()) | 624 if (it == pending_print_requests_.end()) |
| 628 return nullptr; | 625 return nullptr; |
| 629 return it->second.GetPrintJob(request_id); | 626 return it->second.GetPrintJob(request_id); |
| 630 } | 627 } |
| 631 | 628 |
| 632 void PrinterProviderAPIImpl::DispatchGetUsbPrinterInfoRequested( | 629 void PrinterProviderAPIImpl::DispatchGetUsbPrinterInfoRequested( |
| 633 const std::string& extension_id, | 630 const std::string& extension_id, |
| 634 scoped_refptr<UsbDevice> device, | 631 scoped_refptr<UsbDevice> device, |
| 635 const PrinterProviderAPI::GetPrinterInfoCallback& callback) { | 632 const PrinterProviderAPI::GetPrinterInfoCallback& callback) { |
| 636 EventRouter* event_router = EventRouter::Get(browser_context_); | 633 EventRouter* event_router = EventRouter::Get(browser_context_); |
| 637 if (!event_router->ExtensionHasEventListener( | 634 if (!event_router->ExtensionHasEventListener( |
| 638 extension_id, core_api::printer_provider:: | 635 extension_id, |
| 639 OnGetUsbPrinterInfoRequested::kEventName)) { | 636 api::printer_provider::OnGetUsbPrinterInfoRequested::kEventName)) { |
| 640 callback.Run(base::DictionaryValue()); | 637 callback.Run(base::DictionaryValue()); |
| 641 return; | 638 return; |
| 642 } | 639 } |
| 643 | 640 |
| 644 int request_id = | 641 int request_id = |
| 645 pending_usb_printer_info_requests_[extension_id].Add(callback); | 642 pending_usb_printer_info_requests_[extension_id].Add(callback); |
| 646 core_api::usb::Device usb_device; | 643 api::usb::Device usb_device; |
| 647 usb_device.device = | 644 usb_device.device = |
| 648 UsbGuidMap::Get(browser_context_)->GetIdFromGuid(device->guid()); | 645 UsbGuidMap::Get(browser_context_)->GetIdFromGuid(device->guid()); |
| 649 usb_device.vendor_id = device->vendor_id(); | 646 usb_device.vendor_id = device->vendor_id(); |
| 650 usb_device.product_id = device->product_id(); | 647 usb_device.product_id = device->product_id(); |
| 651 | 648 |
| 652 scoped_ptr<base::ListValue> internal_args(new base::ListValue); | 649 scoped_ptr<base::ListValue> internal_args(new base::ListValue); |
| 653 // Request id is not part of the public API and it will be massaged out in | 650 // Request id is not part of the public API and it will be massaged out in |
| 654 // custom bindings. | 651 // custom bindings. |
| 655 internal_args->AppendInteger(request_id); | 652 internal_args->AppendInteger(request_id); |
| 656 internal_args->Append(usb_device.ToValue().release()); | 653 internal_args->Append(usb_device.ToValue().release()); |
| 657 scoped_ptr<Event> event(new Event( | 654 scoped_ptr<Event> event( |
| 658 events::UNKNOWN, | 655 new Event(events::UNKNOWN, |
| 659 core_api::printer_provider::OnGetUsbPrinterInfoRequested::kEventName, | 656 api::printer_provider::OnGetUsbPrinterInfoRequested::kEventName, |
| 660 internal_args.Pass())); | 657 internal_args.Pass())); |
| 661 event_router->DispatchEventToExtension(extension_id, event.Pass()); | 658 event_router->DispatchEventToExtension(extension_id, event.Pass()); |
| 662 } | 659 } |
| 663 | 660 |
| 664 void PrinterProviderAPIImpl::OnGetPrintersResult( | 661 void PrinterProviderAPIImpl::OnGetPrintersResult( |
| 665 const Extension* extension, | 662 const Extension* extension, |
| 666 int request_id, | 663 int request_id, |
| 667 const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) { | 664 const PrinterProviderInternalAPIObserver::PrinterInfoVector& result) { |
| 668 base::ListValue printer_list; | 665 base::ListValue printer_list; |
| 669 | 666 |
| 670 // Update some printer description properties to better identify the extension | 667 // Update some printer description properties to better identify the extension |
| (...skipping 11 matching lines...) Expand all Loading... |
| 682 void PrinterProviderAPIImpl::OnGetCapabilityResult( | 679 void PrinterProviderAPIImpl::OnGetCapabilityResult( |
| 683 const Extension* extension, | 680 const Extension* extension, |
| 684 int request_id, | 681 int request_id, |
| 685 const base::DictionaryValue& result) { | 682 const base::DictionaryValue& result) { |
| 686 pending_capability_requests_[extension->id()].Complete(request_id, result); | 683 pending_capability_requests_[extension->id()].Complete(request_id, result); |
| 687 } | 684 } |
| 688 | 685 |
| 689 void PrinterProviderAPIImpl::OnPrintResult( | 686 void PrinterProviderAPIImpl::OnPrintResult( |
| 690 const Extension* extension, | 687 const Extension* extension, |
| 691 int request_id, | 688 int request_id, |
| 692 core_api::printer_provider_internal::PrintError error) { | 689 api::printer_provider_internal::PrintError error) { |
| 693 const std::string error_str = | 690 const std::string error_str = |
| 694 error == core_api::printer_provider_internal::PRINT_ERROR_NONE | 691 error == api::printer_provider_internal::PRINT_ERROR_NONE |
| 695 ? PrinterProviderAPI::GetDefaultPrintError() | 692 ? PrinterProviderAPI::GetDefaultPrintError() |
| 696 : core_api::printer_provider_internal::ToString(error); | 693 : api::printer_provider_internal::ToString(error); |
| 697 pending_print_requests_[extension->id()].Complete( | 694 pending_print_requests_[extension->id()].Complete( |
| 698 request_id, error == core_api::printer_provider_internal::PRINT_ERROR_OK, | 695 request_id, error == api::printer_provider_internal::PRINT_ERROR_OK, |
| 699 error_str); | 696 error_str); |
| 700 } | 697 } |
| 701 | 698 |
| 702 void PrinterProviderAPIImpl::OnGetUsbPrinterInfoResult( | 699 void PrinterProviderAPIImpl::OnGetUsbPrinterInfoResult( |
| 703 const Extension* extension, | 700 const Extension* extension, |
| 704 int request_id, | 701 int request_id, |
| 705 const core_api::printer_provider::PrinterInfo* result) { | 702 const api::printer_provider::PrinterInfo* result) { |
| 706 if (result) { | 703 if (result) { |
| 707 scoped_ptr<base::DictionaryValue> printer(result->ToValue()); | 704 scoped_ptr<base::DictionaryValue> printer(result->ToValue()); |
| 708 UpdatePrinterWithExtensionInfo(printer.get(), extension); | 705 UpdatePrinterWithExtensionInfo(printer.get(), extension); |
| 709 pending_usb_printer_info_requests_[extension->id()].Complete(request_id, | 706 pending_usb_printer_info_requests_[extension->id()].Complete(request_id, |
| 710 *printer); | 707 *printer); |
| 711 } else { | 708 } else { |
| 712 pending_usb_printer_info_requests_[extension->id()].Complete( | 709 pending_usb_printer_info_requests_[extension->id()].Complete( |
| 713 request_id, base::DictionaryValue()); | 710 request_id, base::DictionaryValue()); |
| 714 } | 711 } |
| 715 } | 712 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 742 bool PrinterProviderAPIImpl::WillRequestPrinters( | 739 bool PrinterProviderAPIImpl::WillRequestPrinters( |
| 743 int request_id, | 740 int request_id, |
| 744 content::BrowserContext* browser_context, | 741 content::BrowserContext* browser_context, |
| 745 const Extension* extension, | 742 const Extension* extension, |
| 746 base::ListValue* args) { | 743 base::ListValue* args) { |
| 747 if (!extension) | 744 if (!extension) |
| 748 return false; | 745 return false; |
| 749 EventRouter* event_router = EventRouter::Get(browser_context_); | 746 EventRouter* event_router = EventRouter::Get(browser_context_); |
| 750 if (!event_router->ExtensionHasEventListener( | 747 if (!event_router->ExtensionHasEventListener( |
| 751 extension->id(), | 748 extension->id(), |
| 752 core_api::printer_provider::OnGetPrintersRequested::kEventName)) { | 749 api::printer_provider::OnGetPrintersRequested::kEventName)) { |
| 753 return false; | 750 return false; |
| 754 } | 751 } |
| 755 | 752 |
| 756 return pending_get_printers_requests_.AddSource(request_id, extension->id()); | 753 return pending_get_printers_requests_.AddSource(request_id, extension->id()); |
| 757 } | 754 } |
| 758 | 755 |
| 759 } // namespace | 756 } // namespace |
| 760 | 757 |
| 761 // static | 758 // static |
| 762 PrinterProviderAPI* PrinterProviderAPI::Create( | 759 PrinterProviderAPI* PrinterProviderAPI::Create( |
| 763 content::BrowserContext* context) { | 760 content::BrowserContext* context) { |
| 764 return new PrinterProviderAPIImpl(context); | 761 return new PrinterProviderAPIImpl(context); |
| 765 } | 762 } |
| 766 | 763 |
| 767 // static | 764 // static |
| 768 std::string PrinterProviderAPI::GetDefaultPrintError() { | 765 std::string PrinterProviderAPI::GetDefaultPrintError() { |
| 769 return core_api::printer_provider_internal::ToString( | 766 return api::printer_provider_internal::ToString( |
| 770 core_api::printer_provider_internal::PRINT_ERROR_FAILED); | 767 api::printer_provider_internal::PRINT_ERROR_FAILED); |
| 771 } | 768 } |
| 772 | 769 |
| 773 } // namespace extensions | 770 } // namespace extensions |
| OLD | NEW |